From 177152e9ed93fa469efa698a87b9a74708478d5e Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Fri, 12 Jun 2020 15:03:55 -0500 Subject: [PATCH 01/40] 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/40] 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/40] 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/40] 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/40] 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 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 06/40] 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 07/40] 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 0766f5541b4d8a0f25c56d095d5688c56e29e320 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Mon, 13 Jul 2020 21:56:31 -0500 Subject: [PATCH 08/40] 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 cb06ebdd9fd81cf305e04938a50b5c40ce3e1775 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Mon, 13 Jul 2020 22:05:56 -0700 Subject: [PATCH 09/40] 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 f7028b7fef527bf8f6657b4e2849715df3523521 Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Tue, 14 Jul 2020 03:00:48 -0500 Subject: [PATCH 10/40] 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 11/40] 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 12/40] 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 b30ff7e2e967b0ffb25caec9983a017ad8656d7c Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 21:26:45 -0700 Subject: [PATCH 13/40] 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 2c1cd44795651d01215dd1f78d050055f47bcbcb Mon Sep 17 00:00:00 2001 From: Autumn211 Date: Wed, 15 Jul 2020 20:07:43 +0100 Subject: [PATCH 14/40] 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 b3102cd51419b0288f815ddb129a4639f1a3b1a1 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 16 Jul 2020 09:49:00 +0100 Subject: [PATCH 15/40] 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 16/40] 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 17/40] 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 18/40] 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 19/40] 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 20/40] 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 21/40] 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 22/40] 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 23/40] 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 24/40] 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 25/40] 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 26/40] 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 27/40] 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 28/40] 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 29/40] 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 30/40] 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 31/40] 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 32/40] 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 33/40] 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 34/40] 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 35/40] 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 36/40] 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 37/40] 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 38/40] 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 cdc762975c203d04836c300cc54b1469debcc1e6 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 22:43:24 +0200 Subject: [PATCH 39/40] 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 40/40] 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 +
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo