From 177152e9ed93fa469efa698a87b9a74708478d5e Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Fri, 12 Jun 2020 15:03:55 -0500 Subject: [PATCH 01/71] Adds some more action buttons for malf AI abilities, removes the malfunction tab --- .../gamemodes/malfunction/Malf_Modules.dm | 32 +++++++++++++++++- .../antagonists/traitor/datum_traitor.dm | 3 +- code/modules/mob/living/silicon/ai/ai.dm | 20 ++--------- code/modules/power/apc.dm | 3 +- icons/mob/actions/actions.dmi | Bin 122968 -> 123170 bytes 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index c1a907f9191..816eadf55bf 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -83,6 +83,36 @@ else add_ranged_ability(user, enable_text) +/datum/action/innate/ai/choose_modules + name = "Choose Modules" + desc = "Spend your processing time to gain a variety of different abilities." + button_icon_state = "choose_module" + auto_use_uses = FALSE // This is an infinite ability. + +/datum/action/innate/ai/choose_modules/Grant(mob/living/L) + . = ..() + owner_AI.malf_picker = new /datum/module_picker + +/datum/action/innate/ai/choose_modules/Trigger() + . = ..() + owner_AI.malf_picker.use(owner_AI) + +/datum/action/innate/ai/return_to_core + name = "Return to Main Core" + desc = "Leave the APC you are shunted to, and return to your core." + icon_icon = 'icons/obj/power.dmi' + button_icon_state = "apcemag" + auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up. + +/datum/action/innate/ai/return_to_core/Trigger() + . = ..() + var/obj/machinery/power/apc/apc = owner_AI.loc + if(!istype(apc)) // This shouldn't happen but here for safety. + to_chat(src, "You are already in your Main Core.") + return + apc.malfvacate() + qdel(src) + //The datum and interface for the malf unlock menu, which lets them choose actions to unlock. /datum/module_picker var/temp @@ -102,7 +132,7 @@ if(istype(A, initial(AM.power_type))) qdel(A) -/datum/module_picker/proc/use(user as mob) +/datum/module_picker/proc/use(mob/user) var/dat dat += {"Select use of processing time: (currently #[processing_time] left.)

diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e13fb701317..1ae4b639fc6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -42,7 +42,8 @@ A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it A.show_laws() A.malf_picker.remove_malf_verbs(A) - A.verbs -= /mob/living/silicon/ai/proc/choose_modules + var/datum/action/innate/ai/choose_modules/CM = locate() in A.actions + qdel(CM) qdel(A.malf_picker) if(owner.som) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 85c4ceac427..61808693a1a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -849,13 +849,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "Switched to [network] camera network.") //End of code by Mord_Sith - -/mob/living/silicon/ai/proc/choose_modules() - set category = "Malfunction" - set name = "Choose Module" - - malf_picker.use(src) - /mob/living/silicon/ai/proc/ai_statuschange() set category = "AI Commands" set name = "AI Status" @@ -1026,15 +1019,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( return -/mob/living/silicon/ai/proc/corereturn() - set category = "Malfunction" - set name = "Return to Main Core" - - var/obj/machinery/power/apc/apc = loc - if(!istype(apc)) - to_chat(src, "You are already in your Main Core.") - return - apc.malfvacate() //Toggles the luminosity and applies it by re-entereing the camera. /mob/living/silicon/ai/proc/toggle_camera_light() @@ -1242,8 +1226,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - verbs += /mob/living/silicon/ai/proc/choose_modules - malf_picker = new /datum/module_picker + var/datum/action/innate/ai/choose_modules/malf_shop = new + malf_shop.Grant(src) /mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) if(!istype(target)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 234b885284e..8f45b175753 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1057,7 +1057,8 @@ occupier.eyeobj.name = "[occupier.name] (AI Eye)" if(malf.parent) qdel(malf) - occupier.verbs += /mob/living/silicon/ai/proc/corereturn + var/datum/action/innate/ai/return_to_core/R = new + R.Grant(occupier) occupier.cancel_camera() if((seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) && malf.nuking) for(var/obj/item/pinpointer/point in GLOB.pinpointer_list) diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 4ea648dea13e186e033234ab0770e807050af597..80a5dbe5b04642cf2a0bbc39d59fcc2cf18becb1 100644 GIT binary patch delta 20990 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 delta 20774 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%0A@aC2@c06RTc$RpOHqyXH0 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 z From 9955e2e2618f7dea9c600976f98b29e3b2143e74 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 23 Jun 2020 12:30:58 -0700 Subject: [PATCH 02/71] Fixes Brainless Cyborgs --- code/modules/mob/transform_procs.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 2ee4a9d2a9c..989aa6cc9bf 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -82,14 +82,11 @@ O.notify_ai(1) if(O.mind && O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Android") + if(O.mind.role_alt_title == "Android" || O.mind.role_alt_title == "Robot") O.mmi = new /obj/item/mmi/robotic_brain(O) - else if(O.mind.role_alt_title == "Robot") - O.mmi = null //Robots do not have removable brains. else O.mmi = new /obj/item/mmi(O) - - if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. + O.mmi.transfer_identity(src) //Does not transfer key/client. O.update_pipe_vision() From 8982211e96190b619738749e7b68e52733c00ef4 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 23 Jun 2020 13:36:28 -0700 Subject: [PATCH 03/71] Removes "Android" alt job title for cyborg --- code/game/jobs/job/silicon.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index b6321765861..640dfb4dfe4 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -32,7 +32,7 @@ minimal_player_age = 21 exp_requirements = 300 exp_type = EXP_TYPE_CREW - alt_titles = list("Android", "Robot") + alt_titles = list("Robot") /datum/job/cyborg/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 989aa6cc9bf..8e7adea666b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -82,7 +82,7 @@ O.notify_ai(1) if(O.mind && O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Android" || O.mind.role_alt_title == "Robot") + if(O.mind.role_alt_title == "Robot") O.mmi = new /obj/item/mmi/robotic_brain(O) else O.mmi = new /obj/item/mmi(O) From 3392c4019eef9c7f54b48ca8979b65bba54a65dc Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Sun, 28 Jun 2020 03:12:38 -0500 Subject: [PATCH 04/71] Make /proc/power_restore recharge APC cells --- code/modules/events/apc_short.dm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index d2fe04dcc5d..aa4674b2345 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -59,7 +59,17 @@ log_and_message_admins("APC Short event shorted out [affected_apc_count] APCs.") /proc/power_restore(announce=TRUE) - power_restore_quick(announce) + if(announce) + GLOB.event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') + + // recharge the APCs + for(var/thing in GLOB.apcs) + var/obj/machinery/power/apc/C = thing + var/area/current_area = get_area(C) + if(!is_station_level(C.z)) + continue + if(C.cell) + C.cell.charge = C.cell.maxcharge /proc/power_restore_quick(announce=TRUE) if(announce) From 1dcb43b5b4a2c78f7a19a704b0caed58f2569223 Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Sun, 28 Jun 2020 09:37:32 -0500 Subject: [PATCH 05/71] Removed unused line --- code/modules/events/apc_short.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index aa4674b2345..51511aa60ed 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -65,7 +65,6 @@ // recharge the APCs for(var/thing in GLOB.apcs) var/obj/machinery/power/apc/C = thing - var/area/current_area = get_area(C) if(!is_station_level(C.z)) continue if(C.cell) From d58dce3bb0ba800ed9e0f8b21f5e080bc77131e1 Mon Sep 17 00:00:00 2001 From: Terilia Date: Mon, 6 Jul 2020 12:29:36 +0200 Subject: [PATCH 06/71] Fixed the very obvious and annoying bug --- code/modules/mob/living/simple_animal/hostile/headcrab.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 08eb7128055..1748b301bcf 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -23,6 +23,8 @@ robust_searching = 1 var/host_species = "" var/list/human_overlays = list() + var/cycles = 4 + /mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired) if(..() && !stat) @@ -31,7 +33,6 @@ if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) Zombify(H) break - var/cycles = 4 if(cycles >= 4) for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD)) From faeaab739b1bda41de29824cc350cb608b93cd91 Mon Sep 17 00:00:00 2001 From: Terilia Date: Mon, 6 Jul 2020 12:36:38 +0200 Subject: [PATCH 07/71] And adjusting the scope to reset the cycles. --- code/modules/mob/living/simple_animal/hostile/headcrab.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 1748b301bcf..b7cec09e6b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -41,7 +41,7 @@ health += 10 qdel(K) break - cycles = 0 + cycles = 0 cycles++ /mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A) From 22f133ec25d2442a91d93909741ebbad145bad95 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Sun, 12 Jul 2020 03:33:08 +0200 Subject: [PATCH 08/71] Build time for windows and co --- .../game/objects/items/stacks/sheets/glass.dm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 4d3e3181726..52d9cf6818e 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -15,11 +15,11 @@ */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 0), \ - new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 0, on_floor = TRUE), \ - new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 0, on_floor = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ + new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ + new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ )) /obj/item/stack/sheet/glass @@ -79,8 +79,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe/window("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ null, \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/rglass @@ -105,8 +105,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmaglass @@ -148,8 +148,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ */ GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmarglass @@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ ..() GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 5, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/titaniumglass @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( ..() GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 5, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/plastitaniumglass From e763dd70af4039ed3ed90064e3e41fd9e0431e17 Mon Sep 17 00:00:00 2001 From: Autumn211 Date: Mon, 13 Jul 2020 16:06:24 +0100 Subject: [PATCH 09/71] Makes job berets have no overlap cost in loadout --- .../client/preference/loadout/loadout_hat.dm | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 7d6275e09e4..758e70f654f 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -42,11 +42,6 @@ display_name = "fedora, brown" path = /obj/item/clothing/head/fedora/brownfedora -/datum/gear/hat/beretsec - display_name = "security beret" - path = /obj/item/clothing/head/beret/sec - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") - /datum/gear/hat/capcsec display_name = "security corporate cap" path = /obj/item/clothing/head/soft/sec/corp @@ -113,32 +108,54 @@ display_name = "cowboy hat, pink" path = /obj/item/clothing/head/cowboyhat/pink -/datum/gear/hat/pr_beret +//Berets Refactor +//Defining all Job Berets as no-overlap +//Somehow this doesn't break the DB. +/datum/gear/hat/beret/job + subtype_path = /datum/gear/hat/beret/job + subtype_cost_overlap = FALSE + +/datum/gear/hat/beret/purple display_name = "beret, purple" path = /obj/item/clothing/head/beret/purple_normal -/datum/gear/hat/bl_beret +/datum/gear/hat/beret/black display_name = "beret, black" path = /obj/item/clothing/head/beret/black -/datum/gear/hat/blu_beret +/datum/gear/hat/beret/blue display_name = "beret, blue" path = /obj/item/clothing/head/beret/blue -/datum/gear/hat/red_beret +/datum/gear/hat/beret/red display_name = "beret, red" path = /obj/item/clothing/head/beret -/datum/gear/hat/sci_beret +/datum/gear/hat/beret/job/sec + display_name = "security beret" + path = /obj/item/clothing/head/beret/sec + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") + +/datum/gear/hat/beret/job/sci display_name = "science beret" path = /obj/item/clothing/head/beret/sci allowed_roles = list("Research Director", "Scientist") -/datum/gear/hat/med_beret +/datum/gear/hat/beret/job/med display_name = "medical beret" path = /obj/item/clothing/head/beret/med allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner") +/datum/gear/hat/beret/job/eng + display_name = "engineering beret" + path = /obj/item/clothing/head/beret/eng + allowed_roles = list("Chief Engineer", "Station Engineer") + +/datum/gear/hat/beret/job/atmos + display_name = "atmospherics beret" + path = /obj/item/clothing/head/beret/atmos + allowed_roles = list("Chief Engineer", "Life Support Specialist") + /datum/gear/hat/surgicalcap_purple display_name = "surgical cap, purple" path = /obj/item/clothing/head/surgery/purple From 5847265d6e60e8f8799b22bb039f2ea5bc649adc Mon Sep 17 00:00:00 2001 From: trololiver112 <59520813+trololiver112@users.noreply.github.com> Date: Tue, 14 Jul 2020 04:35:51 +0200 Subject: [PATCH 10/71] Janiborgs can no longer clean while dead (#13818) * janiborg clean * whoops * foxMcFix --- code/modules/mob/living/silicon/robot/robot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5a064bf48c6..faa51a58ec0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1150,7 +1150,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( if(module) if(module.type == /obj/item/robot_module/janitor) var/turf/tile = loc - if(isturf(tile)) + if(stat != DEAD && isturf(tile)) var/floor_only = TRUE for(var/A in tile) if(istype(A, /obj/effect)) From 0766f5541b4d8a0f25c56d095d5688c56e29e320 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Mon, 13 Jul 2020 21:56:31 -0500 Subject: [PATCH 11/71] fox changes --- code/game/gamemodes/malfunction/Malf_Modules.dm | 6 ------ code/modules/antagonists/traitor/datum_traitor.dm | 6 ++---- code/modules/mob/living/silicon/ai/ai.dm | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 816eadf55bf..6048145879d 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -126,12 +126,6 @@ if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade) possible_modules += AM -/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) //Removes all malfunction-related abilities from the target AI. - for(var/datum/AI_Module/AM in possible_modules) - for(var/datum/action/A in AI.actions) - if(istype(A, initial(AM.power_type))) - qdel(A) - /datum/module_picker/proc/use(mob/user) var/dat dat += {"Select use of processing time: (currently #[processing_time] left.)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 1ae4b639fc6..957300326a6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -41,10 +41,8 @@ A.common_radio.channels.Remove("Syndicate") // De-traitored AIs can still state laws over the syndicate channel without this A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it A.show_laws() - A.malf_picker.remove_malf_verbs(A) - var/datum/action/innate/ai/choose_modules/CM = locate() in A.actions - qdel(CM) - qdel(A.malf_picker) + A.remove_malf_abilities() + QDEL_NULL(A.malf_picker) if(owner.som) var/datum/mindslaves/slaved = owner.som diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 61808693a1a..4959fb1cab9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -63,6 +63,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( //MALFUNCTION var/datum/module_picker/malf_picker + var/datum/action/innate/ai/choose_modules/modules_action var/list/datum/AI_Module/current_modules = list() var/can_dominate_mechs = 0 var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead @@ -1226,8 +1227,17 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - var/datum/action/innate/ai/choose_modules/malf_shop = new - malf_shop.Grant(src) + malf_picker = new /datum/module_picker + modules_action = new(malf_picker) + modules_action.Grant(src) + +///Removes all malfunction-related /datum/action's from the target AI. +/mob/living/silicon/ai/proc/remove_malf_abilities() + QDEL_NULL(modules_action) + for(var/datum/AI_Module/AM in current_modules) + for(var/datum/action/A in actions) + if(istype(A, initial(AM.power_type))) + qdel(A) /mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) if(!istype(target)) From d75d29191a59a7869c757b7034458d412d06c739 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Mon, 13 Jul 2020 22:18:04 -0500 Subject: [PATCH 12/71] mind cleanup --- code/datums/mind.dm | 22 -------------------- code/game/objects/items/devices/megaphone.dm | 2 -- code/modules/mob/living/carbon/human/say.dm | 2 -- 3 files changed, 26 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index cb1ee856b1c..2f22e58d37b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -47,7 +47,6 @@ var/miming = 0 // Mime's vow of silence var/list/antag_datums - var/speech_span // What span any body this mind has talks in. var/datum/changeling/changeling //changeling holder var/linglink var/datum/vampire/vampire //vampire holder @@ -65,8 +64,6 @@ var/isblessed = FALSE // is this person blessed by a chaplain? var/num_blessed = 0 // for prayers - // the world.time since the mob has been brigged, or -1 if not at all - var/brigged_since = -1 var/suicided = FALSE //put this here for easier tracking ingame @@ -1593,25 +1590,6 @@ L = agent_landmarks[team] H.forceMove(L.loc) - -// check whether this mind's mob has been brigged for the given duration -// have to call this periodically for the duration to work properly -/datum/mind/proc/is_brigged(duration) - var/turf/T = current.loc - if(!istype(T)) - brigged_since = -1 - return 0 - - var/is_currently_brigged = current.is_in_brig() - if(!is_currently_brigged) - brigged_since = -1 - return 0 - - if(brigged_since == -1) - brigged_since = world.time - - return (duration <= world.time - brigged_since) - /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 941e90a31ef..c6fa7b20c66 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -33,8 +33,6 @@ if(H && H.mind && H.mind.miming) to_chat(user, "Your vow of silence prevents you from speaking.") return - if(H.mind) - span = H.mind.speech_span if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 65b4585ff6b..01a9990ebd8 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -134,8 +134,6 @@ S.message = "[S.message]" verb = translator.speech_verb return list("verb" = verb) - if(mind) - span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ || HAS_TRAIT(src, TRAIT_JESTER)) From cb06ebdd9fd81cf305e04938a50b5c40ce3e1775 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Mon, 13 Jul 2020 22:05:56 -0700 Subject: [PATCH 13/71] Refactor complete. Matches added. --- code/game/atoms_movable.dm | 3 + code/game/objects/effects/decals/remains.dm | 7 ++ code/game/objects/effects/spiders.dm | 9 ++ code/game/objects/items/trash.dm | 6 ++ code/game/objects/items/weapons/cigs.dm | 5 + code/game/objects/items/weapons/lighters.dm | 8 +- code/game/objects/items/weapons/shards.dm | 5 + .../food_and_drinks/drinks/drinks/bottle.dm | 5 + code/modules/hydroponics/grown.dm | 5 + .../mob/living/silicon/robot/drone/drone.dm | 24 +++++ .../living/silicon/robot/drone/drone_items.dm | 99 +------------------ .../living/simple_animal/friendly/lizard.dm | 10 ++ .../living/simple_animal/friendly/mouse.dm | 10 ++ code/modules/power/lighting.dm | 6 ++ 14 files changed, 106 insertions(+), 96 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ab5ff19462a..00009c8eeca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -567,3 +567,6 @@ /atom/movable/proc/portal_destroyed(obj/effect/portal/P) return + +/atom/movable/proc/decompile_act(obj/item/matter_decompiler/C, mob/user) // For drones to decompile mobs and objs. See drone for an example. + return FALSE diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 9a879a02da3..9747630fff1 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -28,6 +28,13 @@ icon_state = "remainsrobot" anchored = TRUE +/obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 1 + C.stored_comms["metal"] += 2 + C.stored_comms["plastic"] += 2 + qdel(src) + return TRUE + /obj/effect/decal/remains/slime name = "You shouldn't see this" desc = "Noooooooooooooooooooooo" diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 7af5d7a998f..54560d817eb 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -190,6 +190,15 @@ to_chat(S, "You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist [S.master_commander.p_them()] in completing [S.master_commander.p_their()] goals at any cost.") qdel(src) +/obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() + /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" desc = "Green squishy mess." diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7cf48095e72..bbb8ebd55b8 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -8,6 +8,12 @@ desc = "This is rubbish." resistance_flags = FLAMMABLE +/obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["metal"] += 1 + C.stored_comms["plastic"] += 2 + qdel(src) + return TRUE + /obj/item/trash/raisins name = "4no raisins" icon_state= "4no_raisins" diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 8c2c3e85917..73e6a93ffc9 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -311,6 +311,11 @@ LIGHTERS ARE IN LIGHTERS.DM pixel_y = rand(-10,10) transform = turn(transform,rand(0,360)) +/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["plastic"] += 1 + qdel(src) + return TRUE + /obj/item/cigbutt/cigarbutt name = "cigar butt" desc = "A manky old cigar butt." diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 740079db8e1..1bfeeabae03 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -244,12 +244,18 @@ else ..() +/obj/item/match/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(burnt) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/proc/help_light_cig(mob/living/M) var/mask_item = M.get_item_by_slot(slot_wear_mask) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item - /obj/item/match/firebrand name = "firebrand" desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 52c2aea5ddb..6daabffe000 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -88,6 +88,11 @@ playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE) return ..() +/obj/item/shard/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/shard/plasma name = "plasma shard" desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 4515a62d86b..f47707bd5d2 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -141,6 +141,11 @@ var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharp = 1 +/obj/item/broken_bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/reagent_containers/food/drinks/bottle/gin name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index a3b522187e2..5ad8a5f32f4 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -168,6 +168,11 @@ return return ..() +/obj/item/reagent_containers/food/snacks/grown/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["wood"] += 4 + qdel(src) + return TRUE + // For item-containing growns such as eggy or gatfruit /obj/item/reagent_containers/food/snacks/grown/shell/attack_self(mob/user) user.unEquip(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ff7f7fba084..219e56ea08a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -354,3 +354,27 @@ /mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) if(affect_silicon) return ..() + +/mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!client && istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = C.loc + to_chat(D, "You begin decompiling the other drone.") + + if(!do_after(D, 50, target = src.loc)) + to_chat(D, "You need to remain still while decompiling such a large object.") + return + + if(!src || !D) return ..() + + to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + + qdel(src) + new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) + + C.stored_comms["metal"] += 15 + C.stored_comms["glass"] += 15 + C.stored_comms["wood"] += 5 + C.stored_comms["plastic"] += 5 + + return TRUE + return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 8f2b9fee6ae..abc7b2cf865 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -158,8 +158,7 @@ /obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return -/obj/item/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params) - +/obj/item/matter_decompiler/afterattack(atom/target, mob/living/user, proximity, params) if(!proximity) return //Not adjacent. //We only want to deal with using this on turfs. Specific items aren't important. @@ -170,99 +169,9 @@ //Used to give the right message. var/grabbed_something = 0 - for(var/mob/M in T) - if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) - src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") - new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(M) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - return - - else if(istype(M,/mob/living/silicon/robot/drone) && !M.client) - - var/mob/living/silicon/robot/drone/D = src.loc - - if(!istype(D)) - return - - to_chat(D, "You begin decompiling the other drone.") - - if(!do_after(D, 50, target = target)) - to_chat(D, "You need to remain still while decompiling such a large object.") - return - - if(!M || !D) return - - to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - - qdel(M) - new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - - stored_comms["metal"] += 15 - stored_comms["glass"] += 15 - stored_comms["wood"] += 5 - stored_comms["plastic"] += 5 - - return - else - continue - - for(var/obj/W in T) - //Different classes of items give different commodities. - if(istype(W,/obj/item/cigbutt)) - stored_comms["plastic"]++ - else if(istype(W,/obj/structure/spider/spiderling)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/item/light)) - var/obj/item/light/L = W - if(L.status >= 2) //In before someone changes the inexplicably local defines. ~ Z - stored_comms["metal"]++ - stored_comms["glass"]++ - else - continue - else if(istype(W,/obj/effect/decal/remains/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/trash)) - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/ammo_casing)) - stored_comms["metal"]++ - else if(istype(W,/obj/item/shard)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/reagent_containers/food/snacks/grown)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - else if(istype(W,/obj/item/broken_bottle)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/light/tube) || istype(W,/obj/item/light/bulb)) - stored_comms["glass"]++ - else - continue - - qdel(W) - grabbed_something = 1 + for(var/atom/movable/A in T) + if(A.decompile_act(src)) // Each decompileable mob or obj needs to have this defined + grabbed_something = 1 if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 96688963b73..b8c3ac607fd 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,3 +23,13 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1) can_collar = 1 gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index a48b36cb0c7..fd91278761f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -234,3 +234,13 @@ gold_core_spawnable = NO_SPAWN can_collar = 0 butcher_results = list(/obj/item/stack/sheet/metal = 1) + +/mob/living/simple_animal/mouse/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!(istype(user, /mob/living/silicon/robot/drone))) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0a31d882488..3e8d71b3280 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -634,6 +634,12 @@ shatter() return ..() +/obj/item/light/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 1 + C.stored_comms["metal"] += 1 + qdel(src) + return TRUE + /obj/item/light/tube name = "light tube" desc = "A replacement light tube." From 273a3e7b234dafb7cfba0949e31c0749f31a8c41 Mon Sep 17 00:00:00 2001 From: mochi Date: Tue, 14 Jul 2020 09:13:42 +0200 Subject: [PATCH 14/71] Fix syringe gun allowing one syringe more than normal --- code/modules/projectiles/guns/syringe_gun.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 72c60277dec..467cd62468e 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -65,7 +65,8 @@ /obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) if(istype(A, /obj/item/reagent_containers/syringe)) - if(length(syringes) < max_syringes) + var/in_clip = length(syringes) + (chambered.BB ? 1 : 0) + if(in_clip < max_syringes) if(!user.unEquip(A)) return to_chat(user, "You load [A] into \the [src]!") From f7028b7fef527bf8f6657b4e2849715df3523521 Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Tue, 14 Jul 2020 03:00:48 -0500 Subject: [PATCH 15/71] Use proper procs for obtaining cell and changing charge --- code/modules/events/apc_short.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index 51511aa60ed..c19b6cbe8b7 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -64,11 +64,12 @@ // recharge the APCs for(var/thing in GLOB.apcs) - var/obj/machinery/power/apc/C = thing - if(!is_station_level(C.z)) + var/obj/machinery/power/apc/A = thing + if(!is_station_level(A.z)) continue - if(C.cell) - C.cell.charge = C.cell.maxcharge + var/obj/item/stock_parts/cell/C = A.get_cell() + if(C) + C.give(C.maxcharge) /proc/power_restore_quick(announce=TRUE) if(announce) From 93b43721f3d1be9522dbf5c5d54ec5cb3164e535 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 01:05:12 -0700 Subject: [PATCH 16/71] Adds empty cig packets --- code/game/objects/items/weapons/storage/fancy.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f0ab5bd5ac7..37f568fa51a 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -215,6 +215,13 @@ //if we get this far, handle the insertion checks as normal .=..() +/obj/item/storage/fancy/cigarettes/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!length(contents)) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo packet" desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" From 0911425f2b399f73e0da2019b8fa12215a12d900 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 01:43:00 -0700 Subject: [PATCH 17/71] Final tweaks and fixes --- code/modules/food_and_drinks/drinks/drinks/bottle.dm | 7 +++++++ code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- code/modules/mob/living/silicon/robot/drone/drone_items.dm | 2 +- code/modules/reagents/reagent_containers/bottle.dm | 7 +++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index f47707bd5d2..f77d4b60ab4 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -124,6 +124,13 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() +/obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + //Keeping this here for now, I'll ask if I should keep it here. /obj/item/broken_bottle name = "Broken Bottle" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 219e56ea08a..383dee9057a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -368,8 +368,8 @@ to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - qdel(src) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) + qdel(src) C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index abc7b2cf865..7ac12c0a3e4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -170,7 +170,7 @@ var/grabbed_something = 0 for(var/atom/movable/A in T) - if(A.decompile_act(src)) // Each decompileable mob or obj needs to have this defined + if(A.decompile_act(src, usr)) // Each decompileable mob or obj needs to have this defined grabbed_something = 1 if(grabbed_something) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 6c836988e8b..4274c3114db 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -42,6 +42,13 @@ var/image/lid = image(icon, src, "lid_bottle") overlays += lid +/obj/item/reagent_containers/glass/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle containing toxic compounds." From 530c00012007ab9809c721bab6494a732651d590 Mon Sep 17 00:00:00 2001 From: Terilia Date: Tue, 14 Jul 2020 10:59:12 +0200 Subject: [PATCH 18/71] Added the modulo operator - who would have thought that is faster :D --- code/modules/mob/living/simple_animal/hostile/headcrab.dm | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index b7cec09e6b5..c093c8e3d36 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -23,8 +23,6 @@ robust_searching = 1 var/host_species = "" var/list/human_overlays = list() - var/cycles = 4 - /mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired) if(..() && !stat) @@ -33,7 +31,7 @@ if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) Zombify(H) break - if(cycles >= 4) + if(times_fired % 4 == 0) for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD)) visible_message("[src] consumes [K] whole!") @@ -41,8 +39,6 @@ health += 10 qdel(K) break - cycles = 0 - cycles++ /mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A) if(check_friendly_fire) @@ -94,7 +90,6 @@ if(is_zombie) qdel(src) - /mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though. if(speak_chance) if(rand(0,200) < speak_chance) @@ -107,7 +102,6 @@ M.loc = get_turf(src) return ..() - /mob/living/simple_animal/hostile/headcrab/update_icons() . = ..() if(is_zombie) From e08cceb09643959f807a224f1b2ed7d4c9fa58fe Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Tue, 14 Jul 2020 11:23:28 -0500 Subject: [PATCH 19/71] painter fix --- code/game/machinery/doors/airlock.dm | 4 ++++ code/game/machinery/doors/airlock_types.dm | 1 + 2 files changed, 5 insertions(+) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 974b1d39c17..42ff08ff00f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -513,6 +513,10 @@ About the new airlock wires panel: to_chat(user, "You need to select a paintjob first.") return + if(!paintable) + to_chat(user, "This type of airlock cannot be painted.") + return + var/obj/machinery/door/airlock/airlock = painter.available_paint_jobs["[painter.paint_setting]"] // get the airlock type path associated with the airlock name the user just chose var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 2397a5d90c2..dd9581a5af3 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -592,6 +592,7 @@ overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' assemblytype = /obj/structure/door_assembly/multi_tile + paintable = FALSE /obj/machinery/door/airlock/multi_tile/narsie_act() return From b30ff7e2e967b0ffb25caec9983a017ad8656d7c Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 21:26:45 -0700 Subject: [PATCH 20/71] Minor fixes. Removes Plastic --- code/game/objects/effects/decals/remains.dm | 5 ++--- code/game/objects/effects/spiders.dm | 7 ++++--- code/game/objects/items/trash.dm | 5 +++-- code/game/objects/items/weapons/cigs.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 15 +++++++-------- .../mob/living/silicon/robot/drone/drone_items.dm | 15 ++++----------- .../mob/living/simple_animal/friendly/lizard.dm | 7 ++++--- .../mob/living/simple_animal/friendly/mouse.dm | 7 ++++--- 8 files changed, 29 insertions(+), 34 deletions(-) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 9747630fff1..e750c15e761 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -29,9 +29,8 @@ anchored = TRUE /obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["glass"] += 1 - C.stored_comms["metal"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + C.stored_comms["metal"] += 3 qdel(src) return TRUE diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 54560d817eb..9dd1c771b17 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -192,10 +192,11 @@ /obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!istype(user, /mob/living/silicon/robot/drone)) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") - qdel(src) + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [user] into your decompiler. It makes a series of visceral crunching noises.") C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index bbb8ebd55b8..8508c741524 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -9,8 +9,9 @@ resistance_flags = FLAMMABLE /obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["metal"] += 1 - C.stored_comms["plastic"] += 2 + C.stored_comms["metal"] += 2 + C.stored_comms["wood"] += 1 + C.stored_comms["glass"] += 1 qdel(src) return TRUE diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 73e6a93ffc9..30ad91beffa 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -312,7 +312,7 @@ LIGHTERS ARE IN LIGHTERS.DM transform = turn(transform,rand(0,360)) /obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["plastic"] += 1 + C.stored_comms["wood"] += 1 qdel(src) return TRUE diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 383dee9057a..295fa15a672 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -357,24 +357,23 @@ /mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!client && istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = C.loc - to_chat(D, "You begin decompiling the other drone.") + to_chat(user, "You begin decompiling the other drone.") - if(!do_after(D, 50, target = src.loc)) - to_chat(D, "You need to remain still while decompiling such a large object.") + if(!do_after(user, 5 SECONDS, target = loc)) + to_chat(user, "You need to remain still while decompiling such a large object.") return - if(!src || !D) return ..() + if(QDELETED(src) || QDELETED(user)) + return ..() - to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + to_chat(user, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - qdel(src) C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 C.stored_comms["wood"] += 5 - C.stored_comms["plastic"] += 5 + qdel(src) return TRUE return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7ac12c0a3e4..a0582c135e4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -151,8 +151,7 @@ var/list/stored_comms = list( "metal" = 0, "glass" = 0, - "wood" = 0, - "plastic" = 0 + "wood" = 0 ) /obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -167,11 +166,11 @@ return //Used to give the right message. - var/grabbed_something = 0 + var/grabbed_something = FALSE for(var/atom/movable/A in T) - if(A.decompile_act(src, usr)) // Each decompileable mob or obj needs to have this defined - grabbed_something = 1 + if(A.decompile_act(src, user)) // Each decompileable mob or obj needs to have this defined + grabbed_something = TRUE if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") @@ -262,11 +261,5 @@ stack_wood = new /obj/item/stack/sheet/wood(src.module) stack_wood.amount = 1 stack = stack_wood - if("plastic") - if(!stack_plastic) - stack_plastic = new /obj/item/stack/sheet/plastic(src.module) - stack_plastic.amount = 1 - stack = stack_plastic - stack.amount++ decompiler.stored_comms[type]-- diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index b8c3ac607fd..566791786f6 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -26,10 +26,11 @@ /mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!istype(user, /mob/living/silicon/robot/drone)) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(src) C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fd91278761f..152e2494132 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -237,10 +237,11 @@ /mob/living/simple_animal/mouse/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!(istype(user, /mob/living/silicon/robot/drone))) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(src) C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() From 2555c365c3fe7d2c8ccdcac929d40791fb2ec956 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 15 Jul 2020 15:55:19 +0100 Subject: [PATCH 21/71] Removes duplicate helper --- code/controllers/subsystem/events.dm | 26 +++++++++++++------------- code/controllers/subsystem/vote.dm | 2 +- code/defines/procs/admin.dm | 6 +----- code/modules/admin/admin_verbs.dm | 6 +++--- code/modules/admin/verbs/adminsay.dm | 2 +- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 1a6e073c808..390c6bc1a62 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -212,38 +212,38 @@ SUBSYSTEM_DEF(events) if(href_list["toggle_report"]) report_at_round_end = !report_at_round_end - admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") + log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") else if(href_list["dec_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/decrease = (60 * RaiseToPower(10, text2num(href_list["dec_timer"]))) EC.next_event_time -= decrease - admin_log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by [decrease/600] minute(s).") + log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by [decrease/600] minute(s).") else if(href_list["inc_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/increase = (60 * RaiseToPower(10, text2num(href_list["inc_timer"]))) EC.next_event_time += increase - admin_log_and_message_admins("increased timer for [GLOB.severity_to_string[EC.severity]] events by [increase/600] minute(s).") + log_and_message_admins("increased timer for [GLOB.severity_to_string[EC.severity]] events by [increase/600] minute(s).") else if(href_list["select_event"]) var/datum/event_container/EC = locate(href_list["select_event"]) var/datum/event_meta/EM = EC.SelectEvent() if(EM) - admin_log_and_message_admins("has queued the [GLOB.severity_to_string[EC.severity]] event '[EM.name]'.") + log_and_message_admins("has queued the [GLOB.severity_to_string[EC.severity]] event '[EM.name]'.") else if(href_list["pause"]) var/datum/event_container/EC = locate(href_list["pause"]) EC.delayed = !EC.delayed - admin_log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [GLOB.severity_to_string[EC.severity]] events.") + log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [GLOB.severity_to_string[EC.severity]] events.") else if(href_list["interval"]) var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null if(delay && delay > 0) var/datum/event_container/EC = locate(href_list["interval"]) EC.delay_modifier = delay - admin_log_and_message_admins("has set the interval modifier for [GLOB.severity_to_string[EC.severity]] events to [EC.delay_modifier].") + log_and_message_admins("has set the interval modifier for [GLOB.severity_to_string[EC.severity]] events to [EC.delay_modifier].") else if(href_list["stop"]) if(alert("Stopping an event may have unintended side-effects. Continue?","Stopping Event!","Yes","No") != "Yes") return var/datum/event/E = locate(href_list["stop"]) var/datum/event_meta/EM = E.event_meta - admin_log_and_message_admins("has stopped the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has stopped the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") E.kill() else if(href_list["view_events"]) selected_event_container = locate(href_list["view_events"]) @@ -265,23 +265,23 @@ SUBSYSTEM_DEF(events) var/datum/event_meta/EM = locate(href_list["set_weight"]) EM.weight = weight if(EM != new_event) - admin_log_and_message_admins("has changed the weight of the [GLOB.severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].") + log_and_message_admins("has changed the weight of the [GLOB.severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].") else if(href_list["toggle_oneshot"]) var/datum/event_meta/EM = locate(href_list["toggle_oneshot"]) EM.one_shot = !EM.one_shot if(EM != new_event) - admin_log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["toggle_enabled"]) var/datum/event_meta/EM = locate(href_list["toggle_enabled"]) EM.enabled = !EM.enabled - admin_log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["remove"]) if(alert("This will remove the event from rotation. Continue?","Removing Event!","Yes","No") != "Yes") return var/datum/event_meta/EM = locate(href_list["remove"]) var/datum/event_container/EC = locate(href_list["EC"]) EC.available_events -= EM - admin_log_and_message_admins("has removed the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has removed the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["add"]) if(!new_event.name || !new_event.event_type) return @@ -289,12 +289,12 @@ SUBSYSTEM_DEF(events) return new_event.severity = selected_event_container.severity selected_event_container.available_events += new_event - admin_log_and_message_admins("has added \a [GLOB.severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].") + log_and_message_admins("has added \a [GLOB.severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].") new_event = new else if(href_list["clear"]) var/datum/event_container/EC = locate(href_list["clear"]) if(EC.next_event) - admin_log_and_message_admins("has dequeued the [GLOB.severity_to_string[EC.severity]] event '[EC.next_event.name]'.") + log_and_message_admins("has dequeued the [GLOB.severity_to_string[EC.severity]] event '[EC.next_event.name]'.") EC.next_event = null Interact(usr) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index b0110258da7..0b91e6b3467 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -367,7 +367,7 @@ SUBSYSTEM_DEF(vote) var/votedesc = capitalize(mode) if(mode == "custom") votedesc += " ([question])" - admin_log_and_message_admins("cancelled the running [votedesc] vote.") + log_and_message_admins("cancelled the running [votedesc] vote.") reset() if("toggle_restart") if(admin) diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index fb8ca665906..23b485ad252 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -83,10 +83,6 @@ var/message = "[key_name(whom, 0)][isAntag(whom) ? "(ANTAG)" : ""][isLivingSSD(whom) ? "(SSD!)": ""]" return message -/proc/log_and_message_admins(var/message as text) +/proc/log_and_message_admins(message) log_admin("[key_name(usr)] " + message) message_admins("[key_name_admin(usr)] " + message) - -/proc/admin_log_and_message_admins(var/message as text) - log_admin("[key_name(usr)] " + message) - message_admins("[key_name_admin(usr)] " + message, 1) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 80a60957c75..f892d015da2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -826,7 +826,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( return if(holder) - admin_log_and_message_admins("is altering the appearance of [H].") + log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -857,10 +857,10 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) if("Yes") - admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.") + log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.") H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) if("No") - admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.") + log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.") H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index a0e8b4b9088..5a0425af30a 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -78,5 +78,5 @@ C.verbs -= msay to_chat(C, "Mentor chat has been disabled.") - admin_log_and_message_admins("toggled mentor chat [enabling ? "on" : "off"].") + log_and_message_admins("toggled mentor chat [enabling ? "on" : "off"].") feedback_add_details("admin_verb", "TMC") From b511d55cd4f1e9d560ec31b029a89f87dcd4d7bb Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 15 Jul 2020 20:04:08 +0100 Subject: [PATCH 22/71] Gamebreaking bug fix immediately --- code/game/objects/items/devices/radio/radio.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 009ec01ef43..7ddf11ab451 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -272,7 +272,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( tcm.sender_job = "Automated Announcement" tcm.vname = "synthesized voice" tcm.data = SIGNALTYPE_AINOTRACK - // Datum radios dont have a location (obviously + // Datum radios dont have a location (obviously) if(loc && loc.z) tcm.source_level = loc.z // For anyone that reads this: This used to pull from a LIST from the CONFIG DATUM. WHYYYYYYYYY!!!!!!!! -aa else From 2c1cd44795651d01215dd1f78d050055f47bcbcb Mon Sep 17 00:00:00 2001 From: Autumn211 Date: Wed, 15 Jul 2020 20:07:43 +0100 Subject: [PATCH 23/71] Makes various job-specific gear not overlap cost --- .../preference/loadout/loadout_accessories.dm | 17 ++++++++++------- .../client/preference/loadout/loadout_suit.dm | 16 ++++++++++------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 09cc082dc5d..8805c6dd9a9 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -154,6 +154,9 @@ display_name = "corset, blue" path = /obj/item/clothing/accessory/corset/blue +/datum/gear/accessory/armband/job + subtype_path = /datum/gear/accessory/armband/job + subtype_cost_overlap = FALSE /datum/gear/accessory/armband_red display_name = "armband" @@ -163,37 +166,37 @@ display_name = "armband, blue-yellow" path = /obj/item/clothing/accessory/armband/yb -/datum/gear/accessory/armband_sec +/datum/gear/accessory/armband/job/sec display_name = " armband, security" path = /obj/item/clothing/accessory/armband/sec allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot") -/datum/gear/accessory/armband_cargo +/datum/gear/accessory/armband/job/cargo display_name = "cargo armband" path = /obj/item/clothing/accessory/armband/cargo allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner") -/datum/gear/accessory/armband_medical +/datum/gear/accessory/armband/job/medical display_name = "armband, medical" path = /obj/item/clothing/accessory/armband/med allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician") -/datum/gear/accessory/armband_emt +/datum/gear/accessory/armband/job/emt display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen allowed_roles = list("Paramedic", "Brig Physician") -/datum/gear/accessory/armband_engineering +/datum/gear/accessory/armband/job/engineering display_name = "armband, engineering" path = /obj/item/clothing/accessory/armband/engine allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist") -/datum/gear/accessory/armband_hydro +/datum/gear/accessory/armband/job/hydro display_name = "armband, hydroponics" path = /obj/item/clothing/accessory/armband/hydro allowed_roles = list("Botanist") -/datum/gear/accessory/armband_sci +/datum/gear/accessory/armband/job/sci display_name = "armband, science" path = /obj/item/clothing/accessory/armband/science allowed_roles = list("Research Director","Scientist", "Roboticist") diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index 32a9bae99e7..57e7ea63414 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -175,32 +175,36 @@ display_name = "regal shawl" path = /obj/item/clothing/suit/mantle/regal -/datum/gear/suit/captain_cloak +/datum/gear/suit/mantle/job + subtype_path = /datum/gear/suit/mantle/job + subtype_cost_overlap = FALSE + +/datum/gear/suit/mantle/job/captain display_name = "mantle, captain" path = /obj/item/clothing/suit/mantle/armor/captain allowed_roles = list("Captain") -/datum/gear/suit/ce_mantle +/datum/gear/suit/mantle/job/ce display_name = "mantle, chief engineer" path = /obj/item/clothing/suit/mantle/chief_engineer allowed_roles = list("Chief Engineer") -/datum/gear/suit/cmo_mantle +/datum/gear/suit/mantle/job/cmo display_name = "mantle, chief medical officer" path = /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer allowed_roles = list("Chief Medical Officer") -/datum/gear/suit/armored_shawl +/datum/gear/suit/mantle/job/hos display_name = "mantle, head of security" path = /obj/item/clothing/suit/mantle/armor allowed_roles = list("Head of Security") -/datum/gear/suit/hop_shawl +/datum/gear/suit/mantle/job/hop display_name = "mantle, head of personnel" path = /obj/item/clothing/suit/mantle/armor/head_of_personnel allowed_roles = list("Head of Personnel") -/datum/gear/suit/rd_mantle +/datum/gear/suit/mantle/job/rd display_name = "mantle, research director" path = /obj/item/clothing/suit/mantle/labcoat allowed_roles = list("Research Director") From d634ac5e1afde6680346b0ba675cd3ceda4abbb2 Mon Sep 17 00:00:00 2001 From: Oyu-De Date: Wed, 15 Jul 2020 22:14:50 +0300 Subject: [PATCH 24/71] Spelling mistake correction --- code/modules/mob/living/carbon/human/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 31825ea3765..60891563ad2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -341,7 +341,7 @@ if(decaylevel == 3) msg += "[p_they(TRUE)] [p_are()] rotting and blackened, the skin sloughing off. The smell is indescribably foul.\n" if(decaylevel == 4) - msg += "[p_they(TRUE)] [p_are()] mostly dessicated now, with only bones remaining of what used to be a person.\n" + msg += "[p_they(TRUE)] [p_are()] mostly desiccated now, with only bones remaining of what used to be a person.\n" if(hasHUD(user,"security")) var/perpname = get_visible_name(TRUE) From b3102cd51419b0288f815ddb129a4639f1a3b1a1 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 16 Jul 2020 09:49:00 +0100 Subject: [PATCH 25/71] Makes it so only one theta station can spawn --- code/datums/ruins/space.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index b81587440d4..799a12f4db9 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -175,6 +175,7 @@ description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \ hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?" cost = 2 + allow_duplicates = FALSE /datum/map_template/ruin/space/wizardcrash id = "wizardcrash" From a0d354771ba07bc4df8009d4c9c64a23739b4874 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 02:56:31 -0700 Subject: [PATCH 26/71] fix player controlled terrors still moving under AI pathing --- .../mob/living/simple_animal/hostile/terror_spiders/ghost.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index daed363b8d9..9db8b6f074f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -42,5 +42,6 @@ to_chat(user, "Someone else already took this spider.") return key = user.key + walk(src, 0) // if spider is moving under ai control (already aggroed on something before player control), then stop AI movement for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") From 304412a5e4fc2dae153e9d0e53204f4950ae8d07 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 03:14:37 -0700 Subject: [PATCH 27/71] move to mob/living/Login so this fix applies to all simple animals --- code/modules/mob/living/login.dm | 2 ++ .../mob/living/simple_animal/hostile/terror_spiders/ghost.dm | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 580996e54d9..1f27521a52e 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -29,4 +29,6 @@ //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() + walk(src, 0) // if mob is moving under ai control, then stop AI movement + return . diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 9db8b6f074f..daed363b8d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -42,6 +42,5 @@ to_chat(user, "Someone else already took this spider.") return key = user.key - walk(src, 0) // if spider is moving under ai control (already aggroed on something before player control), then stop AI movement for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") From 4ee54cd806333b012924ea98ea784e537e4a91ac Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 17:44:05 -0700 Subject: [PATCH 28/71] moves proc to simple_animal/Login() --- code/modules/mob/living/login.dm | 2 -- code/modules/mob/living/simple_animal/simple_animal.dm | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 1f27521a52e..580996e54d9 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -29,6 +29,4 @@ //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() - walk(src, 0) // if mob is moving under ai control, then stop AI movement - return . diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7d31b5d523b..c3605f47cdb 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -615,3 +615,9 @@ if(pcollar && collar_type) add_overlay("[collar_type]collar") add_overlay("[collar_type]tag") + +/mob/living/simple_animal/Login() + ..() + walk(src, 0) // if mob is moving under ai control, then stop AI movement + return . + From 7ea3528d29f5fef520e69d9ceb5bf3c45d62b40c Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 17:48:44 -0700 Subject: [PATCH 29/71] switches to . = ..() --- code/modules/mob/living/simple_animal/simple_animal.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c3605f47cdb..bfbe7dcb97f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -617,7 +617,6 @@ add_overlay("[collar_type]tag") /mob/living/simple_animal/Login() - ..() + . = ..() walk(src, 0) // if mob is moving under ai control, then stop AI movement - return . From 945a326b7a2f4c199b9d8ac2e6c1d445db7c26be Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 18:33:24 -0700 Subject: [PATCH 30/71] Formatting Fix --- code/modules/mob/living/silicon/robot/drone/drone.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 295fa15a672..5680e5d30d1 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -358,22 +358,16 @@ /mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!client && istype(user, /mob/living/silicon/robot/drone)) to_chat(user, "You begin decompiling the other drone.") - if(!do_after(user, 5 SECONDS, target = loc)) to_chat(user, "You need to remain still while decompiling such a large object.") return - if(QDELETED(src) || QDELETED(user)) return ..() - to_chat(user, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 C.stored_comms["wood"] += 5 qdel(src) - return TRUE return ..() From fe9b5695c995ac1fa82df1aec5f0b4efd5964bb8 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 23:45:10 -0700 Subject: [PATCH 31/71] Adds boxing glove crate --- code/datums/supplypacks.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a18a9d74f28..37cddd4d187 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1767,6 +1767,16 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY cost = 20 containername = "polo supply crate" +/datum/supply_packs/misc/boxing //For non log spamming cargo brawls! + name = "Boxing Supply Crate" + // 6 brooms, 6 horse masks for the brooms, and 1 beach ball + contains = list(/obj/item/clothing/gloves/boxing/blue, + /obj/item/clothing/gloves/boxing/green, + /obj/item/clothing/gloves/boxing/yellow, + /obj/item/clothing/gloves/boxing) + cost = 15 + containername = "boxing supply crate" + ///////////// Station Goals /datum/supply_packs/misc/station_goal From b722f8186df6b30bdc67cda79f1e78601b19cd80 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 23:55:03 -0700 Subject: [PATCH 32/71] Update supplypacks.dm --- code/datums/supplypacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 37cddd4d187..c8045dfe1e4 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1769,7 +1769,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY /datum/supply_packs/misc/boxing //For non log spamming cargo brawls! name = "Boxing Supply Crate" - // 6 brooms, 6 horse masks for the brooms, and 1 beach ball + // 4 boxing gloves contains = list(/obj/item/clothing/gloves/boxing/blue, /obj/item/clothing/gloves/boxing/green, /obj/item/clothing/gloves/boxing/yellow, From 82c2cb0c4c9b9d03f17ddc665bbc7bad15e867b5 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Fri, 17 Jul 2020 07:57:45 +0100 Subject: [PATCH 33/71] Allows players to pick body accessories again --- code/__HELPERS/global_lists.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 8ab919f9061..cbc691e3c2a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -28,6 +28,9 @@ // Different tails __init_body_accessory(/datum/body_accessory/tail) + // Setup species:accessory relations + initialize_body_accessory_by_species() + for(var/path in (subtypesof(/datum/surgery))) GLOB.surgeries_list += new path() From 0031d03e93d898e9ab3d48b8e15e9983de65dc22 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:48:20 +0200 Subject: [PATCH 34/71] Fixes runtime --- code/modules/shuttle/ert.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm index 356ca9687dc..5168ce89278 100644 --- a/code/modules/shuttle/ert.dm +++ b/code/modules/shuttle/ert.dm @@ -9,10 +9,10 @@ /obj/machinery/computer/shuttle/ert/Topic(href, href_list) if(href_list["move"]) var/authorized_roles = list(SPECIAL_ROLE_ERT, SPECIAL_ROLE_DEATHSQUAD) - if(!((usr.mind.assigned_role in authorized_roles) || is_admin(usr))) + if(!((usr.mind?.assigned_role in authorized_roles) || is_admin(usr))) message_admins("Potential ERT shuttle hijack, ERT shuttle moved by unauthorized user: [key_name_admin(usr)]") ..() - + /obj/machinery/computer/camera_advanced/shuttle_docker/ert name = "specops navigation computer" From aa8d9cf26c0bdcfbbf28378b6f55f711d01a3474 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 17 Jul 2020 21:16:47 +0200 Subject: [PATCH 35/71] Fixes a kitchen spike runtime --- code/game/objects/structures/kitchen_spike.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 1f0d4b8b473..ad913540b50 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -77,7 +77,7 @@ /obj/structure/kitchenspike/proc/spike(mob/living/victim) - if(!istype(victim)) + if(!istype(victim) || QDELETED(victim)) return FALSE if(has_buckled_mobs()) //to prevent spam/queing up attacks From 8955dc7db6b04c19de41fbb8637fd2a50b2a224f Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 17 Jul 2020 21:31:55 +0200 Subject: [PATCH 36/71] Actual fix. Did a wrong analysis --- code/game/objects/structures/kitchen_spike.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index ad913540b50..c3f36e42f1d 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -69,15 +69,15 @@ if(isliving(G.affecting)) if(!has_buckled_mobs()) if(do_mob(user, src, 120)) - if(spike(G.affecting)) - G.affecting.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - qdel(G) + var/mob/living/affected = G.affecting + if(spike(affected)) + affected.visible_message("[user] slams [affected] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") return return ..() /obj/structure/kitchenspike/proc/spike(mob/living/victim) - if(!istype(victim) || QDELETED(victim)) + if(!istype(victim)) return FALSE if(has_buckled_mobs()) //to prevent spam/queing up attacks From 0b8e602b1154de4bdb812a54ce10d3bb35991010 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 17 Jul 2020 19:00:47 -0700 Subject: [PATCH 37/71] Arc suggestion --- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bfbe7dcb97f..d4f8e7c4c3d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -617,6 +617,6 @@ add_overlay("[collar_type]tag") /mob/living/simple_animal/Login() - . = ..() + ..() walk(src, 0) // if mob is moving under ai control, then stop AI movement From 4253f695adbffe06403cc82a73ed0d27fbd2e6bb Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Mon, 20 Jul 2020 20:21:22 +0200 Subject: [PATCH 38/71] remove time from windows again --- .../game/objects/items/stacks/sheets/glass.dm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 52d9cf6818e..000ad2d225f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -15,8 +15,8 @@ */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ @@ -79,8 +79,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe/window("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ null, \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/rglass @@ -105,8 +105,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmaglass @@ -148,8 +148,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ */ GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmarglass @@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ ..() GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 5, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 0, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/titaniumglass @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( ..() GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 5, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 0, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/plastitaniumglass From aa986436e14764352e75cbf989597fe2af0de8ca Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 08:21:53 +0100 Subject: [PATCH 39/71] Fixes a bad practice in existing TGUIs --- code/game/machinery/computer/crew.dm | 2 +- code/game/objects/items/devices/sensor_device.dm | 2 +- code/modules/recycling/disposal.dm | 2 +- code/modules/tgui/modules/crew_monitor.dm | 2 +- tgui/docs/tutorial-and-examples.md | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 131956ca3c1..d6a1ccdd33c 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -27,7 +27,7 @@ return tgui_interact(user) -/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index b83128cf4a5..9133bf37b9c 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -19,5 +19,5 @@ /obj/item/sensor_device/attack_self(mob/user as mob) tgui_interact(user) -/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 13d88100042..e6dd04408c2 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -265,7 +265,7 @@ update() return -/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "DisposalBin", name, 300, 250, master_ui, state) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index 783498542e4..f0d164df7c6 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -20,7 +20,7 @@ return TRUE -/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) // The 557 may seem random, but its the perfectsize for margins on the nanomap diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index 08bb6f92321..590ea0f0ee7 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -37,7 +37,7 @@ powerful interactions for embedded objects or remote access. Let's start with a very basic hello world. ```dm -/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state) @@ -240,7 +240,7 @@ and builds a new array based on what was returned by that function. ``` If you need more examples of what you can do with React, see the -[interface conversion guide](docs/converting-old-tgui-interfaces.md). +[interface conversion guide](docs/converting-old-nano-interfaces.md). #### Splitting UIs into smaller, modular components @@ -294,7 +294,7 @@ here's what you need (note that you'll probably be forced to clean your shit up upon code review): ```dm -/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. +/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state) From 31ac29d6028695bd9c5483463a9184e7e119642d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2020 08:57:53 +0000 Subject: [PATCH 40/71] Bump lodash from 4.17.15 to 4.17.19 in /tgui Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 905d2871b69..8cc9b0c818e 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -3730,9 +3730,9 @@ lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" From bd27e9f897136f6a26d2ec1da7266045918257fa Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:29:56 +0100 Subject: [PATCH 41/71] Removes MORE hardcoded zlevel numbers (#13882) --- code/game/turfs/simulated/minerals.dm | 2 +- code/modules/events/sentience.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/living/simple_animal/bot/bot.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index ebad3554f18..8bf3e820d3d 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -439,7 +439,7 @@ var/area/A = get_area(bombturf) var/notify_admins = 0 - if(z != 5) + if(!is_mining_level(z)) notify_admins = 1 if(!triggered_by_explosion) message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 918746f4595..ab8a405785f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -10,7 +10,7 @@ for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) var/turf/T = get_turf(L) - if (T.z != 1) + if (!is_station_level(T.z)) continue if(!(L in GLOB.player_list) && !L.mind && (L.sentience_type == sentience_type)) potential += L diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8737fdf21b3..c01d04beba8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -273,7 +273,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "Gibtonite active" var/turf/bombturf = get_turf(src) var/notify_admins = 0 - if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel + if(!is_mining_level(z))//Only annoy the admins ingame if we're triggered off the mining zlevel notify_admins = 1 if(notify_admins) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index cb45fd98e8b..e51dc527832 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -756,7 +756,7 @@ Pass a positive integer as an argument to override a bot's default speed. // send a radio signal with multiple data key/values /mob/living/simple_animal/bot/proc/post_signal_multiple(var/freq, var/list/keyval) - if(z != 1) //Bot control will only work on station. + if(!is_station_level(z)) //Bot control will only work on station. return var/datum/radio_frequency/frequency = SSradio.return_frequency(freq) if(!frequency) From 9111a64af97f27197d0d0ab223ebab3b5aff32c0 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 11:33:23 +0200 Subject: [PATCH 42/71] Meat hook fix. Beam runtime fix (#13867) --- code/datums/beam.dm | 3 +-- code/modules/mining/lavaland/loot/tendril_loot.dm | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 19935bda130..3b5c9d2f5fb 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -131,6 +131,5 @@ /atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time) - spawn(0) - newbeam.Start() + INVOKE_ASYNC(newbeam, /datum/beam.proc/Start) return newbeam diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index f54bc974f7e..0af08e40c74 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -383,7 +383,10 @@ var/mob/living/L = target if(!L.anchored) L.visible_message("[L] is snagged by [firer]'s hook!") + var/old_density = L.density + L.density = FALSE // Ensures the hook does not hit the target multiple times L.forceMove(get_turf(firer)) + L.density = old_density /obj/item/projectile/hook/Destroy() QDEL_NULL(chain) From 15522dae9e52f43e41696315f93e67dc76e857a6 Mon Sep 17 00:00:00 2001 From: Aidenzack1 <65001885+Aidenzack1@users.noreply.github.com> Date: Tue, 21 Jul 2020 02:34:54 -0700 Subject: [PATCH 43/71] fixes certain items unable to light plasma sheets (#13871) * fixes certain items unable to light plasma sheets fixes matches, lighters, and candles from being unable to properly light plasma sheets on fire * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm --- .../objects/items/stacks/sheets/mineral.dm | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 54d42176f52..9dabea08319 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -218,10 +218,22 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ /obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I) if(I.use_tool(src, user, volume = I.tool_volume)) - message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])") - investigate_log("was ignited by [key_name(user)]","atmos") - fire_act() + log_and_set_aflame(user, I) + return TRUE + +/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params) + if(is_hot(I)) + log_and_set_aflame(user, I) + else + return ..() + +/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I) + var/turf/T = get_turf(src) + message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]") + log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]") + investigate_log("was ignited by [key_name(user)]", "atmos") + user.create_log(MISC_LOG, "Plasma sheets ignited using [I]", src) + fire_act() /obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() From 402318624d68b941703a61f3a44252bc3d4e8dd7 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:35:40 +0100 Subject: [PATCH 44/71] Fixes sparks not checking for deletion (#13872) * Fixes sparks not checking for deletion * Tweaks --- code/game/objects/effects/effect_system/effect_system.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 5ae6b0c6860..9ae89309eed 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -49,6 +49,8 @@ would spawn and follow the beaker, even if it is carried or thrown. holder = atom /datum/effect_system/proc/start() + if(QDELETED(src)) + return for(var/i in 1 to number) if(total_effects > 20) return @@ -68,7 +70,8 @@ would spawn and follow the beaker, even if it is carried or thrown. for(var/j in 1 to steps_amt) sleep(5) step(E,direction) - addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) + if(!QDELETED(src)) + addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) /datum/effect_system/proc/decrement_total_effect() total_effects-- From 7e965624b42ffcc6b8340c99322e6f2b14912764 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:38:06 +0100 Subject: [PATCH 45/71] Fixes null mind runtimes with roasry nullrod (#13875) --- code/game/objects/items/weapons/holy_weapons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 4efb6994e8d..6423bbeb6ff 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -488,7 +488,7 @@ var/mob/living/carbon/human/holder = loc if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will for(var/mob/living/carbon/human/H in range(5, loc)) - if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) + if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2) if(prob(10)) to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!") From 55387c7927ff2fa3ef83f29d0c92c196beb5c074 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:38:24 +0100 Subject: [PATCH 46/71] Adds appropriate attribution to nanomap rendering (#13878) --- tools/github-actions/README.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/github-actions/README.MD b/tools/github-actions/README.MD index 342dcbf3585..74b31f5bdd6 100644 --- a/tools/github-actions/README.MD +++ b/tools/github-actions/README.MD @@ -2,5 +2,5 @@ This folder contains all the script and tools required for GitHub actions. If you add something to this directory, **PLEASE** document it in here -- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically +- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically. Based off of SpacemanDMM (Modified source [here](https://github.com/AffectedArc07/ParaSpacemanDMM), original source [here](https://github.com/Spacemaniac/SpacemanDMM)) - `nanomap-renderer-invoker.sh` - A script which invokes the render tool and clones the maps to the correct directory From 79bd10034a23dfe785abc3a0408e57de24d809d4 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:40:26 +0100 Subject: [PATCH 47/71] Tcomms fixes and tweaks (#13880) * Tcomms fixes and tweaks * Grammar --- code/game/machinery/tcomms/_base.dm | 32 +++++++++++++++++++++++++++++ code/game/machinery/tcomms/core.dm | 1 + code/game/machinery/tcomms/relay.dm | 1 + 3 files changed, 34 insertions(+) diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index dc933099faa..05c7552aacc 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -52,6 +52,19 @@ GLOBAL_LIST_EMPTY(tcomms_machines) . = ..() GLOB.tcomms_machines += src update_icon() + if((!mapload) && (usr)) + // To the person who asks "Hey affected, why are you using this massive operator when you can use AREACOORD?" Well, ill tell you + // get_area_name is fucking broken and uses a for(x in world) search + // It doesnt even work, is expensive, and returns 0 + // Im not refactoring one thing which could risk breaking all admin location logs + // Fight me + log_action(usr, "constructed a new [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) + // Add in component parts for the sake of deconstruction + component_parts = list() + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/stack/cable_coil(null, 1) /** * Base Destructor @@ -60,6 +73,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines) */ /obj/machinery/tcomms/Destroy() GLOB.tcomms_machines -= src + if(usr) + log_action(usr, "destroyed a [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) return ..() /** @@ -462,3 +477,20 @@ GLOBAL_LIST_EMPTY(tcomms_machines) break return ..() +/** + * Screwdriver Act Handler + * + * Handles the screwdriver action for all tcomms machines, so they can be open and closed to be deconstructed + */ +/obj/machinery/tcomms/screwdriver_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_screwdriver(user, icon_state, icon_state, I) + +/** + * Crowbar Act Handler + * + * Handles the crowbar action for all tcomms machines, so they can be deconstructed + */ +/obj/machinery/tcomms/crowbar_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) diff --git a/code/game/machinery/tcomms/core.dm b/code/game/machinery/tcomms/core.dm index 88846a5de33..46cd0e6df71 100644 --- a/code/game/machinery/tcomms/core.dm +++ b/code/game/machinery/tcomms/core.dm @@ -34,6 +34,7 @@ . = ..() link_password = GenerateKey() reachable_zlevels |= loc.z + component_parts += new /obj/item/circuitboard/tcomms/core(null) /** * Destructor for the core. diff --git a/code/game/machinery/tcomms/relay.dm b/code/game/machinery/tcomms/relay.dm index 2cd2a44b1af..b2faf9ce0cd 100644 --- a/code/game/machinery/tcomms/relay.dm +++ b/code/game/machinery/tcomms/relay.dm @@ -25,6 +25,7 @@ */ /obj/machinery/tcomms/relay/Initialize(mapload) . = ..() + component_parts += new /obj/item/circuitboard/tcomms/relay(null) if(mapload && autolink_id) return INITIALIZE_HINT_LATELOAD From f1dbb39f87861963fe9f334f441bc7643ceaf872 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 12:09:07 +0200 Subject: [PATCH 48/71] Gives thralls their actual masters name in the description (#13885) --- code/game/gamemodes/vampire/vampire_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 7e0f00f8721..07c61628337 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -354,10 +354,10 @@ var/datum/objective/protect/serve_objective = new serve_objective.owner = user.mind serve_objective.target = H.mind - serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command." + serve_objective.explanation_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." H.mind.objectives += serve_objective - to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") + to_chat(H, "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") H.Stun(2) add_attack_logs(user, H, "Vampire-thralled") From 92633a4ec313862a266fad832822cd40c2fd7419 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 16:40:50 +0100 Subject: [PATCH 49/71] Removes REACHABLE flag from lavaland --- _maps/cyberiad.dm | 2 +- _maps/delta.dm | 2 +- _maps/metastation.dm | 2 +- code/game/turfs/space/transit.dm | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 81499ec8c75..644869502b4 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -17,7 +17,7 @@ z4 = lavaland #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/cyberiad #elif !defined(MAP_OVERRIDE) diff --git a/_maps/delta.dm b/_maps/delta.dm index cf6acbcddb1..159fd8b01b3 100644 --- a/_maps/delta.dm +++ b/_maps/delta.dm @@ -22,7 +22,7 @@ Lovingly ported by Purpose2 to Paradise #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/delta diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 7747ad79fb8..03ba531f932 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -23,7 +23,7 @@ z7 = empty space #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/metastation diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index a96cbae1269..8e0dedbdd44 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -94,8 +94,6 @@ var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE - var/_z = pick(levels_by_trait(REACHABLE)) //select a random space zlevel - //now select coordinates for a border turf var/_x var/_y @@ -113,7 +111,8 @@ _x = rand(min,max) _y = min - var/turf/T = locate(_x, _y, _z) + var/list/levels_available = levels_by_trait(REACHABLE) + var/turf/T = locate(_x, _y, pick(levels_available)) AM.forceMove(T) AM.newtonian_move(dir) From cdc762975c203d04836c300cc54b1469debcc1e6 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 22:43:24 +0200 Subject: [PATCH 50/71] Makes for loops use GLOB.human_list. Should improve performance a bit. Fixes blood contract affecting dead crew (#13691) * Replaces all human in X to GLOB.human_list * crew monitor * no playerlist converts * forgot to stage there... --- code/__HELPERS/mobs.dm | 3 ++- code/controllers/subsystem/afk.dm | 3 ++- code/datums/diseases/advance/advance.dm | 5 +++-- code/game/gamemodes/game_mode.dm | 9 ++++++--- code/game/gamemodes/nuclear/pinpointer.dm | 3 ++- code/game/gamemodes/revolution/revolution.dm | 6 ++++-- code/game/gamemodes/scoreboard.dm | 6 ++++-- code/game/gamemodes/wizard/artefact.dm | 5 +++-- code/game/objects/effects/manifest.dm | 3 ++- code/modules/admin/topic.dm | 18 ++++++++++++------ code/modules/admin/verbs/debug.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 6 ++++-- code/modules/events/mass_hallucination.dm | 5 ++++- code/modules/flufftext/Hallucination.dm | 14 +++++++++----- .../mining/lavaland/loot/bubblegum_loot.dm | 2 +- code/modules/tgui/modules/crew_monitor.dm | 2 +- 16 files changed, 60 insertions(+), 32 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f7c66c3378b..a38eeb99ced 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -579,7 +579,8 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) LogMouseMacro(".mouse", params) /proc/update_all_mob_security_hud() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing H.sec_hud_set_security_status() /proc/getviewsize(view) diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index 951a7fb1786..25ccda3349c 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -21,7 +21,8 @@ SUBSYSTEM_DEF(afk) /datum/controller/subsystem/afk/fire() var/list/toRemove = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!H?.ckey) // Useless non ckey creatures continue diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 34c41c581f2..318dd176e45 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -395,8 +395,9 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/AD in GLOB.active_diseases) AD.Refresh() - for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) - if(!is_station_level(H.z)) + for(var/thing in shuffle(GLOB.human_list)) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) H.ForceContractDisease(D) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2d71df8c979..57a77167346 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -291,7 +291,8 @@ /////////////////////////////////// /datum/game_mode/proc/get_living_heads() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative" if(player.stat != DEAD && player.mind && (player.mind.assigned_role in real_command_positions)) . |= player.mind @@ -312,7 +313,8 @@ ////////////////////////////////////////////// /datum/game_mode/proc/get_living_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind @@ -321,7 +323,8 @@ //////////////////////////////////////// /datum/game_mode/proc/get_all_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index e8f4c22e377..f6e454bd737 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -357,7 +357,8 @@ var/list/name_counts = list() var/list/names = list() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!trackable(H)) continue diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index b09bb7a851f..213814d52e8 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -385,7 +385,8 @@ if(foecount == GLOB.score_arrested) GLOB.score_allarrested = 1 - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) @@ -415,7 +416,8 @@ for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index d9e59e9ded1..2e370db5f7a 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -41,7 +41,8 @@ GLOB.score_deadaipenalty++ GLOB.score_deadcrew++ - for(var/mob/living/carbon/human/I in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/I = thing if(I.stat == DEAD && is_station_level(I.z)) GLOB.score_deadcrew++ @@ -60,7 +61,8 @@ var/dmg_score = 0 if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) - for(var/mob/living/carbon/human/E in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/E = thing cash_score = 0 dmg_score = 0 var/turf/location = get_turf(E.loc) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 09b228bdd0c..a81b12ed041 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -866,8 +866,9 @@ GLOBAL_LIST_EMPTY(multiverse) possible = list() if(!link) return - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(md5(H.dna.uni_identity) in link.fingerprints) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD && (md5(H.dna.uni_identity) in link.fingerprints)) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index f267494496e..6ada54e75f7 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -10,7 +10,8 @@ /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/M = thing dat += text(" [] - []
", M.name, M.get_assignment()) var/obj/item/paper/P = new /obj/item/paper( src.loc ) P.info = dat diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 50fa99778e7..19bbc40ba25 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2583,14 +2583,16 @@ if("monkey") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.monkeyize() ok = 1 if("corgi") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.corgize() ok = 1 @@ -2661,7 +2663,8 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","PW") message_admins("[key_name_admin(usr)] teleported all players to the prison station.", 1) - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing var/turf/loc = find_loc(H) var/security = 0 if(!is_station_level(loc.z) || GLOB.prisonwarped.Find(H)) @@ -2994,7 +2997,8 @@ if("manifest") var/dat = "Showing Crew Manifest.


" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) dat += text("", H.name, H.get_assignment()) dat += "
NamePosition
[][]
" @@ -3004,7 +3008,8 @@ if("DNA") var/dat = "Showing DNA from blood.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.dna && H.ckey) dat += "" dat += "
NameDNABlood Type
[H][H.dna.unique_enzymes][H.dna.blood_type]
" @@ -3012,7 +3017,8 @@ if("fingerprints") var/dat = "Showing Fingerprints.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) if(H.dna && H.dna.uni_identity) dat += "" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 424e3c91f57..43db66cabc5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -643,7 +643,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) for(var/areatype in areas_without_camera) to_chat(world, "* [areatype]") -/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in GLOB.mob_list) +/client/proc/cmd_admin_dress(mob/living/carbon/human/M in GLOB.human_list) set category = "Event" set name = "Select equipment" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 03315243602..9b7cde2abdd 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -979,7 +979,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/role_string var/obj_count = 0 var/obj_string = "" - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!isLivingSSD(H)) continue mins_ssd = round((world.time - H.last_logout) / 600) @@ -1016,7 +1017,8 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "AFK Players:
NameFingerprints
[H][md5(H.dna.uni_identity)]
" msg += "" var/mins_afk - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.client == null || H.stat == DEAD) // No clientless or dead continue mins_afk = round(H.client.inactivity / 600) diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 196642ce39c..b8bde0a1a67 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -2,7 +2,10 @@ announceWhen = rand(0, 20) /datum/event/mass_hallucination/start() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD) + continue var/armor = H.getarmor(type = "rad") if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 51ac13d4e13..905b629a0b9 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -460,8 +460,9 @@ Gunshots/explosions/opening doors/less rare audio (done) target = T var/image/A = null var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon","zombie") - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H == target) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || H == target) continue if(skip_nearby && (H in view(target))) continue @@ -539,7 +540,8 @@ Gunshots/explosions/opening doors/less rare audio (done) var/mob/living/carbon/human/clone = null var/clone_weapon = null - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.stat || H.lying) continue clone = H @@ -751,8 +753,10 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/projectile, /obj/ite target.client.images.Remove(speech_overlay) else // Radio talk var/list/humans = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - humans += H + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD) + humans += H person = pick(humans) target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") qdel(src) diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm index fa7791edb9e..4ee2c76a419 100644 --- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -82,7 +82,7 @@ B.mineEffect(L) for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H == L) + if(H.stat == DEAD || H == L) continue to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") H.put_in_hands(new /obj/item/kitchen/knife/butcher(H)) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index f0d164df7c6..f1da4ed89ba 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -14,7 +14,7 @@ if("track") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.mob_list + var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.human_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return TRUE From f29114f3d69869b69191d213a55bd13390551e2f Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Tue, 21 Jul 2020 20:45:35 +0000 Subject: [PATCH 51/71] Terror spider event types now depend on server pop (#13874) * Terror spider events now depend on server pop * split off from PR 13657 * farie suggestion * convert var/highpop_trigger to #define TS_HIGHPOP_TRIGGER * newline * re-run mapdiffbot Co-authored-by: Kyep --- code/modules/events/spider_terror.dm | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index 75b86d20cb0..79acc49fe73 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -1,3 +1,4 @@ +#define TS_HIGHPOP_TRIGGER 80 /datum/event/spider_terror announceWhen = 240 @@ -22,23 +23,32 @@ if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent var/spider_type - var/infestation_type = pick(1, 2, 3, 4, 5) + var/infestation_type + if((length(GLOB.clients)) < TS_HIGHPOP_TRIGGER) + infestation_type = pick(1, 2, 3, 4) + else + infestation_type = pick(2, 3, 4, 5) switch(infestation_type) if(1) + // Weakest, only used during lowpop. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green spawncount = 5 if(2) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white - spawncount = 2 - if(3) + // Fairly weak. Dangerous in single combat but has little staying power. Always gets whittled down. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince spawncount = 1 + if(3) + // Variable. Depends how many they infect. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white + spawncount = 2 if(4) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen - spawncount = 1 - if(5) + // Pretty strong. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/princess spawncount = 2 + if(5) + // Strongest, only used during highpop. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen + spawncount = 1 while(spawncount >= 1 && vents.len) var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents) @@ -60,3 +70,6 @@ new spider_type(vent.loc) spawncount-- + +#undef TS_HIGHPOP_TRIGGER + From 1f99c6d5847f3a213d90e9f1391fd62742f9b4d6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 22 Jul 2020 18:50:25 +0100 Subject: [PATCH 52/71] Makes it work better --- _maps/cyberiad.dm | 2 +- _maps/delta.dm | 2 +- _maps/metastation.dm | 2 +- code/game/turfs/space/transit.dm | 2 +- code/modules/space_management/level_traits.dm | 13 +++++++++++++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 644869502b4..3652328e8f4 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -17,7 +17,7 @@ z4 = lavaland #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/cyberiad #elif !defined(MAP_OVERRIDE) diff --git a/_maps/delta.dm b/_maps/delta.dm index 159fd8b01b3..f944092131b 100644 --- a/_maps/delta.dm +++ b/_maps/delta.dm @@ -22,7 +22,7 @@ Lovingly ported by Purpose2 to Paradise #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/delta diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 03ba531f932..0941ffc453a 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -23,7 +23,7 @@ z7 = empty space #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/metastation diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 8e0dedbdd44..dda49fecdbd 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -111,7 +111,7 @@ _x = rand(min,max) _y = min - var/list/levels_available = levels_by_trait(REACHABLE) + var/list/levels_available = get_all_linked_levels_zpos() var/turf/T = locate(_x, _y, pick(levels_available)) AM.forceMove(T) AM.newtonian_move(dir) diff --git a/code/modules/space_management/level_traits.dm b/code/modules/space_management/level_traits.dm index 1d88f70454f..6aa3fa802a7 100644 --- a/code/modules/space_management/level_traits.dm +++ b/code/modules/space_management/level_traits.dm @@ -61,3 +61,16 @@ GLOBAL_LIST_INIT(default_map_traits, MAP_TRANSITION_CONFIG) /proc/level_name_to_num(name) var/datum/space_level/S = GLOB.space_manager.get_zlev_by_name(name) return S.zpos + +/** + * Proc to get a list of all the linked-together Z-Levels + * + * Returns a list of zlevel numbers which can be accessed from travelling space naturally + */ +/proc/get_all_linked_levels_zpos() + var/list/znums = list() + for(var/i in GLOB.space_manager.z_list) + var/datum/space_level/SL = GLOB.space_manager.z_list[i] + if(SL.linkage == CROSSLINKED) + znums |= SL.zpos + return znums From a0e07dd41abf80d60ebdb30ee6323f3bf76f3970 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 23 Jul 2020 02:43:20 -0700 Subject: [PATCH 53/71] SM & TEG cargo crate appearance --- code/datums/supplypacks.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index c8045dfe1e4..5b21036b2bc 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -633,7 +633,6 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY contains = list(/obj/machinery/power/emitter, /obj/machinery/power/emitter) cost = 10 - containertype = /obj/structure/closet/crate/secure containername = "emitter crate" access = ACCESS_CE containertype = /obj/structure/closet/crate/secure/engineering @@ -717,7 +716,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY name = "Supermatter Shard Crate" contains = list(/obj/machinery/power/supermatter_shard) cost = 50 //So cargo thinks twice before killing themselves with it - containertype = /obj/structure/closet/crate/secure + containertype = /obj/structure/closet/crate/secure/engineering containername = "supermatter shard crate" access = ACCESS_CE @@ -728,7 +727,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY /obj/item/pipe/circulator, /obj/item/pipe/circulator) cost = 25 - containertype = /obj/structure/closet/crate/secure + containertype = /obj/structure/closet/crate/secure/engineering containername = "thermo-electric generator crate" access = ACCESS_CE announce_beacons = list("Engineering" = list("Chief Engineer's Desk", "Atmospherics")) From 0dc49ded78d925d66c32830d4236f5e91cb6154a Mon Sep 17 00:00:00 2001 From: Deelite34 Date: Thu, 23 Jul 2020 12:20:04 +0200 Subject: [PATCH 54/71] Update text.dm Fixes 13865 --- code/__HELPERS/text.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index ecbebf813df..47650177283 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -533,7 +533,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[/grid\]", "
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo
") text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") - text = replacetext(text, "\[logo\]", "") + text = replacetext(text, "\[logo\]", "​") text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO if(!no_font) if(P) From 70cc32824b47e142f3b2a4af6f6336b41c00f71d Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 23 Jul 2020 11:33:24 +0100 Subject: [PATCH 55/71] Adds book DRM --- code/modules/library/lib_machines.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 8fa7629863e..67c034e6039 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -150,6 +150,10 @@ GLOBAL_LIST_INIT(library_section_names, list("Any", "Fiction", "Non-Fiction", "A power_change() return if(istype(I, /obj/item/book)) + // NT with those pesky DRM schemes + if(istype(I, /obj/item/book/manual)) + atom_say("NT copyrighted material detected. Scanner is unable to copy book to memory.") + return FALSE user.drop_item() I.forceMove(src) return 1 From 1c1b4fa8c7733b98702fe4f0706000d8abf2ad72 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 23 Jul 2020 12:42:28 +0100 Subject: [PATCH 56/71] Makes book DRM apply to printed books --- code/game/objects/items/weapons/manuals.dm | 1 + code/modules/library/computers/checkout.dm | 1 + code/modules/library/lib_items.dm | 2 ++ code/modules/library/lib_machines.dm | 5 +++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index d91bb29ff76..bab2ff02fbb 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/library.dmi' due_date = 0 // Game time in 1/10th seconds unique = 1 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified + has_drm = TRUE // No reuploading. Piracy is a crime /obj/item/book/manual/engineering_construction diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index f9aae71b2a5..934234f645e 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -463,4 +463,5 @@ B.author = newbook.author B.dat = newbook.content B.icon_state = "book[rand(1,16)]" + B.has_drm = TRUE visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a7dd148b51a..e74625c8715 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -151,6 +151,8 @@ var/carved = 0 // Has the book been hollowed out for use as a secret storage item? var/forbidden = 0 // Prevent ordering of this book. (0=no, 1=yes, 2=emag only) var/obj/item/store // What's in the book? + /// Book DRM. If this var is TRUE, it cannot be scanned and re-uploaded + var/has_drm = FALSE /obj/item/book/attack_self(var/mob/user as mob) if(carved) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 67c034e6039..0c23a0c5800 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -151,8 +151,9 @@ GLOBAL_LIST_INIT(library_section_names, list("Any", "Fiction", "Non-Fiction", "A return if(istype(I, /obj/item/book)) // NT with those pesky DRM schemes - if(istype(I, /obj/item/book/manual)) - atom_say("NT copyrighted material detected. Scanner is unable to copy book to memory.") + var/obj/item/book/B = I + if(B.has_drm) + atom_say("Copyrighted material detected. Scanner is unable to copy book to memory.") return FALSE user.drop_item() I.forceMove(src) From 4a7f85177616031d38c99ce1d099c4b35fc3c44c Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 23 Jul 2020 04:53:08 -0700 Subject: [PATCH 57/71] Fixes admin call shuttle verb ignoring alert status --- code/modules/admin/verbs/randomverbs.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9b7cde2abdd..a65884369a1 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -826,7 +826,10 @@ Traitors and the like can also be revived with the previous role mostly intact. else SSshuttle.emergency.canRecall = FALSE - SSshuttle.emergency.request() + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) + SSshuttle.emergency.request(coefficient = 0.5, redAlert = TRUE) + else + SSshuttle.emergency.request() feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") From f219ea5e0313d28068de42c1c74452b9d88a7137 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Fri, 24 Jul 2020 14:53:52 +0200 Subject: [PATCH 58/71] Removes dead link --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2c0ababbe30..b484a8bccfc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Build Status](https://travis-ci.org/ParadiseSS13/Paradise.svg?branch=master)](https://travis-ci.org/ParadiseSS13/Paradise) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Percentage of issues still open") -[![Krihelimeter](http://www.krihelinator.xyz/badge/paradisess13/paradise)](http://www.krihelinator.xyz) ![Render Nanomaps](https://github.com/ParadiseSS13/Paradise/workflows/Render%20Nanomaps/badge.svg) [![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](http://forthebadge.com) From 6085508428937f42d53bbde7c6feb141897168e6 Mon Sep 17 00:00:00 2001 From: mochi Date: Fri, 24 Jul 2020 18:33:15 +0200 Subject: [PATCH 59/71] Fix lipsticks --- code/game/objects/items/weapons/cosmetics.dm | 60 ++++++++++-------- .../mob/living/carbon/human/update_icons.dm | 8 +-- icons/mob/human_face.dmi | Bin 2480 -> 2134 bytes icons/obj/items.dmi | Bin 152592 -> 152591 bytes 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 8815ad6a20f..42f65141094 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -5,16 +5,22 @@ icon_state = "lipstick" w_class = WEIGHT_CLASS_TINY var/colour = "red" - var/open = 0 - var/list/lipstick_colors = list( - "purple" = "purple", - "jade" = "#216F43", - "lime" = "lime", - "black" = "black", - "green" = "green", - "blue" = "blue", - "white" = "white") + var/open = FALSE + var/static/list/lipstick_colors +/obj/item/lipstick/Initialize(mapload) + . = ..() + if(!lipstick_colors) + lipstick_colors = list( + "black" = "#000000", + "white" = "#FFFFFF", + "red" = "#FF0000", + "green" = "#00C000", + "blue" = "#0000FF", + "purple" = "#D55CD0", + "jade" = "#216F43", + "lime" = "#00FF00", + ) /obj/item/lipstick/purple name = "purple lipstick" @@ -22,7 +28,7 @@ /obj/item/lipstick/jade name = "jade lipstick" - colour = "#216F43" + colour = "jade" /obj/item/lipstick/lime name = "lime lipstick" @@ -47,40 +53,38 @@ /obj/item/lipstick/random name = "lipstick" -/obj/item/lipstick/random/New() - ..() - var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var. - colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) - name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon +/obj/item/lipstick/random/Initialize(mapload) + . = ..() + var/lscolor = pick(lipstick_colors) // A random color is picked from the var defined initially in a new var. + colour = lipstick_colors[lscolor] // The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) + name = "[lscolor] lipstick" // The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon - -/obj/item/lipstick/attack_self(mob/user as mob) - overlays.Cut() +/obj/item/lipstick/attack_self(mob/user) + cut_overlays() to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") open = !open if(open) - var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") - colored.color = colour + var/image/colored = mutable_appearance('icons/obj/items.dmi', "lipstick_uncap_color") + colored.color = lipstick_colors[colour] icon_state = "lipstick_uncap" - overlays += colored + add_overlay(colored) else icon_state = "lipstick" -/obj/item/lipstick/attack(mob/M as mob, mob/user as mob) - if(!open) return - - if(!istype(M, /mob)) return +/obj/item/lipstick/attack(mob/M, mob/user) + if(!open || !istype(M)) + return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.lip_style) //if they already have lipstick on + if(H.lip_style) // If they already have lipstick on to_chat(user, "You need to wipe off the old lipstick first!") return if(H == user) user.visible_message("[user] does [user.p_their()] lips with [src].", \ "You take a moment to apply [src]. Perfect!") H.lip_style = "lipstick" - H.lip_color = colour + H.lip_color = lipstick_colors[colour] H.update_body() else user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ @@ -89,7 +93,7 @@ user.visible_message("[user] does [H]'s lips with \the [src].", \ "You apply \the [src].") H.lip_style = "lipstick" - H.lip_color = colour + H.lip_color = lipstick_colors[colour] H.update_body() else to_chat(user, "Where are the lips on that?") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 81907ba516f..1f38e564928 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -273,10 +273,10 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER) apply_overlay(UNDERWEAR_LAYER) - if(lip_style && (LIPS in dna.species.species_traits)) - var/icon/lips = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "lips_[lip_style]_s") - lips.Blend(lip_color, ICON_ADD) - standing += mutable_appearance(lips, layer = -BODY_LAYER) + if(lip_style && (LIPS in dna.species.species_traits)) + var/mutable_appearance/lips = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]_s") + lips.color = lip_color + standing += lips overlays_standing[BODY_LAYER] = standing apply_overlay(BODY_LAYER) diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index ff471760fe86b052d9161ba7b44fb9beb61036a3..9b6d9468b9dfd8f5a113ed33b0a485172ac7e492 100644 GIT binary patch literal 2134 zcmb_eYcLy#7EUaZ>I$|x>RoDeRbRW>B3`B5n#N6qqSmTM>yb!>c#Df$-9>2yyN$-} zuE%a-g;EqrP;IJ0+NhPv29Y*OBep~u(j=QZ_y7HI$B%Q)%$YN1&V1*5^PTTQF9hi8 zndt!l0R5mqUxX$u{>Q+&8gF(iMW6|Td103_eG{?q8OfN;xV;8=!N?s&fi4s%um-|9#(#6kN)*;6w0`)!SocN zt^4_Wno!#e9Z?4x6B^^oeJi!iHXyXqcPOk3!xy3CG_c$jsNdivx{kYngSPh6+MT-f zPh9P_CpsIRNVi^>wk6bdGlESyz^3?0V#p1r7ty+62b;Lx_C9lJDHzi=&OS*i4v6-i zd9}K?Xy5&WmN5q?000UP^7RhOXsU- zsv`l0lC;VW0)1)#Hi5;4c4xs~9Ms-pSfUN~-tBZxH!vJIlbIen=viGFPj@XH=$OV9 zAEuDWuI}zf7wCoNJsX~LwaH?^;c(*Xv~bD#I(|^CQqfsS-5Y|(CLwrEn|$~ydezWYuMRMh=iJfh%%8yZ5{mZH0g3fEbtm$ zAFqPt8UaT;=C&_}auavug7D3UhtXzL{tQ|00Z2Iw@2kd|;qSSEYg(%Oe`zI?GccIY z*6C!^Dt}m$QKkPcBC)vreA~1pZD`6+Y*L*-ZT~)+__CBrCaWWjdR>d0=_{F0Q&UrU zmUz{2>{W=?oAChyx>Bk1{@7a$HhI!;6H_FXxwLQ4w4Wj7K>V~bsRMl=5QtXE_=+y; zJyG$LG?_Gc1n!fnBbV^q%+KMZ*WK?h3tTK99aO4`E~c=MwpC&CSbzzg-5Ld~4oKFn zu+G5&6xN8U_$W#h)>$nVG1uvk_fB-&C%?8)iUlabJNJQ1y4qE7koWn0OJP^V*}{MI z|K(Kg{7rFDUaCr_{`JeZ`EFV za`nL;+yuD>`Ss8KPfp{)kw`c7xY!YY{9UUoAbN&aTN^7}sAAIA4L&wLg|lotijc@j zX0>$)5($f$rCFL%Fc3cGbXESO=$Vm2ILSavI}ZfstX#&J$HX^@&i z5k(Pn$t=$*-#i?uqkLo%eUV+u^Fx3Q;fQKhmvkW(z+oqP7nY(S^j!CB^lEg1Vd38Go*dM&R(0 z{|f2iI9y99eY)JNxSPtOpd<3<9%W``dC{>iG3D)TNGQmRcO>q?INwZP9>YPOV5m*%WtMh!Gi`5B;>wp$g;Le z&|v|_#RUpA({SU#JK4h_h_sSz-(H|MhYobXE6gHwBJ1>_vxFkYV!o))re4YozPdjl zQtL7&o^r3QCUFl2_N}@LLIv79)9bgVSikSo@~PSXzl6dueQE;{hO8rLQGfhzq50lU zGFh~_%#KzEj&*EB$LR3Y4bkf_wyvK4F_N2Xv9`2UDI#Hb;H u<1WSz=mm2q>Z%;zoi|6m+69T)G4S-a(+4o{^_oWk5af5kx5MYVlD`4lQn~E_ literal 2480 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 Rp}ztE7Yr|-FFNZG@*hhxjMe}E delta 21350 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 From 061c5be0ba4786e168f3204e9e29eaeae802e1d6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Fri, 24 Jul 2020 18:36:19 +0100 Subject: [PATCH 60/71] Makes it so all space ruins are correctly mapped --- .../RandomRuins/SpaceRuins/asteroid1.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid2.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid3.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid4.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid5.dmm | 4 +- .../RandomRuins/SpaceRuins/deepstorage.dmm | 4 +- .../RandomRuins/SpaceRuins/derelict1.dmm | 8 +-- .../RandomRuins/SpaceRuins/derelict2.dmm | 12 ++-- .../RandomRuins/SpaceRuins/derelict3.dmm | 8 +-- .../RandomRuins/SpaceRuins/derelict4.dmm | 4 +- .../RandomRuins/SpaceRuins/derelict5.dmm | 4 +- .../RandomRuins/SpaceRuins/emptyshell.dmm | 8 +-- .../RandomRuins/SpaceRuins/gasthelizards.dmm | 8 +-- .../SpaceRuins/intactemptyship.dmm | 12 ++-- .../RandomRuins/SpaceRuins/listeningpost.dmm | 4 +- .../RandomRuins/SpaceRuins/mechtransport.dmm | 10 ++-- .../RandomRuins/SpaceRuins/onehalf.dmm | 58 +++++++++---------- .../RandomRuins/SpaceRuins/spacebar.dmm | 4 +- .../SpaceRuins/turretedoutpost.dmm | 6 +- .../RandomRuins/SpaceRuins/way_home.dmm | 4 +- .../RandomRuins/SpaceRuins/wizardcrash.dmm | 4 +- 21 files changed, 89 insertions(+), 89 deletions(-) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm index 5dae1cf1452..de19f1ecbc8 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm index aace1d84625..6a90a5dd587 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm index a569b957ebf..121b5cff321 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm index fb51d7aabc1..fb1039beb6f 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm index aae4ff9e9c7..d7f38907b30 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index 8bb87d2026e..7d0db9f8eb3 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/mineral/random/low_chance, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm index 8b094749545..a78a8e88151 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm index 95ad761e62c..f3b7a74c0b3 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm @@ -1,14 +1,14 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/window/reinforced{ tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "c" = ( /obj/machinery/door/airlock/external, @@ -20,7 +20,7 @@ icon_state = "rwindow"; dir = 8 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "e" = ( /obj/structure/window/reinforced{ @@ -64,7 +64,7 @@ /area/ruin/powered) "k" = ( /obj/structure/window/reinforced, -/turf/space, +/turf/template_noop, /area/space/nearstation) "l" = ( /obj/structure/window/reinforced, @@ -112,7 +112,7 @@ icon_state = "rwindow"; dir = 1 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "q" = ( /obj/machinery/light/small{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm index be313cd7770..56cd71d71c6 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/airless, /area/ruin/unpowered) @@ -10,12 +10,12 @@ /area/ruin/unpowered) "d" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "e" = ( /obj/structure/lattice, /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm index 1c7d14bd6fa..ce660407cca 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm index ff8a5ac4cc2..fe74e127741 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm index 4c33095219a..0f30191dfb6 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall/r_wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm index 0f7c36fe634..a8b394a6421 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index a993ab96190..ad1ca6cf96a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -1,9 +1,9 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -15,7 +15,7 @@ }, /area/ruin/powered) "d" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 2; icon_state = "diagonalWall3" @@ -198,7 +198,7 @@ }, /area/ruin/powered) "A" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -212,7 +212,7 @@ }, /area/ruin/powered) "C" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 17d49d666bc..cd47fb8ac43 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/powered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index b4e36942d6a..99b254e2684 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s6"; @@ -168,7 +168,7 @@ /area/ruin/powered) "D" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "E" = ( /obj/item/stack/rods, @@ -202,7 +202,7 @@ /area/ruin/powered) "K" = ( /obj/item/stack/sheet/metal, -/turf/space, +/turf/template_noop, /area/space/nearstation) "L" = ( /obj/structure/mecha_wreckage/gygax, @@ -228,7 +228,7 @@ /area/ruin/powered) "P" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "Q" = ( /turf/simulated/shuttle/wall{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm index fa38a1a647b..93dc1fffed4 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -10,7 +10,7 @@ icon_state = "2-4"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ac" = ( /obj/structure/lattice, @@ -20,7 +20,7 @@ icon_state = "4-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ad" = ( /obj/structure/lattice, @@ -29,7 +29,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ae" = ( /obj/structure/lattice, @@ -38,7 +38,7 @@ dir = 2; icon_state = "coil_red2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "af" = ( /obj/structure/lattice, @@ -48,7 +48,7 @@ icon_state = "1-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ag" = ( /turf/simulated/wall, @@ -65,7 +65,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "aj" = ( /turf/unsimulated/floor/plating/airless, @@ -154,11 +154,11 @@ /area/ruin/onehalf/drone_bay) "aw" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ax" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "ay" = ( /obj/structure/table_frame, @@ -224,7 +224,7 @@ /area/ruin/onehalf/drone_bay) "aH" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "aI" = ( /obj/effect/landmark/damageturf, @@ -805,7 +805,7 @@ /area/ruin/onehalf/bridge) "bU" = ( /obj/item/stack/sheet/metal, -/turf/space, +/turf/template_noop, /area/space/nearstation) "bV" = ( /obj/structure/disposalpipe/segment, @@ -914,7 +914,7 @@ dir = 4 }, /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cn" = ( /obj/structure/lattice, @@ -925,7 +925,7 @@ tag = "icon-small"; icon_state = "small" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "co" = ( /obj/structure/grille, @@ -1008,7 +1008,7 @@ /area/ruin/onehalf/bridge) "cv" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cw" = ( /turf/unsimulated/floor/plating/airless, @@ -1016,7 +1016,7 @@ "cx" = ( /obj/structure/lattice, /obj/item/stack/sheet/plasteel, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cy" = ( /obj/structure/lattice, @@ -1024,7 +1024,7 @@ tag = "icon-medium"; icon_state = "medium" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cz" = ( /obj/structure/grille/broken, @@ -1071,10 +1071,10 @@ /area/ruin/onehalf/bridge) "cE" = ( /obj/item/stack/tile/wood, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cF" = ( -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cG" = ( /obj/structure/lattice, @@ -1083,7 +1083,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cH" = ( /obj/structure/lattice, @@ -1097,7 +1097,7 @@ icon_state = "pipe-b"; dir = 8 }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cI" = ( /obj/machinery/door/airlock/command/glass{ @@ -1149,7 +1149,7 @@ dir = 2; icon_state = "coil_red2" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cQ" = ( /obj/machinery/light{ @@ -1160,7 +1160,7 @@ /area/ruin/onehalf/bridge) "cR" = ( /obj/item/stack/sheet/plasteel, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cS" = ( /obj/structure/lattice, @@ -1169,7 +1169,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cU" = ( /obj/structure/grille, @@ -1221,7 +1221,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "db" = ( /obj/structure/table, @@ -1256,7 +1256,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dg" = ( /obj/structure/girder/reinforced, @@ -1350,7 +1350,7 @@ tag = "icon-medium"; icon_state = "medium" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dp" = ( /obj/structure/lattice, @@ -1366,7 +1366,7 @@ icon_state = "1-4" }, /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dq" = ( /obj/structure/lattice, @@ -1382,7 +1382,7 @@ icon_state = "1-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index 108c8103975..1f9725a3d03 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/mineral, /area/space/nearstation) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm index 96e43773146..67dc298eb20 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -1,10 +1,10 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "c" = ( /obj/structure/grille, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm index b0613eef965..dc1e468624b 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral/random, /area/ruin/unpowered/no_grav/way_home) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index ebfaf3b94b4..a063d88a252 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) From fffe72e25865c8455033d4e658038774b37a9186 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 24 Jul 2020 21:00:59 +0200 Subject: [PATCH 61/71] Fixes dupe with wet leather --- code/game/objects/items/stacks/sheets/leather.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 6bdfdd49234..9f6844c8b9e 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ HS.amount++ src.use(1) wetness = initial(wetness) - break + return //If it gets to here it means it did not find a suitable stack on the tile. var/obj/item/stack/sheet/leather/HS = new(src.loc) HS.amount = 1 From 8eeff80419e3e7177aa5b89cf081ce43312cadd6 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 25 Jul 2020 00:31:02 +0100 Subject: [PATCH 62/71] Update lavaland_surface_ash_walker1.dmm --- .../RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 281346d9b8f..be8f849400f 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1205,9 +1205,9 @@ /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "dg" = ( -/obj/structure/bonfire/dense, /obj/structure/stone_tile/center, /obj/effect/mapping_helpers/no_lava, +/obj/structure/bonfire, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "di" = ( From 40a91624eecca225d75e83d42eecf2164f550cf6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 25 Jul 2020 12:01:37 +0100 Subject: [PATCH 63/71] Minor subsystem tweaks --- code/controllers/subsystem/garbage.dm | 2 +- code/controllers/subsystem/nano_mob_hunter.dm | 1 + code/controllers/subsystem/{ => processing}/dcs.dm | 0 paradise.dme | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) rename code/controllers/subsystem/{ => processing}/dcs.dm (100%) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 619508544a6..e50c372584a 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -4,7 +4,7 @@ SUBSYSTEM_DEF(garbage) wait = 2 SECONDS flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - init_order = INIT_ORDER_GARBAGE + init_order = INIT_ORDER_GARBAGE // Why does this have an init order if it has SS_NO_INIT? offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended." var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm index 19b57f59a70..b8a5d09e0b5 100644 --- a/code/controllers/subsystem/nano_mob_hunter.dm +++ b/code/controllers/subsystem/nano_mob_hunter.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt) name = "Nano-Mob Hunter GO Server" init_order = INIT_ORDER_NANOMOB priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact. + flags = SS_NO_INIT offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed." var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this var/list/normal_spawns = list() diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/processing/dcs.dm similarity index 100% rename from code/controllers/subsystem/dcs.dm rename to code/controllers/subsystem/processing/dcs.dm diff --git a/paradise.dme b/paradise.dme index ca3ce303ce9..70c17c96107 100644 --- a/paradise.dme +++ b/paradise.dme @@ -218,7 +218,6 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\changelog.dm" #include "code\controllers\subsystem\chat.dm" -#include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fires.dm" #include "code\controllers\subsystem\garbage.dm" @@ -251,6 +250,7 @@ #include "code\controllers\subsystem\titlescreen.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\dcs.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" From c64cd72d0248c61d3bcd033173dff1ab1a8972b5 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 26 Jul 2020 12:35:56 +0100 Subject: [PATCH 64/71] Removes bad symbol --- code/modules/paperwork/ticketmachine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index c5939c392b1..fe417c91e40 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -169,7 +169,7 @@ /obj/item/ticket_machine_ticket name = "Ticket" - desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." + desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." icon = 'icons/obj/bureaucracy.dmi' icon_state = "ticket" maptext_x = 7 From e778f895ab8704b1b4484ab65da93bf4653d4cc7 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 09:35:02 -0500 Subject: [PATCH 65/71] yes --- code/game/gamemodes/wizard/spellbook.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index d1695a86603..d0773947c21 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -610,7 +610,7 @@ var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - /datum/spellbook_entry/loadout for(var/T in entry_types) var/datum/spellbook_entry/E = new T - if(GAMEMODE_IS_WIZARD && E.is_ragin_restricted) + if(GAMEMODE_IS_RAGIN_MAGES && E.is_ragin_restricted) qdel(E) continue entries |= E From f6925381bbd7194d3e1deff5e8eb46c43783afe9 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 10:00:56 -0500 Subject: [PATCH 66/71] teleporter --- code/game/machinery/teleporter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index b92e3c78bb8..59bae3174c4 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -79,7 +79,7 @@ /obj/machinery/computer/teleporter/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) var/data[0] data["powerstation"] = power_station - if(power_station) + if(power_station?.teleporter_hub) data["teleporterhub"] = power_station.teleporter_hub data["calibrated"] = power_station.teleporter_hub.calibrated data["accurate"] = power_station.teleporter_hub.accurate From 73f756f1de4ec748b0d6f3a7cea38c76c9f4e166 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 26 Jul 2020 20:53:58 +0100 Subject: [PATCH 67/71] Adds missing offline implications --- code/controllers/subsystem.dm | 2 +- code/controllers/subsystem/processing/dcs.dm | 2 ++ code/controllers/subsystem/processing/fastprocess.dm | 1 + code/controllers/subsystem/processing/obj.dm | 1 + code/controllers/subsystem/processing/processing.dm | 1 + code/controllers/subsystem/tickets/mentor_tickets.dm | 1 + code/controllers/subsystem/tickets/tickets.dm | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 03e54df61c5..c9934b128cf 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -35,7 +35,7 @@ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out! - var/offline_implications = "None" // What are the implications of this SS being offlined? + var/offline_implications = "None. No immediate action is needed." // What are the implications of this SS being offlined? //Do not override ///datum/controller/subsystem/New() diff --git a/code/controllers/subsystem/processing/dcs.dm b/code/controllers/subsystem/processing/dcs.dm index 09dea24071f..a223f4676f6 100644 --- a/code/controllers/subsystem/processing/dcs.dm +++ b/code/controllers/subsystem/processing/dcs.dm @@ -3,6 +3,8 @@ PROCESSING_SUBSYSTEM_DEF(dcs) flags = SS_NO_INIT var/list/elements_by_type = list() + // Update this if you add in components which actually use this as a processor + offline_implications = "This SS doesnt actually process anything yet. No immediate action is needed." /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 9622e021469..37761ca8d60 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -4,3 +4,4 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" wait = 2 stat_tag = "FP" + offline_implications = "Objects using the 'Fast Processing' processor will no longer process. Shuttle call recommended." diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm index 26021fb267a..2a05c04af58 100644 --- a/code/controllers/subsystem/processing/obj.dm +++ b/code/controllers/subsystem/processing/obj.dm @@ -3,3 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(obj) priority = FIRE_PRIORITY_OBJ flags = SS_NO_INIT wait = 20 + offline_implications = "Objects using the 'Objects' processor will no longer process. Shuttle call recommended." diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index a8bc823bbbe..5302314589d 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(processing) var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() + offline_implications = "Objects using the default processor will no longer process. Shuttle call recommended." /datum/controller/subsystem/processing/stat_entry() ..("[stat_tag]:[processing.len]") diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 76c7ed2dc28..3fd003418a4 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -10,6 +10,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets ticket_name = "Mentor Ticket" span_class = "mentorhelp" close_rights = R_MENTOR | R_ADMIN + offline_implications = "Mentor tickets will no longer be marked as stale. No immediate action is needed." /datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg) message_mentorTicket(msg) diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 3aa0a8846c3..8fae7179706 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -20,6 +20,7 @@ SUBSYSTEM_DEF(tickets) init_order = INIT_ORDER_TICKETS wait = 300 priority = FIRE_PRIORITY_TICKETS + offline_implications = "Admin tickets will no longer be marked as stale. No immediate action is needed." flags = SS_BACKGROUND From 8d73f4edb69a9df08f93b2a54c7089c67ef63589 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 16:55:53 -0500 Subject: [PATCH 68/71] rev fix --- code/game/gamemodes/miniantags/revenant/revenant.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index f86f018757e..637ab69bf04 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -16,6 +16,7 @@ var/icon_stun = "revenant_stun" var/icon_drain = "revenant_draining" incorporeal_move = 3 + see_invisible = INVISIBILITY_REVENANT invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY From 2f08b2df022a44ddb4dce8d7821b2d5a3c63276f Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Mon, 27 Jul 2020 08:49:11 +0100 Subject: [PATCH 69/71] More Improvements --- code/modules/paperwork/ticketmachine.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index fe417c91e40..2234e2911a6 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -108,7 +108,7 @@ maptext_x = 10 if(100) maptext_x = 8 - maptext = "[current_number]" //Finally, apply the maptext + maptext = "[ticket_number]" /obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/hand_labeler_refill)) @@ -151,8 +151,8 @@ to_chat(user, "You take a ticket from [src], looks like you're ticket number #[ticket_number]...") var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src)) theirticket.name = "Ticket #[ticket_number]" - theirticket.maptext = "[ticket_number]" - theirticket.saved_maptext = "[ticket_number]" + theirticket.maptext = "[ticket_number]" + theirticket.saved_maptext = "[ticket_number]" theirticket.ticket_number = ticket_number theirticket.source = src theirticket.owner = user.UID() @@ -167,6 +167,10 @@ user.adjust_fire_stacks(1) user.IgniteMob() +// Stop AI penetrating the bureaucracy +/obj/machinery/ticket_machine/attack_ai(mob/user) + return + /obj/item/ticket_machine_ticket name = "Ticket" desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." From 094934a49b153f36c96d88f320ddc33e8dc32c07 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 28 Jul 2020 21:46:05 +0100 Subject: [PATCH 70/71] Removes some non ASCII characters --- code/modules/customitems/item_defines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 1a5da52ffce..530b9095f75 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -349,7 +349,7 @@ to_chat(user, "You modify the appearance of [target].") var/obj/item/clothing/mask/gas/M = target M.name = "Prescription Gas Mask" - M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale” can be seen on the inner band." + M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words \"Property of Yon-Dale\" can be seen on the inner band." M.icon = 'icons/obj/custom_items.dmi' M.icon_state = "gas_tariq" M.sprite_sheets = list( From debcf5dad095070ac54d1a62a523ed8598f265e4 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 29 Jul 2020 10:06:00 +0100 Subject: [PATCH 71/71] Replaces all "var " with "var/" --- code/game/gamemodes/miniantags/borer/borer.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/depot.dm | 4 ++-- code/game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/weapons/RSF.dm | 2 +- code/game/objects/items/weapons/cards_ids.dm | 4 ++-- code/game/objects/items/weapons/storage/bags.dm | 6 +++--- code/game/objects/items/weapons/storage/storage.dm | 2 +- code/modules/admin/verbs/onlyone.dm | 2 +- code/modules/antagonists/_common/antag_spawner.dm | 2 +- code/modules/antagonists/traitor/datum_traitor.dm | 2 +- code/modules/events/slaughterevent.dm | 2 +- code/modules/mining/abandonedcrates.dm | 2 +- code/modules/mob/new_player/poll.dm | 2 +- code/modules/projectiles/guns/energy/special.dm | 2 +- code/modules/reagents/chemistry/recipes/slime_extracts.dm | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index f99a00567ae..750473b1dfa 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -394,7 +394,7 @@ to_chat(src, " You are feeling far too docile to do that.") return - var content = "" + var/content = "" content += "" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 3091caa82a2..5198a97a88c 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -164,7 +164,7 @@ data["selected_pod"] = "\ref[selected_pod]" var/list/temprecords[0] for(var/datum/dna2/record/R in records) - var tempRealName = R.dna.real_name + var/tempRealName = R.dna.real_name temprecords.Add(list(list("record" = "\ref[R]", "realname" = sanitize(tempRealName)))) data["records"] = temprecords diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 62c82d9bd95..9ba28094ace 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -165,7 +165,7 @@ alerts_when_broken = TRUE /obj/machinery/computer/syndicate_depot/selfdestruct/get_menu(mob/user) - var menutext = {"Syndicate Depot Fusion Reactor Control
+ var/menutext = {"Syndicate Depot Fusion Reactor Control


Disable Containment Field
"} return menutext @@ -204,7 +204,7 @@ return ..() /obj/machinery/computer/syndicate_depot/shieldcontrol/get_menu(mob/user) - var menutext = {"Syndicate Depot Shield Grid Control
+ var/menutext = {"Syndicate Depot Shield Grid Control

"} menutext += {"(SYNDI-LEADER) Whole-base Shield: [perimeterarea.shield_list.len ? "ON" : "OFF"] ([perimeterarea.shield_list.len ? "Disable" : "Enable"])
"} menutext += {"(SYNDI-LEADER) Armory Shield: [depotarea.shield_list.len ? "ON" : "OFF"] ([depotarea.shield_list.len ? "Disable" : "Enable"])
"} diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7ddf11ab451..7cf09199cfd 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( channels[chan_name] |= FREQ_LISTENING . = 1 else if(href_list["spec_freq"]) - var freq = href_list["spec_freq"] + var/freq = href_list["spec_freq"] if(has_channel_access(usr, freq)) set_frequency(text2num(freq)) . = 1 diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index a8da7503c72..26cef27a0b4 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -58,7 +58,7 @@ RSF if(!proximity) return if(!(istype(A, /obj/structure/table) || istype(A, /turf/simulated/floor))) return - var spawn_location + var/spawn_location var/turf/T = get_turf(A) if(istype(T) && !T.density) spawn_location = T diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 405ce47a033..dc26b14e24b 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -356,13 +356,13 @@ /obj/item/card/id/syndicate/attack_self(mob/user as mob) if(!src.registered_name) - var t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) + var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) if(!t) to_chat(user, "Invalid name.") return src.registered_name = t - var u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) + var/u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) if(!u) to_chat(user, "Invalid assignment.") src.registered_name = "" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4a449069d4c..6d5a192c641 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -421,13 +421,13 @@ /obj/item/storage/bag/tray/cyborg/afterattack(atom/target, mob/user as mob) if( isturf(target) || istype(target,/obj/structure/table) ) - var foundtable = istype(target,/obj/structure/table/) + var/foundtable = istype(target,/obj/structure/table/) if( !foundtable ) //it must be a turf! for(var/obj/structure/table/T in target) foundtable = 1 break - var turf/dropspot + var/turf/dropspot if( !foundtable ) // don't unload things onto walls or other silly places. dropspot = user.loc else if( isturf(target) ) // they clicked on a turf with a table in it @@ -437,7 +437,7 @@ overlays = null - var droppedSomething = 0 + var/droppedSomething = 0 for(var/obj/item/I in contents) I.loc = dropspot diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 55b25ad725a..16bd6f4caa8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -541,7 +541,7 @@ return depth /obj/item/storage/serialize() - var data = ..() + var/data = ..() var/list/content_list = list() data["content"] = content_list data["slots"] = storage_slots diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index e51f6da991a..9f2579ad162 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -84,7 +84,7 @@ var/obj/item/slot_item_hand = H.get_item_by_slot(slot_r_hand) H.unEquip(slot_item_hand) - var /obj/item/multisword/pure_evil/multi = new(H) + var/obj/item/multisword/pure_evil/multi = new(H) H.equip_to_slot_or_del(multi, slot_r_hand) var/obj/item/card/id/W = new(H) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index beefc41735b..8e29326632f 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -194,7 +194,7 @@ to_chat(user, "The demons do not respond to your summon. Perhaps you should try again later.") /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "", mob/user) - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.vialspawned = TRUE S.holder = holder diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 957300326a6..ee23ea35d98 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -399,7 +399,7 @@ var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") var/responses = jointext(GLOB.syndicate_code_response, ", ") - var message = "
The code phrases were:[phrases]
\ + var/message = "
The code phrases were:[phrases]
\ The code responses were:[responses]
" return message diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm index ac265adb420..91918894cfd 100644 --- a/code/modules/events/slaughterevent.dm +++ b/code/modules/events/slaughterevent.dm @@ -33,7 +33,7 @@ spawn_locs += get_turf(player_mind.current) if(!spawn_locs) //If we can't find THAT, then just retry return kill() - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs)) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs)) var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) S.holder = holder player_mind.transfer_to(S) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 9b74c922a6b..044b78a04bc 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -82,7 +82,7 @@ new /obj/item/clothing/head/corgi(src) if(67 to 68) for(var/i in 1 to rand(4, 7)) - var /newitem = pick(subtypesof(/obj/item/stock_parts)) + var/newitem = pick(subtypesof(/obj/item/stock_parts)) new newitem(src) if(69 to 70) new /obj/item/stack/ore/bluespace_crystal(src, 5) diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 19893819e0c..2e109d36d34 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -90,7 +90,7 @@ if(adminonly) question = "(Admin only poll) " + question - var output = "" + var/output = "" if(polltype == POLLTYPE_MULTI || polltype == POLLTYPE_OPTION) select_query = GLOB.dbcon.NewQuery("SELECT text, percentagecalc, (SELECT COUNT(optionid) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id GROUP BY optionid) AS votecount FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") select_query.Execute() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 48aaff9d8b4..e2eb9e84057 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -424,7 +424,7 @@ update_icon() if(istype(loc, /mob/living/carbon)) - var /mob/living/carbon/M = loc + var/mob/living/carbon/M = loc if(src == M.machine) update_dat() M << browse("Temperature Gun Configuration
[dat]", "window=tempgun;size=510x102") diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index b1fb33edf85..1525ed42bd3 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -38,7 +38,7 @@ /datum/chemical_reaction/slimemonkey/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") for(var/i = 1, i <= 3, i++) - var /obj/item/reagent_containers/food/snacks/monkeycube/M = new /obj/item/reagent_containers/food/snacks/monkeycube + var/obj/item/reagent_containers/food/snacks/monkeycube/M = new /obj/item/reagent_containers/food/snacks/monkeycube M.forceMove(get_turf(holder.my_atom)) //Green