From 254ff702b8731ebeb057962487b67421fd99ac2b Mon Sep 17 00:00:00 2001 From: sushi Date: Sun, 7 Sep 2025 03:00:55 -0400 Subject: [PATCH 001/107] Deconstruct non-item objects eaten by a recycler instead of just deleting them. (#92864) ## About The Pull Request Currently `/obj/machinery/recycler` will just delete anything it eats and will only extract materials if they are retrieved from `/datum/component/material_container/insert_item()`. This change adjusts the recycler to call `deconstruct(FALSE)` on non-item objects so that they are properly destroyed and any special effects the object implements for this scenario aren't just lost. This change also makes the recycler consider if the object being destroyed is a secure, locked closet to prevent griefing heads by deleting all of their closet items or exploiting the recycler to possibly get at the contents of locked departmental orders. ## Why It's Good For The Game If you insert any non-item object into a recycler it will just straight up delete it. This appears to me as an oversight, as inserting things like locked closets/crates will just destroy anything in them, and things like reagent_dispensers/atmos canisters will completely delete the gases within. This allows non-item objects to react to their deconstruction when inserted into a recycler. Items are still recycled as they were originally. The alternative is to just prevent the recycler from consuming non-item objects. At the moment due to my lack of knowledge of all the game's stuff this may be the safer option. Currently the only safety added on top of what was already there is to prevent deconstructing locked closets, but there may be more things I'm not thinking of. However, its a lot less interesting to me to just block non-items and I would like to try this first. ![dreamseeker_MHMlibFCIF](https://github.com/user-attachments/assets/3878d7c0-6b82-42bc-b9b1-01a7f7613a2d) ![dreamseeker_zcFl6dTjuQ](https://github.com/user-attachments/assets/3ccaf852-b6e0-4844-a78f-ce52409d32d7) ![dreamseeker_RbOXD2ZvsZ](https://github.com/user-attachments/assets/2fca53eb-4f1f-4091-992f-20c02f9f89de) ## Changelog :cl: sushi add: recyclers will now deconstruct non-item objects that they eat instead of just deleting them /:cl: --- code/game/machinery/recycler.dm | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index af163f21a80..dcbc5aa0e41 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -178,6 +178,14 @@ not_eaten += 1 continue + // Prevent blindly deconstructing locked secure closets (head closets, important departmental orders, etc.) + // unless they have already been unlocked to prevent exploiting the recycler to bypass closet access. + if (iscloset(thing)) + var/obj/structure/closet/as_closet = thing + if (as_closet.secure && as_closet.locked) + not_eaten += 1 + continue + if (istype(thing, /obj/item/organ/brain) || istype(thing, /obj/item/dullahan_relay)) living_detected = TRUE @@ -215,7 +223,17 @@ for(var/i = length(nom); i >= 1; i--) if(!is_operational) //we ran out of power after recycling a large amount to items, time to stop break - use_energy(active_power_usage / (recycle_item(nom[i]) ? 1 : 2)) //recycling stuff that produces no material takes just half the power + var/full_power_usage = TRUE + var/obj/nom_obj = nom[i] + if (isitem(nom_obj)) + // Whether or not items consume full power depends on if they produced a material when recycled. + full_power_usage = recycle_item(nom_obj) + else + // When a non-item is eaten, we deconstruct it with dismantled = FALSE so that + // it and its contents aren't just deleted. These always consume full power. + nom_obj.deconstruct(FALSE) + use_energy(active_power_usage / (full_power_usage ? 1 : 2)) + if(nom.len && sound) playsound(src, item_recycle_sound, (50 + nom.len * 5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once. if(not_eaten) From ad56fd7da8a61b8cf4c4c911f593039eb2367cd3 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:01:12 +0000 Subject: [PATCH 002/107] Automatic changelog for PR #92864 [ci skip] --- html/changelogs/AutoChangeLog-pr-92864.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92864.yml diff --git a/html/changelogs/AutoChangeLog-pr-92864.yml b/html/changelogs/AutoChangeLog-pr-92864.yml new file mode 100644 index 00000000000..6b7316de021 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92864.yml @@ -0,0 +1,4 @@ +author: "sushi" +delete-after: True +changes: + - rscadd: "recyclers will now deconstruct non-item objects that they eat instead of just deleting them" \ No newline at end of file From 252d836fb0549b8e03f9dc055029be6e2501843c Mon Sep 17 00:00:00 2001 From: KingkumaArt <69398298+KingkumaArt@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:02:17 -0400 Subject: [PATCH 003/107] Makes the slot machine spin faster (#92876) ## About The Pull Request Does what it says, taking the slot machine from 6 seconds to 2 seconds to spin. ## Why It's Good For The Game Was playing a round of tram and was annoyed at how slow it was to gamble. It also makes sense the slot machine goes quick so you waste your money faster. :cl: Webcomicartist qol: The slot machine spins faster, allowing for more time-efficient gambling. /:cl: --- code/game/machinery/slotmachine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 90fe826136b..470d791080a 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -8,8 +8,8 @@ #define SMALL_PRIZE 400 #define BIG_PRIZE 1000 #define JACKPOT 10000 -#define SPIN_TIME 65 //As always, deciseconds. -#define REEL_DEACTIVATE_DELAY 7 +#define SPIN_TIME 36 //As always, deciseconds. +#define REEL_DEACTIVATE_DELAY 4 #define JACKPOT_SEVENS FA_ICON_7 #define HOLOCHIP 1 #define COIN 2 From 6d5c0ce2c9cef1bb388f2a995133ac1700009f68 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:02:38 +0000 Subject: [PATCH 004/107] Automatic changelog for PR #92876 [ci skip] --- html/changelogs/AutoChangeLog-pr-92876.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92876.yml diff --git a/html/changelogs/AutoChangeLog-pr-92876.yml b/html/changelogs/AutoChangeLog-pr-92876.yml new file mode 100644 index 00000000000..4665686d6f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92876.yml @@ -0,0 +1,4 @@ +author: "Webcomicartist" +delete-after: True +changes: + - qol: "The slot machine spins faster, allowing for more time-efficient gambling." \ No newline at end of file From 013dd622004efc59537cefa7ada0fe2ee9b79f3b Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:03:40 -0400 Subject: [PATCH 005/107] Fixes flaky runtime issue for maps with space terrain near their borders by making maploaded movables stay put (#92862) ## About The Pull Request Ever since https://github.com/tgstation/tgstation/pull/91920 we have been getting a very persistent CI failure downstream, and upon investigating the transitions of this map seem weird and cut off, almost like it's taking pieces of the other side and trying to superimpose them on itself. image I looked at what it changed, and this line stuck out to me as suspicious. image It stuck out to me because it seems like it might not appropriately handle space maps that have terrain near the borders (we have a map that is surrounded by an asteroid field, for instance, and that's the one that's been causing issues).
Asteroid field map shown here StrongDMM_BP2oO3sKtf
~~@Time-Green Do you have any insights to this?~~ ~~I am drafting it for now because I don't think this is the right 'fix' as it will likely interfere with/break the icebox wilderness stuff.~~ ~~The main issue is (possibly?) that `atom/movable`s (including these rocks) which end up on the border of the map transition are being yeeted into space, on the opposite end of the map, because of their location.~~ ~~Movables that are maploaded probably shouldn't be transitioned, might be the solution there?~~ EDIT: Fairly certain that the issue has been found out, it's due to movable rocks which are mapped near the edge of the map getting instantly teleported upon maploading. Seems like this is something we should prevent from happening. ## Why It's Good For The Game Fixes an oversight ## Changelog Not player-facing --- code/game/turfs/open/_open.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 2dd779a7f1f..78af79d750f 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -137,6 +137,9 @@ if(!destination_z || !destination_x || !destination_y || arrived.pulledby || arrived.currently_z_moving) return + if(SSatoms.initialized == INITIALIZATION_INNEW_MAPLOAD) // we don't want to be transitioning atoms to another z-level while we are still in mapload + return + var/tx = destination_x var/ty = destination_y var/turf/DT = locate(tx, ty, destination_z) From 29e109c525fccbad4b109eaea710db4132328ec0 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:09:33 -0400 Subject: [PATCH 006/107] Stethoscopes can now detect heart attacks (#92869) ## About The Pull Request Adds text for when you use a stethoscope on a person having a heart attack(and removes a doubled check for `body_part == BODY_ZONE_PRECISE_GROIN` that's already handled with the `switch`) ## Why It's Good For The Game Closes #92865 ## Changelog :cl: qol: You can now hear heart attacks with a stethoscope /:cl: --- code/modules/clothing/neck/_neck.dm | 49 +++++++++++++++-------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 3a5982712bd..f47f470580b 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -248,7 +248,7 @@ var/heart_strength var/pulse_pressure - + var/having_heart_attack = carbon_patient.has_status_effect(/datum/status_effect/heart_attack) var/heart_noises = TRUE var/obj/item/organ/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART) @@ -292,6 +292,8 @@ if(isnull(heart) || !heart.is_beating() || carbon_patient.stat == DEAD) render_list += "You don't hear a heartbeat!\n"//they're dead or their heart isn't beating heart_noises = FALSE + else if(having_heart_attack) + render_list += "You hear a rapid, irregular heartbeat.\n" else if(heart.damage > 10 || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY) render_list += "You hear a weak heartbeat.\n"//their heart is damaged, or they have critical blood else @@ -304,28 +306,25 @@ user.visible_message(span_notice("[user] presses their hands against [carbon_patient]'s abdomen."), ignored_mobs = user) //assess abdominal organs - if(body_part == BODY_ZONE_PRECISE_GROIN) - var/appendix_okay = TRUE - var/liver_okay = TRUE - if(!liver)//sanity check, ensure the patient actually has a liver - render_list += "You can't feel anything where [target.p_their()] liver would be.\n" + var/appendix_okay = TRUE + var/liver_okay = TRUE + if(!liver)//sanity check, ensure the patient actually has a liver + render_list += "You can't feel anything where [target.p_their()] liver would be.\n" + liver_okay = FALSE + else + if(liver.damage > 10) + render_list += "[target.p_Their()] liver feels firm.\n"//their liver is damaged liver_okay = FALSE - else - if(liver.damage > 10) - render_list += "[target.p_Their()] liver feels firm.\n"//their liver is damaged - liver_okay = FALSE - - if(!appendix)//sanity check, ensure the patient actually has an appendix - render_list += "You can't feel anything where [target.p_their()] appendix would be.\n" + if(!appendix)//sanity check, ensure the patient actually has an appendix + render_list += "You can't feel anything where [target.p_their()] appendix would be.\n" + appendix_okay = FALSE + else + if(appendix.damage > 10 && carbon_patient.stat == CONSCIOUS) + render_list += "[target] screams when you lift your hand from [target.p_their()] appendix!\n"//scream if their appendix is damaged and they're awake + target.emote("scream") appendix_okay = FALSE - else - if(appendix.damage > 10 && carbon_patient.stat == CONSCIOUS) - render_list += "[target] screams when you lift your hand from [target.p_their()] appendix!\n"//scream if their appendix is damaged and they're awake - target.emote("scream") - appendix_okay = FALSE - - if(liver_okay && appendix_okay)//if they have all their organs and have no detectable damage - render_list += "You don't find anything abnormal.\n"//they're okay :D + if(liver_okay && appendix_okay)//if they have all their organs and have no detectable damage + render_list += "You don't find anything abnormal.\n"//they're okay :D if(BODY_ZONE_PRECISE_EYES) balloon_alert(user, "can't do that!") @@ -347,12 +346,14 @@ if(isnull(heart) || !heart.is_beating() || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY || carbon_patient.stat == DEAD) render_list += "You can't find a pulse!\n"//they're dead, their heart isn't beating, or they have critical blood else - if(heart.damage > 10) - heart_strength = span_danger("irregular")//their heart is damaged + if(having_heart_attack) + heart_strength = span_danger("irregular") + else if(heart.damage > 10) + heart_strength = span_danger("weak")//their heart is damaged else heart_strength = span_notice("regular")//they're okay :D - if(carbon_patient.blood_volume <= BLOOD_VOLUME_SAFE && carbon_patient.blood_volume > BLOOD_VOLUME_OKAY) + if((carbon_patient.blood_volume <= BLOOD_VOLUME_SAFE && carbon_patient.blood_volume > BLOOD_VOLUME_OKAY) || having_heart_attack) pulse_pressure = span_danger("thready")//low blood else pulse_pressure = span_notice("strong")//they're okay :D From f071d2fcd003b794cfd205c6468a6e510455d823 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:09:51 +0000 Subject: [PATCH 007/107] Automatic changelog for PR #92869 [ci skip] --- html/changelogs/AutoChangeLog-pr-92869.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92869.yml diff --git a/html/changelogs/AutoChangeLog-pr-92869.yml b/html/changelogs/AutoChangeLog-pr-92869.yml new file mode 100644 index 00000000000..5318a9537e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92869.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - qol: "You can now hear heart attacks with a stethoscope" \ No newline at end of file From b5313bac3449aa7bf684024699196b45fd8b99a1 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:10:50 -0400 Subject: [PATCH 008/107] Makes the arcade machine experiment succeed on game completion rather than item vending (#92857) ## About The Pull Request Previously, the arcade game win experiment succeeded upon the machine calling `prizevend()`, meaning the experiment completed upon tickets being inserted into the machine, counter to the experiment's text. This pr changes the experiment to succeed upon the machine calling the new `victory_tickets()`, which has replaced each instance of a won game dispensing tickets. ## Why It's Good For The Game fixes #80218 Standardized ticket dispensing ## Changelog :cl: fix: Arcade machine experiment now succeeds on output rather than input of tickets /:cl: --- code/__DEFINES/dcs/signals/signals_object.dm | 4 ++-- code/game/machinery/computer/arcade/_arcade.dm | 8 +++++++- code/game/machinery/computer/arcade/amputation.dm | 4 +--- code/game/machinery/computer/arcade/battle.dm | 3 +-- code/game/machinery/computer/arcade/orion.dm | 3 +-- code/modules/experisci/experiment/physical_experiments.dm | 4 ++-- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 844d72bc62f..a077e5341e5 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -29,8 +29,8 @@ #define COMSIG_MACHINERY_SET_OCCUPANT "machinery_set_occupant" ///from /obj/machinery/destructive_scanner/proc/open(aggressive): Runs when the destructive scanner scans a group of objects. (list/scanned_atoms) #define COMSIG_MACHINERY_DESTRUCTIVE_SCAN "machinery_destructive_scan" -///from /obj/machinery/computer/arcade/prizevend(mob/user, prizes = 1) -#define COMSIG_ARCADE_PRIZEVEND "arcade_prizevend" +///from /obj/machinery/computer/arcade/victory_tickets(tickets, sound = TRUE) +#define COMSIG_ARCADE_VICTORY "arcade_victory" ///from /datum/controller/subsystem/air/proc/start_processing_machine: () #define COMSIG_MACHINERY_START_PROCESSING_AIR "start_processing_air" ///from /datum/controller/subsystem/air/proc/stop_processing_machine: () diff --git a/code/game/machinery/computer/arcade/_arcade.dm b/code/game/machinery/computer/arcade/_arcade.dm index 1627a3d0fe8..f0879eb1da9 100644 --- a/code/game/machinery/computer/arcade/_arcade.dm +++ b/code/game/machinery/computer/arcade/_arcade.dm @@ -77,7 +77,6 @@ ///Dispenses the proper prizes and gives them a positive mood event. If valid, has a small chance to give a pulse rifle. /obj/machinery/computer/arcade/proc/prizevend(mob/living/user, prizes = 1) - SEND_SIGNAL(src, COMSIG_ARCADE_PRIZEVEND, user, prizes) if(user.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && HAS_TRAIT(user, TRAIT_GAMERGOD)) visible_message(span_notice("[user] inputs an intense cheat code!"),\ span_notice("You hear a flurry of buttons being pressed.")) @@ -99,3 +98,10 @@ var/atom/movable/the_prize = new prizeselect(get_turf(src)) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) visible_message(span_notice("[src] dispenses [the_prize]!"), span_notice("You hear a chime and a clunk.")) + +/obj/machinery/computer/arcade/proc/victory_tickets(tickets, sound = TRUE) + SEND_SIGNAL(src, COMSIG_ARCADE_VICTORY) + visible_message(span_notice("[src] dispenses [tickets] ticket\s!")) + new /obj/item/stack/arcadeticket((get_turf(src)), tickets) + if(sound) + playsound(loc, 'sound/machines/arcade/win.ogg', 40) diff --git a/code/game/machinery/computer/arcade/amputation.dm b/code/game/machinery/computer/arcade/amputation.dm index b61c460398e..d425cd5eba5 100644 --- a/code/game/machinery/computer/arcade/amputation.dm +++ b/code/game/machinery/computer/arcade/amputation.dm @@ -23,9 +23,7 @@ qdel(chopchop) user.mind?.adjust_experience(/datum/skill/gaming, 100) user.won_game() - playsound(src, 'sound/machines/arcade/win.ogg', 50, TRUE) - new /obj/item/stack/arcadeticket((get_turf(src)), rand(6,10)) - to_chat(user, span_notice("[src] dispenses a handful of tickets!")) + victory_tickets(rand(6,10)) return if(!do_they_still_have_that_hand(user, chopchop)) to_chat(user, span_warning("The guillotine drops, but your hand seems to be gone already!")) diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index 142d85370c9..9cbec4430fb 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -232,8 +232,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has outbombed Cuban Pete and been awarded a bomb.") user.log_message("outbombed Cuban Pete and has been awarded a bomb.", LOG_GAME) else - visible_message(span_notice("[src] dispenses 2 tickets!")) - new /obj/item/stack/arcadeticket((get_turf(src)), 2) + victory_tickets(2,FALSE) player_gold += enemy_gold_reward if(user) var/exp_gained = DEFAULT_EXP_GAIN * all_worlds[player_current_world] diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 72bf0cb1e51..6c2945cb126 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -470,8 +470,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] made it to Orion on an emagged machine and got an explosive toy ship.") user.log_message("made it to Orion on an emagged machine and got an explosive toy ship.", LOG_GAME) else - new /obj/item/stack/arcadeticket((get_turf(src)), 2) - to_chat(user, span_notice("[src] dispenses 2 tickets!")) + victory_tickets(2) obj_flags &= ~EMAGGED name = initial(name) desc = initial(desc) diff --git a/code/modules/experisci/experiment/physical_experiments.dm b/code/modules/experisci/experiment/physical_experiments.dm index 60303814e44..11075d1c75e 100644 --- a/code/modules/experisci/experiment/physical_experiments.dm +++ b/code/modules/experisci/experiment/physical_experiments.dm @@ -43,12 +43,12 @@ linked_experiment_handler.announce_message("Incorrect object for experiment.") return FALSE - RegisterSignal(currently_scanned_atom, COMSIG_ARCADE_PRIZEVEND, PROC_REF(win_arcade)) + RegisterSignal(currently_scanned_atom, COMSIG_ARCADE_VICTORY, PROC_REF(win_arcade)) linked_experiment_handler.announce_message("Experiment ready to start.") return TRUE /datum/experiment/physical/arcade_winner/unregister_events() - UnregisterSignal(currently_scanned_atom, COMSIG_ARCADE_PRIZEVEND) + UnregisterSignal(currently_scanned_atom, COMSIG_ARCADE_VICTORY) /datum/experiment/physical/arcade_winner/check_progress() . += EXPERIMENT_PROG_BOOL("Win an arcade game at a tracked arcade cabinet.", is_complete()) From c5d040ab939a52db0c8d7517a70f25ec394ce64f Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:11:08 +0000 Subject: [PATCH 009/107] Automatic changelog for PR #92857 [ci skip] --- html/changelogs/AutoChangeLog-pr-92857.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92857.yml diff --git a/html/changelogs/AutoChangeLog-pr-92857.yml b/html/changelogs/AutoChangeLog-pr-92857.yml new file mode 100644 index 00000000000..3d2d5370f2f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92857.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - bugfix: "Arcade machine experiment now succeeds on output rather than input of tickets" \ No newline at end of file From 215d6be146471f4da45cc133bcd6f7caf36879b0 Mon Sep 17 00:00:00 2001 From: Mordent <62817778+mordent-goonstation@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:12:53 -0400 Subject: [PATCH 010/107] Make ListInputModal not consume useBackend, allows use as component (#92842) ## About The Pull Request While not used elsewhere, the `ListInputModal` component makes internal use of `act` that isn't needed given the only (current) usage is in `ListInputWindow`, which handles all of the relevant logic. This PR removes that, relying instead on functionality passed in via its usage in `ListInputWindow`. ## Why It's Good For The Game A downstream of some of these more core interfaces [is intending to](https://github.com/goonstation/goonstation/pull/24451) nest a `ListInputModal` in a different interface, and thus letting the implementation specific functionality be passed in facilitates this. Closer parity good. --- .../ListInputWindow/ListInputModal.tsx | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tgui/packages/tgui/interfaces/ListInputWindow/ListInputModal.tsx b/tgui/packages/tgui/interfaces/ListInputWindow/ListInputModal.tsx index fb18ae8ad37..7a0a7ba20c2 100644 --- a/tgui/packages/tgui/interfaces/ListInputWindow/ListInputModal.tsx +++ b/tgui/packages/tgui/interfaces/ListInputWindow/ListInputModal.tsx @@ -9,7 +9,6 @@ import { KEY_Z, } from 'tgui-core/keycodes'; -import { useBackend } from '../../backend'; import { InputButtons } from '../common/InputButtons'; type ListInputModalProps = { @@ -21,8 +20,6 @@ type ListInputModalProps = { }; export const ListInputModal = (props: ListInputModalProps) => { - const { act } = useBackend(); - const { items = [], default_item, message, on_selected, on_cancel } = props; const [selected, setSelected] = useState(items.indexOf(default_item)); @@ -143,6 +140,7 @@ export const ListInputModal = (props: ListInputModalProps) => { { autoFocus autoSelect fluid - onEnter={() => { - act('submit', { entry: filteredItems[selected] }); - }} + onEnter={() => on_selected(filteredItems[selected])} onChange={onSearch} placeholder="Search..." value={searchQuery} @@ -173,14 +169,28 @@ export const ListInputModal = (props: ListInputModalProps) => { ); }; +interface ListDisplayProps { + filteredItems: string[]; + onClick: (itemIndex: number) => void; + onDoubleClick: (entry: string) => void; + onFocusSearch: () => void; + searchBarVisible: boolean; + selected: number; +} + /** * Displays the list of selectable items. * If a search query is provided, filters the items. */ -const ListDisplay = (props) => { - const { act } = useBackend(); - const { filteredItems, onClick, onFocusSearch, searchBarVisible, selected } = - props; +const ListDisplay = (props: ListDisplayProps) => { + const { + filteredItems, + onClick, + onDoubleClick, + onFocusSearch, + searchBarVisible, + selected, + } = props; return (
@@ -190,13 +200,10 @@ const ListDisplay = (props) => { className="candystripe" color="transparent" fluid - id={index} + id={`${index}`} key={index} onClick={() => onClick(index)} - onDoubleClick={(event) => { - event.preventDefault(); - act('submit', { entry: filteredItems[selected] }); - }} + onDoubleClick={() => onDoubleClick(item)} onKeyDown={(event) => { const keyCode = window.event ? event.which : event.keyCode; if (searchBarVisible && keyCode >= KEY_A && keyCode <= KEY_Z) { From 03771cf1ab9510b2d50c938a73d57492dc729904 Mon Sep 17 00:00:00 2001 From: uaioy <114047053+uaioy@users.noreply.github.com> Date: Sun, 7 Sep 2025 00:14:35 -0700 Subject: [PATCH 011/107] Nerfs the recharge rate in wiz modsuit (#92800) ## About The Pull Request Nerfs the wizard modsuit shield recharges, it takes 20 seconds (double the original time) for them to start recharging, and they recharge every 3 seconds (used to be 1 second). can tone it down a bit if its too much ## Why It's Good For The Game I know wizard is meant to be super busted and all that, but a shield that blocks 5 attacks and it recharges every 10 seconds is extremely frustrating if not impossible to play against unless you bring a bomb, specially if they had any form of teleport (i dont think we should make all antags be only countered by bombs), wizard modsuit is already stacked with armour, no slips, anti flashbangs and space proofing, i think the shields are overkill ## Changelog :cl: balance: wizard modsuit shield recharges slower /:cl: --- code/modules/mod/modules/modules_antag.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index d8449338f7b..b190d872d39 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -78,6 +78,8 @@ idle_power_cost = 0 //magic use_energy_cost = 0 //magic too max_charges = 5 + recharge_start_delay = 20 SECONDS + charge_increment_delay = 3 SECONDS shield_icon_file = 'icons/effects/magic.dmi' shield_icon = "mageshield" required_slots = list() From 8475d997e9c22a1defc2c59abc42d0e7f8b570e2 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:14:53 +0000 Subject: [PATCH 012/107] Automatic changelog for PR #92800 [ci skip] --- html/changelogs/AutoChangeLog-pr-92800.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92800.yml diff --git a/html/changelogs/AutoChangeLog-pr-92800.yml b/html/changelogs/AutoChangeLog-pr-92800.yml new file mode 100644 index 00000000000..1e6a6f34fd7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92800.yml @@ -0,0 +1,4 @@ +author: "uaioy" +delete-after: True +changes: + - balance: "wizard modsuit shield recharges slower" \ No newline at end of file From 02051fbf78c475650efc0cada6073ed970660bd9 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:15:37 +0200 Subject: [PATCH 013/107] Fixes organ fishing blocking alternate material rod loot from spawning (#92794) ## About The Pull Request A bit absurd, but we allow for this to happen with other alternate pools (like mansus rifts or hydroponic trays), so I'd say we should let it slide. (Plus fishing out a second skeleton from someone sounds both hilarious and extremely cursed) Closes #92792 ## Changelog :cl: fix: Fixed organ fishing blocking alternate material rod loot from spawning /:cl: --- code/modules/fishing/sources/subtypes/surgery.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/fishing/sources/subtypes/surgery.dm b/code/modules/fishing/sources/subtypes/surgery.dm index 3beaa1d2fd9..0ee2b06d856 100644 --- a/code/modules/fishing/sources/subtypes/surgery.dm +++ b/code/modules/fishing/sources/subtypes/surgery.dm @@ -12,9 +12,13 @@ wait_time_range = list(6 SECONDS, 12 SECONDS) /datum/fish_source/surgery/spawn_reward(reward_path, atom/spawn_location, atom/fishing_spot, obj/item/fishing_rod/used_rod) + if(reward_path != FISHING_RANDOM_ORGAN) + return ..() + if(istype(fishing_spot, /obj/machinery/fishing_portal_generator)) var/obj/machinery/fishing_portal_generator/portal = fishing_spot fishing_spot = portal.current_linked_atom + if(!iscarbon(fishing_spot)) var/random_type = pick(subtypesof(/obj/item/organ) - GLOB.prototype_organs) return new random_type(spawn_location) From c6e0b5da33ed92091d7c08f0ec67fb8ecb9d5594 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:15:58 +0000 Subject: [PATCH 014/107] Automatic changelog for PR #92794 [ci skip] --- html/changelogs/AutoChangeLog-pr-92794.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92794.yml diff --git a/html/changelogs/AutoChangeLog-pr-92794.yml b/html/changelogs/AutoChangeLog-pr-92794.yml new file mode 100644 index 00000000000..8ab72a7dccf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92794.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed organ fishing blocking alternate material rod loot from spawning" \ No newline at end of file From 135a09182b9dce16ac3c77b918cd62331bb77ed7 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sun, 7 Sep 2025 02:24:34 -0500 Subject: [PATCH 015/107] Refactors obscured (#92779) ## About The Pull Request Fixes #85028 Obscured flags and covered flags are tracked on carbons, updated as items are equipped and unequipped. It's that shrimple. Closes #92760 Just removes the species exception checks for not making sense Also refactors handcuffs / legcuffs removal. In all of these situations they were hardcoded when they could easily just use an inventory proc to work. ## Why It's Good For The Game Stops a million excessive calls to `check_obscured_slots` Makes obscured behavior more consistent Makes obscured behavior easier to use Cleans up human rendering (There was some cursed stuff before with render item -> updated obscured -> update body -> cause side effects) ## Changelog :cl: Melbert del: Golems which somehow manage to grow wings and somehow manage to equip something that covers their jumpsuit can no longer fly. (Seriously, this will not affect anyone) refactor: Refactored clothing obscurity entirely. Items should be a loooot more consistent and what covers what, and should update a lot snappier. As always, report any oddities, like mysteriously disappearing articles of clothing, hair, or species parts refactored: Refactored handcuffs and legcuffs a bit, report any odd situations with cuffs like getting stuck restrained /:cl: --- code/__DEFINES/inventory.dm | 2 +- code/__HELPERS/pronouns.dm | 4 +- code/_globalvars/bitfields.dm | 47 ++++--- code/_onclick/hud/fullscreen.dm | 2 - code/_onclick/hud/human.dm | 4 +- code/datums/components/bloodysoles.dm | 2 +- code/datums/components/cuff_n_stun.dm | 1 - .../components/toggle_attached_clothing.dm | 1 - code/datums/elements/strippable.dm | 4 +- code/datums/mutations/hulk.dm | 2 +- code/datums/status_effects/debuffs/drunk.dm | 4 +- code/datums/wounds/scars/_scars.dm | 2 +- code/game/objects/items.dm | 5 +- .../abductor/equipment/gear/abductor_items.dm | 1 - code/modules/antagonists/cult/blood_magic.dm | 1 - .../sacrifice_knowledge.dm | 8 +- .../clothing/chameleon/_chameleon_action.dm | 1 + code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/head/animalears.dm | 2 +- code/modules/clothing/masks/animal_masks.dm | 1 + code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/fishing/fish/types/rift.dm | 7 +- code/modules/forensics/forensics_helpers.dm | 2 +- code/modules/mob/inventory.dm | 23 ++-- .../mob/living/basic/drone/visuals_icons.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 47 +------ .../mob/living/carbon/carbon_defines.dm | 5 + .../mob/living/carbon/carbon_update_icons.dm | 34 ++--- code/modules/mob/living/carbon/examine.dm | 40 +++--- code/modules/mob/living/carbon/human/dummy.dm | 7 +- code/modules/mob/living/carbon/human/human.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 17 ++- .../mob/living/carbon/human/human_helpers.dm | 4 +- .../living/carbon/human/human_update_icons.dm | 90 ++++--------- .../mob/living/carbon/human/init_signals.dm | 18 +-- .../mob/living/carbon/human/inventory.dm | 20 +-- .../carbon/human/species_types/mushpeople.dm | 7 +- code/modules/mob/living/carbon/inventory.dm | 126 +++++++++--------- code/modules/mob/living/emote.dm | 2 +- code/modules/mob/living/living.dm | 5 - .../mob/living/simple_animal/bot/secbot.dm | 1 - code/modules/mob/mob.dm | 16 ++- code/modules/mob/mob_update_icons.dm | 56 +++----- code/modules/mod/mod_activation.dm | 2 +- code/modules/mod/mod_control.dm | 1 + code/modules/mod/mod_theme.dm | 1 + code/modules/photography/camera/camera.dm | 5 +- .../surgery/bodyparts/dismemberment.dm | 14 +- .../surgery/bodyparts/head_hair_and_lips.dm | 11 +- .../species_parts/lizard_bodyparts.dm | 2 +- .../surgery/organs/external/_visual_organs.dm | 35 +---- .../modules/surgery/organs/external/spines.dm | 7 +- code/modules/surgery/organs/external/tails.dm | 14 +- .../organs/external/wings/functional_wings.dm | 4 +- .../organs/external/wings/moth_wings.dm | 13 +- .../surgery/organs/external/wings/wings.dm | 13 +- .../surgery/organs/internal/ears/_ears.dm | 7 +- .../surgery/organs/internal/eyes/_eyes.dm | 3 +- .../screenshots/screenshot_digi_leg_test.png | Bin 1758 -> 1759 bytes code/modules/unit_tests/strippable.dm | 1 - .../mecha/equipment/weapons/weapons.dm | 1 - 61 files changed, 279 insertions(+), 492 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 621954eee09..9a369301967 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -86,7 +86,7 @@ DEFINE_BITFIELD(no_equip_flags, list( ITEM_SLOT_MASK | ITEM_SLOT_HEAD | ITEM_SLOT_FEET | ITEM_SLOT_ID | ITEM_SLOT_BELT | ITEM_SLOT_BACK | ITEM_SLOT_NECK ) //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. -//Make sure to update check_obscured_slots() if you add more. +//Make sure to update obscured_slots if you add more. #define HIDEGLOVES (1<<0) #define HIDESUITSTORAGE (1<<1) #define HIDEJUMPSUIT (1<<2) //these first four are only used in exterior suits diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 7aaca3e7556..cc907f1bc49 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -413,8 +413,8 @@ /mob/living/carbon/human/get_visible_gender() if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return PLURAL - var/face_hidden = (wear_mask?.flags_inv & HIDEFACE) || (head?.flags_inv & HIDEFACE) - if(face_hidden && (check_obscured_slots() & ITEM_SLOT_ICLOTHING)) + // If both face and uniform are hidden, can't assess gender + if(obscured_slots & (HIDEFACE|HIDEJUMPSUIT) == (HIDEFACE|HIDEJUMPSUIT)) return PLURAL return gender diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 2d8d098b09b..f8f1b2cc917 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -206,24 +206,35 @@ DEFINE_BITFIELD(item_flags, list( "NO_BLOOD_ON_ITEM" = NO_BLOOD_ON_ITEM, )) -DEFINE_BITFIELD(flags_inv, list( - "HIDEEARS" = HIDEEARS, - "HIDEEYES" = HIDEEYES, - "HIDEFACE" = HIDEFACE, - "HIDEFACIALHAIR" = HIDEFACIALHAIR, - "HIDEGLOVES" = HIDEGLOVES, - "HIDEHAIR" = HIDEHAIR, - "HIDEHEADGEAR" = HIDEHEADGEAR, - "HIDEJUMPSUIT" = HIDEJUMPSUIT, - "HIDEMASK" = HIDEMASK, - "HIDEBELT" = HIDEBELT, - "HIDENECK" = HIDENECK, - "HIDESHOES" = HIDESHOES, - "HIDESNOUT" = HIDESNOUT, - "HIDESUITSTORAGE" = HIDESUITSTORAGE, - "HIDEMUTWINGS" = HIDEMUTWINGS, - "HIDEANTENNAE" = HIDEANTENNAE, -)) +#define HIDEFLAGS_BITFIELD list( \ + "HIDEEARS" = HIDEEARS, \ + "HIDEEYES" = HIDEEYES, \ + "HIDEFACE" = HIDEFACE, \ + "HIDEFACIALHAIR" = HIDEFACIALHAIR, \ + "HIDEGLOVES" = HIDEGLOVES, \ + "HIDEHAIR" = HIDEHAIR, \ + "HIDEHEADGEAR" = HIDEHEADGEAR, \ + "HIDEJUMPSUIT" = HIDEJUMPSUIT, \ + "HIDEMASK" = HIDEMASK, \ + "HIDEBELT" = HIDEBELT, \ + "HIDENECK" = HIDENECK, \ + "HIDESHOES" = HIDESHOES, \ + "HIDESNOUT" = HIDESNOUT, \ + "HIDESUITSTORAGE" = HIDESUITSTORAGE, \ + "HIDEMUTWINGS" = HIDEMUTWINGS, \ + "HIDEANTENNAE" = HIDEANTENNAE, \ +) + +/// Item obscured flags +DEFINE_BITFIELD(flags_inv, HIDEFLAGS_BITFIELD) +/// Item coverage flags +DEFINE_BITFIELD(transparent_protection, HIDEFLAGS_BITFIELD) +/// Mob obscured flags +DEFINE_BITFIELD(obscured_slots, HIDEFLAGS_BITFIELD) +/// Mob covered flags +DEFINE_BITFIELD(covered_slots, HIDEFLAGS_BITFIELD) + +#undef HIDEFLAGS_BITFIELD DEFINE_BITFIELD(strict_coverage_zones, list( "HAIR_APPENDAGE_FRONT" = HAIR_APPENDAGE_FRONT, diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index c3ce31d9d3d..e26eb16f6cc 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -72,8 +72,6 @@ if(screen.needs_offsetting) screen.plane = GET_NEW_PLANE(initial(screen.plane), offset) -INITIALIZE_IMMEDIATE(/atom/movable/screen/fullscreen) - /atom/movable/screen/fullscreen icon = 'icons/hud/screen_full.dmi' icon_state = "default" diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index fda5012a4c7..3ccab614996 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -301,7 +301,7 @@ var/mob/living/carbon/human/human_mob = mymob if(istype(human_mob)) blocked_slots |= human_mob.dna?.species?.no_equip_flags - if(isnull(human_mob.w_uniform) && !HAS_TRAIT(human_mob, TRAIT_NO_JUMPSUIT)) + if((isnull(human_mob.w_uniform) || !(human_mob.w_uniform.item_flags & IN_INVENTORY)) && !HAS_TRAIT(human_mob, TRAIT_NO_JUMPSUIT)) var/obj/item/bodypart/chest = human_mob.get_bodypart(BODY_ZONE_CHEST) if(isnull(chest) || IS_ORGANIC_LIMB(chest)) blocked_slots |= ITEM_SLOT_ID|ITEM_SLOT_BELT @@ -311,7 +311,7 @@ var/obj/item/bodypart/right_leg = human_mob.get_bodypart(BODY_ZONE_R_LEG) if(isnull(right_leg) || IS_ORGANIC_LIMB(right_leg)) blocked_slots |= ITEM_SLOT_RPOCKET - if(isnull(human_mob.wear_suit)) + if(isnull(human_mob.wear_suit) || !(human_mob.wear_suit.item_flags & IN_INVENTORY)) blocked_slots |= ITEM_SLOT_SUITSTORE if(human_mob.num_hands <= 0) blocked_slots |= ITEM_SLOT_GLOVES diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index 0f4b5d8321e..4dc7a7feeb6 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -43,7 +43,7 @@ * Returns true if the parent item is obscured by something else that the wielder is wearing */ /datum/component/bloodysoles/proc/is_obscured() - return (wielder.check_covered_slots() & equipped_slot) || is_under_feet_covered() + return (hidden_slots_to_inventory_slots(wielder.covered_slots) & equipped_slot) || is_under_feet_covered() /** * Returns true if the parent item is worn in the ITEM_SLOT_ICLOTHING slot and the diff --git a/code/datums/components/cuff_n_stun.dm b/code/datums/components/cuff_n_stun.dm index fda9618e93c..6f9355cb6f1 100644 --- a/code/datums/components/cuff_n_stun.dm +++ b/code/datums/components/cuff_n_stun.dm @@ -82,7 +82,6 @@ if(!do_after(parent, handcuff_timer, human_target)) return human_target.set_handcuffed(new handcuff_type(human_target)) - human_target.update_handcuffed() post_arrest_callback?.Invoke(human_target) /datum/component/stun_n_cuff/proc/stun_target(mob/living/carbon/human_target) diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index 87af014396e..a251fd0e38a 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -140,7 +140,6 @@ parent_gear.icon_state = "[initial(parent_gear.post_init_icon_state) || initial(parent_gear.icon_state)][parent_icon_state_suffix]" parent_gear.worn_icon_state = parent_gear.icon_state parent_gear.update_slot_icon() - wearer.update_obscured_slots(deployable.flags_inv) wearer.update_mob_action_buttons() /// Undeploy gear if it moves slots somehow diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 70b7e2968ab..b041aa47c3d 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -262,10 +262,10 @@ return STRIPPABLE_OBSCURING_NONE var/mob/living/carbon/carbon_source = source - if (carbon_source.check_obscured_slots() & item_slot) + if (hidden_slots_to_inventory_slots(carbon_source.obscured_slots) & item_slot) return STRIPPABLE_OBSCURING_COMPLETELY - if (carbon_source.check_covered_slots() & item_slot) + if (hidden_slots_to_inventory_slots(carbon_source.covered_slots) & item_slot) return STRIPPABLE_OBSCURING_INACCESSIBLE return STRIPPABLE_OBSCURING_NONE diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 91f57f46fa8..6f9225cfdd1 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -123,7 +123,7 @@ if(ishuman(possible_throwable)) var/mob/living/carbon/human/human_throwable = possible_throwable - if(human_throwable.wear_suit && (human_throwable.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(human_throwable.obscured_slots & HIDEJUMPSUIT) to_chat(user, span_warning("You can't reach [human_throwable]'s tail through [human_throwable.p_their()] [human_throwable.wear_suit.name]!")) return diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index fc5c74f46d5..8202f526f26 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -33,9 +33,7 @@ // Having your face covered conceals your drunkness if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner - if(carbon_owner.wear_mask?.flags_inv & HIDEFACE) - return null - if(carbon_owner.head?.flags_inv & HIDEFACE) + if(carbon_owner.obscured_slots & HIDEFACE) return null // .01s are used in case the drunk value ends up to be a small decimal. diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index 2fdd92b82d0..d5125521787 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -178,7 +178,7 @@ var/mob/living/carbon/human/human_victim = victim if(istype(limb, /obj/item/bodypart/head)) - if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE))) + if(human_victim.obscured_slots & HIDEFACE) return FALSE else if(limb.scars_covered_by_clothes) var/num_covers = LAZYLEN(human_victim.get_clothing_on_part(limb)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cd3f17e1622..cfc296cf327 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -755,7 +755,6 @@ SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) if(!silent) play_drop_sound(DROP_SOUND_VOLUME) - user?.update_equipment(src) /// called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -792,7 +791,7 @@ * polling ghosts while it's just being equipped as a visual preview for a dummy. */ /obj/item/proc/visual_equipped(mob/user, slot, initial = FALSE) - return + return TRUE /** * Called by on_equipped. Don't call this directly, we want the ITEM_POST_EQUIPPED signal to be sent after everything else. @@ -818,8 +817,6 @@ item_flags |= IN_INVENTORY RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON)), PROC_REF(update_slot_icon), override = TRUE) - user.update_equipment(src) - if(!initial && (slot_flags & slot) && (play_equip_sound())) return diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 90d2d5a9053..b056ecbef30 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -445,7 +445,6 @@ Return to step 11 of normal process."} if(do_after(user, time_to_cuff, carbon_victim) && carbon_victim.canBeHandcuffed()) if(!carbon_victim.handcuffed) carbon_victim.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(carbon_victim)) - carbon_victim.update_handcuffed() to_chat(user, span_notice("You restrain [carbon_victim].")) log_combat(user, carbon_victim, "handcuffed") else diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index db66083062a..1bafdb7a3ef 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -573,7 +573,6 @@ if(do_after(user, 3 SECONDS, C)) if(!C.handcuffed) C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) - C.update_handcuffed() C.adjust_silence(10 SECONDS) to_chat(user, span_notice("You shackle [C].")) log_combat(user, C, "shackled") diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 9e9cc36c948..210baad0dda 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -334,13 +334,7 @@ sac_target.visible_message(span_danger("[sac_target] begins to shudder violenty as dark tendrils begin to drag them into thin air!")) sac_target.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult(sac_target)) - sac_target.update_handcuffed() - - if(sac_target.legcuffed) - sac_target.legcuffed.forceMove(sac_target.drop_location()) - sac_target.legcuffed.dropped(sac_target) - sac_target.legcuffed = null - sac_target.update_worn_legcuffs() + sac_target.dropItemToGround(sac_target.legcuffed, TRUE) sac_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 85, 150) sac_target.do_jitter_animation() diff --git a/code/modules/clothing/chameleon/_chameleon_action.dm b/code/modules/clothing/chameleon/_chameleon_action.dm index d0fdf826991..4befe80fbe8 100644 --- a/code/modules/clothing/chameleon/_chameleon_action.dm +++ b/code/modules/clothing/chameleon/_chameleon_action.dm @@ -120,6 +120,7 @@ if(ismob(chameleon_item.loc)) var/mob/wearer = chameleon_item.loc wearer.update_clothing(chameleon_item.slot_flags | ITEM_SLOT_HANDS) + wearer.refresh_obscured() /datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) PROTECTED_PROC(TRUE) // Call update_look, not this! diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 53bbcbe6377..f388cea8805 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -563,12 +563,12 @@ BLIND // can't see anything if(user.is_holding(src)) user.update_held_items() return TRUE - if(up) - user.update_obscured_slots(visor_flags_inv) user.update_clothing(slot_flags) if(!iscarbon(user)) return TRUE var/mob/living/carbon/carbon_user = user + if(up) + carbon_user.refresh_obscured() if(visor_vars_to_toggle & VISOR_TINT) carbon_user.update_tint() if((visor_flags & (MASKINTERNALS|HEADINTERNALS)) && carbon_user.invalid_internals()) diff --git a/code/modules/clothing/head/animalears.dm b/code/modules/clothing/head/animalears.dm index 77ed57a9083..bcb5ffb63ed 100644 --- a/code/modules/clothing/head/animalears.dm +++ b/code/modules/clothing/head/animalears.dm @@ -10,7 +10,7 @@ if(ishuman(user) && (slot & ITEM_SLOT_HEAD)) update_icon(ALL, user) user.update_worn_head() //Color might have been changed by update_appearance. - ..() + return ..() /obj/item/clothing/head/costume/kitty/update_icon(updates=ALL, mob/living/carbon/human/user) . = ..() diff --git a/code/modules/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm index fd900810e67..d3482a2c39e 100644 --- a/code/modules/clothing/masks/animal_masks.dm +++ b/code/modules/clothing/masks/animal_masks.dm @@ -91,6 +91,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) to_chat(M, span_userdanger("[src] was cursed!")) M.update_worn_mask() + M.refresh_obscured() /obj/item/clothing/mask/animal/proc/clear_curse() REMOVE_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 1d57e38ac39..5463ac03d1c 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -77,7 +77,7 @@ . += "The [fastening_type] are all knotted together." /obj/item/clothing/shoes/visual_equipped(mob/user, slot) - ..() + . = ..() if(offset && (slot_flags & slot)) user.pixel_z += offset worn_y_dimension -= (offset * 2) diff --git a/code/modules/fishing/fish/types/rift.dm b/code/modules/fishing/fish/types/rift.dm index eb72c82ac44..ba6a0142ed4 100644 --- a/code/modules/fishing/fish/types/rift.dm +++ b/code/modules/fishing/fish/types/rift.dm @@ -722,12 +722,7 @@ icon_state = "babbearfish" /datum/bodypart_overlay/simple/babbearfish/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDEEARS) || (human.wear_mask?.flags_inv & HIDEEARS)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEEARS) /obj/item/organ/ears/babbelfish/Initialize(mapload) . = ..() diff --git a/code/modules/forensics/forensics_helpers.dm b/code/modules/forensics/forensics_helpers.dm index 46c0bfa3a9d..5b32ee43418 100644 --- a/code/modules/forensics/forensics_helpers.dm +++ b/code/modules/forensics/forensics_helpers.dm @@ -200,7 +200,7 @@ var/dirty_hands = !!(target_flags & (ITEM_SLOT_GLOVES|ITEM_SLOT_HANDS)) var/dirty_feet = !!(target_flags & ITEM_SLOT_FEET) - var/slots_to_bloody = target_flags & ~check_covered_slots() + var/slots_to_bloody = target_flags & ~hidden_slots_to_inventory_slots(covered_slots) var/list/all_worn = get_equipped_items() for(var/obj/item/thing as anything in all_worn) if(thing.slot_flags & slots_to_bloody) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 324282c0af0..d1a0e084f3a 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -295,10 +295,7 @@ location = turf break - I.forceMove(location) - I.layer = initial(I.layer) - SET_PLANE_EXPLICIT(I, initial(I.plane), location) - I.dropped(src) + transferItemToLoc(I, location, force = TRUE, silent = TRUE, animated = !ignore_animation) return FALSE /// Returns true if a mob is holding something @@ -424,13 +421,10 @@ if(!item_dropping) return FALSE - if(client) - client.screen -= item_dropping + client?.screen -= item_dropping - if(observers?.len) - for(var/mob/dead/observe as anything in observers) - if(observe.client) - observe.client.screen -= item_dropping + for(var/mob/dead/observe as anything in observers) + observe.client?.screen -= item_dropping item_dropping.layer = initial(item_dropping.layer) SET_PLANE_EXPLICIT(item_dropping, initial(item_dropping.plane), newloc) @@ -441,7 +435,7 @@ else item_dropping.forceMove(newloc) - item_dropping.dropped(src, silent) + has_unequipped(item_dropping, silent) SEND_SIGNAL(item_dropping, COMSIG_ITEM_POST_UNEQUIP, force, newloc, no_move, invdrop, silent) SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, item_dropping, force, newloc, no_move, invdrop, silent) return TRUE @@ -520,8 +514,15 @@ /// This proc is called after an item has been successfully handled and equipped to a slot. /mob/proc/has_equipped(obj/item/item, slot, initial = FALSE) + SHOULD_CALL_PARENT(TRUE) return item.on_equipped(src, slot, initial) +/// This proc is called after an item has been removed from a mob but before it has been officially deslotted. +/mob/proc/has_unequipped(obj/item/item, silent = FALSE) + SHOULD_CALL_PARENT(TRUE) + item.dropped(src, silent) + return TRUE + /** * Equip an item to the slot or delete * diff --git a/code/modules/mob/living/basic/drone/visuals_icons.dm b/code/modules/mob/living/basic/drone/visuals_icons.dm index fb89e82c8a1..59952d8d249 100644 --- a/code/modules/mob/living/basic/drone/visuals_icons.dm +++ b/code/modules/mob/living/basic/drone/visuals_icons.dm @@ -27,7 +27,7 @@ client.screen += internal_storage -/mob/living/basic/drone/update_worn_head(update_obscured = TRUE) +/mob/living/basic/drone/update_worn_head() remove_overlay(DRONE_HEAD_LAYER) if(head) @@ -44,7 +44,7 @@ apply_overlay(DRONE_HEAD_LAYER) -/mob/living/basic/drone/update_worn_mask(update_obscured = TRUE) +/mob/living/basic/drone/update_worn_mask() update_worn_head() /mob/living/basic/drone/regenerate_icons() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6a16b8ea879..004dbedb06a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -220,32 +220,10 @@ /mob/living/carbon/proc/uncuff() if (handcuffed) - var/obj/item/W = handcuffed - set_handcuffed(null) - if (buckled?.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - SET_PLANE_EXPLICIT(W, initial(W.plane), src) + dropItemToGround(handcuffed, TRUE) changeNext_move(0) if (legcuffed) - var/obj/item/W = legcuffed - legcuffed = null - update_worn_legcuffs() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - SET_PLANE_EXPLICIT(W, initial(W.plane), src) + dropItemToGround(legcuffed, TRUE) changeNext_move(0) /mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break) @@ -263,18 +241,10 @@ else if(I == handcuffed) - handcuffed.forceMove(drop_location()) - set_handcuffed(null) - I.dropped(src) - if(buckled?.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() + dropItemToGround(I, TRUE) return TRUE if(I == legcuffed) - legcuffed.forceMove(drop_location()) - legcuffed = null - I.dropped(src) - update_worn_legcuffs() + dropItemToGround(I, TRUE) return TRUE /mob/living/carbon/proc/accident(obj/item/I) @@ -836,8 +806,6 @@ if(heal_flags & HEAL_RESTRAINTS) QDEL_NULL(handcuffed) QDEL_NULL(legcuffed) - set_handcuffed(null) - update_handcuffed() return ..() @@ -1128,7 +1096,7 @@ . |= held_thing.wash(clean_types) // Check and wash stuff that isn't covered - var/covered = check_covered_slots() + var/covered = hidden_slots_to_inventory_slots(covered_slots) for(var/obj/item/worn as anything in get_equipped_items()) var/slot = get_slot_by_item(worn) // Don't wash glasses if something other than them is covering our eyes @@ -1185,9 +1153,6 @@ scaries.fake = TRUE QDEL_NULL(phantom_wound) -/mob/living/carbon/is_face_visible() - return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE) - /// Returns whether or not the carbon should be able to be shocked /mob/living/carbon/proc/should_electrocute(power_source) if (ismecha(loc)) @@ -1231,7 +1196,7 @@ REMOVE_TRAIT(src, TRAIT_RESTRAINED, HANDCUFFED_TRAIT) else if(handcuffed) ADD_TRAIT(src, TRAIT_RESTRAINED, HANDCUFFED_TRAIT) - + update_handcuffed() /mob/living/carbon/on_lying_down(new_lying_angle) . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 1efea4923e5..d137f110f3a 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -125,3 +125,8 @@ var/bodyshape = BODYSHAPE_HUMANOID COOLDOWN_DECLARE(bleeding_message_cd) + + /// Obscured hide flags (hideflags that can't be seen AND can't be interacted with) + var/obscured_slots = NONE + /// Covered hide flags (hideflags that can be seen, BUT can't be interacted with) + var/covered_slots = NONE diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index a7b22ed39b5..78f5d38205b 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -1,7 +1,3 @@ -/mob/living/carbon/update_obscured_slots(obscured_flags) - ..() - update_body() - /// Updates features and clothing attached to a specific limb with limb-specific offsets /mob/living/carbon/proc/update_features(feature_key) switch(feature_key) @@ -338,7 +334,7 @@ overlays_standing[WOUND_LAYER] = wound_overlay apply_overlay(WOUND_LAYER) -/mob/living/carbon/update_worn_mask(update_obscured = TRUE) +/mob/living/carbon/update_worn_mask() remove_overlay(FACEMASK_LAYER) if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated @@ -349,15 +345,13 @@ inv.update_appearance() if(wear_mask) - if(update_obscured) - update_obscured_slots(wear_mask.flags_inv) - if(!(check_obscured_slots() & ITEM_SLOT_MASK)) + if(!(obscured_slots & HIDEMASK)) overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) -/mob/living/carbon/update_worn_neck(update_obscured = TRUE) +/mob/living/carbon/update_worn_neck() remove_overlay(NECK_LAYER) if(client && hud_used?.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1]) @@ -365,15 +359,13 @@ inv.update_appearance() if(wear_neck) - if(update_obscured) - update_obscured_slots(wear_neck.flags_inv) - if(!(check_obscured_slots() & ITEM_SLOT_NECK)) + if(!(obscured_slots & HIDENECK)) overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi') update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) -/mob/living/carbon/update_worn_back(update_obscured = TRUE) +/mob/living/carbon/update_worn_back() remove_overlay(BACK_LAYER) if(client && hud_used?.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1]) @@ -381,24 +373,20 @@ inv.update_appearance() if(back) - if(update_obscured) - update_obscured_slots(back.flags_inv) overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi') update_hud_back(back) apply_overlay(BACK_LAYER) -/mob/living/carbon/update_worn_legcuffs(update_obscured = TRUE) +/mob/living/carbon/update_worn_legcuffs() remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - if(update_obscured) - update_obscured_slots(legcuffed.flags_inv) overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/simple/mob.dmi', "legcuff1", -LEGCUFF_LAYER) apply_overlay(LEGCUFF_LAYER) throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = src.legcuffed) -/mob/living/carbon/update_worn_head(update_obscured = TRUE) +/mob/living/carbon/update_worn_head() remove_overlay(HEAD_LAYER) if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated @@ -409,20 +397,16 @@ inv.update_appearance() if(head) - if(update_obscured) - update_obscured_slots(head.flags_inv) - if(!(check_obscured_slots() & ITEM_SLOT_HEAD)) + if(!(obscured_slots & HIDEHEADGEAR)) overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head/default.dmi') update_hud_head(head) apply_overlay(HEAD_LAYER) -/mob/living/carbon/update_worn_handcuffs(update_obscured = TRUE) +/mob/living/carbon/update_worn_handcuffs() remove_overlay(HANDCUFF_LAYER) if(handcuffed) - if(update_obscured) - update_obscured_slots(handcuffed.flags_inv) var/mutable_appearance/handcuff_overlay = mutable_appearance('icons/mob/simple/mob.dmi', "handcuff1", -HANDCUFF_LAYER) if(handcuffed.blocks_emissive != EMISSIVE_BLOCK_NONE) handcuff_overlay.overlays += emissive_blocker(handcuff_overlay.icon, handcuff_overlay.icon_state, src, alpha = handcuff_overlay.alpha) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 8e1c9d91fbf..a562204f65e 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -365,14 +365,13 @@ /// Coolects examine information about the mob's clothing and equipment /mob/living/carbon/proc/get_clothing_examine_info(mob/living/user) . = list() - var/obscured = check_obscured_slots() var/t_He = p_They() var/t_His = p_Their() var/t_his = p_their() var/t_has = p_have() var/t_is = p_are() //head - if(head && !(obscured & ITEM_SLOT_HEAD) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) + if(head && !(obscured_slots & HIDEHEADGEAR) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [head.examine_title(user)] on [t_his] head." //back if(back && !HAS_TRAIT(back, TRAIT_EXAMINE_SKIP)) @@ -388,7 +387,7 @@ var/obj/item/corresponding_item = get_item_for_held_index(part.held_index) || part . += "[t_He] [t_has] a [corresponding_item.examine_title(user)] in place of [t_his] [initial(part.plaintext_zone)]." //gloves - if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) + if(gloves && !(obscured_slots & HIDEGLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [gloves.examine_title(user)] on [t_his] hands." else if(GET_ATOM_BLOOD_DECAL_LENGTH(src) && num_hands) var/list/blood_stains = GET_ATOM_BLOOD_DECALS(src) @@ -402,15 +401,15 @@ var/cables_or_cuffs = istype(handcuffed, /obj/item/restraints/handcuffs/cable) ? "restrained with cable" : "handcuffed" . += span_warning("[t_He] [t_is] [icon2html(handcuffed, user)] [cables_or_cuffs]!") //shoes - if(shoes && !(obscured & ITEM_SLOT_FEET) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) + if(shoes && !(obscured_slots & HIDESHOES) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [shoes.examine_title(user)] on [t_his] feet." //mask - if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) + if(wear_mask && !(obscured_slots & HIDEMASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [wear_mask.examine_title(user)] on [t_his] face." - if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) + if(wear_neck && !(obscured_slots & HIDENECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_neck.examine_title(user)] around [t_his] neck." //eyes - if(!(obscured & ITEM_SLOT_EYES) ) + if(!(obscured_slots & HIDEEYES)) if(glasses && !HAS_TRAIT(glasses, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [glasses.examine_title(user)] covering [t_his] eyes." else if(HAS_TRAIT(src, TRAIT_UNNATURAL_RED_GLOWY_EYES)) @@ -418,13 +417,12 @@ else if(HAS_TRAIT(src, TRAIT_BLOODSHOT_EYES)) . += span_warning("[t_His] eyes are bloodshot!") //ears - if(ears && !(obscured & ITEM_SLOT_EARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) + if(ears && !(obscured_slots & HIDEEARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [ears.examine_title(user)] on [t_his] ears." // Yes there's a lot of copypasta here, we can improve this later when carbons are less dumb in general /mob/living/carbon/human/get_clothing_examine_info(mob/living/user) . = list() - var/obscured = check_obscured_slots() var/t_He = p_They() var/t_His = p_Their() var/t_his = p_their() @@ -432,7 +430,7 @@ var/t_is = p_are() //uniform - if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !HAS_TRAIT(w_uniform, TRAIT_EXAMINE_SKIP)) + if(w_uniform && !(obscured_slots & HIDEJUMPSUIT) && !HAS_TRAIT(w_uniform, TRAIT_EXAMINE_SKIP)) //accessory var/accessory_message = "" if(istype(w_uniform, /obj/item/clothing/under)) @@ -443,16 +441,16 @@ . += "[t_He] [t_is] wearing [w_uniform.examine_title(user)][accessory_message]." //head - if(head && !(obscured & ITEM_SLOT_HEAD) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) + if(head && !(obscured_slots & HIDEHEADGEAR) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [head.examine_title(user)] on [t_his] head." //mask - if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) + if(wear_mask && !(obscured_slots & HIDEMASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [wear_mask.examine_title(user)] on [t_his] face." //neck - if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) + if(wear_neck && !(obscured_slots & HIDENECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_neck.examine_title(user)] around [t_his] neck." //eyes - if(!(obscured & ITEM_SLOT_EYES) ) + if(!(obscured_slots & HIDEEYES)) if(glasses && !HAS_TRAIT(glasses, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [glasses.examine_title(user)] covering [t_his] eyes." else if(HAS_TRAIT(src, TRAIT_UNNATURAL_RED_GLOWY_EYES)) @@ -460,13 +458,13 @@ else if(HAS_TRAIT(src, TRAIT_BLOODSHOT_EYES)) . += span_warning("[t_His] eyes are bloodshot!") //ears - if(ears && !(obscured & ITEM_SLOT_EARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) + if(ears && !(obscured_slots & HIDEEARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [ears.examine_title(user)] on [t_his] ears." //suit/armor if(wear_suit && !HAS_TRAIT(wear_suit, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_suit.examine_title(user)]." //suit/armor storage - if(s_store && !(obscured & ITEM_SLOT_SUITSTORE) && !HAS_TRAIT(s_store, TRAIT_EXAMINE_SKIP)) + if(s_store && !(obscured_slots & HIDESUITSTORAGE) && !HAS_TRAIT(s_store, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] carrying [s_store.examine_title(user)] on [t_his] [wear_suit.name]." //back if(back && !HAS_TRAIT(back, TRAIT_EXAMINE_SKIP)) @@ -491,7 +489,7 @@ var/obj/item/corresponding_item = get_item_for_held_index(part.held_index) || part . += "[t_He] [t_has] [corresponding_item.examine_title(user)] in place of [t_his] [initial(part.plaintext_zone)]." //gloves - if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) + if(gloves && !(obscured_slots & HIDEGLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [gloves.examine_title(user)] on [t_his] hands." else if(GET_ATOM_BLOOD_DECAL_LENGTH(src) || blood_in_hands) if(num_hands) @@ -501,10 +499,10 @@ var/cables_or_cuffs = istype(handcuffed, /obj/item/restraints/handcuffs/cable) ? "restrained with cable" : "handcuffed" . += span_warning("[t_He] [t_is] [icon2html(handcuffed, user)] [cables_or_cuffs]!") //belt - if(belt && !(obscured & ITEM_SLOT_BELT) && !HAS_TRAIT(belt, TRAIT_EXAMINE_SKIP)) + if(belt && !(obscured_slots & HIDEBELT) && !HAS_TRAIT(belt, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [belt.examine_title(user)] about [t_his] waist." //shoes - if(shoes && !(obscured & ITEM_SLOT_FEET) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) + if(shoes && !(obscured_slots & HIDESHOES) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [shoes.examine_title(user)] on [t_his] feet." /// Collects info displayed about any HUDs the user has when examining src @@ -584,7 +582,7 @@ /mob/living/carbon/human/examine_more(mob/user) . = ..() - if(istype(w_uniform, /obj/item/clothing/under) && !(check_obscured_slots() & ITEM_SLOT_ICLOTHING) && !HAS_TRAIT(w_uniform, TRAIT_EXAMINE_SKIP)) + if(istype(w_uniform, /obj/item/clothing/under) && !(obscured_slots & HIDEJUMPSUIT) && !HAS_TRAIT(w_uniform, TRAIT_EXAMINE_SKIP)) var/obj/item/clothing/under/undershirt = w_uniform if(undershirt.has_sensor == BROKEN_SENSORS) . += list(span_notice("\The [undershirt]'s medical sensors are sparking.")) @@ -622,7 +620,7 @@ /// Reports how old the mob appears to be /mob/living/carbon/human/proc/get_age_text() - if((wear_mask?.flags_inv & HIDEFACE) || (head?.flags_inv & HIDEFACE)) + if(obscured_slots & HIDEFACE) return var/age_text diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 7ef6b08251c..d5b60051347 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -72,8 +72,13 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) qdel(delete) /mob/living/carbon/human/dummy/has_equipped(obj/item/item, slot, initial = FALSE) + SHOULD_CALL_PARENT(FALSE) // assuming direct control item.item_flags |= IN_INVENTORY - return item.visual_equipped(src, slot, initial) + if(!item.visual_equipped(src, slot, initial)) + return FALSE + + add_item_coverage(item) + return TRUE /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d2c86f4da5f..9792d645ebb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -588,7 +588,7 @@ * Returns false if we couldn't wash our hands due to them being obscured, otherwise true */ /mob/living/carbon/human/proc/wash_hands(clean_types) - if(check_covered_slots() & ITEM_SLOT_GLOVES) + if(covered_slots & HIDEGLOVES) return FALSE if(gloves) @@ -611,7 +611,7 @@ if(glasses && !is_eyes_covered(ITEM_SLOT_MASK|ITEM_SLOT_HEAD) && glasses.wash(clean_types)) . = TRUE - if(wear_mask && !(check_covered_slots() & ITEM_SLOT_MASK) && wear_mask.wash(clean_types)) + if(wear_mask && !(covered_slots & HIDEMASK) && wear_mask.wash(clean_types)) . = TRUE /** @@ -623,7 +623,7 @@ . |= COMPONENT_CLEANED // Wash hands if exposed - if(!gloves && (clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0 && !(check_covered_slots() & ITEM_SLOT_GLOVES)) + if(!gloves && (clean_types & CLEAN_TYPE_BLOOD) && blood_in_hands > 0 && !(covered_slots & HIDEGLOVES)) blood_in_hands = 0 update_worn_gloves() . |= COMPONENT_CLEANED diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4e9e37010ee..a3034d11719 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -393,7 +393,7 @@ if (!(flags & SHOCK_NO_HUMAN_ANIM)) electrocution_animation(4 SECONDS) -/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc +/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize obscured_slots //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc var/list/damaged = list() var/list/inventory_items_to_kill = list() var/acidity = acidpwr * min(acid_volume*0.005, 0.1) @@ -673,29 +673,28 @@ /mob/living/carbon/human/proc/burn_clothing(seconds_per_tick, stacks) var/list/burning_items = list() - var/covered = check_covered_slots() //HEAD// - if(glasses && !(covered & ITEM_SLOT_EYES)) + if(glasses && !(covered_slots & HIDEEYES)) burning_items += glasses - if(wear_mask && !(covered & ITEM_SLOT_MASK)) + if(wear_mask && !(covered_slots & HIDEMASK)) burning_items += wear_mask - if(wear_neck && !(covered & ITEM_SLOT_NECK)) + if(wear_neck && !(covered_slots & HIDENECK)) burning_items += wear_neck - if(ears && !(covered & ITEM_SLOT_EARS)) + if(ears && !(covered_slots & HIDEEARS)) burning_items += ears if(head) burning_items += head //CHEST// - if(w_uniform && !(covered & ITEM_SLOT_ICLOTHING)) + if(w_uniform && !(covered_slots & HIDEJUMPSUIT)) burning_items += w_uniform if(wear_suit) burning_items += wear_suit //ARMS & HANDS// var/obj/item/clothing/arm_clothes = null - if(gloves && !(covered & ITEM_SLOT_GLOVES)) + if(gloves && !(covered_slots & HIDEGLOVES)) arm_clothes = gloves else if(wear_suit && ((wear_suit.body_parts_covered & HANDS) || (wear_suit.body_parts_covered & ARMS))) arm_clothes = wear_suit @@ -706,7 +705,7 @@ //LEGS & FEET// var/obj/item/clothing/leg_clothes = null - if(shoes && !(covered & ITEM_SLOT_FEET)) + if(shoes && !(covered_slots & HIDESHOES)) leg_clothes = shoes else if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (wear_suit.body_parts_covered & LEGS))) leg_clothes = wear_suit diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 5c4140223be..5a84b21169a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -80,9 +80,7 @@ /mob/living/carbon/human/get_face_name(if_no_face = "Unknown") if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return if_no_face //We're Unknown, no face information for you - for(var/obj/item/worn_item in get_equipped_items()) - if(!(worn_item.flags_inv & HIDEFACE)) - continue + if(obscured_slots & HIDEFACE) return if_no_face var/obj/item/bodypart/head = get_bodypart(BODY_ZONE_HEAD) if(isnull(head) || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (head.brutestate + head.burnstate) > 2 || !real_name || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) //disfigured. use id-name if possible diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 8c91fee3dc5..044315bd2b8 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -70,14 +70,10 @@ There are several things that need to be remembered: //damage overlays update_damage_overlays() -/mob/living/carbon/human/update_obscured_slots(obscured_flags) - ..() - sec_hud_set_security_status() - /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv -/mob/living/carbon/human/update_worn_undersuit(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_undersuit() remove_overlay(UNIFORM_LAYER) if(client && hud_used) @@ -88,10 +84,7 @@ There are several things that need to be remembered: var/obj/item/clothing/under/uniform = w_uniform update_hud_uniform(uniform) - if(update_obscured) - update_obscured_slots(uniform.flags_inv) - - if(HAS_TRAIT(uniform, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_ICLOTHING)) + if(HAS_TRAIT(uniform, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEJUMPSUIT)) return var/target_overlay = uniform.icon_state @@ -136,7 +129,7 @@ There are several things that need to be remembered: apply_overlay(UNIFORM_LAYER) check_body_shape(BODYSHAPE_DIGITIGRADE, ITEM_SLOT_ICLOTHING) -/mob/living/carbon/human/update_worn_id(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_id() remove_overlay(ID_LAYER) if(client && hud_used) @@ -149,9 +142,6 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_id update_hud_id(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) return @@ -169,7 +159,7 @@ There are several things that need to be remembered: apply_overlay(ID_LAYER) -/mob/living/carbon/human/update_worn_gloves(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_gloves() remove_overlay(GLOVES_LAYER) if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]) @@ -198,10 +188,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = gloves update_hud_gloves(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_GLOVES)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEGLOVES)) return var/icon_file = 'icons/mob/clothing/hands.dmi' @@ -233,7 +220,7 @@ There are several things that need to be remembered: overlays_standing[GLOVES_LAYER] = gloves_overlay apply_overlay(GLOVES_LAYER) -/mob/living/carbon/human/update_worn_glasses(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_glasses() remove_overlay(GLASSES_LAYER) var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) @@ -248,10 +235,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = glasses update_hud_glasses(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_EYES)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEEYES)) return var/icon_file = 'icons/mob/clothing/eyes.dmi' @@ -261,7 +245,8 @@ There are several things that need to be remembered: overlays_standing[GLASSES_LAYER] = glasses_overlay apply_overlay(GLASSES_LAYER) -/mob/living/carbon/human/update_worn_ears(update_obscured = TRUE) + +/mob/living/carbon/human/update_worn_ears() remove_overlay(EARS_LAYER) var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) @@ -276,10 +261,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = ears update_hud_ears(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_EARS)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEEARS)) return var/icon_file = 'icons/mob/clothing/ears.dmi' @@ -289,7 +271,7 @@ There are several things that need to be remembered: overlays_standing[EARS_LAYER] = ears_overlay apply_overlay(EARS_LAYER) -/mob/living/carbon/human/update_worn_neck(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_neck() remove_overlay(NECK_LAYER) if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1]) @@ -300,10 +282,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_neck update_hud_neck(wear_neck) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_NECK)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDENECK)) return var/icon_file = 'icons/mob/clothing/neck.dmi' @@ -315,7 +294,7 @@ There are several things that need to be remembered: apply_overlay(NECK_LAYER) -/mob/living/carbon/human/update_worn_shoes(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_shoes() remove_overlay(SHOES_LAYER) if(num_legs < 2) @@ -329,10 +308,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = shoes update_hud_shoes(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_FEET)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDESHOES)) return var/icon_file = DEFAULT_SHOES_FILE @@ -356,7 +332,7 @@ There are several things that need to be remembered: apply_overlay(SHOES_LAYER) check_body_shape(BODYSHAPE_DIGITIGRADE, ITEM_SLOT_FEET) -/mob/living/carbon/human/update_suit_storage(update_obscured = TRUE) +/mob/living/carbon/human/update_suit_storage() remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) @@ -367,10 +343,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = s_store update_hud_s_store(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_SUITSTORE)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDESUITSTORAGE)) return var/mutable_appearance/s_store_overlay = worn_item.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi') @@ -379,7 +352,7 @@ There are several things that need to be remembered: overlays_standing[SUIT_STORE_LAYER] = s_store_overlay apply_overlay(SUIT_STORE_LAYER) -/mob/living/carbon/human/update_worn_head(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_head() remove_overlay(HEAD_LAYER) if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]) var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] @@ -389,10 +362,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = head update_hud_head(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_HEAD)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEHEADGEAR)) return var/icon_file = 'icons/mob/clothing/head/default.dmi' @@ -405,7 +375,7 @@ There are several things that need to be remembered: apply_overlay(HEAD_LAYER) check_body_shape(BODYSHAPE_SNOUTED, ITEM_SLOT_HEAD) -/mob/living/carbon/human/update_worn_belt(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_belt() remove_overlay(BELT_LAYER) if(client && hud_used) @@ -416,10 +386,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = belt update_hud_belt(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_BELT)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEBELT)) return var/icon_file = 'icons/mob/clothing/belt.dmi' @@ -431,7 +398,7 @@ There are several things that need to be remembered: apply_overlay(BELT_LAYER) -/mob/living/carbon/human/update_worn_oversuit(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_oversuit() remove_overlay(SUIT_LAYER) if(client && hud_used) @@ -442,9 +409,6 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_suit update_hud_wear_suit(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) return @@ -479,7 +443,7 @@ There are several things that need to be remembered: client.screen += r_store update_observer_view(r_store) -/mob/living/carbon/human/update_worn_mask(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_mask() remove_overlay(FACEMASK_LAYER) var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) @@ -494,10 +458,7 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_mask update_hud_wear_mask(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots() & ITEM_SLOT_MASK)) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDEMASK)) return var/icon_file = 'icons/mob/clothing/mask.dmi' @@ -509,7 +470,7 @@ There are several things that need to be remembered: apply_overlay(FACEMASK_LAYER) check_body_shape(BODYSHAPE_SNOUTED, ITEM_SLOT_MASK) -/mob/living/carbon/human/update_worn_back(update_obscured = TRUE) +/mob/living/carbon/human/update_worn_back() remove_overlay(BACK_LAYER) if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1]) @@ -521,9 +482,6 @@ There are several things that need to be remembered: var/mutable_appearance/back_overlay update_hud_back(worn_item) - if(update_obscured) - update_obscured_slots(worn_item.flags_inv) - if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) return diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 4bea0e925ea..06016b7a07c 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -13,15 +13,9 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) - // List of signals which force a visible name update - // TRAIT_UNKNOWN is excluded as it calls update_ID_card which also calls update_visible_name - var/static/list/name_update_signals = list( - SIGNAL_ADDTRAIT(TRAIT_INVISIBLE_MAN), - SIGNAL_REMOVETRAIT(TRAIT_INVISIBLE_MAN), - SIGNAL_ADDTRAIT(TRAIT_DISFIGURED), - SIGNAL_REMOVETRAIT(TRAIT_DISFIGURED), - ) - RegisterSignals(src, name_update_signals, PROC_REF(update_visible_name)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_HUSK), SIGNAL_REMOVETRAIT(TRAIT_HUSK)), PROC_REF(refresh_obscured)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_INVISIBLE_MAN), SIGNAL_REMOVETRAIT(TRAIT_INVISIBLE_MAN)), PROC_REF(invisible_man_toggle)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DISFIGURED), SIGNAL_REMOVETRAIT(TRAIT_DISFIGURED)), PROC_REF(update_visible_name)) /// Gaining or losing [TRAIT_DWARF] updates our height and grants passtable /mob/living/carbon/human/proc/on_dwarf_trait(datum/source) @@ -91,3 +85,9 @@ vision_distance = COMBAT_MESSAGE_RANGE, ) playsound(src, SFX_RUSTLE, 50, TRUE, -5, frequency = 0.8) + +/// When [TRAIT_INVISIBLE_MAN] is added or removed we need to update a few things +/mob/living/carbon/human/proc/invisible_man_toggle(datum/source) + SIGNAL_HANDLER + refresh_obscured() + update_visible_name() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0805e2a1169..a2dfad08eee 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -215,7 +215,6 @@ . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !item_dropping) return - var/not_handled = FALSE //if we actually unequipped an item, this is because we dont want to run this proc twice, once for carbons and once for humans if(item_dropping == wear_suit) if(s_store && invdrop) dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit. @@ -280,15 +279,12 @@ s_store = null if(!QDELETED(src)) update_suit_storage() - else - not_handled = TRUE - if(not_handled) - return - - update_equipment_speed_mods() - update_obscured_slots(item_dropping.flags_inv) - hud_used?.update_locked_slots() +/mob/living/carbon/human/item_coverage_changed(added_slots, removed_slots) + . = ..() + if((added_slots|removed_slots) & HIDEFACE) + sec_hud_set_security_status() + update_visible_name() /mob/living/carbon/human/toggle_internals(obj/item/tank, is_external = FALSE) // Just close the tank if it's the one the mob already has open. @@ -420,9 +416,3 @@ new_bodypart.try_attach_limb(src, TRUE) hand_bodyparts[i] = new_bodypart ..() //Don't redraw hands until we have organs for them - -/mob/living/carbon/human/update_equipment(obj/item/source) - . = ..() - // If the item we equipped/unequipped hides our face, we (potentially) need to update our name - if (source.flags_inv & HIDEFACE) - update_visible_name() diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index e03cef43cf3..9d0797e0b04 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -78,12 +78,7 @@ return SSaccessories.caps_list /datum/bodypart_overlay/mutant/mushroom_cap/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) /datum/bodypart_overlay/mutant/mushroom_cap/override_color(obj/item/bodypart/bodypart_owner) //The mushroom cap is red by default (can still be dyed) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index a2f4b623826..f4cf1757d9a 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,21 +1,3 @@ -/// Returns a list of slots that are *visibly* covered by clothing and thus cannot be seen by others -/mob/living/carbon/proc/check_obscured_slots() - var/hidden_slots = NONE - - for(var/obj/item/equipped_item in get_equipped_items()) - hidden_slots |= equipped_item.flags_inv - - return hidden_slots_to_inventory_slots(hidden_slots) - -/// Returns a list of slots that are protected by other clothing, but could possibly be seen by others, via transparent visors and similar stuff -/mob/living/carbon/proc/check_covered_slots() - var/hidden_slots = NONE - - for(var/obj/item/equipped_item in get_equipped_items()) - hidden_slots |= equipped_item.flags_inv | equipped_item.transparent_protection - - return hidden_slots_to_inventory_slots(hidden_slots) - /// Convers HIDEX to ITEM_SLOT_X, should be phased out in favor of using latter everywhere later /proc/hidden_slots_to_inventory_slots(hidden_slots) var/obscured = NONE @@ -81,34 +63,13 @@ /// Returns items which are currently visible on the mob /mob/living/carbon/proc/get_visible_items() - var/static/list/visible_slots = list( - ITEM_SLOT_OCLOTHING, - ITEM_SLOT_ICLOTHING, - ITEM_SLOT_GLOVES, - ITEM_SLOT_EYES, - ITEM_SLOT_EARS, - ITEM_SLOT_MASK, - ITEM_SLOT_HEAD, - ITEM_SLOT_FEET, - ITEM_SLOT_ID, - ITEM_SLOT_BELT, - ITEM_SLOT_BACK, - ITEM_SLOT_NECK, - ITEM_SLOT_HANDS, - ITEM_SLOT_SUITSTORE, - ITEM_SLOT_HANDCUFFED, - ITEM_SLOT_LEGCUFFED, - ) - var/list/obscured = check_obscured_slots() var/list/visible_items = list() - for (var/slot in visible_slots) - if (obscured & slot) - continue - var/obj/item/equipped = get_item_by_slot(slot) - if (equipped) - visible_items += equipped + var/obscured_item_slots = hidden_slots_to_inventory_slots(obscured_slots) for (var/obj/item/held in held_items) visible_items += held + for(var/obj/item/thing in get_equipped_items()) + if(!(get_slot_by_item(thing) & obscured_item_slots)) + visible_items += thing return visible_items /mob/living/carbon/proc/equip_in_one_of_slots(obj/item/equipping, list/slots, qdel_on_fail = TRUE, indirect_action = FALSE) @@ -154,13 +115,10 @@ equipping.pulledby.stop_pulling() equipping.screen_loc = null - if(client) - client.screen -= equipping + client?.screen -= equipping - if(observers?.len) - for(var/mob/dead/observe as anything in observers) - if(observe.client) - observe.client.screen -= equipping + for(var/mob/dead/observe as anything in observers) + observe.client?.screen -= equipping equipping.forceMove(src) SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) @@ -190,7 +148,6 @@ update_worn_neck(equipping) if(ITEM_SLOT_HANDCUFFED) set_handcuffed(equipping) - update_handcuffed() if(ITEM_SLOT_LEGCUFFED) legcuffed = equipping update_worn_legcuffs() @@ -208,19 +165,32 @@ return not_handled -/mob/living/carbon/has_equipped(obj/item/item, slot, initial) - . = ..() - hud_used?.update_locked_slots() - /mob/living/carbon/get_equipped_speed_mod_items() return ..() + get_equipped_items() +/mob/living/carbon/has_equipped(obj/item/item, slot, initial = FALSE) + . = ..() + if(!.) + return + + update_equipment_speed_mods() + hud_used?.update_locked_slots() + add_item_coverage(item) + +/mob/living/carbon/has_unequipped(obj/item/item) + . = ..() // NB: ATP the item is still in the slot, but no longer has the IN_INVENTORY flag (so is not returned by get_equipped_items) + if(!.) + return + + update_equipment_speed_mods() + hud_used?.update_locked_slots() + remove_item_coverage(item) + /mob/living/carbon/doUnEquip(obj/item/item_dropping, force, newloc, no_move, invdrop = TRUE, silent = FALSE) . = ..() //Sets the default return value to what the parent returns. if(!. || !item_dropping) //We don't want to set anything to null if the parent returned 0. return - var/not_handled = FALSE //if we actually unequipped an item, this is because we dont want to run this proc twice, once for carbons and once for humans if(item_dropping == head) head = null if(!QDELETED(src)) @@ -241,14 +211,10 @@ set_handcuffed(null) if(buckled?.buckle_requires_restraints) buckled.unbuckle_mob(src) - if(!QDELETED(src)) - update_handcuffed() else if(item_dropping == legcuffed) legcuffed = null if(!QDELETED(src)) update_worn_legcuffs() - else - not_handled = TRUE // Not an else-if because we're probably equipped in another slot if(item_dropping == internal && (QDELETED(src) || QDELETED(item_dropping) || item_dropping.loc != src)) @@ -256,12 +222,44 @@ if(!QDELETED(src)) update_mob_action_buttons(UPDATE_BUTTON_STATUS) - if(not_handled) - return +/// Adds the passed item's coverage to the mob's coverage related flags +/mob/living/carbon/proc/add_item_coverage(obj/item/item) + var/pre_coverage = obscured_slots + obscured_slots |= item.flags_inv + covered_slots |= item.flags_inv | item.transparent_protection + if(pre_coverage != obscured_slots) + item_coverage_changed(obscured_slots & ~pre_coverage, pre_coverage & ~obscured_slots) - update_equipment_speed_mods() - update_obscured_slots(item_dropping.flags_inv) - hud_used?.update_locked_slots() +/// Removes the passed item's coverage from the mob's coverage related flags +/mob/living/carbon/proc/remove_item_coverage(obj/item/item) + refresh_obscured() // No way to remove a single item's coverage without recalculating everything + +/mob/living/carbon/refresh_obscured() + var/pre_coverage = obscured_slots + + obscured_slots = NONE + covered_slots = NONE + for(var/obj/item/other_equipped_item as anything in get_equipped_items()) + obscured_slots |= other_equipped_item.flags_inv + covered_slots |= other_equipped_item.flags_inv | other_equipped_item.transparent_protection + + if(HAS_TRAIT(src, TRAIT_HUSK) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) + obscured_slots |= HIDEHAIR|HIDEFACIALHAIR + + if(pre_coverage != obscured_slots) + item_coverage_changed(obscured_slots & ~pre_coverage, pre_coverage & ~obscured_slots) + +/** + * Called when a mob's obscured slots change + * + * Args + * * added_slots - slots that were added to obscured_slots + * * removed_slots - slots that were removed from obscured_slots + */ +/mob/living/carbon/proc/item_coverage_changed(added_slots, removed_slots) + update_clothing(hidden_slots_to_inventory_slots(added_slots|removed_slots)) + if((added_slots|removed_slots) & (HIDEJUMPSUIT|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT|HIDEMUTWINGS|HIDEANTENNAE)) + update_body() /// Returns the helmet if an air tank compatible helmet is equipped. /mob/living/carbon/proc/can_breathe_helmet() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 98077996f0a..2c007f75ae5 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -630,7 +630,7 @@ TIMER_COOLDOWN_START(user, COOLDOWN_YAWN_PROPAGATION, cooldown * 3) var/mob/living/carbon/carbon_user = user - if(istype(carbon_user) && ((carbon_user.wear_mask?.flags_inv & HIDEFACE) || carbon_user.head?.flags_inv & HIDEFACE)) + if(carbon_user.obscured_slots & HIDEFACE) return // if your face is obscured, skip propagation var/propagation_distance = user.client ? 5 : 2 // mindless mobs are less able to spread yawns diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f0d3e1f249e..d8352bacb74 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2478,11 +2478,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(GRAB_KILL) add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/kill) - -/// Only defined for carbons who can wear masks and helmets, we just assume other mobs have visible faces -/mob/living/proc/is_face_visible() - return TRUE - /// Sprite to show for photocopying mob butts /mob/living/proc/get_butt_sprite() return null diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index d2fb1785b86..d902fdf1eff 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -349,7 +349,6 @@ return FALSE if(!current_target.handcuffed) current_target.set_handcuffed(new cuff_type(current_target)) - current_target.update_handcuffed() playsound(src, SFX_LAW, 50, FALSE) back_to_idle() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a047f0dc1ed..4f5432ee1f0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -675,18 +675,25 @@ return // check to see if their face is blocked or, if not, a signal blocks it - if(examined_mob.is_face_visible() && SEND_SIGNAL(src, COMSIG_MOB_EYECONTACT, examined_mob, TRUE) != COMSIG_BLOCK_EYECONTACT) + if(examined_mob.can_eye_contact() && SEND_SIGNAL(src, COMSIG_MOB_EYECONTACT, examined_mob, TRUE) != COMSIG_BLOCK_EYECONTACT) var/obj/item/clothing/eye_cover = examined_mob.is_eyes_covered() if (!eye_cover || (!eye_cover.tint && !eye_cover.flash_protect)) var/msg = span_smallnotice("You make eye contact with [examined_mob].") addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), src, msg), 0.3 SECONDS) // so the examine signal has time to fire and this will print after - if(!imagined_eye_contact && is_face_visible() && !examined_mob.is_blind() && SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT) + if(!imagined_eye_contact && can_eye_contact() && !examined_mob.is_blind() && SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT) var/obj/item/clothing/eye_cover = is_eyes_covered() if (!eye_cover || (!eye_cover.tint && !eye_cover.flash_protect)) var/msg = span_smallnotice("[src] makes eye contact with you.") addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), examined_mob, msg), 0.3 SECONDS) +/// Checks if we can make eye contact or someone can make eye contact with us +/mob/living/proc/can_eye_contact() + return TRUE + +/mob/living/carbon/can_eye_contact() + return !(obscured_slots & HIDEFACE) + /** * Called by using Activate Held Object with an empty hand/limb * @@ -1502,11 +1509,6 @@ else living_flags |= QUEUE_NUTRITION_UPDATE -/// Update mob stats based on equipment we are wearing when an item is equipped/dropped, to be overriden by children -/// source - Item that caused the update by being equipped/dropped -/mob/proc/update_equipment(obj/item/source) - update_equipment_speed_mods() - /// Apply a proper movespeed modifier based on items we have equipped /mob/proc/update_equipment_speed_mods() var/speedies = 0 diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index b14da72e830..210c041408c 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -42,42 +42,24 @@ if(slot_flags & ITEM_SLOT_HANDS) update_held_items() -///Updates item slots obscured by this item (or using an override of flags to check) -/mob/proc/update_obscured_slots(obscured_flags) - if(obscured_flags & HIDEGLOVES) - update_worn_gloves(update_obscured = FALSE) - if(obscured_flags & HIDESUITSTORAGE) - update_suit_storage(update_obscured = FALSE) - if(obscured_flags & HIDEJUMPSUIT) - update_worn_undersuit(update_obscured = FALSE) - if(obscured_flags & HIDESHOES) - update_worn_shoes(update_obscured = FALSE) - if(obscured_flags & HIDEMASK) - update_worn_mask(update_obscured = FALSE) - if(obscured_flags & HIDEBELT) - update_worn_belt(update_obscured = FALSE) - if(obscured_flags & HIDEEARS) - update_worn_ears(update_obscured = FALSE) - if(obscured_flags & HIDEEYES) - update_worn_glasses(update_obscured = FALSE) - if(obscured_flags & HIDENECK) - update_worn_neck(update_obscured = FALSE) - if(obscured_flags & HIDEHEADGEAR) - update_worn_head(update_obscured = FALSE) +/// Recalculates the mob's obscured and covered slots based on currently equipped items +/mob/proc/refresh_obscured() + SIGNAL_HANDLER + return /mob/proc/update_icons() return ///Updates the handcuff overlay & HUD element. -/mob/proc/update_worn_handcuffs(update_obscured = FALSE) +/mob/proc/update_worn_handcuffs() return ///Updates the legcuff overlay & HUD element. -/mob/proc/update_worn_legcuffs(update_obscured = FALSE) +/mob/proc/update_worn_legcuffs() return ///Updates the back overlay & HUD element. -/mob/proc/update_worn_back(update_obscured = FALSE) +/mob/proc/update_worn_back() return ///Updates the held items overlay(s) & HUD element. @@ -86,27 +68,27 @@ SEND_SIGNAL(src, COMSIG_MOB_UPDATE_HELD_ITEMS) ///Updates the mask overlay & HUD element. -/mob/proc/update_worn_mask(update_obscured = FALSE) +/mob/proc/update_worn_mask() return ///Updates the neck overlay & HUD element. -/mob/proc/update_worn_neck(update_obscured = FALSE) +/mob/proc/update_worn_neck() return ///Updates the oversuit overlay & HUD element. -/mob/proc/update_worn_oversuit(update_obscured = FALSE) +/mob/proc/update_worn_oversuit() return ///Updates the undersuit/uniform overlay & HUD element. -/mob/proc/update_worn_undersuit(update_obscured = FALSE) +/mob/proc/update_worn_undersuit() return ///Updates the belt overlay & HUD element. -/mob/proc/update_worn_belt(update_obscured = FALSE) +/mob/proc/update_worn_belt() return ///Updates the on-head overlay & HUD element. -/mob/proc/update_worn_head(update_obscured = FALSE) +/mob/proc/update_worn_head() return ///Updates every part of a carbon's body. Including parts, mutant parts, lips, underwear, and socks. @@ -117,23 +99,23 @@ return ///Updates the glasses overlay & HUD element. -/mob/proc/update_worn_glasses(update_obscured = FALSE) +/mob/proc/update_worn_glasses() return ///Updates the id overlay & HUD element. -/mob/proc/update_worn_id(update_obscured = FALSE) +/mob/proc/update_worn_id() return ///Updates the shoes overlay & HUD element. -/mob/proc/update_worn_shoes(update_obscured = FALSE) +/mob/proc/update_worn_shoes() return ///Updates the glasses overlay & HUD element. -/mob/proc/update_worn_gloves(update_obscured = FALSE) +/mob/proc/update_worn_gloves() return ///Updates the suit storage overlay & HUD element. -/mob/proc/update_suit_storage(update_obscured = FALSE) +/mob/proc/update_suit_storage() return ///Updates the pocket overlay & HUD element. @@ -141,5 +123,5 @@ return ///Updates the headset overlay & HUD element. -/mob/proc/update_worn_ears(update_obscured = FALSE) +/mob/proc/update_worn_ears() return diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 76fa31d5eac..d2baba9c8d2 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -271,7 +271,7 @@ part.alternate_worn_layer = part_datum.unsealed_layer update_speed() wearer.update_clothing(part.slot_flags | slot_flags) - wearer.update_obscured_slots(part.visor_flags_inv) + wearer.refresh_obscured() if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals()) wearer.cutoff_internals() SEND_SIGNAL(src, COMSIG_MOD_PART_SEALED, part_datum) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index d6974643acf..883eee631d0 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -191,6 +191,7 @@ set_wearer(user) else if(wearer) unset_wearer() + return ..() /obj/item/mod/control/dropped(mob/user) . = ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 2a1c677b641..db4b0f61c25 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -167,6 +167,7 @@ part.worn_icon = used_skin[MOD_WORN_ICON_OVERRIDE] || 'icons/mob/clothing/modsuit/mod_clothing.dmi' part.icon_state = "[skin]-[part.base_icon_state][mod.get_part_datum(part).sealed ? "-sealed" : ""]" mod.wearer?.update_clothing(part.slot_flags) + mod.wearer?.refresh_obscured() /datum/armor/mod_theme melee = 10 diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index c55c038de29..9ef40666fc3 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -315,8 +315,9 @@ qdel(clone_area) get_icon.Blend("#000", ICON_UNDERLAY) for(var/mob/living/carbon/human/person in mobs) - if(person.is_face_visible()) - names += "[person.name]" + if(person.obscured_slots & HIDEFACE) + continue + names += "[person.name]" var/datum/picture/picture = new("picture", desc.Join("
"), mobs_spotted, dead_spotted, names, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) after_picture(user, picture) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 0e25e1b981f..fb979ab054d 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -206,10 +206,9 @@ arm_owner.dropItemToGround(arm_owner.get_item_for_held_index(held_index), 1) . = ..() if(arm_owner.handcuffed) - arm_owner.handcuffed.forceMove(drop_location()) - arm_owner.handcuffed.dropped(arm_owner) + var/obj/item/lost_cuffs = arm_owner.handcuffed arm_owner.set_handcuffed(null) - arm_owner.update_handcuffed() + arm_owner.dropItemToGround(lost_cuffs, force = TRUE) if(arm_owner.hud_used) var/atom/movable/screen/inventory/hand/associated_hand = arm_owner.hud_used.hand_slots["[held_index]"] associated_hand?.update_appearance() @@ -222,13 +221,8 @@ . = ..() if(special || !leg_owner) return - if(leg_owner.legcuffed) - leg_owner.legcuffed.forceMove(drop_location()) - leg_owner.legcuffed.dropped(leg_owner) - leg_owner.legcuffed = null - leg_owner.update_worn_legcuffs() - if(leg_owner.shoes) - leg_owner.dropItemToGround(leg_owner.shoes, force = TRUE) + leg_owner.dropItemToGround(leg_owner.legcuffed, force = TRUE) + leg_owner.dropItemToGround(leg_owner.shoes, force = TRUE) /obj/item/bodypart/head/drop_limb(special, dismembered, move_to_floor = TRUE) if(!special) diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 6cc44094d21..1d3ed4dfe5e 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -11,17 +11,10 @@ LAZYNULL(hair_masks) if(human_head_owner) for(var/obj/item/worn_item in human_head_owner.get_equipped_items()) - if(worn_item.flags_inv & HIDEHAIR) - hair_hidden = TRUE - if(worn_item.flags_inv & HIDEFACIALHAIR) - facial_hair_hidden = TRUE if(worn_item.hair_mask) LAZYSET(hair_masks, worn_item.hair_mask, TRUE) - - //invisibility and husk stuff - if(HAS_TRAIT(human_head_owner, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(human_head_owner, TRAIT_HUSK)) - hair_hidden = TRUE - facial_hair_hidden = TRUE + hair_hidden = !!(human_head_owner.obscured_slots & HIDEHAIR) + facial_hair_hidden = !!(human_head_owner.obscured_slots & HIDEFACIALHAIR) if(is_husked) hair_hidden = TRUE facial_hair_hidden = TRUE diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index b431000b9e2..d8d1ed59774 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -64,7 +64,7 @@ var/uniform_compatible = isnull(worn_uniform) \ || (worn_uniform.supports_variations_flags & DIGITIGRADE_VARIATIONS) \ || !(worn_uniform.body_parts_covered & LEGS) \ - || (worn_suit?.flags_inv & HIDEJUMPSUIT) // If suit hides our jumpsuit, it doesn't matter if it squishes + || (obscured_slots & HIDEJUMPSUIT) // If suit hides our jumpsuit, it doesn't matter if it squishes var/suit_compatible = isnull(worn_suit) \ || (worn_suit.supports_variations_flags & DIGITIGRADE_VARIATIONS) \ diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index b4924471195..2978ffa0dcf 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -123,12 +123,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times dyable = TRUE /datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) /datum/bodypart_overlay/mutant/horns/get_global_feature_list() return SSaccessories.horns_list @@ -155,12 +150,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times feature_key = FEATURE_FRILLS /datum/bodypart_overlay/mutant/frills/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(!(human.head?.flags_inv & HIDEEARS)) - return TRUE - return FALSE + return !(bodypart_owner.owner?.obscured_slots & HIDEEARS) /datum/bodypart_overlay/mutant/frills/get_global_feature_list() return SSaccessories.frills_list @@ -189,12 +179,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times feature_key = FEATURE_SNOUT /datum/bodypart_overlay/mutant/snout/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDESNOUT) || (human.wear_mask?.flags_inv & HIDESNOUT)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDESNOUT) /datum/bodypart_overlay/mutant/snout/get_global_feature_list() return SSaccessories.snouts_list @@ -282,12 +267,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times return burnt ? burn_datum.icon_state : sprite_datum.icon_state /datum/bodypart_overlay/mutant/antennae/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(!(human.head?.flags_inv & HIDEANTENNAE)) - return TRUE - return FALSE + return !(bodypart_owner.owner?.obscured_slots & HIDEANTENNAE) ///The leafy hair of a podperson /obj/item/organ/pod_hair @@ -333,9 +313,4 @@ Unlike normal organs, we're actually inside a persons limbs at all times overlay.color = null /datum/bodypart_overlay/mutant/pod_hair/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 0cb680c112e..4fc3c862b05 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -38,12 +38,7 @@ return SSaccessories.spines_list /datum/bodypart_overlay/mutant/spines/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(human.wear_suit?.flags_inv & HIDEJUMPSUIT) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) /datum/bodypart_overlay/mutant/spines/set_dye_color(new_color, obj/item/organ/tail/organ) var/obj/item/organ/tail/tail = organ?.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 48eeffece85..a554e759713 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -148,12 +148,7 @@ return "[wagging ? "wagging_" : ""][sprite_datum.icon_state]" //add the wagging tag if we be wagging /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(human.wear_suit?.flags_inv & HIDEJUMPSUIT) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) /obj/item/organ/tail/cat name = "tail" @@ -283,12 +278,7 @@ return (!isnull(tail_spine_key) ? "[tail_spine_key]_" : "") + (wagging ? "wagging_" : "") + sprite_datum.icon_state // Select the wagging state if appropriate /datum/bodypart_overlay/mutant/tail_spines/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(human.wear_suit?.flags_inv & HIDEJUMPSUIT) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) /datum/bodypart_overlay/mutant/tail_spines/set_dye_color(new_color, obj/item/organ/organ) dye_color = new_color //no update_body_parts() call, tail/set_dye_color will do it. diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index 86bad3a1b57..ee6f45de75e 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -82,8 +82,8 @@ if(human.stat || human.body_position == LYING_DOWN || isnull(human.client)) return FALSE //Jumpsuits have tail holes, so it makes sense they have wing holes too - if(!cant_hide && human.wear_suit && ((human.wear_suit.flags_inv & HIDEJUMPSUIT) && (!human.wear_suit.species_exception || !is_type_in_list(src, human.wear_suit.species_exception)))) - to_chat(human, span_warning("Your suit blocks your wings from extending!")) + if(!cant_hide && (human.obscured_slots & HIDEJUMPSUIT)) + to_chat(human, span_warning("Your clothing blocks your wings from extending!")) return FALSE var/turf/location = get_turf(human) if(!location) diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index ff282b30666..e71251e8ebf 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -54,11 +54,7 @@ return FALSE if(owner.has_gravity()) return FALSE - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - if(human_owner.wear_suit?.flags_inv & HIDEMUTWINGS) - return FALSE //Can't fly with hidden wings - if(burnt) + if((owner.obscured_slots & HIDEMUTWINGS) || burnt) return FALSE var/datum/gas_mixture/current = owner.loc.return_air() if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) @@ -117,12 +113,7 @@ return SSaccessories.moth_wings_list /datum/bodypart_overlay/mutant/wings/moth/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(human.wear_suit?.flags_inv & HIDEMUTWINGS) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEMUTWINGS) /datum/bodypart_overlay/mutant/wings/moth/get_base_icon_state() return burnt ? burn_datum.icon_state : sprite_datum.icon_state diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm index ac990ba1032..a801f9720da 100644 --- a/code/modules/surgery/organs/external/wings/wings.dm +++ b/code/modules/surgery/organs/external/wings/wings.dm @@ -25,15 +25,4 @@ feature_key = FEATURE_WINGS /datum/bodypart_overlay/mutant/wings/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if(!human.wear_suit) - return TRUE - if(!(human.wear_suit.flags_inv & HIDEJUMPSUIT)) - return TRUE - if(human.wear_suit.species_exception && is_type_in_list(src, human.wear_suit.species_exception)) - return TRUE - return FALSE - - + return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 66991b6d236..0c86cac08d5 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -178,12 +178,7 @@ return SSaccessories.ears_list /datum/bodypart_overlay/mutant/cat_ears/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - var/mob/living/carbon/human/human = bodypart_owner.owner - if(!istype(human)) - return TRUE - if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return FALSE - return TRUE + return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR) /datum/bodypart_overlay/mutant/cat_ears/get_image(image_layer, obj/item/bodypart/limb) var/mutable_appearance/base_ears = ..() diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 98d32916c58..97d5943f855 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -267,8 +267,7 @@ var/mutable_appearance/eye_right = mutable_appearance('icons/mob/human/human_face.dmi', "[eye_icon_state]_r", -EYES_LAYER, parent) var/list/overlays = list(eye_left, eye_right) - var/obscured = parent.check_obscured_slots() - if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES)) + if(overlay_ignore_lighting && !(parent.obscured_slots & HIDEEYES)) overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, parent, -EYES_LAYER, alpha = eye_left.alpha) overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, parent, -EYES_LAYER, alpha = eye_right.alpha) diff --git a/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png index 3907b46b8709b4db3a6a2aeaa4b68a3dba36c500..8fb16d008feb0fb38330be17cc50c85b0a17758d 100644 GIT binary patch delta 1380 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 diff --git a/code/modules/unit_tests/strippable.dm b/code/modules/unit_tests/strippable.dm index 47a76a1ca75..36083804b15 100644 --- a/code/modules/unit_tests/strippable.dm +++ b/code/modules/unit_tests/strippable.dm @@ -25,7 +25,6 @@ var/handcuffs = allocate(/obj/item/restraints/handcuffs, user) user.forceMove(target.loc) user.set_handcuffed(handcuffs) - user.update_handcuffed() TEST_ASSERT_EQUAL(strip_menu.ui_status(user, ui_state), UI_UPDATE, "Being within range but cuffed was not update-only.") user.set_handcuffed(null) qdel(handcuffs) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index c3545fc0edf..d4dbc1257f6 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -668,7 +668,6 @@ if(autocuff && iscarbon(target)) var/mob/living/carbon/carbontarget = target carbontarget.set_handcuffed(new cuff_type(carbontarget)) - carbontarget.update_handcuffed() return if(istype(target, /obj/machinery/door)) From 1320c6d89f945a5d841ea1266beafa35bb2e34ab Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:24:52 +0000 Subject: [PATCH 016/107] Automatic changelog for PR #92779 [ci skip] --- html/changelogs/AutoChangeLog-pr-92779.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92779.yml diff --git a/html/changelogs/AutoChangeLog-pr-92779.yml b/html/changelogs/AutoChangeLog-pr-92779.yml new file mode 100644 index 00000000000..e3cc8b60870 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92779.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - rscdel: "Golems which somehow manage to grow wings and somehow manage to equip something that covers their jumpsuit can no longer fly. (Seriously, this will not affect anyone)" + - refactor: "Refactored clothing obscurity entirely. Items should be a loooot more consistent and what covers what, and should update a lot snappier. As always, report any oddities, like mysteriously disappearing articles of clothing, hair, or species parts" \ No newline at end of file From 4b4fa2d61269aa56cdcaba5fb2f0d8fb104fefdd Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Sun, 7 Sep 2025 17:26:45 +1000 Subject: [PATCH 017/107] Sets the X-01 Multiphase to 12 lethal shots to match the energy gun (#92766) ## About The Pull Request What it says on the tin. If you saw a PR similar to this one. You didn't. ## Why It's Good For The Game It's really weird that the X-01 is, for whatever reason, inferior to the energy gun in terms of lethal capacity but not in terms of nonlethal capacity. I don't really get it, so let's put in two shots. ## Changelog :cl: balance: The Multiphase X-01 has 12 lethal shots to match the capacity of the standard energy gun. /:cl: --- code/modules/projectiles/ammunition/energy/laser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 04d139ca375..1168a2b3814 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -36,7 +36,7 @@ select_name = "kill" /obj/item/ammo_casing/energy/laser/hos - e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE * 1.2) + e_cost = LASER_SHOTS(12, STANDARD_CELL_CHARGE * 1.2) /obj/item/ammo_casing/energy/laser/musket projectile_type = /obj/projectile/beam/laser/musket From e22e2581d6b557ac997abd3cb48e30907c2aae4a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:27:04 +0000 Subject: [PATCH 018/107] Automatic changelog for PR #92766 [ci skip] --- html/changelogs/AutoChangeLog-pr-92766.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92766.yml diff --git a/html/changelogs/AutoChangeLog-pr-92766.yml b/html/changelogs/AutoChangeLog-pr-92766.yml new file mode 100644 index 00000000000..b5222f8d20a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92766.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "The Multiphase X-01 has 12 lethal shots to match the capacity of the standard energy gun." \ No newline at end of file From c82a39217a73f819e7a46942cce520f3783ef7a0 Mon Sep 17 00:00:00 2001 From: Xander3359 <66163761+Xander3359@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:30:50 -0400 Subject: [PATCH 019/107] Converts some afterattack to interaction (#92762) ## About The Pull Request Converts the following into item interaction: - porta_turret - porta_turret_cover - plating/foam (Foam plating) - plate ~cup (and mortar subtype)~ - Recharger ## Why It's Good For The Game Conversion from afterattack to interaction ## Changelog :cl: refactor: change some attack procs to use item interaction /:cl: --- code/_globalvars/traits/_traits.dm | 1 - .../machinery/porta_turret/portable_turret.dm | 100 ++++++++++-------- .../porta_turret/portable_turret_cover.dm | 53 +++++----- code/game/machinery/recharger.dm | 33 +++--- code/game/objects/items/storage/lockbox.dm | 2 +- code/game/turfs/open/floor/plating.dm | 27 ++--- .../food_and_drinks/machinery/griddle.dm | 5 - .../modules/food_and_drinks/machinery/oven.dm | 3 + code/modules/food_and_drinks/plate.dm | 28 ++--- code/modules/mining/fulton.dm | 15 ++- 10 files changed, 138 insertions(+), 129 deletions(-) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 142d9948c82..1e661883b23 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -65,7 +65,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MOVE_GROUND" = TRAIT_MOVE_GROUND, "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, - "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN, "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, "TRAIT_NOT_BARFABLE" = TRAIT_NOT_BARFABLE, "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 7734e98b949..58123bc2323 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -324,55 +324,61 @@ DEFINE_BITFIELD(turret_flags, list( balloon_alert(user, "saved to multitool buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(machine_stat & BROKEN) - if(I.tool_behaviour == TOOL_CROWBAR) - //If the turret is destroyed, you can remove it with a crowbar to - //try and salvage its components - to_chat(user, span_notice("You begin prying the metal coverings off...")) - if(I.use_tool(src, user, 20)) - if(prob(70)) - if(stored_gun) - stored_gun.forceMove(loc) - stored_gun = null - to_chat(user, span_notice("You remove the turret and salvage some components.")) - if(prob(50)) - new /obj/item/stack/sheet/iron(loc, rand(1,4)) - if(prob(50)) - new /obj/item/assembly/prox_sensor(loc) - else - to_chat(user, span_notice("You remove the turret but did not manage to salvage anything.")) - qdel(src) +/obj/machinery/porta_turret/crowbar_act(mob/living/user, obj/item/tool) + if(!(machine_stat & BROKEN)) + return NONE - else if((I.tool_behaviour == TOOL_WRENCH) && (!on)) - if(raised) - return - - //This code handles moving the turret around. After all, it's a portable turret! - if(!anchored && !isinspace()) - set_anchored(TRUE) - RemoveInvisibility(id=type) - update_appearance() - to_chat(user, span_notice("You secure the exterior bolts on the turret.")) - if(has_cover) - cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second - cover.parent_turret = src //make the cover's parent src - else if(anchored) - set_anchored(FALSE) - to_chat(user, span_notice("You unsecure the exterior bolts on the turret.")) - power_change() - SetInvisibility(INVISIBILITY_NONE, id=type) - qdel(cover) //deletes the cover, and the turret instance itself becomes its own cover. - - else if(I.GetID()) - //Behavior lock/unlock mangement - if(allowed(user)) - locked = !locked - to_chat(user, span_notice("Controls are now [locked ? "locked" : "unlocked"].")) - else - to_chat(user, span_alert("Access denied.")) + //If the turret is destroyed, you can remove it with a crowbar to + //try and salvage its components + to_chat(user, span_notice("You begin prying the metal coverings off...")) + if(!tool.use_tool(src, user, 20)) + return ITEM_INTERACT_BLOCKING + if(prob(70)) + if(stored_gun) + stored_gun.forceMove(loc) + stored_gun = null + to_chat(user, span_notice("You remove the turret and salvage some components.")) + if(prob(50)) + new /obj/item/stack/sheet/iron(loc, rand(1,4)) + if(prob(50)) + new /obj/item/assembly/prox_sensor(loc) else - return ..() + to_chat(user, span_notice("You remove the turret but did not manage to salvage anything.")) + qdel(src) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/porta_turret/wrench_act(mob/living/user, obj/item/tool) + if(on || raised) + return NONE + + //This code handles moving the turret around. After all, it's a portable turret! + if(!anchored && !isinspace()) + set_anchored(TRUE) + RemoveInvisibility(id=type) + update_appearance() + to_chat(user, span_notice("You secure the exterior bolts on the turret.")) + if(has_cover) + cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second + cover.parent_turret = src //make the cover's parent src + else if(anchored) + set_anchored(FALSE) + to_chat(user, span_notice("You unsecure the exterior bolts on the turret.")) + power_change() + SetInvisibility(INVISIBILITY_NONE, id=type) + qdel(cover) //deletes the cover, and the turret instance itself becomes its own cover. + return ITEM_INTERACT_SUCCESS + +/obj/machinery/porta_turret/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!tool.GetID()) + return NONE + + //Behavior lock/unlock mangement + if(!allowed(user)) + to_chat(user, span_alert("Access denied.")) + return ITEM_INTERACT_BLOCKING + locked = !locked + to_chat(user, span_notice("Controls are now [locked ? "locked" : "unlocked"].")) + return ITEM_INTERACT_SUCCESS /obj/machinery/porta_turret/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index 9ce769c1ddc..268c9e36714 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -37,40 +37,41 @@ return ..() || parent_turret.attack_ghost(user) /obj/machinery/porta_turret_cover/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - . = NONE if(parent_turret.locked) - return + user.balloon_alert(user, "controls locked") + return ITEM_INTERACT_BLOCKING multi_tool.set_buffer(parent_turret) balloon_alert(user, "saved to multitool buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on) - if(parent_turret.raised) - return - if(!parent_turret.anchored) - parent_turret.set_anchored(TRUE) - to_chat(user, span_notice("You secure the exterior bolts on the turret.")) - parent_turret.SetInvisibility(INVISIBILITY_MAXIMUM, id=parent_turret.type, priority=INVISIBILITY_PRIORITY_TURRET_COVER) - parent_turret.update_appearance() - else - parent_turret.set_anchored(FALSE) - to_chat(user, span_notice("You unsecure the exterior bolts on the turret.")) - parent_turret.SetInvisibility(INVISIBILITY_NONE, id=parent_turret.type, priority=INVISIBILITY_PRIORITY_TURRET_COVER) - parent_turret.update_appearance() - qdel(src) - return +/obj/machinery/porta_turret_cover/wrench_act(mob/living/user, obj/item/tool) + if(parent_turret.on || parent_turret.raised) + return NONE - if(I.GetID()) - if(parent_turret.allowed(user)) - parent_turret.locked = !parent_turret.locked - to_chat(user, span_notice("Controls are now [parent_turret.locked ? "locked" : "unlocked"].")) - else - to_chat(user, span_notice("Access denied.")) - return + if(parent_turret.anchored) + parent_turret.set_anchored(FALSE) + to_chat(user, span_notice("You unsecure the exterior bolts on the turret.")) + parent_turret.SetInvisibility(INVISIBILITY_NONE, id=parent_turret.type, priority=INVISIBILITY_PRIORITY_TURRET_COVER) + parent_turret.update_appearance() + qdel(src) + return ITEM_INTERACT_SUCCESS - return ..() + parent_turret.set_anchored(TRUE) + to_chat(user, span_notice("You secure the exterior bolts on the turret.")) + parent_turret.SetInvisibility(INVISIBILITY_MAXIMUM, id=parent_turret.type, priority=INVISIBILITY_PRIORITY_TURRET_COVER) + parent_turret.update_appearance() + return ITEM_INTERACT_SUCCESS + +/obj/machinery/porta_turret_cover/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!tool.GetID()) + return NONE + if(!parent_turret.allowed(user)) + to_chat(user, span_notice("Access denied.")) + return ITEM_INTERACT_BLOCKING + parent_turret.locked = !parent_turret.locked + to_chat(user, span_notice("Controls are now [parent_turret.locked ? "locked" : "unlocked"].")) + return ITEM_INTERACT_SUCCESS /obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) return parent_turret.attacked_by(I, user, modifiers) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 54cfdd4a61a..a655972eb3b 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -6,12 +6,15 @@ desc = "A charging dock for energy based weaponry, PDAs, and other devices." circuit = /obj/item/circuitboard/machine/recharger pass_flags = PASSTABLE + /// The item currently inserted into the charger var/obj/item/charging = null + /// How good the capacitor is at charging the item var/recharge_coeff = 1 - var/using_power = FALSE //Did we put power into "charging" last process()? - ///Did we finish recharging the currently inserted item? + /// Did we put power into "charging" last process()? + var/using_power = FALSE + /// Did we finish recharging the currently inserted item? var/finished_recharging = FALSE - + /// List of items that can be recharged var/static/list/allowed_devices = typecacheof(list( /obj/item/gun/energy, /obj/item/melee/baton/security, @@ -83,28 +86,28 @@ update_appearance() return ..() -/obj/machinery/recharger/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(!is_type_in_typecache(attacking_item, allowed_devices)) - return ..() +/obj/machinery/recharger/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!is_type_in_typecache(tool, allowed_devices)) + return NONE if(!anchored) to_chat(user, span_notice("[src] isn't connected to anything!")) - return TRUE + return ITEM_INTERACT_BLOCKING if(charging || panel_open) - return TRUE + return ITEM_INTERACT_BLOCKING var/area/our_area = get_area(src) //Check to make sure user's not in space doing it, and that the area got proper power. if(!isarea(our_area) || our_area.power_equip == 0) - to_chat(user, span_notice("[src] blinks red as you try to insert [attacking_item].")) - return TRUE + to_chat(user, span_notice("[src] blinks red as you try to insert [tool].")) + return ITEM_INTERACT_BLOCKING - if (istype(attacking_item, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy_gun = attacking_item + if(istype(tool, /obj/item/gun/energy)) + var/obj/item/gun/energy/energy_gun = tool if(!energy_gun.can_charge) to_chat(user, span_notice("Your gun has no external power connector.")) - return TRUE - user.transferItemToLoc(attacking_item, src) - return TRUE + return ITEM_INTERACT_BLOCKING + user.transferItemToLoc(tool, src) + return ITEM_INTERACT_SUCCESS /obj/machinery/recharger/wrench_act(mob/living/user, obj/item/tool) if(charging) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 81d1f080bed..02f89c0f351 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -27,7 +27,7 @@ /obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) if(!held_item) return NONE - if(src.broken) + if(broken) return NONE if(!held_item.GetID()) return NONE diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 83781b92cbc..8aa5c2ed393 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -156,19 +156,22 @@ /turf/open/floor/plating/foam/break_tile() return //jetfuel can't break steel foam... -/turf/open/floor/plating/foam/attackby(obj/item/attacking_item, mob/user, list/modifiers) - if(ismetaltile(attacking_item)) - var/obj/item/stack/tile/tiles = attacking_item - if(!tiles.use(1)) - return - var/obj/lattice = locate(/obj/structure/lattice) in src - if(lattice) - qdel(lattice) - to_chat(user, span_notice("You reinforce the foamed plating with tiling.")) - playsound(src, 'sound/items/weapons/Genhit.ogg', 50, TRUE) - ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return +/turf/open/floor/plating/foam/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!ismetaltile(tool)) + return NONE + var/obj/item/stack/tile/tiles = tool + if(!tiles.use(1)) + return ITEM_INTERACT_BLOCKING + var/obj/lattice = locate(/obj/structure/lattice) in src + if(lattice) + qdel(lattice) + to_chat(user, span_notice("You reinforce the foamed plating with tiling.")) + playsound(src, 'sound/items/weapons/Genhit.ogg', 50, TRUE) + ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return ITEM_INTERACT_SUCCESS + +/turf/open/floor/plating/foam/attackby(obj/item/attacking_item, mob/user, list/modifiers) playsound(src, 'sound/items/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index f5ff1c140e8..5d0beed7ee0 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -57,11 +57,6 @@ visible_message(span_notice("[exposing_reagent] begins to cook on [src].")) return NONE -/obj/machinery/griddle/crowbar_act(mob/living/user, obj/item/I) - . = ..() - return default_deconstruction_crowbar(I, ignore_panel = TRUE) - - /obj/machinery/griddle/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(griddled_objects.len >= max_items) diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index 7b4ccb76280..a0d0ebad417 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -270,6 +270,9 @@ return ITEM_INTERACT_SUCCESS /obj/item/plate/oven_tray/item_interaction(mob/living/user, obj/item/item, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . if(isnull(item.atom_storage)) return NONE diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 243d4f0ef14..600313c8383 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -24,26 +24,26 @@ if(fragile) AddElement(/datum/element/can_shatter) -/obj/item/plate/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(!IS_EDIBLE(I)) +/obj/item/plate/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!IS_EDIBLE(tool)) balloon_alert(user, "not food!") - return - if(I.w_class > biggest_w_class) + return ITEM_INTERACT_BLOCKING + if(tool.w_class > biggest_w_class) balloon_alert(user, "too big!") - return + return ITEM_INTERACT_BLOCKING if(contents.len >= max_items) balloon_alert(user, "can't fit!") - return + return ITEM_INTERACT_BLOCKING //Center the icon where the user clicked. if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) - return - if(user.transferItemToLoc(I, src, silent = FALSE)) - I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -max_x_offset, max_x_offset) - I.pixel_y = min(text2num(LAZYACCESS(modifiers, ICON_Y)) + placement_offset, max_height_offset) - to_chat(user, span_notice("You place [I] on [src].")) - AddToPlate(I, user) - else - return ..() + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src, silent = FALSE)) + return ITEM_INTERACT_BLOCKING + tool.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -max_x_offset, max_x_offset) + tool.pixel_y = min(text2num(LAZYACCESS(modifiers, ICON_Y)) + placement_offset, max_height_offset) + to_chat(user, span_notice("You place [tool] on [src].")) + AddToPlate(tool, user) + return ITEM_INTERACT_SUCCESS /obj/item/plate/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!iscarbon(target)) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index d05370b273f..8738752af33 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -62,31 +62,30 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(thing.anchored) return NONE - . = ITEM_INTERACT_BLOCKING var/obj/structure/extraction_point/beacon = beacon_ref?.resolve() if(isnull(beacon)) balloon_alert(user, "not linked!") beacon_ref = null - return . + return ITEM_INTERACT_BLOCKING var/area/area = get_area(thing) if(!can_use_indoors) if(!area.outdoors) balloon_alert(user, "not outdoors!") - return . + return ITEM_INTERACT_BLOCKING if(area.area_flags & NOTELEPORT) balloon_alert(user, "unable to activate!") - return + return ITEM_INTERACT_BLOCKING var/area/target_area = get_area(beacon) if(area != target_area && ((area.area_flags & LOCAL_TELEPORT) || (target_area.area_flags & LOCAL_TELEPORT))) balloon_alert(user, "unable to activate!") - return + return ITEM_INTERACT_BLOCKING if(!safe_for_living_creatures && check_for_living_mobs(thing)) to_chat(user, span_warning("[src] is not safe for use with living creatures, they wouldn't survive the trip back!")) balloon_alert(user, "not safe!") - return . + return ITEM_INTERACT_BLOCKING if(thing.move_resist > max_force_fulton) balloon_alert(user, "too heavy!") - return . + return ITEM_INTERACT_BLOCKING balloon_alert_to_viewers("attaching...") playsound(thing, 'sound/items/zip/zip.ogg', vol = 50, vary = TRUE) if(isliving(thing)) @@ -95,7 +94,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) to_chat(thing, span_userdanger("You are being extracted! Stand still to proceed.")) if(!do_after(user, 5 SECONDS, target = thing)) - return . + return ITEM_INTERACT_BLOCKING balloon_alert_to_viewers("extracting!") if(loc == user && ishuman(user)) From e17cdf50c9ade4b76107cda08327c9eb35898194 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:31:07 +0000 Subject: [PATCH 020/107] Automatic changelog for PR #92762 [ci skip] --- html/changelogs/AutoChangeLog-pr-92762.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92762.yml diff --git a/html/changelogs/AutoChangeLog-pr-92762.yml b/html/changelogs/AutoChangeLog-pr-92762.yml new file mode 100644 index 00000000000..b871b4ef58a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92762.yml @@ -0,0 +1,4 @@ +author: "Xander3359" +delete-after: True +changes: + - refactor: "change some attack procs to use item interaction" \ No newline at end of file From d19856e2b764e9078c0a83f12da71dbf17b33cc8 Mon Sep 17 00:00:00 2001 From: sushi Date: Sun, 7 Sep 2025 03:39:16 -0400 Subject: [PATCH 021/107] Fix element/elevation failing to clean up its element/elevation_core from turfs when deleted before Moved is invoked on its source (#92860) ## About The Pull Request * Fixes https://github.com/tgstation/tgstation/issues/92759 * Fixes https://github.com/tgstation/tgstation/issues/81474 The problem is that things like the recycler and bitrunner goal hole react to the crate Enter'ing them, and within their `COMSIG_ATOM_ENTERED` handlers will just outright delete the crate. However, `COMSIG_ATOM_ENTERED` is raised _after_ the crate's `loc` has been set, so upon its deletion the `element/elevation` that was attached to it would `Detach` and attempt to remove the `element/elevation_core` that it had attached to its turf, but will try to do so at the turf it was moved to, not where it was moved from. Thus, the `element/elevation_core` would be left on the tile and would still elevate mobs that moved onto it even though the crate was no longer there. The second issue linked above goes into more detail about the bitrunner crate case showing code and such. This pr attempts to solve this by introducing a new signal, `COMSIG_ATOM_EXITING`, which is raised in the same fashion as `COMSIG_ATOM_ENTERING`. It also splits `element/elevation/on_moved()` into `on_source_exiting()` and `on_source_entering()` so that `elevation` removes its `elevation_core` from the turf it was on immediately, before anything has a chance to delete it upon it entering something. I'm not TOTALLY confident in this being the proper way to go about this, but made sure that overlapping elevation things still interact like they used to, that the `elevation_core` is properly removed upon falling into a chasm and when entering wormholes, and most importantly that the two issues listed above no longer happen. This could still be an issue if there's anyway in game to get an atom to move w/o it going through `doMove` and raising the ENTERING and EXITING signals so let me know if there's anyway this can happen!!! ## Why It's Good For The Game ![dreamseeker_8aiK7O3L10](https://github.com/user-attachments/assets/cd5d9439-2851-4d07-9ad8-090edbb533df) vs ![dreamseeker_SpX6NtHtQG](https://github.com/user-attachments/assets/f15e5572-82a2-4dea-aa9f-7d1a1b455fb3) ## Changelog :cl: sushi fix: crates and other objects causing elevation will no longer leave behind magic elevating turfs upon destruction /:cl: --- .../signals/signals_atom/signals_atom_main.dm | 2 ++ code/datums/elements/elevation.dm | 31 ++++++++++--------- code/game/atom/_atom.dm | 1 + 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 1f261db129a..522a5b72f55 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -70,6 +70,8 @@ #define COMSIG_ATOM_EXITED "atom_exited" ///from base of atom/movable/Moved(): (atom/movable/gone, direction) #define COMSIG_ATOM_ABSTRACT_EXITED "atom_abstract_exited" +///from base of atom/Exited(): (atom/exited, direction) +#define COMSIG_ATOM_EXITING "atom_exiting" ///from base of atom/Bumped(): (/atom/movable) (the one that gets bumped) #define COMSIG_ATOM_BUMPED "atom_bumped" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index 80a9bbe323c..304d79ad160 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -17,16 +17,16 @@ src.pixel_shift = pixel_shift - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + RegisterSignal(target, COMSIG_ATOM_ENTERING, PROC_REF(on_source_entering)) + RegisterSignal(target, COMSIG_ATOM_EXITING, PROC_REF(on_source_exiting)) var/atom/atom_target = target register_turf(atom_target, atom_target.loc) /datum/element/elevation/Detach(atom/movable/source) - UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + UnregisterSignal(source, list(COMSIG_ATOM_ENTERING, COMSIG_ATOM_EXITING)) unregister_turf(source, source.loc) REMOVE_TRAIT(source, TRAIT_ELEVATING_OBJECT, ref(src)) - UnregisterSignal(source, COMSIG_MOVABLE_MOVED) return ..() /datum/element/elevation/proc/reset_elevation(turf/target) @@ -45,10 +45,13 @@ SIGNAL_HANDLER current_values[ELEVATION_MAX_PIXEL_SHIFT] = max(current_values[ELEVATION_MAX_PIXEL_SHIFT], pixel_shift) -/datum/element/elevation/proc/on_moved(atom/movable/source, atom/oldloc) +/datum/element/elevation/proc/on_source_entering(atom/movable/source, atom/entering, atom/old_loc) SIGNAL_HANDLER - unregister_turf(source, oldloc) - register_turf(source, source.loc) + register_turf(source, entering) + +/datum/element/elevation/proc/on_source_exiting(atom/movable/source, atom/exiting) + SIGNAL_HANDLER + unregister_turf(source, exiting) /datum/element/elevation/proc/register_turf(atom/movable/source, atom/location) if(!isturf(location)) @@ -67,17 +70,15 @@ UnregisterSignal(location, list(COMSIG_TURF_RESET_ELEVATION, COMSIG_TURF_CHANGE)) reset_elevation(location) -///Changing or destroying the turf detaches the element, also we need to reapply the traits since they don't get passed down. +/// When a turf with elevated objects changes, we need to unregister all the elevating objects on it. When a turf Initializes(), +/// it calls Entered() on all of its moveable contents, which will invoke on_source_entering(), which will register each elevating +/// object with the new turf. We need to do this because turfs do not keep their traits when changed, and so the check for +/// TRAIT_TURF_HAS_ELEVATED_OBJ above will fail and cause override runtimes when we attempt to register the signals again. /datum/element/elevation/proc/pre_change_turf(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER - var/list/trait_sources = GET_TRAIT_SOURCES(changed, TRAIT_TURF_HAS_ELEVATED_OBJ(pixel_shift)) - trait_sources = trait_sources.Copy() - post_change_callbacks += CALLBACK(src, PROC_REF(post_change_turf), trait_sources) - -/datum/element/elevation/proc/post_change_turf(list/trait_sources, turf/changed) - for(var/source in trait_sources) - ADD_TRAIT(changed, TRAIT_TURF_HAS_ELEVATED_OBJ(pixel_shift), source) - reset_elevation(changed) + for (var/atom/movable/content as anything in changed) + if(HAS_TRAIT_FROM(content, TRAIT_ELEVATING_OBJECT, ref(src))) + unregister_turf(content, changed) #define ELEVATE_TIME 0.2 SECONDS #define ELEVATION_SOURCE(datum) "elevation_[REF(datum)]" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 10aa9c8345a..83502e23d81 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -615,6 +615,7 @@ */ /atom/Exited(atom/movable/gone, direction) SEND_SIGNAL(src, COMSIG_ATOM_EXITED, gone, direction) + SEND_SIGNAL(gone, COMSIG_ATOM_EXITING, src, direction) ///Return atom temperature /atom/proc/return_temperature() From 805f334f50e90b12ba484bf2f005c741308bc58a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:39:33 +0000 Subject: [PATCH 022/107] Automatic changelog for PR #92860 [ci skip] --- html/changelogs/AutoChangeLog-pr-92860.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92860.yml diff --git a/html/changelogs/AutoChangeLog-pr-92860.yml b/html/changelogs/AutoChangeLog-pr-92860.yml new file mode 100644 index 00000000000..0697d093cb4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92860.yml @@ -0,0 +1,4 @@ +author: "sushi" +delete-after: True +changes: + - bugfix: "crates and other objects causing elevation will no longer leave behind magic elevating turfs upon destruction" \ No newline at end of file From 5d2102d909af76d063947064215d62b5584935e2 Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:39:53 -0400 Subject: [PATCH 023/107] Stops eyelidless corpses from trying (and failing) to blink (#92874) ## About The Pull Request 91YPV6s2tG Saw this amusing runtime-dead bodies spawned in the morgue with randomized injuries have a chance to spawn with eyes that were damaged so much as to be qdeleted. The `check_damage_threshold()` proc occurs before the actual damage gets dealt, so it is possible to enter the blinking procs with eyelids that have become null. This just adds a safety check for that. ## Why It's Good For The Game silly bugfix ## Changelog :cl: fix: dead bodies in the morgue will no longer try to blink /:cl: --- code/modules/surgery/organs/internal/eyes/_eyes.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 97d5943f855..5d1d37ca9f9 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -452,6 +452,8 @@ /// Animates one eyelid at a time, thanks BYOND and thanks animation chains /obj/item/organ/eyes/proc/animate_eyelid(obj/effect/abstract/eyelid_effect/eyelid, mob/living/carbon/human/parent, sync_blinking = TRUE, list/anim_times = null) . = list() + if(isnull(eyelid)) // Can't blink if we don't have an eyelid + return var/prevent_loops = HAS_TRAIT(parent, TRAIT_PREVENT_BLINK_LOOPS) animate(eyelid, alpha = 0, time = 0, loop = (prevent_loops ? 0 : -1)) From 7a5f7f1beee222f581c447bc85e0b426589c82dd Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:40:12 +0000 Subject: [PATCH 024/107] Automatic changelog for PR #92874 [ci skip] --- html/changelogs/AutoChangeLog-pr-92874.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92874.yml diff --git a/html/changelogs/AutoChangeLog-pr-92874.yml b/html/changelogs/AutoChangeLog-pr-92874.yml new file mode 100644 index 00000000000..3a97ffbf133 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92874.yml @@ -0,0 +1,4 @@ +author: "vinylspiders" +delete-after: True +changes: + - bugfix: "dead bodies in the morgue will no longer try to blink" \ No newline at end of file From 2df7e9ffe7010c348505a0ea34289ae5e0feed55 Mon Sep 17 00:00:00 2001 From: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:43:51 +0300 Subject: [PATCH 025/107] You can eject more materials from autolathe now (#92818) ## About The Pull Request yeah ## Changelog :cl: fix: Fixed oversight from "Material tab for the autolathe" PR. You can now eject BS crystals, allien alloy and mythril from autolathe. /:cl: --- .../research/designs/autolathe/materials.dm | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/code/modules/research/designs/autolathe/materials.dm b/code/modules/research/designs/autolathe/materials.dm index cc07a59ea7e..8fdc01234ce 100644 --- a/code/modules/research/designs/autolathe/materials.dm +++ b/code/modules/research/designs/autolathe/materials.dm @@ -130,3 +130,36 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) + +/datum/design/bs_crystal + name = "Bluespace Crystal" + id = "bscrystal" + build_type = AUTOLATHE + materials = list(/datum/material/bluespace = SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/bluespace_crystal + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, + ) + +/datum/design/mythril + name = "Mythril" + id = "mythril" + build_type = AUTOLATHE + materials = list(/datum/material/mythril = SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/mythril + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, + ) + +/datum/design/alien_alloy + name = "Alien Alloy" + id = "allienalloy" + build_type = AUTOLATHE + materials = list(/datum/material/alloy/alien = SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/stack/sheet/mineral/abductor + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, + ) From 40a2e0bf1a5da15c0a7c7b206daae0cc0752507f Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:44:08 +0000 Subject: [PATCH 026/107] Automatic changelog for PR #92818 [ci skip] --- html/changelogs/AutoChangeLog-pr-92818.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92818.yml diff --git a/html/changelogs/AutoChangeLog-pr-92818.yml b/html/changelogs/AutoChangeLog-pr-92818.yml new file mode 100644 index 00000000000..91beccc1c53 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92818.yml @@ -0,0 +1,4 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - bugfix: "Fixed oversight from \"Material tab for the autolathe\" PR. You can now eject BS crystals, allien alloy and mythril from autolathe." \ No newline at end of file From bfa0aaaae5a3999d5d46f43693a274cda012560d Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:14:38 +0530 Subject: [PATCH 027/107] Fixes Chemmaster not highlighting selected container (#92728) ## About The Pull Request https://github.com/user-attachments/assets/57930c18-3001-45d1-9023-58d9fd9f23b4 ## Changelog :cl: fix: Chemmaster highlights selected icon & has its window scaled up /:cl: --- tgui/packages/tgui/interfaces/ChemMaster.tsx | 26 +++++++------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/tgui/packages/tgui/interfaces/ChemMaster.tsx b/tgui/packages/tgui/interfaces/ChemMaster.tsx index 94b6f2f34d0..77767a078bc 100644 --- a/tgui/packages/tgui/interfaces/ChemMaster.tsx +++ b/tgui/packages/tgui/interfaces/ChemMaster.tsx @@ -5,8 +5,8 @@ import { Button, ColorBox, Divider, - DmIcon, Icon, + ImageButton, LabeledList, NumberInput, ProgressBar, @@ -406,36 +406,28 @@ const ContainerButton = (props: CategoryButtonProps) => { key={container.ref} content={`${capitalize(container.name)}\xa0(${container.volume}u)`} > - + /> ); }; From 5b0ade2d5bd9c227ef788eaa5747a18c82dcdde0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:44:55 +0000 Subject: [PATCH 028/107] Automatic changelog for PR #92728 [ci skip] --- html/changelogs/AutoChangeLog-pr-92728.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92728.yml diff --git a/html/changelogs/AutoChangeLog-pr-92728.yml b/html/changelogs/AutoChangeLog-pr-92728.yml new file mode 100644 index 00000000000..d62a5cf8a69 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92728.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "Chemmaster highlights selected icon & has its window scaled up" \ No newline at end of file From d532cc9003135bd03520c6a6335d389b86da3a26 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:52:07 +0200 Subject: [PATCH 029/107] Adds plumbing to toilets (#92695) ## About The Pull Request Toilets no longer act as infinite instant water sources, instead working like showers and sinks - requiring either plumbing, or water reclaimers to restore their cistern's supply. If a toilet has a large enough fish inside, or if someone accidentally drops a small item into it, when flushing it'll spew out all of its cistern's contents around itself (Dropped items can be removed using a plunger after a small delay). Also fixed plunger act code on some plumbing objects, and converted toilets to use item interactions. ### This is a commission for ImprovedName/Ezel ## Why It's Good For The Game Makes toilets more intresting with plumbing, and brings them more inline with other plumbing appliances so that way you can't just make a toilet with 1 material sheet and conjure a infinite water resouce anywhere you please without a water recycler. Also you can get up to some silly stuff with foam production. ## Changelog :cl: add: Toilets now require plumbing or water reclaimers to function, and can get clogged by small items. fix: Trying to use plungers on plumbing objects will no longer hit them after finishing the interaction. code: Updated toilet item interaction code /:cl: --- .../SpaceRuins/DJstation/quarters_1.dmm | 3 +- .../SpaceRuins/DJstation/quarters_2.dmm | 5 +- .../SpaceRuins/DJstation/quarters_3.dmm | 1 - .../CatwalkStation/CatwalkStation_2023.dmm | 3 + .../map_files/Deltastation/DeltaStation2.dmm | 20 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 20 +- _maps/map_files/MetaStation/MetaStation.dmm | 17 +- .../map_files/NebulaStation/NebulaStation.dmm | 8 + _maps/map_files/tramstation/tramstation.dmm | 21 +- _maps/map_files/wawastation/wawastation.dmm | 11 + code/datums/components/plumbing/_plumbing.dm | 12 +- code/game/machinery/medipen_refiller.dm | 10 +- code/game/objects/structures/shower.dm | 11 +- .../structures/water_structures/sink.dm | 2 +- .../structures/water_structures/toilet.dm | 244 ++++++++++++++---- .../plumbing/plumbers/_plumb_machinery.dm | 10 +- code/modules/plumbing/plumbers/iv_drip.dm | 10 +- 17 files changed, 304 insertions(+), 104 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index dc6cea464f7..efdb18e781a 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -31,9 +31,8 @@ /area/ruin/space/djstation) "v" = ( /obj/structure/toilet{ - pixel_y = 8 + dir = 1 }, -/obj/machinery/duct, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm index 4a1dac457b1..ef304f1d930 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm @@ -4,9 +4,6 @@ /area/template_noop) "d" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured, -/area/ruin/space/djstation) -"f" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/dark/textured, /area/ruin/space/djstation) @@ -95,7 +92,7 @@ Y a i M -f +Z d V i diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm index 956b5efe787..9102b5e7acc 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm @@ -15,7 +15,6 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) "d" = ( diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 116f0fb12a0..9cae1477c0f 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -60227,6 +60227,7 @@ id_tag = "restroom_3"; name = "Toilet Unit" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "rJo" = ( @@ -64219,6 +64220,7 @@ id_tag = "restroom_2"; name = "Toilet Unit" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "sVA" = ( @@ -77306,6 +77308,7 @@ id_tag = "restroom_1"; name = "Toilet Unit" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "wOr" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 503c883a062..9c882016ed0 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1631,6 +1631,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/toilet/locker) "asv" = ( @@ -5730,7 +5731,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, /obj/structure/toilet{ - dir = 8 + dir = 1 }, /obj/machinery/light/small/directional/south, /obj/effect/landmark/start/hangover, @@ -7388,6 +7389,10 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) +"bNS" = ( +/obj/machinery/duct, +/turf/closed/wall, +/area/station/medical/break_room) "bNT" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 @@ -27188,7 +27193,7 @@ "gGT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ - dir = 8 + dir = 4 }, /obj/machinery/newscaster/directional/west, /obj/machinery/button/door/directional/south{ @@ -50505,6 +50510,10 @@ /obj/item/paper_bin, /turf/open/floor/carpet, /area/station/command/meeting_room/council) +"mxX" = ( +/obj/machinery/duct, +/turf/closed/wall, +/area/station/science/breakroom) "mxY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, @@ -66301,6 +66310,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/commons/toilet/locker) "qvi" = ( @@ -67603,7 +67613,7 @@ "qKz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/toilet{ - dir = 8 + dir = 1 }, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/bot, @@ -132205,7 +132215,7 @@ fDF fDF peU cHO -aAj +mxX qQM jYk vsV @@ -140442,7 +140452,7 @@ cky dki lvZ jQB -lvZ +bNS lvZ pkg lvZ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 81ec9c04290..5c0c8563625 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -42228,6 +42228,11 @@ dir = 10 }, /area/station/science/research) +"lUp" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "lUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43662,6 +43667,7 @@ id_tag = "Toilet2"; name = "Unit 2" }, +/obj/machinery/duct, /turf/open/floor/iron/textured, /area/station/commons/toilet) "msN" = ( @@ -44244,6 +44250,7 @@ id_tag = "Toilet1"; name = "Unit 1" }, +/obj/machinery/duct, /turf/open/floor/iron/textured, /area/station/commons/toilet) "mBr" = ( @@ -82279,6 +82286,10 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"xpD" = ( +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "xpE" = ( /obj/structure/table, /obj/item/knife/kitchen, @@ -84614,6 +84625,7 @@ /area/station/security/prison/mess) "xWG" = ( /obj/machinery/light/small/directional/south, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "xWM" = ( @@ -248838,7 +248850,7 @@ pBs eYF sNj fKR -hsB +xpD uja ise iuv @@ -249095,7 +249107,7 @@ pBs uja uja uja -hsB +xpD uja wJk iuv @@ -249352,7 +249364,7 @@ pBs uja kDz mBm -twU +lUp uja uPT poL @@ -249609,7 +249621,7 @@ kqP uja uja uja -hsB +xpD uja ehq kOq diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9e6f77fbd41..b21913e628f 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -22784,7 +22784,8 @@ /area/station/medical/virology) "hVX" = ( /obj/structure/toilet{ - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/machinery/light/small/directional/west, /obj/machinery/newscaster/directional/south, @@ -33348,6 +33349,7 @@ id_tag = "Toilet4"; name = "Unit 4" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "lvZ" = ( @@ -33861,7 +33863,8 @@ /area/station/tcommsat/computer) "lJm" = ( /obj/structure/toilet{ - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/machinery/light/small/directional/west, /obj/machinery/newscaster/directional/south, @@ -40061,7 +40064,7 @@ /area/station/maintenance/port) "nKO" = ( /obj/structure/toilet{ - dir = 4 + dir = 1 }, /obj/machinery/light/small/directional/east, /obj/machinery/newscaster/directional/east, @@ -41475,6 +41478,7 @@ id_tag = "Toilet1"; name = "Unit 1" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "ooz" = ( @@ -49684,7 +49688,8 @@ /area/station/engineering/atmos) "rdT" = ( /obj/structure/toilet{ - pixel_y = 8 + pixel_y = 8; + dir = 4 }, /obj/machinery/light/small/directional/west, /obj/machinery/newscaster/directional/south, @@ -56690,6 +56695,7 @@ id_tag = "Toilet3"; name = "Unit 3" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "tzE" = ( @@ -63994,6 +64000,7 @@ id_tag = "Toilet2"; name = "Unit 2" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "vTf" = ( @@ -104913,7 +104920,7 @@ xnU dIO jlY vgu -fLz +kAF lvU nKO dIO diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index dcdf808c474..0745ce5a6d4 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -26607,6 +26607,7 @@ name = "Unit 3" }, /obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/duct, /turf/open/floor/iron/dark/diagonal, /area/station/commons/toilet/restrooms) "dXP" = ( @@ -36023,6 +36024,7 @@ name = "Unit 2" }, /obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/duct, /turf/open/floor/iron/dark/diagonal, /area/station/commons/toilet/restrooms) "frS" = ( @@ -47899,6 +47901,7 @@ dir = 8 }, /obj/effect/turf_decal/siding/thinplating_new/light/corner, +/obj/machinery/duct, /turf/open/floor/iron/white/herringbone, /area/station/commons/toilet/restrooms) "hdD" = ( @@ -50088,6 +50091,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, /turf/open/floor/iron/white/herringbone, /area/station/commons/toilet/restrooms) "htW" = ( @@ -50593,6 +50597,7 @@ name = "Unit 1" }, /obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/duct, /turf/open/floor/iron/dark/diagonal, /area/station/commons/toilet/restrooms) "hxD" = ( @@ -102050,6 +102055,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron/white/herringbone, /area/station/commons/toilet/restrooms) "pem" = ( @@ -108689,6 +108695,7 @@ /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 }, +/obj/machinery/duct, /turf/open/floor/iron/white/herringbone, /area/station/commons/toilet/restrooms) "qbN" = ( @@ -157180,6 +157187,7 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/iron/white/herringbone, /area/station/commons/toilet/restrooms) "xsN" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 72c4cbf16fc..a61fb71021d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -10679,6 +10679,7 @@ /area/station/cargo/warehouse) "cDZ" = ( /obj/machinery/airalarm/directional/north, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "cEb" = ( @@ -17682,6 +17683,7 @@ name = "Unit 1"; id_tag = "Toilet1" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "ffL" = ( @@ -26841,6 +26843,7 @@ name = "Unit 2"; id_tag = "Toilet2" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "iCh" = ( @@ -36766,6 +36769,7 @@ name = "Unit 3"; id_tag = "Toilet3" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "lMJ" = ( @@ -51202,6 +51206,7 @@ name = "Unit 5"; id_tag = "Toilet5" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "qYJ" = ( @@ -51995,6 +52000,7 @@ name = "Unit 4"; id_tag = "Toilet4" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "rlZ" = ( @@ -62597,6 +62603,7 @@ /area/station/service/hydroponics/garden) "uOY" = ( /obj/machinery/light/cold/directional/north, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "uOZ" = ( @@ -85552,7 +85559,7 @@ apC apC veV veV -hAD +alT hAD veV pdr @@ -85809,12 +85816,12 @@ abM apC nmk ffE -hAD +alT hAD veV veV kMD -hAD +alT rlX oEl apC @@ -86323,12 +86330,12 @@ abM apC paH iCe -hAD +alT hAD veV veV kMD -hAD +alT qYx rgT apC @@ -86580,7 +86587,7 @@ abM apC veV veV -hAD +alT hAD ubY ubY @@ -86837,7 +86844,7 @@ abM apC lYZ lMw -hAD +alT hAD hAD hAD diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 36aa0093653..997f5f45a51 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -588,6 +588,7 @@ id_tag = "u5"; name = "Unit 5" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "ajQ" = ( @@ -30250,6 +30251,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "kub" = ( @@ -39385,6 +39387,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "nDC" = ( @@ -43819,6 +43822,7 @@ /area/station/solars/starboard/fore) "pik" = ( /obj/item/radio/intercom/directional/west, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "piE" = ( @@ -47512,6 +47516,7 @@ id_tag = "u2"; name = "Unit 2" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "qsI" = ( @@ -52014,6 +52019,7 @@ id_tag = "u4"; name = "Unit 4" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "rUu" = ( @@ -52485,6 +52491,7 @@ id_tag = "u1"; name = "Unit 1" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "saa" = ( @@ -53858,6 +53865,7 @@ "swe" = ( /obj/structure/urinal/directional/north, /obj/machinery/light/small/dim/directional/east, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "swi" = ( @@ -54460,6 +54468,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "sGV" = ( +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "sHa" = ( @@ -63419,6 +63428,7 @@ /obj/structure/urinal/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "vPP" = ( @@ -68339,6 +68349,7 @@ id_tag = "u3"; name = "Unit 3" }, +/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "xzP" = ( diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index d3fd5f5ad87..d2414cc5af0 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -46,9 +46,7 @@ set_recipient_reagents_holder(custom_receiver ? custom_receiver : parent_movable.reagents) if(start) - //We're registering here because I need to check whether we start active or not, and this is just easier - //Should be called after we finished. Done this way because other networks need to finish setting up aswell - RegisterSignal(parent, COMSIG_COMPONENT_ADDED, PROC_REF(enable)) + enable() /datum/component/plumbing/RegisterWithParent() RegisterSignals(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(disable)) @@ -60,7 +58,7 @@ /datum/component/plumbing/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, COMSIG_OBJ_HIDE, \ - COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_DIR_CHANGE, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, COMSIG_COMPONENT_ADDED)) + COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_DIR_CHANGE, COMSIG_MOVABLE_CHANGE_DUCT_LAYER)) REMOVE_TRAIT(parent, TRAIT_UNDERFLOOR, REF(src)) /datum/component/plumbing/Destroy() @@ -233,10 +231,8 @@ duct.update_appearance() ///settle wherever we are, and start behaving like a piece of plumbing -/datum/component/plumbing/proc/enable(obj/object, datum/component/component) - SIGNAL_HANDLER - if(active || (component && component != src)) - UnregisterSignal(parent, list(COMSIG_COMPONENT_ADDED)) +/datum/component/plumbing/proc/enable() + if(active) return update_dir() diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index d31198749b8..3f365ff3b1d 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -110,10 +110,12 @@ /obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/attacking_plunger, mob/living/user, reinforced) user.balloon_alert_to_viewers("furiously plunging...", "plunging medipen refiller...") - if(do_after(user, 3 SECONDS, target = src)) - user.balloon_alert_to_viewers("finished plunging") - reagents.expose(get_turf(src), TOUCH) - reagents.clear_reagents() + if(!do_after(user, 3 SECONDS, target = src)) + return TRUE + user.balloon_alert_to_viewers("finished plunging") + reagents.expose(get_turf(src), TOUCH) + reagents.clear_reagents() + return TRUE /obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/tool) default_unfasten_wrench(user, tool) diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 6485a375a1f..43a13115824 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -130,10 +130,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) /obj/machinery/shower/plunger_act(obj/item/plunger/attacking_plunger, mob/living/user, reinforced) user.balloon_alert_to_viewers("furiously plunging...", "plunging shower...") - if(do_after(user, 3 SECONDS, target = src)) - user.balloon_alert_to_viewers("finished plunging") - reagents.expose(get_turf(src), TOUCH) //splash on the floor - reagents.clear_reagents() + if(!do_after(user, 3 SECONDS, target = src)) + return TRUE + user.balloon_alert_to_viewers("finished plunging") + reagents.expose(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + begin_processing() + return TRUE /obj/machinery/shower/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index fdaa20af104..ce371659737 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -159,7 +159,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) O.play_tool_sound(src) has_water_reclaimer = FALSE new/obj/item/stock_parts/water_recycler(get_turf(loc)) - to_chat(user, span_notice("You remove the water reclaimer from [src]")) + to_chat(user, span_notice("You remove the water reclaimer from [src].")) return if(istype(O, /obj/item/stack/ore/glass)) diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index c2f1ecb848f..7738a0f6473 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -7,45 +7,71 @@ density = FALSE anchored = TRUE - ///Boolean if whether the toilet is currently flushing. + /// Boolean if whether the toilet is currently flushing. var/flushing = FALSE - ///Boolean if the toilet seat is up. + /// Boolean if the toilet seat is up. var/cover_open = FALSE - ///Boolean if the cistern is up, allowing items to be put in/out. + /// Boolean if the cistern is up, allowing items to be put in/out. var/cistern_open = FALSE - ///The combined weight of all items in the cistern put together. + /// The combined weight of all items in the cistern put together. var/w_items = 0 - ///Reference to the mob being given a swirlie. + /// Reference to the mob being given a swirlie. var/mob/living/swirlie - ///The type of material used to build the toilet. + /// The type of material used to build the toilet. var/buildstacktype = /obj/item/stack/sheet/iron - ///How much of the buildstacktype is needed to construct the toilet. + /// How much of the buildstacktype is needed to construct the toilet. var/buildstackamount = 1 - ///Lazylist of items in the cistern. + /// Lazylist of items in the cistern. var/list/cistern_items - ///Lazylist of fish in the toilet, not to be mixed with the items in the cistern. Max of 3 + /// Lazylist of fish in the toilet, not to be mixed with the items in the cistern. Max of 3 var/list/fishes + /// Does the toilet have a water recycler to recollect its water supply? + var/has_water_reclaimer = TRUE + /// Units of water to reclaim per second + var/reclaim_rate = 0.5 + /// What reagent does the toilet flush with + var/reagent_id = /datum/reagent/water + /// How much reagent can the cistern contain + var/reagent_capacity = 200 + /// Item stuck in the basin of the toilet + var/obj/item/stuck_item = null -/obj/structure/toilet/Initialize(mapload) +/obj/structure/toilet/Initialize(mapload, has_water_reclaimer = null) . = ..() cover_open = round(rand(0, 1)) + if(!isnull(has_water_reclaimer)) + src.has_water_reclaimer = has_water_reclaimer update_appearance(UPDATE_ICON) if(mapload && SSmapping.level_trait(z, ZTRAIT_STATION)) AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/toilet]) AddElement(/datum/element/fish_safe_storage) register_context() + create_reagents(reagent_capacity) + if(src.has_water_reclaimer) + reagents.add_reagent(reagent_id, reagent_capacity) + AddComponent(/datum/component/plumbing/simple_demand, extend_pipe_to_edge = TRUE) /obj/structure/toilet/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() if(user.pulling && isliving(user.pulling)) context[SCREENTIP_CONTEXT_LMB] = "Give Swirlie" - else if(cover_open && istype(held_item, /obj/item/fish)) - context[SCREENTIP_CONTEXT_LMB] = "Insert Fish" - else if(cover_open && LAZYLEN(fishes)) - context[SCREENTIP_CONTEXT_LMB] = "Grab Fish" + if(cover_open) + if(isnull(held_item)) + if(LAZYLEN(fishes)) + context[SCREENTIP_CONTEXT_LMB] = "Grab Fish" + else if(istype(held_item, /obj/item/fish)) + context[SCREENTIP_CONTEXT_LMB] = "Insert Fish" + else if(istype(held_item, /obj/item/plunger)) + context[SCREENTIP_CONTEXT_LMB] = "Unclog" + else if(held_item.w_class <= WEIGHT_CLASS_SMALL) + context[SCREENTIP_CONTEXT_LMB] = "Insert Item" else if(cistern_open) if(isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = "Check Cistern" + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER && has_water_reclaimer) + context[SCREENTIP_CONTEXT_LMB] = "Remove Reclaimer" + else if(istype(held_item, /obj/item/stock_parts/water_recycler) && !has_water_reclaimer) + context[SCREENTIP_CONTEXT_LMB] = "Install Reclaimer" else context[SCREENTIP_CONTEXT_LMB] = "Insert Item" context[SCREENTIP_CONTEXT_RMB] = "Flush" @@ -54,8 +80,14 @@ /obj/structure/toilet/examine(mob/user) . = ..() - if(cover_open && LAZYLEN(fishes)) - . += span_notice("You can see fish in the toilet, you can probably take one out.") + if(cover_open) + if(LAZYLEN(fishes)) + . += span_notice("You can see fish in the toilet, you can probably take one out.") + if(stuck_item) + . += span_notice("There seems to be something small in [src]'s bowl...") + if(cistern_open && has_water_reclaimer) + . += span_notice("A water recycler is installed. Its attached by a pair of screws.") + . += span_notice("Its display states: [reagents.total_volume]/[reagents.maximum_volume] liquids remaining.") /obj/structure/toilet/examine_more(mob/user) . = ..() @@ -66,6 +98,7 @@ . = ..() QDEL_LAZYLIST(fishes) QDEL_LAZYLIST(cistern_items) + QDEL_NULL(stuck_item) /obj/structure/toilet/Exited(atom/movable/gone, direction) . = ..() @@ -101,12 +134,18 @@ if(swirlie) return if(cover_open) + if(!reagents.total_volume) + to_chat(user, span_notice("\The [src] is dry!")) + return grabbed_mob.visible_message(span_danger("[user] starts to give [grabbed_mob] a swirlie!"), span_userdanger("[user] starts to give you a swirlie...")) swirlie = grabbed_mob var/was_alive = (swirlie.stat != DEAD) if(!do_after(user, 3 SECONDS, target = src, timed_action_flags = IGNORE_HELD_ITEM)) swirlie = null return + if(!reagents.total_volume) + to_chat(user, span_notice("\The [src] is dry!")) + return grabbed_mob.visible_message(span_danger("[user] gives [grabbed_mob] a swirlie!"), span_userdanger("[user] gives you a swirlie!"), span_hear("You hear a toilet flushing.")) if(iscarbon(grabbed_mob)) var/mob/living/carbon/carbon_grabbed = grabbed_mob @@ -158,7 +197,25 @@ . = ..() if(flushing) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(reagents.total_volume <= 50) + to_chat(user, span_notice("You press the flush lever, but nothing happens.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + flushing = TRUE + var/something_stuck = !isnull(stuck_item) + if(!something_stuck && LAZYLEN(fishes)) + for(var/obj/item/fish/fish as anything in fishes) + if(fish.w_class >= WEIGHT_CLASS_NORMAL) + something_stuck = TRUE + break + + if(something_stuck) + reagents.create_foam(/datum/effect_system/fluid_spread/foam, 10, notification = span_danger("[src] overflows, spilling its cistern's contents everywhere!"), log = TRUE) + else + reagents.remove_all(50) + + begin_reclamation() playsound(src, 'sound/machines/toilet_flush.ogg', cover_open ? 40 : 20, TRUE) if(cover_open && (dir & SOUTH)) update_appearance(UPDATE_OVERLAYS) @@ -183,50 +240,97 @@ else for(var/datum/material/M as anything in custom_materials) new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) + if(has_water_reclaimer) + new /obj/item/stock_parts/water_recycler(drop_location()) + if(stuck_item) + stuck_item.forceMove(drop_location()) + +/obj/structure/toilet/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(user.combat_mode) + return NONE -/obj/structure/toilet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) - if(cover_open && istype(attacking_item, /obj/item/fish)) + if(cover_open && istype(tool, /obj/item/fish)) if(fishes >= 3) to_chat(user, span_warning("There's too many fishes, flush them down first.")) - return - if(!user.transferItemToLoc(attacking_item, src)) - to_chat(user, span_warning("\The [attacking_item] is stuck to your hand!")) - return - var/obj/item/fish/the_fish = attacking_item + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + to_chat(user, span_warning("\The [tool] is stuck to your hand!")) + return ITEM_INTERACT_BLOCKING + var/obj/item/fish/the_fish = tool if(the_fish.status == FISH_DEAD) - to_chat(user, span_warning("You place [attacking_item] into [src], may it rest in peace.")) + to_chat(user, span_warning("You place [tool] into [src], may it rest in peace.")) else - to_chat(user, span_notice("You place [attacking_item] into [src], hopefully no one will miss it!")) - LAZYADD(fishes, attacking_item) - return + to_chat(user, span_notice("You place [tool] into [src], hopefully no one will miss it!")) + LAZYADD(fishes, tool) + return ITEM_INTERACT_SUCCESS - if(cistern_open && !user.combat_mode) - if(attacking_item.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_warning("[attacking_item] does not fit!")) - return - if(w_items + attacking_item.w_class > WEIGHT_CLASS_HUGE) + if(cistern_open) + if(istype(tool, /obj/item/stock_parts/water_recycler)) + if(has_water_reclaimer) + to_chat(user, span_warning("[src] already has a water recycler installed.")) + return ITEM_INTERACT_BLOCKING + + playsound(src, 'sound/machines/click.ogg', 20, TRUE) + qdel(tool) + has_water_reclaimer = TRUE + begin_reclamation() + return ITEM_INTERACT_SUCCESS + + if(tool.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, span_warning("[tool] does not fit!")) + return ITEM_INTERACT_BLOCKING + if(w_items + tool.w_class > WEIGHT_CLASS_HUGE) to_chat(user, span_warning("The cistern is full!")) - return - if(!user.transferItemToLoc(attacking_item, src)) - to_chat(user, span_warning("\The [attacking_item] is stuck to your hand, you cannot put it in the cistern!")) - return - LAZYADD(cistern_items, attacking_item) - w_items += attacking_item.w_class - to_chat(user, span_notice("You carefully place [attacking_item] into the cistern.")) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + to_chat(user, span_warning("\The [tool] is stuck to your hand, you cannot put it in the cistern!")) + return ITEM_INTERACT_BLOCKING + LAZYADD(cistern_items, tool) + w_items += tool.w_class + to_chat(user, span_notice("You carefully place [tool] into the cistern.")) + return ITEM_INTERACT_SUCCESS - if(is_reagent_container(attacking_item) && !user.combat_mode) - if (!cover_open) - return - if(istype(attacking_item, /obj/item/food/monkeycube)) - var/obj/item/food/monkeycube/cube = attacking_item - cube.Expand() - return - var/obj/item/reagent_containers/RG = attacking_item - RG.reagents.add_reagent(/datum/reagent/water, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - to_chat(user, span_notice("You fill [RG] from [src]. Gross.")) - return ..() + if(!cover_open) + return NONE + + if(!is_reagent_container(tool)) + if(tool.w_class > WEIGHT_CLASS_SMALL) + return NONE + + if(stuck_item) + to_chat(user, span_warning("There's already something blocking [src]'s drain pipe!")) + return ITEM_INTERACT_BLOCKING + + if(!user.transferItemToLoc(tool, src)) + to_chat(user, span_warning("\The [tool] is stuck to your hand!")) + return ITEM_INTERACT_BLOCKING + + stuck_item = tool + to_chat(user, span_notice("You drop [tool] into [src]'s bowl.")) + return ITEM_INTERACT_SUCCESS + + if(reagents.total_volume <= 0) + to_chat(user, span_notice("\The [src] is dry.")) + return ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/food/monkeycube)) + var/obj/item/food/monkeycube/cube = tool + cube.Expand() + return ITEM_INTERACT_SUCCESS + + var/obj/item/reagent_containers/container = tool + if(!container.is_refillable()) + return NONE + + if(container.reagents.holder_full()) + to_chat(user, span_notice("\The [container] is full.")) + return ITEM_INTERACT_BLOCKING + + reagents.trans_to(container, container.amount_per_transfer_from_this, transferred_by = user) + begin_reclamation() + to_chat(user, span_notice("You fill [container] from [src]. Gross.")) + return ITEM_INTERACT_SUCCESS /obj/structure/toilet/crowbar_act(mob/living/user, obj/item/tool) to_chat(user, span_notice("You start to [cistern_open ? "replace the lid on" : "lift the lid off"] the cistern...")) @@ -240,11 +344,39 @@ update_appearance(UPDATE_ICON_STATE) return ITEM_INTERACT_SUCCESS +/obj/structure/toilet/screwdriver_act(mob/living/user, obj/item/tool) + if(!cistern_open) + to_chat(user, span_warning("You need to open [src]'s cistern first!")) + return ITEM_INTERACT_BLOCKING + + if(!has_water_reclaimer) + to_chat(user, span_warning("\the [src] doesn't have a water reclaimer installed.")) + return ITEM_INTERACT_BLOCKING + + tool.play_tool_sound(src) + has_water_reclaimer = FALSE + new /obj/item/stock_parts/water_recycler(drop_location()) + to_chat(user, span_notice("You remove the water reclaimer from \the [src].")) + return ITEM_INTERACT_SUCCESS + /obj/structure/toilet/wrench_act(mob/living/user, obj/item/tool) tool.play_tool_sound(src) deconstruct() return ITEM_INTERACT_SUCCESS +/obj/structure/toilet/plunger_act(obj/item/plunger/attacking_plunger, mob/living/user, reinforced) + user.balloon_alert_to_viewers("furiously plunging...") + if(!do_after(user, 3 SECONDS, target = src)) + return TRUE + user.balloon_alert_to_viewers("finished plunging") + reagents.expose(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + begin_reclamation() + if(stuck_item) + stuck_item.forceMove(drop_location()) + stuck_item = null + return TRUE + ///Ends the flushing animation and updates overlays if necessary /obj/structure/toilet/proc/end_flushing() flushing = FALSE @@ -252,9 +384,19 @@ update_appearance(UPDATE_OVERLAYS) QDEL_LAZYLIST(fishes) +/obj/structure/toilet/proc/begin_reclamation() + START_PROCESSING(SSplumbing, src) + +/obj/structure/toilet/process(seconds_per_tick) + // Water reclamation complete? + if(!has_water_reclaimer || reagents.total_volume >= reagents.maximum_volume) + return PROCESS_KILL + reagents.add_reagent(reagent_id, reclaim_rate * seconds_per_tick) + /obj/structure/toilet/greyscale material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS buildstacktype = null + has_water_reclaimer = FALSE /obj/structure/toilet/secret var/secret_type = null diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index 1627b667f1a..84e51918dc8 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -98,7 +98,9 @@ /obj/machinery/plumbing/plunger_act(obj/item/plunger/attacking_plunger, mob/living/user, reinforced) user.balloon_alert_to_viewers("furiously plunging...") - if(do_after(user, 3 SECONDS, target = src)) - user.balloon_alert_to_viewers("finished plunging") - reagents.expose(get_turf(src), TOUCH) //splash on the floor - reagents.clear_reagents() + if(!do_after(user, 3 SECONDS, target = src)) + return TRUE + user.balloon_alert_to_viewers("finished plunging") + reagents.expose(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + return TRUE diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index a2e3f905d1f..0fef34ef4ca 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -22,10 +22,12 @@ /obj/machinery/iv_drip/plumbing/plunger_act(obj/item/plunger/attacking_plunger, mob/living/user, reinforced) user.balloon_alert_to_viewers("furiously plunging...", "plunging iv drip...") - if(do_after(user, 3 SECONDS, target = src)) - user.balloon_alert_to_viewers("finished plunging") - reagents.expose(get_turf(src), TOUCH) //splash on the floor - reagents.clear_reagents() + if(!do_after(user, 3 SECONDS, target = src)) + return TRUE + user.balloon_alert_to_viewers("finished plunging") + reagents.expose(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + return TRUE /obj/machinery/iv_drip/plumbing/wrench_act(mob/living/user, obj/item/tool) if(default_unfasten_wrench(user, tool) != SUCCESSFUL_UNFASTEN) From f6e6a247d38c4d48e9e8a5c7ca229ee4e97c4186 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:52:23 +0000 Subject: [PATCH 030/107] Automatic changelog for PR #92695 [ci skip] --- html/changelogs/AutoChangeLog-pr-92695.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92695.yml diff --git a/html/changelogs/AutoChangeLog-pr-92695.yml b/html/changelogs/AutoChangeLog-pr-92695.yml new file mode 100644 index 00000000000..f0a5a6a0f11 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92695.yml @@ -0,0 +1,6 @@ +author: "SmArtKar" +delete-after: True +changes: + - rscadd: "Toilets now require plumbing or water reclaimers to function, and can get clogged by small items." + - bugfix: "Trying to use plungers on plumbing objects will no longer hit them after finishing the interaction." + - code_imp: "Updated toilet item interaction code" \ No newline at end of file From 8ed348e4fc48e44d787fd800c9148a604b412bd3 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:29:53 +0530 Subject: [PATCH 031/107] Fixes ore silo id check being enforced too strictly (#92666) ## About The Pull Request - Fixes #92515 - Fixes #92660 The Ore Silo ID requirement is now only enabled for the station map loaded ore silo which means ore silos constructed by the player/off station silos etc have this requirement disabled so golems & other roles can use it as normal. There is no urgency for this to be enforced always. The ID restriction button also now changes colour & text correctly when toggling it ## Changelog :cl: fix: ore silo id restriction button in the UI now changes text & colour correctly fix: ore silo id restriction is now only enforced for station loaded silo and is optional in other cases /:cl: --- code/modules/mining/machine_silo.dm | 41 +++++++++++++---------- tgui/packages/tgui/interfaces/OreSilo.tsx | 30 +++++++++-------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 743f3eec6f7..82b87421d29 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -33,8 +33,8 @@ interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON processing_flags = NONE - /// By default, an ore silo requires you to be wearing an ID to pull materials from it. - var/ID_required = TRUE + /// Only the station loaded ore silo starts out with ID restrictions, else its optional + var/ID_required = FALSE /// List of all connected components that are on hold from accessing materials. var/list/holds = list() /// List of all components that are sharing ores with this silo. @@ -52,6 +52,7 @@ RADIO_CHANNEL_SUPPLY = NONE, RADIO_CHANNEL_SECURITY = NONE, ) + ///List of announcement messages for silo restrictions var/static/alist/announcement_messages = alist( BAN_ATTEMPT_FAILURE_NO_ACCESS = "ACCESS ENFORCEMENT FAILURE: $SILO_USER_NAME lacks supply command authority.", BAN_ATTEMPT_FAILURE_CHALLENGING_DA_CHIEF = "ACCESS ENFORCEMENT FAILURE: $SILO_USER_NAME attempting subversion of supply command authority.", @@ -69,6 +70,7 @@ /obj/machinery/ore_silo/Initialize(mapload) . = ..() + materials = AddComponent( \ /datum/component/material_container, \ SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ @@ -80,12 +82,28 @@ ), \ allowed_items = /obj/item/stack \ ) + if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src + ID_required = TRUE + register_context() setup_radio() configure_default_announcements_policy() +/obj/machinery/ore_silo/Destroy() + if (GLOB.ore_silo_default == src) + GLOB.ore_silo_default = null + + for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) + mats.disconnect() + + ore_connected_machines = null + materials = null + QDEL_NULL(radio) + + return ..() + /obj/machinery/ore_silo/emag_act(mob/living/user) if(obj_flags & EMAGGED) return FALSE @@ -104,19 +122,6 @@ radio.keyslot.channels[RADIO_CHANNEL_SECURITY] = TRUE radio.recalculateChannels() -/obj/machinery/ore_silo/Destroy() - if (GLOB.ore_silo_default == src) - GLOB.ore_silo_default = null - - for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) - mats.disconnect() - - ore_connected_machines = null - materials = null - QDEL_NULL(radio) - - return ..() - /obj/machinery/ore_silo/examine(mob/user) . = ..() . += span_notice("It can be linked to techfabs, circuit printers and protolathes with a multitool.") @@ -330,11 +335,12 @@ if("toggle_ban") var/list/banned_user_data = params["user_data"] - attempt_ban_toggle(usr, banned_user_data) + attempt_ban_toggle(ui.user, banned_user_data) return TRUE if("toggle_restrict") - attempt_toggle_restrict(usr) + attempt_toggle_restrict(ui.user) + return TRUE /** * Called from the ore silo's UI, when someone attempts to (un)ban a user from using the ore silo. * The person doing the banning should have at least QM access. Unless this is emagged. Not modifiable by silicons unless emagged. @@ -558,6 +564,7 @@ var/amount ///List of individual materials used in the action var/list/materials + ///User data of the player doing material operations var/alist/user_data /datum/ore_silo_log/New(obj/machinery/M, _action, _amount, _noun, list/mats=list(), alist/user_data) diff --git a/tgui/packages/tgui/interfaces/OreSilo.tsx b/tgui/packages/tgui/interfaces/OreSilo.tsx index 9e48a87c0ae..0a40cb223f7 100644 --- a/tgui/packages/tgui/interfaces/OreSilo.tsx +++ b/tgui/packages/tgui/interfaces/OreSilo.tsx @@ -68,7 +68,7 @@ type Data = { logs: Log[]; // Banned users is a list of bank account datum IDs banned_users: number[]; - id_required: BooleanLike; + ID_required: BooleanLike; }; const actionToColor = { @@ -238,20 +238,22 @@ type LogsListProps = { const RestrictButton = () => { const { act, data } = useBackend(); - const { id_required } = data; + const { ID_required } = data; return ( - + + + ); }; From 2c44b47b3505503e409959c4c731e63758970dc9 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 08:00:12 +0000 Subject: [PATCH 032/107] Automatic changelog for PR #92666 [ci skip] --- html/changelogs/AutoChangeLog-pr-92666.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92666.yml diff --git a/html/changelogs/AutoChangeLog-pr-92666.yml b/html/changelogs/AutoChangeLog-pr-92666.yml new file mode 100644 index 00000000000..4a536a2a854 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92666.yml @@ -0,0 +1,5 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "ore silo id restriction button in the UI now changes text & colour correctly" + - bugfix: "ore silo id restriction is now only enforced for station loaded silo and is optional in other cases" \ No newline at end of file From 0fa8e001353fd7d4a7e245adec29b1a28442ffd6 Mon Sep 17 00:00:00 2001 From: gamer Date: Sun, 7 Sep 2025 04:01:28 -0400 Subject: [PATCH 033/107] Splattercasting Infinite Blood Fix (#92645) ## About The Pull Request One line change, max(variable,0) means if the variable is negative then it is 0 instead cooldown_remaining can be negative, whether its due to how spell.next_use_time and world.time is measured, or due to something else. This makes sure no blood spell will ever give you free blood back, touch spells are still broken, this PR doesn't change that, they simply do not interact with splattercasting period as of now, which is not intended. Sanguine spells not interacting IS intended. ## Why It's Good For The Game No infinite time stop (via this method, anyway) ## Changelog :cl: fix: Splattercasting touch spells no longer give infinite blood /:cl: --- code/datums/components/splattercasting.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/splattercasting.dm b/code/datums/components/splattercasting.dm index eafc9629a83..cc11afbf789 100644 --- a/code/datums/components/splattercasting.dm +++ b/code/datums/components/splattercasting.dm @@ -75,7 +75,7 @@ return //normal cooldown spell has - var/cooldown_remaining = spell.next_use_time - world.time + var/cooldown_remaining = max(spell.next_use_time - world.time,0) //how much we discount, we make the spell cost 1/10th of its actual cooldown var/new_cooldown = cooldown_remaining / 10 //convert how much cooldown that spell saved into blood cost From 5fe727b6e1b2aade5f35fcaae66e14e23c64bfef Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 08:01:48 +0000 Subject: [PATCH 034/107] Automatic changelog for PR #92645 [ci skip] --- html/changelogs/AutoChangeLog-pr-92645.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92645.yml diff --git a/html/changelogs/AutoChangeLog-pr-92645.yml b/html/changelogs/AutoChangeLog-pr-92645.yml new file mode 100644 index 00000000000..af5d03c404a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92645.yml @@ -0,0 +1,4 @@ +author: "pebis36012" +delete-after: True +changes: + - bugfix: "Splattercasting touch spells no longer give infinite blood" \ No newline at end of file From 04b667b7ba76b69009c3c54693c0d03600cd74e4 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 7 Sep 2025 14:40:51 +0530 Subject: [PATCH 035/107] Fixes 4 bugs with `/datum/parsed_map/readlist()` (#92652) ## About The Pull Request - Fixes the proc skipping `0` & `null` values. Text like `"0"` & `"null"` when sent to `parse_constant()` will yield `0` & `null` respectively but when checked against `!` operator https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1019 It gets mistaken as an empty value/new line so its skipped So if you had a list such as `list("Hello", 0, "null")` When parsed it would yield `list("Hello")`. That's fixed now. We check the text before parsing it - Fixes `=` symbol getting mistaken for a key/value pair if it is embedded inside a string expression. Consider this list `list("A", "B = C")`. This list should just be linear because the equals symbol is meant to escaped as it is within a string literal. However `findtext()` proc doesn't account for that https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1014 So we end up creating a key/value pair and a linear element, creating a broken list like that runtimes(because of the missing `"` symbol in breaking up the string at the middle) The solution is simple, we already have the proc `find_next_delimiter_position()` that will escape everything between `"` so we now use that to find the position of `=` - Fixes the proc being unable to parse alists who's values themselves are lists. Consider the example `list("A" = list(1, 2))` When we look for `,` symbol to check for the next list element here https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1015 You get a broken left literal like this `"A" = list(1` because the comma within the list is getting mistaken for a new element. Now we check for such edge cases and remember to parse the full list before checking for the next comma & now your alists can contain lists as elements themselves - Map reader can read nested lists to any degree e.g. `list(list(3, 4), list(5, 6))` parses correctly ## Changelog :cl: fix: the map reader now reads null & 0 values into lists fix: the map reader now parses associative lists(maps/alists) correctly in cases where = sign is embedded within a string fix: the map reader now parses associative lists(maps/alists) who's values themselves can be lists fix: the map reader can now parse nested lists to any degree /:cl: --- _maps/map_files/wawastation/wawastation.dmm | 2 +- code/modules/mapping/reader.dm | 58 ++++++++++++++++----- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 997f5f45a51..fcdeca02178 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -34581,7 +34581,7 @@ /obj/machinery/elevator_control_panel{ linked_elevator_id = "aisat"; pixel_x = 32; - preset_destination_names = list(2 = "Telecomms", 3 = "AI Core") + preset_destination_names = list("2" = "Telecomms", "3" = "AI Core") }, /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat_interior) diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 1efcf71676e..c32f85af1db 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -1008,27 +1008,61 @@ GLOBAL_LIST_EMPTY(map_model_default) var/old_position = 1 while(position != 0) // find next delimiter that is not within "..." - position = find_next_delimiter_position(text,old_position,delimiter) + position = find_next_delimiter_position(text, old_position, delimiter) // check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7)) - var/equal_position = findtext(text,"=",old_position, position) - var/trim_left = trim(copytext(text,old_position,(equal_position ? equal_position : position))) - var/left_constant = parse_constant(trim_left) - if(position) - old_position = position + length(text[position]) - if(!left_constant) // damn newlines man. Exists to provide behavior consistency with the above loop. not a major cost becuase this path is cold + var/equal_position = find_next_delimiter_position(text, old_position, "=") + var/trim_left = trim(copytext(text, old_position, (equal_position ? equal_position : position))) + if(!trim_left) // damn newlines man. Exists to provide behavior consistency with the above loop. not a major cost becuase this path is cold + if(position) + old_position = position + length(text[position]) continue - if(equal_position && !isnum(left_constant)) + var/is_simple = TRUE //linear list + var/trim_right = trim_left //simple var + if(equal_position) // Associative var, so do the association. // Note that numbers cannot be keys - the RHS is dropped if so. - var/trim_right = trim(copytext(text, equal_position + length(text[equal_position]), position)) - var/right_constant = parse_constant(trim_right) - .[left_constant] = right_constant - else // simple var + trim_right = trim(copytext(text, equal_position + length(text[equal_position]), position)) + is_simple = FALSE + + //right value is a list and since we used the delimiter , this text would be incomplete so we need to parse the full string + if(copytext(trim_right, 1, 6) == "list(") + var/start_index = is_simple ? old_position : equal_position + length(text[equal_position]) + var/opening_count = 0 + var/closing_count = 0 + var/index = start_index + var/begin = FALSE + while(!begin || (opening_count != closing_count)) + var/char = text[index] + if(char == "(") + opening_count += 1 + begin = TRUE + else if(char == ")") + closing_count += 1 + index += 1 + trim_right = trim(copytext(text, start_index, index)) + if(is_simple) + trim_left = trim_right + if(index == length(text)) //stops a wasteful iteration when we reach the end + position = 0 + else + old_position = index + 1 //this moves our pointer past , to the next element + else if(position) + old_position = position + length(text[position]) + + //assign value + var/left_constant = parse_constant(trim_left) + if(is_simple) . += list(left_constant) + else + .[left_constant] = parse_constant(trim_right) /datum/parsed_map/proc/parse_constant(text) + // empty text + if(!text) + return "" + // number var/num = text2num(text) if(isnum(num)) From 9077171fa718acd368b71b24e5fe2a283fffd9c9 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:11:09 +0000 Subject: [PATCH 036/107] Automatic changelog for PR #92652 [ci skip] --- html/changelogs/AutoChangeLog-pr-92652.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92652.yml diff --git a/html/changelogs/AutoChangeLog-pr-92652.yml b/html/changelogs/AutoChangeLog-pr-92652.yml new file mode 100644 index 00000000000..8794b36aa5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92652.yml @@ -0,0 +1,7 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "the map reader now reads null & 0 values into lists" + - bugfix: "the map reader now parses associative lists(maps/alists) correctly in cases where = sign is embedded within a string" + - bugfix: "the map reader now parses associative lists(maps/alists) who's values themselves can be lists" + - bugfix: "the map reader can now parse nested lists to any degree" \ No newline at end of file From b0a69a4023f3f90b6d6b7457f144702a3d914077 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 7 Sep 2025 14:41:30 +0530 Subject: [PATCH 037/107] Zombie powder works through inhale/ingest again (#92880) ## About The Pull Request - Fixes #92873 ignore commit message, that's a typo ## Changelog :cl: fix: zombie powder works through inhale(now faster acting)/ingest again /:cl: --- .../chemistry/reagents/toxin_reagents.dm | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 6c9ae29d4c3..ab4de8a550e 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -259,26 +259,39 @@ ph = 13 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) +/datum/reagent/toxin/zombiepowder/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection) . = ..() + if(!isliving(exposed_mob) || !(methods & (INGEST|INHALE))) + return + + LAZYINITLIST(data) + data["method"] |= methods + + //the stomach handles INGEST via on_mob_metabolize() we only deal with INHALE + //also means vapour works much faster which is realistic + if(methods & INHALE) + zombify(exposed_mob) +/** + * Does the fake death & oxy loss on the mob + * + * Arguments + * * mob/living/holder_mob - the mob we are zombifying +*/ +/datum/reagent/toxin/zombiepowder/proc/zombify(mob/living/holder_mob) + PRIVATE_PROC(TRUE) + holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if((data?["method"] & (INGEST|INHALE)) && holder_mob.stat != DEAD) holder_mob.fakedeath(type) +/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) + . = ..() + zombify(holder_mob) + /datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob) . = ..() affected_mob.cure_fakedeath(type) -/datum/reagent/toxin/zombiepowder/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection) - . = ..() - if(!(methods & (INGEST|INHALE))) - return - - var/datum/reagent/zombiepowder = exposed_mob.reagents.has_reagent(/datum/reagent/toxin/zombiepowder) - if(zombiepowder) - LAZYINITLIST(zombiepowder.data) - zombiepowder.data["method"] |= (INGEST|INHALE) - /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() if(HAS_TRAIT(affected_mob, TRAIT_FAKEDEATH) && HAS_TRAIT(affected_mob, TRAIT_DEATHCOMA)) From 62cb3001cf4d47eb75ffe0fd841caebced710ce4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:11:48 +0000 Subject: [PATCH 038/107] Automatic changelog for PR #92880 [ci skip] --- html/changelogs/AutoChangeLog-pr-92880.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92880.yml diff --git a/html/changelogs/AutoChangeLog-pr-92880.yml b/html/changelogs/AutoChangeLog-pr-92880.yml new file mode 100644 index 00000000000..69885b291e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92880.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "zombie powder works through inhale(now faster acting)/ingest again" \ No newline at end of file From 5a6fe316a23338c6a5ac6ad4628773633250890f Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 7 Sep 2025 14:42:10 +0530 Subject: [PATCH 039/107] [NO GBP] Fixes runtime for vendors using department cards (#92882) ## About The Pull Request Cause the `account_job` is null so it run-timed ## Changelog :cl: fix: no runtime for vendors using department cards /:cl: --- code/modules/vending/vendor/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vending/vendor/inventory.dm b/code/modules/vending/vendor/inventory.dm index 25b133025e0..8955e1002ab 100644 --- a/code/modules/vending/vendor/inventory.dm +++ b/code/modules/vending/vendor/inventory.dm @@ -273,7 +273,7 @@ var/datum/bank_account/account = paying_id_card.registered_account //deduct money from person - if(!discountless && account.account_job.paycheck_department == payment_department) + if(!discountless && account.account_job?.paycheck_department == payment_department) price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. if(attempt_charge(src, mob_paying, price_to_use) & COMPONENT_OBJ_CANCEL_CHARGE) speak("You do not possess the funds to purchase [product_to_vend.name].") From 5034204525bb20f4b3d6a5425541163c8d55e0e7 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:12:28 +0000 Subject: [PATCH 040/107] Automatic changelog for PR #92882 [ci skip] --- html/changelogs/AutoChangeLog-pr-92882.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92882.yml diff --git a/html/changelogs/AutoChangeLog-pr-92882.yml b/html/changelogs/AutoChangeLog-pr-92882.yml new file mode 100644 index 00000000000..433151a6286 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92882.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "no runtime for vendors using department cards" \ No newline at end of file From a029668e5621f69a51272d0d1efca9d71786148f Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Sun, 7 Sep 2025 05:12:38 -0400 Subject: [PATCH 041/107] Makes the dynamic tester tiers / population caps start at 1 (#92870) ## About The Pull Request No antags are spawned at 0 anyway, and it causes some runtimes. ## Why It's Good For The Game ## Changelog Not player-facing --- code/controllers/subsystem/dynamic/dynamic_testing.dm | 4 ++-- tgui/packages/tgui/interfaces/DynamicTester.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/dynamic/dynamic_testing.dm b/code/controllers/subsystem/dynamic/dynamic_testing.dm index 5df1e3d2977..c1b5c3df005 100644 --- a/code/controllers/subsystem/dynamic/dynamic_testing.dm +++ b/code/controllers/subsystem/dynamic/dynamic_testing.dm @@ -70,14 +70,14 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities switch(action) if("set_num_players") var/old_num = num_players - num_players = text2num(params["num_players"]) + num_players = max(text2num(params["num_players"]), 1) if(old_num != num_players) update_reports() return TRUE if("set_tier") var/old_tier = tier - tier = text2num(params["tier"]) + tier = max(text2num(params["tier"]), 1) if(old_tier != tier) update_reports() return TRUE diff --git a/tgui/packages/tgui/interfaces/DynamicTester.tsx b/tgui/packages/tgui/interfaces/DynamicTester.tsx index af86fff955b..13cd36fd392 100644 --- a/tgui/packages/tgui/interfaces/DynamicTester.tsx +++ b/tgui/packages/tgui/interfaces/DynamicTester.tsx @@ -70,7 +70,7 @@ export const DynamicTester = () => { act('set_tier', { tier: e })} @@ -81,7 +81,7 @@ export const DynamicTester = () => { act('set_num_players', { num_players: e })} From 7ea60a9b8f98c342a2d5671a01dea8292b3cf244 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 11:16:18 +0200 Subject: [PATCH 042/107] Bump actions/setup-dotnet from 4 to 5 (#92863) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 4 to 5.
Release notes

Sourced from actions/setup-dotnet's releases.

v5.0.0

What's Changed

Breaking Changes

Make sure your runner is updated to this version or newer to use this release. v2.327.1 Release Notes

Dependency Updates

Bug Fixes

New Contributors

Full Changelog: https://github.com/actions/setup-dotnet/compare/v4...v5.0.0

v4.3.1

What's Changed

Full Changelog: https://github.com/actions/setup-dotnet/compare/v4...v4.3.1

v4.3.0

What's Changed

New Contributors

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-dotnet&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/discord_discussions.yml | 2 +- .github/workflows/run_linters.yml | 2 +- .github/workflows/tgs_test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/discord_discussions.yml b/.github/workflows/discord_discussions.yml index 7f894fa18ca..68876aed185 100644 --- a/.github/workflows/discord_discussions.yml +++ b/.github/workflows/discord_discussions.yml @@ -28,7 +28,7 @@ jobs: exit 1 - name: Setup dotnet - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 8.0.x dotnet-quality: ga diff --git a/.github/workflows/run_linters.yml b/.github/workflows/run_linters.yml index 81c963c25ed..68ded6a10c9 100644 --- a/.github/workflows/run_linters.yml +++ b/.github/workflows/run_linters.yml @@ -39,7 +39,7 @@ jobs: path: tools/icon_cutter/cache key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }} - name: Setup .NET SDK - uses: actions/setup-dotnet@v4.2.0 + uses: actions/setup-dotnet@v5 with: dotnet-version: 9.x - name: Install OpenDream diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index 6c689ae7d1a..feb89bac9c0 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -59,7 +59,7 @@ jobs: - 5000:5000 #Can't use env here for some reason steps: - name: Setup dotnet - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 8.0.x From 1f0d05e660c3551c913b7b6aba5dfa7217c8ed92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 11:26:52 +0200 Subject: [PATCH 043/107] Bump actions/stale from 9 to 10 (#92868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
Release notes

Sourced from actions/stale's releases.

v10.0.0

What's Changed

Breaking Changes

Enhancement

Dependency Upgrades

Documentation changes

New Contributors

Full Changelog: https://github.com/actions/stale/compare/v9...v10.0.0

v9.1.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/stale/compare/v9...v9.1.0

Changelog

Sourced from actions/stale's changelog.

Changelog

[9.1.0]

What's Changed

[9.0.0]

Breaking Changes

  1. Action is now stateful: If the action ends because of operations-per-run then the next run will start from the first unprocessed issue skipping the issues processed during the previous run(s). The state is reset when all the issues are processed. This should be considered for scheduling workflow runs.
  2. Version 9 of this action updated the runtime to Node.js 20. All scripts are now run with Node.js 20 instead of Node.js 16 and are affected by any breaking changes between Node.js 16 and 20.

What Else Changed

  1. Performance optimization that removes unnecessary API calls by @​dsame in #1033; fixes #792
  2. Logs displaying current GitHub API rate limit by @​dsame in #1032; addresses #1029

For more information, please read the action documentation and its section about statefulness

[4.1.1]

In scope of this release we updated actions/core to 1.10.0 for v4 and fixed issues operation count.

[8.0.0]

:warning: This version contains breaking changes :warning:

[7.0.0]

:warning: Breaking change :warning:

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=9&new-version=10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 188931a31f0..cec11541e42 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-22.04 steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This PR has been inactive for long enough to be automatically marked as stale. This means it is at risk of being auto closed in ~ 7 days, please address any outstanding review items and ensure your PR is finished, if these are all true and you are auto-staled anyway, you need to actively ask maintainers if your PR will be merged. Once you have done any of the previous actions then you should request a maintainer remove the stale label on your PR, to reset the stale timer. If you feel no maintainer will respond in that time, you may wish to close this PR youself, while you seek maintainer comment, as you will then be able to reopen the PR yourself" From 1c1826659b9cf0956996fab6cb8099da4b17be97 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sun, 7 Sep 2025 05:28:41 -0400 Subject: [PATCH 044/107] De-HTMLs manuals, updates chef recipes (#92841) ## About The Pull Request The manuals' formatting is fucked up, and the chef recipes book was really out of date. This PR changes the formatting to work better, and updates the chef recipes to be more correct. ## Why It's Good For The Game fixes #84168 Good formatting ## Changelog :cl: spellcheck: Fixes a bunch of manual's formatting, and updates Chef Recipes /:cl: --- code/game/objects/items/manuals.dm | 359 +++++++++++++---------------- 1 file changed, 157 insertions(+), 202 deletions(-) diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index e89391f7887..f798fa66ad8 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -12,223 +12,178 @@ starting_author = "Farmer John" // Whoever wrote the paper or book, can be changed by pen or PC. It is not automatically assigned. starting_title = "The Human Harvest: From Seed to Market" //book contents below - starting_content = {" - - - - - -

Growing Humans

- - Why would you want to grow humans? Well, I'm expecting most readers to be in the slave trade, but a few might actually - want to revive fallen comrades. Growing pod people is actually quite simple: -

-

    -
  1. Find a dead person who is in need of revival.
  2. -
  3. Take a blood sample with a syringe (samples of their blood taken BEFORE they died will also work).
  4. -
  5. Inject a packet of replica pod seeds (which can be acquired by either mutating cabbages into replica pods (and then harvesting said replica pods) or by purchasing them from certain corporate entities) with the blood sample.
  6. -
  7. It is imperative to understand that injecting the replica pod plant with blood AFTER it has been planted WILL NOT WORK; you have to inject the SEED PACKET, NOT the TRAY.
  8. -
  9. Plant the seeds.
  10. -
  11. Tend to the replica pod's water and nutrition levels until it is time to harvest the podcloned humanoid.
  12. -
  13. Note that if the corpse's mind (or spirit, or soul, or whatever the hell your local chaplain calls it) is already in a new body or has left this plane of existence entirely, you will just receive seed packets upon harvesting the replica pod plant, not a podperson.
  14. -
-

- It really is that easy! Good luck! - - - - "} + starting_content = "\ +

Growing Humans

\ + \ + Why would you want to grow humans? Well, I'm expecting most readers to be in the slave trade, but a few might actually\ + want to revive fallen comrades. Growing pod people is actually quite simple:\ +

\ +

    \ +
  1. Find a dead person who is in need of revival.
  2. \ +
  3. Take a blood sample with a syringe (samples of their blood taken BEFORE they died will also work).
  4. \ +
  5. Inject a packet of replica pod seeds (which can be acquired by either mutating cabbages into replica pods (and then harvesting said replica pods) or by purchasing them from certain corporate entities) with the blood sample.
  6. \ +
  7. It is imperative to understand that injecting the replica pod plant with blood AFTER it has been planted WILL NOT WORK; you have to inject the SEED PACKET, NOT the TRAY.
  8. \ +
  9. Plant the seeds.
  10. \ +
  11. Tend to the replica pod's water and nutrition levels until it is time to harvest the podcloned humanoid.
  12. \ +
  13. Note that if the corpse's mind (or spirit, or soul, or whatever the hell your local chaplain calls it) is already in a new body or has left this plane of existence entirely, you will just receive seed packets upon harvesting the replica pod plant, not a podperson.
  14. \ +
\ + It really is that easy! Good luck!\ + \ + " /obj/item/book/manual/ripley_build_and_repair name = "APLU \"Ripley\" Construction and Operation Manual" icon_state ="book" starting_author = "Weyland-Yutani Corp" starting_title = "APLU \"Ripley\" Construction and Operation Manual" - starting_content = {" - - - - - -
- Weyland-Yutani - Building Better Worlds -

Autonomous Power Loader Unit \"Ripley\"

-
-

Specifications:

-
    -
  • Class: Autonomous Power Loader
  • -
  • Scope: Logistics and Construction
  • -
  • Weight: 820kg (without operator and with empty cargo compartment)
  • -
  • Height: 2.5m
  • -
  • Width: 1.8m
  • -
  • Top speed: 5km/hour
  • -
  • Operation in vacuum/hostile environment: Possible -
  • Airtank Volume: 500liters
  • -
  • Devices: -
      -
    • Hydraulic Clamp
    • -
    • High-speed Drill
    • -
    -
  • -
  • Propulsion Device: Power cell powered electro-hydraulic system.
  • -
  • Power cell capacity: Varies.
  • -
- -

Construction:

-
    -
  1. Connect all exosuit parts to the chassis frame
  2. -
  3. Connect all hydraulic fittings and tighten them up with a wrench
  4. -
  5. Adjust the servohydraulics with a screwdriver
  6. -
  7. Wire the chassis. (Cable is not included.)
  8. -
  9. Use the wirecutters to remove the excess cable if needed.
  10. -
  11. Install the central control module (Not included. Use supplied datadisk to create one).
  12. -
  13. Secure the mainboard with a screwdriver.
  14. -
  15. Install the peripherals control module (Not included. Use supplied datadisk to create one).
  16. -
  17. Secure the peripherals control module with a screwdriver
  18. -
  19. Install the internal armor plating (Not included due to Nanotrasen regulations. Can be made using 5 iron sheets.)
  20. -
  21. Secure the internal armor plating with a wrench
  22. -
  23. Weld the internal armor plating to the chassis
  24. -
  25. Install the external reinforced armor plating (Not included due to Nanotrasen regulations. Can be made using 5 reinforced iron sheets.)
  26. -
  27. Secure the external reinforced armor plating with a wrench
  28. -
  29. Weld the external reinforced armor plating to the chassis
  30. -
- - - -

Operation

- Please consult the Nanotrasen compendium "Robotics for Dummies". - "} + starting_content = "\ +
\ + Weyland-Yutani - Building Better Worlds\ +

Autonomous Power Loader Unit \"Ripley\"

\ +
\ +

Specifications:

\ +
    \ +
  • Class: Autonomous Power Loader
  • \ +
  • Scope: Logistics and Construction
  • \ +
  • Weight: 820kg (without operator and with empty cargo compartment)
  • \ +
  • Height: 2.5m
  • \ +
  • Width: 1.8m
  • \ +
  • Top speed: 5km/hour
  • \ +
  • Operation in vacuum/hostile environment: Possible\ +
  • Airtank Volume: 500liters
  • \ +
  • Devices:\ +
      \ +
    • Hydraulic Clamp
    • \ +
    • High-speed Drill
    • \ +
    \ +
  • \ +
  • Propulsion Device: Power cell powered electro-hydraulic system.
  • \ +
  • Power cell capacity: Varies.
  • \ +
\ + \ +

Construction:

\ +
    \ +
  1. Connect all exosuit parts to the chassis frame
  2. \ +
  3. Connect all hydraulic fittings and tighten them up with a wrench
  4. \ +
  5. Adjust the servohydraulics with a screwdriver
  6. \ +
  7. Wire the chassis. (Cable is not included.)
  8. \ +
  9. Use the wirecutters to remove the excess cable if needed.
  10. \ +
  11. Install the central control module (Not included. Use supplied datadisk to create one).
  12. \ +
  13. Secure the mainboard with a screwdriver.
  14. \ +
  15. Install the peripherals control module (Not included. Use supplied datadisk to create one).
  16. \ +
  17. Secure the peripherals control module with a screwdriver
  18. \ +
  19. Install the internal armor plating (Not included due to Nanotrasen regulations. Can be made using 5 iron sheets.)
  20. \ +
  21. Secure the internal armor plating with a wrench
  22. \ +
  23. Weld the internal armor plating to the chassis
  24. \ +
  25. Install the external reinforced armor plating (Not included due to Nanotrasen regulations. Can be made using 5 reinforced iron sheets.)
  26. \ +
  27. Secure the external reinforced armor plating with a wrench
  28. \ +
  29. Weld the external reinforced armor plating to the chassis
  30. \ + \ +

    Operation

    \ + Please consult the Nanotrasen compendium \"Robotics for Dummies\".\ + " /obj/item/book/manual/chef_recipes name = "Chef Recipes" icon_state = "cooked_book" starting_author = "Lord Frenrir Cageth" starting_title = "Chef Recipes" - starting_content = {" - - - - - - -

    Food for Dummies

    - Here is a guide on basic food recipes and also how to not poison your customers accidentally. - - -

    Basic ingredients preparation:

    - - Dough: 10u water + 15u flour for simple dough.
    - 6u egg yolk + 12 egg white + 15u flour + 5u sugar for cake batter.
    - Doughs can be transformed by using a knife and rolling pin.
    - All doughs can be microwaved.
    - Bowl: Add water to it for soup preparation.
    - Meat: Microwave it, process it, slice it into microwavable cutlets with your knife, or use it raw.
    - Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu.
    - Rice: Mix 10u rice with 10u water in a bowl then microwave it. - -

    Custom food:

    - Add ingredients to a base item to prepare a custom meal.
    - The bases are:
    - - bun (burger)
    - - breadslices(sandwich)
    - - plain bread
    - - plain pie
    - - vanilla cake
    - - empty bowl (salad)
    - - bowl with 10u water (soup)
    - - boiled spaghetti
    - - pizza bread
    - - metal rod (kebab) - -

    Table Craft:

    - Put ingredients on table, then click and drag the table onto yourself to see what recipes you can prepare. - -

    Microwave:

    - Use it to cook or boil food ingredients (meats, doughs, egg, spaghetti, donkpocket, etc...). - It can cook multiple items at once. - -

    Processor:

    - Use it to process certain ingredients (meat into meatballs, doughslice into spaghetti, potato into fries,etc...) - -

    Gibber:

    - Stuff an animal in it to grind it into meat. - -

    Meat spike:

    - Stick an animal on it then begin collecting its meat. - - -

    Example recipes:

    - Vanilla Cake: Microwave cake batter.
    - Burger: 1 bun + 1 meat steak
    - Bread: Microwave dough.
    - Waffles: 2 pastry base
    - Popcorn: Microwave corn.
    - Meat Steak: Microwave meat.
    - Meat Pie: 1 plain pie + 1u black pepper + 1u salt + 2 meat cutlets
    - Boiled Spagetti: Microwave spaghetti.
    - Donuts: 1u sugar + 1 pastry base
    - Fries: Process potato. - -

    Sharing your food:

    - You can put your meals on your kitchen counter or load them in the snack vending machines. - - - "} + starting_content = "\ + \ +

    Food for Dummies

    \ + Here is a guide on basic food recipes and also how to not poison your customers accidentally.\ + \ + \ +

    Basic ingredients preparation:

    \ + \ + Dough: 10u water + 15u flour for simple dough.
    \ + 6u egg yolk + 12 egg white + 15u flour + 5u sugar for cake batter.
    \ + Doughs can be transformed by using a knife and rolling pin.
    \ + All doughs can be baked.
    \ + Bowl: Add recipe ingredients and liquid to make soups.
    \ + Meat: Grill it, process it, slice it into grillable cutlets with your knife, or use it raw.
    \ + Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu.
    \ + Rice: Mix 10u rice with 10u water then microwave it.\ + \ +

    Custom food:

    \ + Add ingredients to a base item to prepare a custom meal.
    \ + The bases are:
    \ + - bun (burger)
    \ + - breadslices(sandwich)
    \ + - plain bread
    \ + - vanilla cake
    \ + - empty bowl (salad)
    \ + - bowl with liquid (soup)
    \ + - boiled spaghetti
    \ + - pizza bread
    \ + - iron rod (kebab)
    \ + - plain pie
    \ + - seaweed sheet(sushi)
    \ + \ +

    Cooking menu:

    \ + Open the crafting menu and click the cooking tab to see the list of cookable food.\ + \ +

    Microwave:

    \ + Use it to cook or boil food ingredients (egg, spaghetti, donkpocket, etc...).\ + It can cook multiple items at once.\ + \ +

    Processor:

    \ + Use it to process certain ingredients (meat into meatballs, doughslice into spaghetti, etc...)\ + \ +

    Gibber:

    \ + Stuff an animal in it to grind it into meat.\ + \ +

    Meat spike:

    \ + Stick an animal on it then begin collecting its meat.\ + \ + \ +

    Example recipes:

    \ + Vanilla Cake: Bake cake base.
    \ + Burger: 1 bun + 1 patty
    \ + Bread: Bake dough.
    \ + Waffles: 2 pastry base
    \ + Popcorn: Microwave corn.
    \ + Meat Steak: Grill meat.
    \ + Meat Pie: 1 plain pie + 1u black pepper + 1u salt + 1 meat steak
    \ + Boiled Spagetti: Microwave spaghetti.
    \ + Donuts: 1u sugar + 1 pastry base
    \ + Fries: Cut and process potato.\ + \ +

    Sharing your food:

    \ + You can put your meals on your kitchen counter or load them in the snack vending machines.\ + " /obj/item/book/manual/nuclear name = "Fission Mailed: Nuclear Sabotage 101" icon_state ="bookNuclear" starting_author = "Syndicate" starting_title = "Fission Mailed: Nuclear Sabotage 101" - starting_content = {" - - - - - Nuclear Explosives 101:
    - Hello and thank you for choosing the Syndicate for your nuclear information needs.
    - Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.
    - First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.
    - Pressing any button on the compacted bomb will cause it to extend and bolt itself into place.
    - If this is done to unbolt it one must completely log in which at this time may not be possible.
    - To make the nuclear device functional:
    -
  31. Place the nuclear device in the designated detonation zone.
  32. -
  33. Extend and anchor the nuclear device from its interface.
  34. -
  35. Insert the nuclear authorisation disk into slot.
  36. -
  37. Type numeric authorisation code into the keypad. This should have been provided. Note: If you make a mistake press R to reset the device. -
  38. Press the E button to log onto the device.
  39. - You now have activated the device. To deactivate the buttons at anytime for example when you've already prepped the bomb for detonation remove the auth disk OR press the R on the keypad.
    - Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option.
    - Note: Nanotrasen is a pain in the neck.
    - Toggle off the SAFETY.
    - Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.
    - So use the - - and + + to set a det time between 5 seconds and 10 minutes.
    - Then press the timer toggle button to start the countdown.
    - Now remove the auth. disk so that the buttons deactivate.
    - Note: THE BOMB IS STILL SET AND WILL DETONATE
    - Now before you remove the disk if you need to move the bomb you can:
    - Toggle off the anchor, move it, and re-anchor.

    - Good luck. Remember the order:
    - Disk, Code, Safety, Timer, Disk, RUN!
    - Intelligence Analysts believe that normal Nanotrasen procedure is for the Captain to secure the nuclear authorisation disk.
    - Good luck! - - "} + starting_content = "\ + Nuclear Explosives 101:
    \ + Hello and thank you for choosing the Syndicate for your nuclear information needs.
    \ + Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.
    \ + First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.
    \ + Pressing any button on the compacted bomb will cause it to extend and bolt itself into place.
    \ + If this is done to unbolt it one must completely log in which at this time may not be possible.
    \ + To make the nuclear device functional:
    \ +
  40. Place the nuclear device in the designated detonation zone.
  41. \ +
  42. Extend and anchor the nuclear device from its interface.
  43. \ +
  44. Insert the nuclear authorisation disk into slot.
  45. \ +
  46. Type numeric authorisation code into the keypad. This should have been provided. Note: If you make a mistake press R to reset the device.\ +
  47. Press the E button to log onto the device.
  48. \ + You now have activated the device. To deactivate the buttons at anytime for example when you've already prepped the bomb for detonation remove the auth disk OR press the R on the keypad.
    \ + Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option.
    \ + Note: Nanotrasen is a pain in the neck.
    \ + Toggle off the SAFETY.
    \ + Note: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.
    \ + So use the - - and + + to set a det time between 5 seconds and 10 minutes.
    \ + Then press the timer toggle button to start the countdown.
    \ + Now remove the auth. disk so that the buttons deactivate.
    \ + Note: THE BOMB IS STILL SET AND WILL DETONATE
    \ + Now before you remove the disk if you need to move the bomb you can:
    \ + Toggle off the anchor, move it, and re-anchor.

    \ + Good luck. Remember the order:
    \ + Disk, Code, Safety, Timer, Disk, RUN!
    \ + Intelligence Analysts believe that normal Nanotrasen procedure is for the Captain to secure the nuclear authorisation disk.
    \ + Good luck!\ + " From 9aaf21bbb3593c8ae7bbe535f96a2ecb06ecee26 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:29:01 +0000 Subject: [PATCH 045/107] Automatic changelog for PR #92841 [ci skip] --- html/changelogs/AutoChangeLog-pr-92841.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92841.yml diff --git a/html/changelogs/AutoChangeLog-pr-92841.yml b/html/changelogs/AutoChangeLog-pr-92841.yml new file mode 100644 index 00000000000..a893978a240 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92841.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - spellcheck: "Fixes a bunch of manual's formatting, and updates Chef Recipes" \ No newline at end of file From b3a4505b76daef4430289ffb615b7b2fabe27df5 Mon Sep 17 00:00:00 2001 From: Krysonism <49783092+Krysonism@users.noreply.github.com> Date: Sun, 7 Sep 2025 11:35:18 +0200 Subject: [PATCH 046/107] Unnerfs the attack speed of sentience first basic mobs (#92859) ## About The Pull Request This PR gives vat beast, mega arachnid and butterbear 0.8 seconds attack cd, instead of the default basic mob 2 second attack CD. ## Why It's Good For The Game All mobs used to have a human like 0.8 second attack delay when sentient, this was changed for basic mobs a while ago to normalize the attack rate between AI controlled and sentient mobs. This mostly makes sense, but the faster attack rate also helped make up for the fact that human controlled mobs don't have aimbot unlike AI mobs. And some of the basic mobs slowed down were designed to be player controlled and balanced around the 0.8 second click cd. This brings them back where they were intended to be when played As a side effect it makes the AI controlled vatbeasts and mega arachnids more deadly. I think that isn't a bad thing as one of the design goals for cytology to set it apart from gold slimes was that breeding giant space monsters should be dangerous. ## Changelog :cl: balance: vatbeasts, mega arachnids and butterbears now attack much quicker, in line with their old player controlled attack speed. /:cl: --- code/modules/mob/living/basic/cytology/vatbeast.dm | 1 + .../mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm | 1 + code/modules/mob/living/basic/space_fauna/bear/_bear.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/code/modules/mob/living/basic/cytology/vatbeast.dm b/code/modules/mob/living/basic/cytology/vatbeast.dm index 0075061cda1..d9d1c364802 100644 --- a/code/modules/mob/living/basic/cytology/vatbeast.dm +++ b/code/modules/mob/living/basic/cytology/vatbeast.dm @@ -15,6 +15,7 @@ damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 1, STAMINA = 1, OXY = 1) melee_damage_lower = 25 melee_damage_upper = 25 + melee_attack_cooldown = CLICK_CD_MELEE obj_damage = 40 unsuitable_atmos_damage = 0 attack_sound = 'sound/items/weapons/punch3.ogg' diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm index bfbd222f89c..72c55a8eca3 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -10,6 +10,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BUG melee_damage_lower = 30 melee_damage_upper = 30 + melee_attack_cooldown = CLICK_CD_MELEE maxHealth = 300 health = 300 diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index a85f4cab814..32738c05434 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -127,6 +127,7 @@ obj_damage = 11 melee_damage_lower = 0 melee_damage_upper = 0 + melee_attack_cooldown = CLICK_CD_MELEE sharpness = NONE //it's made of butter armour_penetration = 0 response_harm_continuous = "takes a bite out of" From 990f8b2e783ee8122772c9c66d37e347c2ce5c8a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:35:39 +0000 Subject: [PATCH 047/107] Automatic changelog for PR #92859 [ci skip] --- html/changelogs/AutoChangeLog-pr-92859.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92859.yml diff --git a/html/changelogs/AutoChangeLog-pr-92859.yml b/html/changelogs/AutoChangeLog-pr-92859.yml new file mode 100644 index 00000000000..5bb37665e07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92859.yml @@ -0,0 +1,4 @@ +author: "Krysonism" +delete-after: True +changes: + - balance: "vatbeasts, mega arachnids and butterbears now attack much quicker, in line with their old player controlled attack speed." \ No newline at end of file From 8e71857eab659a134a5cef121635b8ad4e043606 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 7 Sep 2025 11:36:06 +0200 Subject: [PATCH 048/107] [NO GBP] Fixes recycling card hands into decks deleting cards (#92850) ## About The Pull Request Closes #92848 ## Changelog :cl: fix: Fixed recycling card hands into decks deleting cards /:cl: --- code/modules/cards/cards.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/cards/cards.dm b/code/modules/cards/cards.dm index 3a18b36f86d..fbfa2a39658 100644 --- a/code/modules/cards/cards.dm +++ b/code/modules/cards/cards.dm @@ -102,7 +102,10 @@ card_atoms += card if(istype(card_item, /obj/item/toy/cards/cardhand)) - qdel(card_item) + var/obj/item/toy/cards/cardhand/recycled_cardhand = card_item + recycled_cardhand.card_atoms -= cards_to_add + if (!length(recycled_cardhand.fetch_card_atoms())) + qdel(card_item) update_appearance() return cards_to_add From 027c11a65aa84544b0542cc4054a671b9c9fae07 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Sun, 7 Sep 2025 19:36:26 +1000 Subject: [PATCH 049/107] Lets you rename the smoothbore disabler (#92835) ## About The Pull Request What it says on the tin. ## Why It's Good For The Game You can do it with laser muskets, so why not this? ## Changelog :cl: qol: Lets you rename the smoothbore disabler. /:cl: --- code/modules/projectiles/guns/energy/crank_guns.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 32aa65827cf..05139823fae 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -44,6 +44,7 @@ shaded_charge = 1 charge_sections = 1 spread = 22.5 + obj_flags = UNIQUE_RENAME /obj/item/gun/energy/disabler/smoothbore/Initialize(mapload) . = ..() From 89e2e1187967d39bfdb448e903d617fa9d763ed4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:36:46 +0000 Subject: [PATCH 050/107] Automatic changelog for PR #92835 [ci skip] --- html/changelogs/AutoChangeLog-pr-92835.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92835.yml diff --git a/html/changelogs/AutoChangeLog-pr-92835.yml b/html/changelogs/AutoChangeLog-pr-92835.yml new file mode 100644 index 00000000000..3c3c5e83ba2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92835.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - qol: "Lets you rename the smoothbore disabler." \ No newline at end of file From 35dba8dad8131630d2d6dbf6f4e30027a303c62e Mon Sep 17 00:00:00 2001 From: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:37:16 +0300 Subject: [PATCH 051/107] Fixes multitool/wirecutters interaction with mechs (and wires) (#92821) ## About The Pull Request hi ## Changelog :cl: fix: Fixed wires interaction and fixed mech multitool/wirecutters interaction. /:cl: --- code/datums/wires/_wires.dm | 5 +++-- code/modules/vehicles/mecha/mecha_defense.dm | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 6e40b719b72..b53bb64183b 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -257,12 +257,13 @@ /datum/wires/proc/interact(mob/user) if(!interactable(user)) - return + return FALSE ui_interact(user) for(var/A in assemblies) var/obj/item/I = assemblies[A] if(istype(I) && I.on_found(user)) - return + break + return TRUE /** * Checks whether wire assignments should be revealed. diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 5bb9084c550..3dcd5835b2e 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -269,6 +269,8 @@ return part.try_attach_part(user, src, FALSE) if(is_wire_tool(tool) && (mecha_flags & PANEL_OPEN)) + if(user.combat_mode) + return if(wires.interact(user)) return ITEM_INTERACT_SUCCESS From df66516ba482f66d9ce878d27fd65a2b02b37983 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:37:37 +0000 Subject: [PATCH 052/107] Automatic changelog for PR #92821 [ci skip] --- html/changelogs/AutoChangeLog-pr-92821.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92821.yml diff --git a/html/changelogs/AutoChangeLog-pr-92821.yml b/html/changelogs/AutoChangeLog-pr-92821.yml new file mode 100644 index 00000000000..13c68d5a8bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92821.yml @@ -0,0 +1,4 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - bugfix: "Fixed wires interaction and fixed mech multitool/wirecutters interaction." \ No newline at end of file From 6cad0492baac5980457d108994bfac15dfa80667 Mon Sep 17 00:00:00 2001 From: SimplyLogan <47579821+loganuk@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:44:05 +0100 Subject: [PATCH 053/107] Stops coffee machines having melee god mode (#92776) ## About The Pull Request Stops coffee machines having melee god mode - Fixes #92775 | Before| After| |--------|--------| | image | image| | Changes don't break the machine for the coffee addicts among you | |--------| | image | ## Why It's Good For The Game - Coffee machines should not be immune to melee attacks - Funny but needs fixing image ## Changelog :cl: fix: Stops coffee machines having melee god mode qol: Right clicking on coffee machine without coffee pot has correct message /:cl: --- .../food_and_drinks/machinery/coffeemaker.dm | 213 ++++++++++-------- 1 file changed, 114 insertions(+), 99 deletions(-) diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 2659d9800a4..192760ed447 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -160,11 +160,22 @@ /obj/machinery/coffeemaker/proc/replace_pot(mob/living/user, obj/item/reagent_containers/cup/coffeepot/new_coffeepot) if(!user) return FALSE - if(coffeepot) + + // If we're trying to eject/remove the current pot + if(!new_coffeepot) + if(!coffeepot) + balloon_alert(user, "no coffeepot to remove!") + return FALSE try_put_in_hand(coffeepot, user) - if(new_coffeepot) + balloon_alert(user, "coffeepot returned") + coffeepot = null + else + // If we're replacing with a new pot + if(coffeepot) + try_put_in_hand(coffeepot, user) coffeepot = new_coffeepot - balloon_alert(user, "replaced pot") + balloon_alert(user, "coffeepot inserted") + update_appearance(UPDATE_OVERLAYS) return TRUE @@ -183,90 +194,92 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers) +/obj/machinery/coffeemaker/item_interaction(mob/living/user, obj/item/tool, list/modifiers) //You can only screw open empty grinder - if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) - return FALSE + if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + return ITEM_INTERACT_SUCCESS - if(default_deconstruction_crowbar(attack_item)) - return + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS if(panel_open) //Can't insert objects when its screwed open - return TRUE + return ITEM_INTERACT_BLOCKING - if (istype(attack_item, /obj/item/reagent_containers/cup/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/cup/coffeepot/new_pot = attack_item - . = TRUE //no afterattack + if (istype(tool, /obj/item/reagent_containers/cup/coffeepot) && !(tool.item_flags & ABSTRACT) && tool.is_open_container()) + var/obj/item/reagent_containers/cup/coffeepot/new_pot = tool + . = ITEM_INTERACT_SUCCESS //no afterattack if(!user.transferItemToLoc(new_pot, src)) - return TRUE + return ITEM_INTERACT_BLOCKING replace_pot(user, new_pot) update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/cup/glass/coffee_cup) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/cup/glass/coffee_cup/new_cup = attack_item + if (istype(tool, /obj/item/reagent_containers/cup/glass/coffee_cup) && !(tool.item_flags & ABSTRACT) && tool.is_open_container()) + var/obj/item/reagent_containers/cup/glass/coffee_cup/new_cup = tool if(new_cup.reagents.total_volume > 0) balloon_alert(user, "the cup must be empty!") - return + return ITEM_INTERACT_BLOCKING if(coffee_cups >= max_coffee_cups) balloon_alert(user, "the cup holder is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING coffee_cups++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/pack/sugar)) - var/obj/item/reagent_containers/condiment/pack/sugar/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/pack/sugar)) + var/obj/item/reagent_containers/condiment/pack/sugar/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING if(sugar_packs >= max_sugar_packs) balloon_alert(user, "the sugar compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING sugar_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/creamer)) - var/obj/item/reagent_containers/condiment/creamer/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/creamer)) + var/obj/item/reagent_containers/condiment/creamer/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING if(creamer_packs >= max_creamer_packs) balloon_alert(user, "the creamer compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING creamer_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/pack/astrotame)) - var/obj/item/reagent_containers/condiment/pack/astrotame/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/pack/astrotame)) + var/obj/item/reagent_containers/condiment/pack/astrotame/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING else if(sweetener_packs >= max_sweetener_packs) balloon_alert(user, "the sweetener compartment is full!") - return - else if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + else if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING sweetener_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/coffee_cartridge) && !(attack_item.item_flags & ABSTRACT)) - var/obj/item/coffee_cartridge/new_cartridge = attack_item + if (istype(tool, /obj/item/coffee_cartridge) && !(tool.item_flags & ABSTRACT)) + var/obj/item/coffee_cartridge/new_cartridge = tool if(!user.transferItemToLoc(new_cartridge, src)) - return + return ITEM_INTERACT_BLOCKING replace_cartridge(user, new_cartridge) balloon_alert(user, "added cartridge") update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack + + return NONE // Allow normal attack processing if no special interaction occurred /obj/machinery/coffeemaker/proc/try_brew() if(!cartridge) @@ -582,101 +595,102 @@ return FALSE return TRUE -/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers) +/obj/machinery/coffeemaker/impressa/item_interaction(mob/living/user, obj/item/tool, list/modifiers) //You can only screw open empty grinder - if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) - return + if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + return ITEM_INTERACT_SUCCESS - if(default_deconstruction_crowbar(attack_item)) - return + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS if(panel_open) //Can't insert objects when its screwed open - return TRUE + return ITEM_INTERACT_BLOCKING - if (istype(attack_item, /obj/item/reagent_containers/cup/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/cup/coffeepot/new_pot = attack_item + if (istype(tool, /obj/item/reagent_containers/cup/coffeepot) && !(tool.item_flags & ABSTRACT) && tool.is_open_container()) + var/obj/item/reagent_containers/cup/coffeepot/new_pot = tool if(!user.transferItemToLoc(new_pot, src)) - return TRUE + return ITEM_INTERACT_BLOCKING replace_pot(user, new_pot) update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/cup/glass/coffee) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/cup/glass/coffee/new_cup = attack_item //different type of cup + if (istype(tool, /obj/item/reagent_containers/cup/glass/coffee) && !(tool.item_flags & ABSTRACT) && tool.is_open_container()) + var/obj/item/reagent_containers/cup/glass/coffee/new_cup = tool //different type of cup if(new_cup.reagents.total_volume > 0 ) balloon_alert(user, "the cup must be empty!") - return + return ITEM_INTERACT_BLOCKING if(coffee_cups >= max_coffee_cups) balloon_alert(user, "the cup holder is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING coffee_cups++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/pack/sugar)) - var/obj/item/reagent_containers/condiment/pack/sugar/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/pack/sugar)) + var/obj/item/reagent_containers/condiment/pack/sugar/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING if(sugar_packs >= max_sugar_packs) balloon_alert(user, "the sugar compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING sugar_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/creamer)) - var/obj/item/reagent_containers/condiment/creamer/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/creamer)) + var/obj/item/reagent_containers/condiment/creamer/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING if(creamer_packs >= max_creamer_packs) balloon_alert(user, "the creamer compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING creamer_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/reagent_containers/condiment/pack/astrotame)) - var/obj/item/reagent_containers/condiment/pack/astrotame/new_pack = attack_item + if (istype(tool, /obj/item/reagent_containers/condiment/pack/astrotame)) + var/obj/item/reagent_containers/condiment/pack/astrotame/new_pack = tool if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) balloon_alert(user, "the pack must be full!") - return + return ITEM_INTERACT_BLOCKING if(sweetener_packs >= max_sweetener_packs) balloon_alert(user, "the sweetener compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING sweetener_packs++ update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return ITEM_INTERACT_SUCCESS //no afterattack - if (istype(attack_item, /obj/item/food/grown/coffee) && !(attack_item.item_flags & ABSTRACT)) + if (istype(tool, /obj/item/food/grown/coffee) && !(tool.item_flags & ABSTRACT)) if(coffee_amount >= BEAN_CAPACITY) balloon_alert(user, "the coffee container is full!") - return - if(!HAS_TRAIT(attack_item, TRAIT_DRIED)) + return ITEM_INTERACT_BLOCKING + if(!HAS_TRAIT(tool, TRAIT_DRIED)) balloon_alert(user, "coffee beans must be dry!") - return - var/obj/item/food/grown/coffee/new_coffee = attack_item + return ITEM_INTERACT_BLOCKING + var/obj/item/food/grown/coffee/new_coffee = tool if(!user.transferItemToLoc(new_coffee, src)) - return + return ITEM_INTERACT_BLOCKING coffee += new_coffee coffee_amount++ balloon_alert(user, "added coffee") + update_appearance(UPDATE_OVERLAYS) + return ITEM_INTERACT_SUCCESS //no afterattack - - if (istype(attack_item, /obj/item/storage/box/coffeepack)) + if (istype(tool, /obj/item/storage/box/coffeepack)) if(coffee_amount >= BEAN_CAPACITY) balloon_alert(user, "the coffee container is full!") - return - var/obj/item/storage/box/coffeepack/new_coffee_pack = attack_item + return ITEM_INTERACT_BLOCKING + var/obj/item/storage/box/coffeepack/new_coffee_pack = tool for(var/obj/item/food/grown/coffee/new_coffee in new_coffee_pack.contents) if(HAS_TRAIT(new_coffee, TRAIT_DRIED)) //the coffee beans inside must be dry if(coffee_amount < BEAN_CAPACITY) @@ -687,15 +701,16 @@ balloon_alert(user, "added coffee") update_appearance(UPDATE_OVERLAYS) else - return + return ITEM_INTERACT_BLOCKING else - return + return ITEM_INTERACT_BLOCKING else balloon_alert(user, "non-dried beans inside of coffee pack!") - return + return ITEM_INTERACT_BLOCKING + update_appearance(UPDATE_OVERLAYS) + return ITEM_INTERACT_SUCCESS //no afterattack - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack + return NONE // Allow normal attack processing if no special interaction occurred /obj/machinery/coffeemaker/impressa/take_cup(mob/user) if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break From 11f56f98514600eaeb963ce3c55778eb73692a53 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:44:24 +0000 Subject: [PATCH 054/107] Automatic changelog for PR #92776 [ci skip] --- html/changelogs/AutoChangeLog-pr-92776.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92776.yml diff --git a/html/changelogs/AutoChangeLog-pr-92776.yml b/html/changelogs/AutoChangeLog-pr-92776.yml new file mode 100644 index 00000000000..24dd7f5326f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92776.yml @@ -0,0 +1,5 @@ +author: "loganuk" +delete-after: True +changes: + - bugfix: "Stops coffee machines having melee god mode" + - qol: "Right clicking on coffee machine without coffee pot has correct message" \ No newline at end of file From d99f49d7af55e0e4864794bbb185d5aee9857555 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sun, 7 Sep 2025 05:45:15 -0400 Subject: [PATCH 055/107] Prevent escape pods from being considered "planetary" by the Spacer perk (#92768) ## About The Pull Request The Spacer perk checked is_on_a_planet(), which checked a few other things including onSyndieBase(), but onSyndieBase() was made for scoring purposes(I think) so onSyndieBase() end returns on_escaped_shuttle(), which is true for escape pods so onSyndieBase() was returning true for escape pods, so escape pods got syndicate gravity. This pr only lets the syndicate base give gravity if it's not on a shuttle, and makes reserved areas by default space(except syndie base). ## Why It's Good For The Game fixes #81750 fixes #89960 ## Changelog :cl: fix: Escape pods no longer have planetary gravity /:cl: --- code/__HELPERS/levels.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm index 14d65a929dc..6818978d7d1 100644 --- a/code/__HELPERS/levels.dm +++ b/code/__HELPERS/levels.dm @@ -52,10 +52,14 @@ // Central Command is definitely in space return FALSE - if(what.onSyndieBase()) + if(what.onSyndieBase() && !what.on_escaped_shuttle()) // Syndicate recon outpost is on some moon or something return TRUE + if(is_reserved_level(what_turf.z)) + // Reserved levels are primarily shuttles aside from syndie base + return FALSE + // Finally, more specific checks are ran for edge cases, such as lazily loaded map templates or away missions. Not perfect. return istype(what_turf) && what_turf.planetary_atmos && what_turf.has_gravity() From fc2b0bd99bb4835e2d6a4a4927189f31152395b6 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:45:38 +0000 Subject: [PATCH 056/107] Automatic changelog for PR #92768 [ci skip] --- html/changelogs/AutoChangeLog-pr-92768.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92768.yml diff --git a/html/changelogs/AutoChangeLog-pr-92768.yml b/html/changelogs/AutoChangeLog-pr-92768.yml new file mode 100644 index 00000000000..196cea7cd29 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92768.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - bugfix: "Escape pods no longer have planetary gravity" \ No newline at end of file From a25838701c4653cdb8414d831f7bbd42ef92ec11 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 7 Sep 2025 11:45:47 +0200 Subject: [PATCH 057/107] [NO GBP] Fixes mobs without guaranteed butcher drops not dropping any crusher trophies (#92825) ## About The Pull Request I've tested this on goliaths, but mobs like watchers and brimdemons don't have guaranteed drops so this will error out. ## Changelog :cl: fix: Fixed mobs without guaranteed butcher drops not dropping any crusher trophies /:cl: --- code/datums/elements/crusher_loot.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/datums/elements/crusher_loot.dm b/code/datums/elements/crusher_loot.dm index 16b5253dca2..28cd12f82a0 100644 --- a/code/datums/elements/crusher_loot.dm +++ b/code/datums/elements/crusher_loot.dm @@ -46,5 +46,8 @@ /datum/element/crusher_loot/proc/make_path(mob/living/target, path) if(drop_immediately) new path(get_turf(target)) - else - target.guaranteed_butcher_results[path] = 1 + return + + if (!target.guaranteed_butcher_results) + target.guaranteed_butcher_results = list() + target.guaranteed_butcher_results[path] = 1 From 81c0fe32b349bcb2691369275808462ca22d7263 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 09:46:06 +0000 Subject: [PATCH 058/107] Automatic changelog for PR #92825 [ci skip] --- html/changelogs/AutoChangeLog-pr-92825.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92825.yml diff --git a/html/changelogs/AutoChangeLog-pr-92825.yml b/html/changelogs/AutoChangeLog-pr-92825.yml new file mode 100644 index 00000000000..2f7f4c6a05d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92825.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed mobs without guaranteed butcher drops not dropping any crusher trophies" \ No newline at end of file From 22cb1820a1aceda8af4780ae6cfa4ea3d5df402b Mon Sep 17 00:00:00 2001 From: Lucy Date: Sun, 7 Sep 2025 05:46:32 -0400 Subject: [PATCH 059/107] Update SpacemanDMM suite to 1.11 (#92811) ## About The Pull Request Updates `SPACEMAN_DMM_VERSION` to `suite-1.11` in `dependencies.sh`, for the new https://github.com/SpaceManiac/SpacemanDMM/releases/tag/suite-1.11 release ## Why It's Good For The Game finally... `load_ext`, `for(k,v)`, and `callee.proc.type` support ## Changelog No user-facing changes. --- dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.sh b/dependencies.sh index 910fc9d0281..56596e18d39 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -17,7 +17,7 @@ export NODE_VERSION_LTS=22.11.0 export BUN_VERSION=1.2.16 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.10 +export SPACEMAN_DMM_VERSION=suite-1.11 # Python version for mapmerge and other tools export PYTHON_VERSION=3.9.0 From e7bd1c0e0280ec7224e301ea131f06580123b0ec Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sun, 7 Sep 2025 05:06:29 -0500 Subject: [PATCH 060/107] [MDB Ignore] Replaces MOST Emergency NanoMed vendors with new First Aid Stations. (Also reverts advanced medkits in bridge and buffs back nanomeds) (#92677) ## About The Pull Request ### Main changes Across all station maps, emergency shuttles, and arrivals shuttles, the Emergency NanoMeds (wall mounted medical supply vendors) have been replcaed with Deforest First Aid Stations. image Deforest First Aid Station have an internal supply of healing which recharges slowly over time (1/10th of the pool is recharged every 30 seconds). To access this healing, users must insert their arm into the machine with left click. (Or you can mouse drop other people into it.) Once their arm is in place, some of the internal supply will be used up to heal the user. The internal supply can heal brute, burn, tox, and blood loss. This is straight, instant healing - so it doesn't trigger allergies or nothing. However, if you insert a robotic arm, it will refuse to heal you. Users are charged every time healing is dispensed - 2.5 credits per unit of damage healed. Payments go to the medical budget, same as kiosks. You can also right click the machine to dispense gauze for 16 credits. On **red alert** (or for medical staff, or on emergency shuttles), all charges are waived. (It's free) Also you can emag it so it causes damage instead. Funny. ### Other changes: Buffs the contents of emergency nanomeds Reverts bridge advanced medkits to normal medkits ## Why It's Good For The Game Wall vending changes: People want options to heal chip damage beyond visiting the bar but we also don't really want people to load up on boat loads of medical supplies. So here we are: A machine fully capable of healing minor injuries that you can carry along with you. If you're missing like 4-6 brute or toxin damage, you can visit a first aid station and pay 15 credits to top yourself off. This is of course on top of all the other options available to you, such as getting a hearty meal, some variety of drink from the bar, sleeping in dorms, water coolers, etc. The limited pool + cost requirement prevents you from going 0-100, so you still have to go to medbay if you are severely wounded or your ID was stolen. Nanomed changes: Now that they are considerably less common once again, they can have a decent stock. Advanced medkit changes: I don't really see the justification behind handing these out so freely, and given the medical stations will have adequate extra healing for the command staff, they don't need these. ## Changelog :cl: Melber balance: Advanced first aid kits in the bridge are back to being normal first aid kids balance: Emergency Nanomed vendors have larger stocks and better supplies add: Replaces a majority of Emergency Nanomeds on stations and shuttles with Deforest First Aid Stations. Left clicking these stationary machines will heal minor damage and blood loss over time - at a (small) price. Right clicking them will provide gauze, also for a price. All costs are waived on shuttles, during red alert, or for medical staff. You can also click-drag to have other mobs use the machine. However, robotic limbs need not apply. /:cl: --- .../CatwalkStation/CatwalkStation_2023.dmm | 1412 ++++++++--------- .../map_files/Deltastation/DeltaStation2.dmm | 603 +++---- .../map_files/IceBoxStation/IceBoxStation.dmm | 341 ++-- _maps/map_files/MetaStation/MetaStation.dmm | 381 ++--- _maps/map_files/Mining/Lavaland.dmm | 30 +- .../map_files/NebulaStation/NebulaStation.dmm | 516 +++--- _maps/map_files/debug/gateway_test.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 146 +- _maps/map_files/tramstation/tramstation.dmm | 1237 +++++++-------- _maps/map_files/wawastation/wawastation.dmm | 318 ++-- _maps/minigame/deathmatch/maint_mania.dmm | 2 +- _maps/shuttles/arrival_catwalk.dmm | 2 +- _maps/shuttles/arrival_delta.dmm | 2 +- _maps/shuttles/arrival_kilo.dmm | 2 +- _maps/shuttles/emergency_asteroid.dmm | 4 +- _maps/shuttles/emergency_bar.dmm | 2 +- _maps/shuttles/emergency_bballhooper.dmm | 2 +- _maps/shuttles/emergency_birdboat.dmm | 2 +- _maps/shuttles/emergency_box.dmm | 2 +- _maps/shuttles/emergency_casino.dmm | 8 +- _maps/shuttles/emergency_catwalk.dmm | 4 +- _maps/shuttles/emergency_cere.dmm | 2 +- _maps/shuttles/emergency_clown.dmm | 2 +- _maps/shuttles/emergency_cruise.dmm | 6 +- _maps/shuttles/emergency_delta.dmm | 2 +- _maps/shuttles/emergency_donut.dmm | 4 +- _maps/shuttles/emergency_fish.dmm | 12 +- _maps/shuttles/emergency_goon.dmm | 6 +- _maps/shuttles/emergency_humpback.dmm | 4 +- _maps/shuttles/emergency_kilo.dmm | 4 +- _maps/shuttles/emergency_lance.dmm | 6 +- _maps/shuttles/emergency_luxury.dmm | 8 +- _maps/shuttles/emergency_meta.dmm | 4 +- _maps/shuttles/emergency_mini.dmm | 4 +- _maps/shuttles/emergency_nebula.dmm | 2 +- _maps/shuttles/emergency_northstar.dmm | 4 +- _maps/shuttles/emergency_omega.dmm | 6 +- _maps/shuttles/emergency_pubby.dmm | 2 +- .../emergency_scrapheap/classic_aft3.dmm | 2 +- _maps/shuttles/emergency_shadow.dmm | 4 +- _maps/shuttles/emergency_tram.dmm | 4 +- _maps/shuttles/emergency_tranquility.dmm | 6 +- _maps/shuttles/emergency_venture.dmm | 8 +- _maps/shuttles/emergency_wawa.dmm | 2 +- _maps/virtual_domains/meta_central.dmm | 66 +- code/datums/components/payment.dm | 2 +- code/game/machinery/wall_healer.dm | 566 +++++++ code/modules/vending/medical_wall.dm | 15 +- icons/obj/machines/wall_healer.dmi | Bin 0 -> 1010 bytes tgstation.dme | 1 + 50 files changed, 3180 insertions(+), 2592 deletions(-) create mode 100644 code/game/machinery/wall_healer.dm create mode 100644 icons/obj/machines/wall_healer.dmi diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 9cae1477c0f..df89defdb38 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -761,13 +761,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/warden) -"amk" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/closet/crate/trashcart/laundry, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "ams" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/siding/blue/corner{ @@ -2605,6 +2598,13 @@ }, /turf/open/floor/glass, /area/station/service/kitchen) +"aQx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "aQz" = ( /obj/structure/table, /turf/open/floor/iron/dark/textured, @@ -2686,6 +2686,9 @@ }, /turf/open/openspace, /area/station/command/gateway) +"aSW" = ( +/turf/closed/wall, +/area/station/service/hydroponics/garden/abandoned) "aSX" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -2756,6 +2759,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"aUe" = ( +/obj/item/tank/internals/plasma/empty, +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "aUl" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -2873,17 +2887,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) -"aVv" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "aVy" = ( /obj/structure/sign/directions/security/directional/north{ dir = 2; @@ -2902,6 +2905,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"aVL" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/north, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","medbay"); + c_tag = "Medbay - Lobby" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "aVN" = ( /turf/closed/wall, /area/station/command/teleporter) @@ -4621,6 +4639,10 @@ }, /turf/open/floor/iron, /area/station/science/research) +"bvY" = ( +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/wood, +/area/station/ai_monitored/command/storage/eva) "bvZ" = ( /obj/structure/railing{ dir = 8 @@ -5197,6 +5219,13 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"bEJ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "bES" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -6811,6 +6840,15 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/disposal) +"caQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/autolathe, +/obj/structure/sign/poster/official/do_not_question/directional/north, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "caS" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7412,6 +7450,10 @@ }, /turf/open/floor/wood/large, /area/station/service/kitchen) +"ckE" = ( +/obj/machinery/hydroponics/soil, +/turf/open/misc/sandy_dirt, +/area/station/service/hydroponics/garden/abandoned) "ckG" = ( /obj/structure/table, /obj/item/clothing/glasses/sunglasses/big{ @@ -8393,10 +8435,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"cyY" = ( -/obj/machinery/hydroponics/soil, -/turf/open/misc/sandy_dirt, -/area/station/service/hydroponics/garden/abandoned) "czk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8508,11 +8546,6 @@ /obj/machinery/light/directional, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"cAs" = ( -/obj/structure/disposalpipe/segment, -/obj/item/banner/command/mundane, -/turf/open/floor/plating, -/area/station/maintenance/port) "cAv" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -9224,30 +9257,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"cJi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/cultivator, -/obj/item/reagent_containers/cup/bottle/nutrient/rh{ - pixel_x = 10; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/bottle/nutrient/ez{ - pixel_x = 10; - pixel_y = -4 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/item/reagent_containers/spray/pestspray{ - pixel_x = 10; - pixel_y = -14 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "cJk" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/shrink_cw, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, @@ -10449,6 +10458,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"ddx" = ( +/obj/structure/disposalpipe/segment, +/obj/item/banner/command/mundane, +/turf/open/floor/plating, +/area/station/maintenance/port) "ddz" = ( /obj/effect/turf_decal/siding/white, /obj/item/kirbyplants/organic/plant21{ @@ -12425,13 +12439,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/cafeteria) -"dJx" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/washing_machine, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "dJB" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/machinery/door/poddoor/shutters/preopen{ @@ -12583,6 +12590,14 @@ }, /turf/open/floor/iron/textured, /area/station/cargo/storage) +"dLb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "dLl" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, @@ -12653,14 +12668,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/lesser) -"dMK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/structure/frame/machine/secured, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "dMM" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -12846,13 +12853,6 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) -"dOC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "dOG" = ( /obj/structure/cable, /turf/closed/wall/r_wall, @@ -12975,13 +12975,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/science/robotics) -"dRo" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "dRU" = ( /obj/structure/table/wood, /obj/effect/spawner/random/maintenance, @@ -13675,6 +13668,14 @@ "eap" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) +"eas" = ( +/obj/machinery/wall_healer/directional/east, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) "eaw" = ( /obj/effect/turf_decal/siding/brown, /obj/effect/turf_decal/siding/brown/corner{ @@ -13973,6 +13974,13 @@ /obj/effect/landmark/start/depsec/science, /turf/open/openspace, /area/station/security/checkpoint/science) +"eet" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "eeA" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -14712,14 +14720,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"epX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/table/glass, -/obj/item/storage/medkit/regular, -/obj/structure/cable, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/medical) "epY" = ( /obj/structure/plaque/static_plaque/golden/commission/efficiency{ pixel_y = 32 @@ -14782,6 +14782,14 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) +"eqU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/structure/frame/machine/secured, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "eqV" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/turf_decal/bot, @@ -14874,14 +14882,6 @@ }, /turf/open/openspace, /area/station/service/library) -"erQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "esb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -14982,19 +14982,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) -"euA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/closet/crate/hydroponics, -/obj/effect/spawner/random/food_or_drink/plant_produce, -/obj/effect/spawner/random/food_or_drink/seed_flowers, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "euD" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -15940,12 +15927,6 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"eLk" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/effect/spawner/random/clothing/gloves, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "eLl" = ( /obj/machinery/door/airlock/command{ name = "Captain's Office" @@ -16049,10 +16030,6 @@ /obj/item/airlock_painter, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"eNm" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "eNx" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 4 @@ -17615,6 +17592,10 @@ /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"flo" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "flD" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, @@ -17803,14 +17784,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"foP" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "foR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -17903,6 +17876,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/space_hut) +"fpM" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/west, +/obj/effect/spawner/random/clothing/gloves, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "fpN" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -18433,9 +18412,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) -"fxX" = ( -/turf/closed/wall, -/area/station/service/hydroponics/garden/abandoned) "fxY" = ( /obj/machinery/vending/cigarette, /obj/structure/disposalpipe/segment{ @@ -19382,6 +19358,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"fMC" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "fMS" = ( /obj/effect/turf_decal/siding/dark/inner_corner{ dir = 8 @@ -20103,6 +20086,14 @@ }, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) +"fWc" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/machinery/status_display/ai/directional/south, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron, +/area/station/commons/dorms) "fWt" = ( /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 4 @@ -20482,12 +20473,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/commons/storage/primary) -"gbv" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/sign/poster/official/work_for_a_future/directional/south, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/science/research) "gby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21029,6 +21014,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) +"giM" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "giT" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/floor/glass, @@ -22178,16 +22170,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/command/heads_quarters/cmo) -"gBc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "gBf" = ( /obj/structure/lattice/catwalk, /obj/item/stack/rods, @@ -22414,14 +22396,6 @@ }, /turf/open/floor/carpet, /area/station/maintenance/starboard/lesser) -"gEJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "gEN" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -22431,6 +22405,17 @@ }, /turf/open/floor/engine/hull/reinforced/air, /area/station/ai_monitored/turret_protected/ai) +"gFa" = ( +/obj/structure/table/reinforced, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "gFi" = ( /obj/structure/closet/secure_closet/research_director, /obj/item/clothing/head/soft/purple, @@ -22441,6 +22426,12 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"gFm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/closed/wall, +/area/station/service/hydroponics/garden/abandoned) "gFo" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -22905,19 +22896,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/space/openspace, /area/space/nearstation) -"gMZ" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/stamp/head/hop{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) "gNf" = ( /obj/structure/light_construct/directional/east, /obj/effect/mapping_helpers/broken_floor, @@ -23061,19 +23039,6 @@ /obj/machinery/drone_dispenser, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"gPh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/storage/bag/plants, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "gPu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23356,6 +23321,18 @@ /obj/effect/spawner/random/maintenance/no_decals, /turf/open/floor/engine/hull, /area/space/nearstation) +"gSS" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/directions/engineering/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "gSX" = ( /obj/machinery/plumbing/sender, /obj/effect/decal/cleanable/dirt, @@ -23387,6 +23364,14 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) +"gTH" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -3; + pixel_y = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "gTL" = ( /obj/machinery/door/airlock/public/glass{ name = "Circle Center" @@ -23449,13 +23434,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"gUR" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gVi" = ( /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, @@ -24065,6 +24043,15 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/engine/hull, /area/space/nearstation) +"heb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/banner/blue{ + inspiration_available = 0 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "hei" = ( /obj/structure/chair{ dir = 8 @@ -24339,6 +24326,16 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) +"hip" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/aft) "hiu" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/engine/hull/air, @@ -25558,15 +25555,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"hBj" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/machinery/autolathe, -/obj/structure/sign/poster/official/do_not_question/directional/north, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) "hBu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ @@ -26350,6 +26338,13 @@ dir = 4 }, /area/station/tcommsat/server) +"hLN" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/hydroponics/garden/abandoned) "hLT" = ( /obj/docking_port/stationary/escape_pod{ dir = 8 @@ -26964,15 +26959,6 @@ }, /turf/open/floor/plating, /area/station/construction/storage_wing) -"hTF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/item/vending_refill/hydroseeds, -/obj/structure/frame/machine/secured, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "hTI" = ( /obj/machinery/light/directional/south, /obj/effect/landmark/firealarm_sanity, @@ -27136,6 +27122,17 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat/foyer) +"hWU" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "hXc" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -27751,14 +27748,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"ihn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) "ihv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -27836,16 +27825,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"iiT" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/machinery/space_heater, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "iiV" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/cigarette_pack, @@ -27861,14 +27840,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) -"iji" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "ijl" = ( /obj/structure/cable, /obj/item/restraints/legcuffs/beartrap/prearmed{ @@ -28573,12 +28544,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"itU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/closed/wall, -/area/station/service/hydroponics/garden/abandoned) "itV" = ( /obj/item/stack/sheet/mineral/wood{ pixel_x = -5; @@ -29578,6 +29543,19 @@ dir = 4 }, /area/station/hallway/primary/fore) +"iIs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/biogenerator, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "iIu" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating/airless, @@ -30674,13 +30652,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"iZD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "iZI" = ( /obj/machinery/computer/bank_machine, /obj/machinery/light_switch/directional/west{ @@ -31571,24 +31542,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jmG" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/button/door/directional/north{ - id = "hydropony_shutters"; - name = "hydroponics shutters control"; - pixel_x = 10; - pixel_y = 30; - req_access = list("hydroponics") - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/sink/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) "jmQ" = ( /obj/effect/spawner/random/trash/grime, /turf/open/floor/plating, @@ -32403,10 +32356,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"jyf" = ( -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "jyl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing, @@ -32505,17 +32454,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/dorms) -"jyZ" = ( -/obj/item/tank/internals/plasma/empty, -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "jzi" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/wood, @@ -32872,6 +32810,11 @@ }, /turf/open/openspace, /area/station/maintenance/starboard/lesser) +"jDr" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/spawner/random/clothing/wardrobe_closet_colored, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "jDx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -33297,6 +33240,12 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"jJZ" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "jKe" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -33631,11 +33580,6 @@ /obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, /turf/open/floor/wood/large, /area/station/service/library) -"jPB" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) "jPC" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -34333,14 +34277,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) -"kbi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "kbj" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -34580,6 +34516,13 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) +"kew" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "key" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34897,11 +34840,6 @@ /obj/structure/sign/poster/ripped/directional/north, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"kjl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) "kjF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/junction/yjunction{ @@ -35409,6 +35347,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) +"kpE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "kpJ" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/tracker, @@ -36427,10 +36373,6 @@ dir = 8 }, /area/station/tcommsat/server) -"kEn" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/station/service/hydroponics/garden/abandoned) "kEw" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -37589,6 +37531,14 @@ /obj/machinery/suit_storage_unit/engine, /turf/open/floor/iron/dark, /area/station/engineering/storage) +"kYT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "kYU" = ( /obj/machinery/air_sensor/engine_chamber, /turf/open/floor/engine, @@ -38808,16 +38758,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"luD" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) "luI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -41108,18 +41048,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"mcs" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/directions/engineering/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "mcB" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -41187,13 +41115,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured, /area/station/cargo/warehouse) -"mdn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/banner/red{ - inspiration_available = 0 - }, -/turf/open/floor/eighties, -/area/station/maintenance/hallway/abandoned_recreation) "mdp" = ( /obj/structure/closet, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -41643,6 +41564,14 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"mju" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "mjB" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -41656,6 +41585,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"mkd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/banner/red{ + inspiration_available = 0 + }, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "mke" = ( /obj/structure/table, /obj/item/binoculars, @@ -41666,6 +41602,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/glass, /area/station/commons/fitness/recreation) +"mkv" = ( +/obj/structure/table, +/obj/structure/bedsheetbin/empty{ + pixel_y = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "mkI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42344,6 +42287,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"muC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Garden" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "muF" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/north, @@ -44309,10 +44266,6 @@ /obj/structure/railing, /turf/open/openspace, /area/station/engineering/atmos/upper) -"nck" = ( -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "nct" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44633,15 +44586,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/law_office, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"nhD" = ( -/obj/structure/table/glass, -/obj/machinery/vending/wallmed/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "nhE" = ( /obj/structure/sign/poster/contraband/communist_state/directional/north, /obj/effect/decal/cleanable/crayon{ @@ -44854,6 +44798,13 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"nkZ" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "nld" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -45858,6 +45809,13 @@ /obj/effect/spawner/random/clothing/funny_hats, /turf/open/floor/plating, /area/station/maintenance/port) +"nym" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/item/pen, +/obj/structure/sign/poster/contraband/missing_gloves/directional/west, +/turf/open/floor/wood, +/area/station/commons/dorms) "nyw" = ( /obj/machinery/light/small/directional/east, /obj/machinery/air_sensor/nitrous_tank, @@ -46199,6 +46157,12 @@ /obj/effect/mapping_helpers/mail_sorting/science/research, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"nCC" = ( +/obj/machinery/light/directional/north, +/obj/machinery/light_switch/directional/north, +/obj/structure/closet/wardrobe/white, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "nCI" = ( /obj/machinery/component_printer, /obj/effect/turf_decal/bot_white, @@ -47815,13 +47779,6 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"oai" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "oaj" = ( /turf/closed/wall, /area/station/security/medical) @@ -47989,6 +47946,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) +"ocT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/sink/kitchen/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "odd" = ( /obj/structure/railing{ dir = 1 @@ -49690,12 +49656,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"oEA" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "oEI" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/mug/britcup{ @@ -49850,10 +49810,8 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"oHh" = ( -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, -/obj/structure/closet/wardrobe/white, +"oHs" = ( +/obj/structure/closet/wardrobe/grey, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) "oHu" = ( @@ -50969,13 +50927,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/maintenance/port/aft) -"oXS" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/service/hydroponics/garden/abandoned) "oXT" = ( /obj/effect/turf_decal/stripes/asteroid/corner{ dir = 8 @@ -53765,6 +53716,13 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"pOF" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron, +/area/station/commons/dorms) "pOM" = ( /obj/structure/railing{ dir = 1 @@ -53987,6 +53945,10 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/ce) +"pQh" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/station/service/hydroponics/garden/abandoned) "pQq" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -54217,15 +54179,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"pST" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/effect/spawner/random/entertainment/coin, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "pSY" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -54564,6 +54517,12 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"qau" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/sign/poster/official/work_for_a_future/directional/south, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/science/research) "qaI" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp, @@ -54738,6 +54697,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"qeb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "qec" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55654,6 +55623,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"qrN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "qrP" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/textured_large, @@ -55822,17 +55796,6 @@ /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/iron, /area/station/construction/storage_wing) -"quW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/guides/jobs/hydroponics, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction) "qvd" = ( /obj/structure/railing{ dir = 9 @@ -56903,22 +56866,14 @@ }, /turf/open/openspace, /area/station/service/library) -"qMa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 +"qMe" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" }, -/obj/item/hatchet{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/crowbar, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "qMi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57108,6 +57063,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qPy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "qPB" = ( /obj/structure/mannequin/skeleton, /turf/open/floor/iron/dark/textured_large, @@ -57176,6 +57141,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"qQj" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "qQx" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/effect/turf_decal/stripes/end, @@ -57828,13 +57800,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"rad" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/item/pen, -/obj/structure/sign/poster/contraband/missing_gloves/directional/west, -/turf/open/floor/wood, -/area/station/commons/dorms) "rah" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/iron{ @@ -59334,14 +59299,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) -"rwe" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/station/commons/dorms) "rwh" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -59925,17 +59882,6 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"rFp" = ( -/obj/machinery/vending/wallmed/directional/west{ - pixel_x = 27 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/command/gateway) "rFq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -60171,6 +60117,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"rIS" = ( +/obj/machinery/wall_healer/directional/west{ + pixel_x = 27 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/command/gateway) "rIU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60407,6 +60364,11 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"rMe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "rMj" = ( /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/lesser) @@ -60792,6 +60754,13 @@ dir = 4 }, /area/station/medical/pharmacy) +"rSu" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/washing_machine, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "rTa" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -61146,13 +61115,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"rYa" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "rYd" = ( /obj/effect/turf_decal/tile/red/opposingcorners{ dir = 1 @@ -61232,11 +61194,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"sax" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "saE" = ( /obj/machinery/door/airlock/public/glass{ name = "Community Center" @@ -61805,6 +61762,17 @@ /obj/machinery/light/blacklight/directional/west, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"shX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/guides/jobs/hydroponics, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction) "sij" = ( /obj/structure/reflector/double{ dir = 6 @@ -62177,16 +62145,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) -"spm" = ( -/obj/effect/decal/cleanable/glitter{ - color = "ff8080" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "spr" = ( /obj/structure/table, /obj/item/hand_labeler{ @@ -63562,6 +63520,20 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) +"sLB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "sLC" = ( /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, @@ -63730,6 +63702,13 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/turret_protected/aisat_interior) +"sOw" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/random/clothing/backpack, +/obj/effect/spawner/random/clothing/backpack, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "sOz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64064,15 +64043,6 @@ "sTv" = ( /turf/closed/wall, /area/station/security/courtroom) -"sTK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/banner/blue{ - inspiration_available = 0 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/eighties, -/area/station/maintenance/hallway/abandoned_recreation) "sTT" = ( /obj/structure/railing/corner/end/flip{ dir = 4 @@ -64162,26 +64132,17 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron, /area/station/engineering/lobby) +"sUF" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/aft) "sUM" = ( /obj/effect/turf_decal/box/white{ color = "#EFB341" }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"sUR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Garden" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "sUV" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -64640,17 +64601,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"tcv" = ( -/obj/structure/table/reinforced, -/obj/item/plant_analyzer, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "tcw" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -64673,13 +64623,6 @@ /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"tcW" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/station/commons/dorms) "tda" = ( /obj/item/pen, /obj/item/pen/blue, @@ -65409,21 +65352,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"toE" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/north, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay"); - c_tag = "Medbay - Lobby" - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "toH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67610,10 +67538,6 @@ "tYh" = ( /turf/open/floor/plating/airless, /area/station/maintenance/space_hut) -"tYi" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "tYl" = ( /obj/structure/closet/crate/silvercrate, /obj/machinery/camera/motion{ @@ -69670,19 +69594,6 @@ "uAE" = ( /turf/open/floor/iron/dark, /area/station/security/range) -"uAF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/biogenerator, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "uAO" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -70101,10 +70012,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"uGp" = ( -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) "uGt" = ( /obj/structure/tank_holder/extinguisher, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -70513,15 +70420,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance/storage) -"uLC" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera/autoname/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medbay - Upper Morgue" - }, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/dark/textured_large, -/area/station/medical/morgue) "uLL" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -70640,6 +70538,15 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uOx" = ( +/obj/structure/table/glass, +/obj/machinery/wall_healer/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "uOC" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /turf/open/floor/iron/dark/smooth_large, @@ -71188,13 +71095,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) -"uXW" = ( -/obj/structure/table, -/obj/structure/bedsheetbin/empty{ - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "uXZ" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/three, @@ -71804,20 +71704,6 @@ /obj/structure/closet/bombcloset/security, /turf/open/floor/iron/dark, /area/station/security/office) -"vhF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "vhJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -72267,6 +72153,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/wood, /area/station/security/detectives_office) +"voe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/item/vending_refill/hydroseeds, +/obj/structure/frame/machine/secured, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "vof" = ( /obj/effect/landmark/carpspawn, /turf/open/space/openspace, @@ -72366,11 +72261,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"vpp" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/spawner/random/clothing/wardrobe_closet_colored, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "vpt" = ( /obj/structure/chair/pew/right{ dir = 4 @@ -72777,6 +72667,22 @@ /obj/structure/light_construct/directional/east, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"vwa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/item/hatchet{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/crowbar, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "vwb" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -73313,14 +73219,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"vEp" = ( -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/medical) "vEF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73660,6 +73558,16 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"vKc" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "vKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/dark/textured, @@ -73715,6 +73623,24 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/locker) +"vKZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/button/door/directional/north{ + id = "hydropony_shutters"; + name = "hydroponics shutters control"; + pixel_x = 10; + pixel_y = 30; + req_access = list("hydroponics") + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/sink/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "vLb" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -75838,13 +75764,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/wood, /area/station/service/library) -"wqE" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/closet/crate/trashcart/laundry, -/obj/effect/spawner/random/clothing/backpack, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "wqI" = ( /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/plating, @@ -76124,13 +76043,6 @@ /obj/effect/spawner/random/entertainment/dice, /turf/open/floor/wood/large, /area/station/service/library) -"wvm" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "wvw" = ( /obj/machinery/conveyor{ dir = 8; @@ -77442,6 +77354,30 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"wQw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/cultivator, +/obj/item/reagent_containers/cup/bottle/nutrient/rh{ + pixel_x = 10; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/bottle/nutrient/ez{ + pixel_x = 10; + pixel_y = -4 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/item/reagent_containers/spray/pestspray{ + pixel_x = 10; + pixel_y = -14 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "wQD" = ( /obj/machinery/light/small/directional/east, /obj/item/solar_assembly, @@ -78241,6 +78177,15 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, /area/station/hallway/primary/port) +"xck" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/camera/autoname/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay - Upper Morgue" + }, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron/dark/textured_large, +/area/station/medical/morgue) "xcx" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/smooth_large, @@ -78441,6 +78386,16 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) +"xfn" = ( +/obj/effect/decal/cleanable/glitter{ + color = "ff8080" + }, +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "xfq" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/yellow/opposingcorners{ @@ -78559,13 +78514,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"xhT" = ( -/obj/structure/table, -/obj/structure/bedsheetbin{ - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/locker) "xhX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -78910,6 +78858,14 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) +"xot" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/structure/cable, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/medical) "xoF" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -79189,14 +79145,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/cytology) -"xss" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "xsv" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/engine, @@ -79616,6 +79564,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"xAt" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "xAu" = ( /turf/closed/wall, /area/station/medical/chemistry) @@ -79863,6 +79815,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"xDR" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "xDW" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -80518,6 +80474,19 @@ /obj/effect/spawner/random/entertainment, /turf/open/floor/plating, /area/station/maintenance/port) +"xNN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/closet/crate/hydroponics, +/obj/effect/spawner/random/food_or_drink/plant_produce, +/obj/effect/spawner/random/food_or_drink/seed_flowers, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "xNV" = ( /obj/structure/railing{ dir = 1 @@ -80684,6 +80653,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) +"xRn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/storage/bag/plants, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "xRI" = ( /obj/machinery/conveyor{ dir = 8; @@ -80794,6 +80776,14 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/engineering/storage) +"xSv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics/garden/abandoned) "xSz" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -81258,6 +81248,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/command/heads_quarters/ce) +"xYf" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/effect/spawner/random/entertainment/coin, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "xYh" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -81281,6 +81280,19 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/wood/large, /area/station/service/library) +"xYn" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) "xYy" = ( /obj/machinery/nuclearbomb/selfdestruct, /obj/machinery/light/directional/east, @@ -81647,6 +81659,13 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"yeu" = ( +/obj/structure/table, +/obj/structure/bedsheetbin{ + pixel_y = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/locker) "yeA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81714,15 +81733,6 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"yfu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/sink/kitchen/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "yfv" = ( /obj/structure/table/wood, /obj/item/binoculars{ @@ -81916,16 +81926,6 @@ /obj/structure/chair, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"yiw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics/garden/abandoned) "yiy" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -107382,7 +107382,7 @@ gPW xRU xOn xAj -jyf +xAt own wik uxl @@ -107633,7 +107633,7 @@ jBd lOd nKj jIX -sTK +heb vYH cFL xAj @@ -109222,7 +109222,7 @@ bFe rPE srD jDx -cAs +ddx ovx tRJ dWj @@ -113054,7 +113054,7 @@ kZo hMd ozk pen -rFp +rIS szz oTK tQI @@ -113072,7 +113072,7 @@ fLr iLm fLr pEO -toE +aVL sGy xeM ujD @@ -113303,7 +113303,7 @@ dDX vuO ugN tGb -gMZ +xYn loc ltm kRk @@ -114070,7 +114070,7 @@ bOk bOk wrI fjt -nck +xDR vuO ilg wmy @@ -115842,7 +115842,7 @@ wVd lBg nhR iol -gUR +eet jMr ibK jqv @@ -116115,10 +116115,10 @@ nyA jph dcE dTL -tYi -pST -eLk -iji +oHs +xYf +fpM +gTH dCm jqo eaw @@ -116372,10 +116372,10 @@ iOE jph heR dTL -vpp +jDr oNp sPC -wqE +sOw dCm rpL lHY @@ -116629,10 +116629,10 @@ jph jph dcE dTL -oHh +nCC sjO skC -amk +qQj dCm dCE bLf @@ -116886,10 +116886,10 @@ heR dcE dcE dTL -dJx +rSu uzN oqd -uXW +mkv dCm nZb ayn @@ -117146,7 +117146,7 @@ dTL uNG jQu oqd -xhT +yeu dCm emL bXg @@ -119710,7 +119710,7 @@ pRO mcY tFy qNn -rad +nym clF pRO ntw @@ -120487,7 +120487,7 @@ pRO tqQ ccZ qMN -tcW +pOF dCm tMZ idM @@ -120744,7 +120744,7 @@ pRO gnw qAd vfe -rwe +fWc dCm cNO idM @@ -121001,7 +121001,7 @@ cVN cVN dux ezT -tcW +pOF dCm ade rdl @@ -121258,7 +121258,7 @@ olU olU laK ffR -tcW +pOF dCm cNO dCm @@ -122095,7 +122095,7 @@ hFi hFi hFi hFi -kjl +rMe gnT hFi hFi @@ -122573,7 +122573,7 @@ iYq caE dUe oDH -wvm +bEJ iKT oDH oDH @@ -122629,8 +122629,8 @@ cMb lue vnp hFi -quW -ihn +shX +mju vvc exj qZZ @@ -122882,12 +122882,12 @@ aLd aLd cWU cWU -fxX -fxX -kEn -kEn -sUR -fxX +aSW +aSW +pQh +pQh +muC +aSW uVg uVg dEB @@ -123089,7 +123089,7 @@ qgr xiy lmt qPj -hBj +caQ gNy qgI lMT @@ -123139,12 +123139,12 @@ mTH cWU cWU msr -fxX -euA -xss -yfu -vhF -cyY +aSW +xNN +xSv +ocT +sLB +ckE uVg dEk xLQ @@ -123396,12 +123396,12 @@ jmh qdA wOx vcm -kEn -hTF -sax -gEJ -gBc -cyY +pQh +voe +qrN +dLb +qPy +ckE uVg viT bwI @@ -123653,12 +123653,12 @@ jmh dlt wKl rNT -kEn -dMK -sax -erQ -yiw -cyY +pQh +eqU +qrN +kYT +qeb +ckE uVg wZW xNr @@ -123910,12 +123910,12 @@ jmh qdA wOx tVR -kEn -kbi -eNm -dOC -uAF -fxX +pQh +kpE +flo +aQx +iIs +aSW uVg uVg pWZ @@ -124167,12 +124167,12 @@ jmh rOn iXD kiu -itU -tcv -cJi -qMa -gPh -fxX +gFm +gFa +wQw +vwa +xRn +aSW jjG uVg ucl @@ -124425,10 +124425,10 @@ qdA xZP aKk wKb -kEn -kEn -kEn -oXS +pQh +pQh +pQh +hLN wKb wKb uVg @@ -124689,7 +124689,7 @@ koi boq wKb jCK -aVv +hWU moI lRp wKb @@ -124942,10 +124942,10 @@ eEv eEv eEv wKb -iiT +xfn aWb tCE -mcs +gSS wKb wKb wKb @@ -125201,8 +125201,8 @@ wKb wKb wKb rlR -luD -jyZ +hip +aUe wKb hhN pss @@ -125455,7 +125455,7 @@ hZf wKb eEv eEv -iZD +kew wUu sfL pwQ @@ -125710,13 +125710,13 @@ vlc mgY mgY wKb -dRo +nkZ wep eEv ebQ diA xqo -spm +vKc wKb lmL jyA @@ -125967,8 +125967,8 @@ wKb yfj nuZ wKb -rYa -oEA +fMC +jJZ trK msK ina @@ -126228,7 +126228,7 @@ wKb wKb wKb wKb -foP +qMe ilV bvG wKb @@ -126406,7 +126406,7 @@ xSq irJ grE rTW -oai +giM dPD dPD sNK @@ -127765,7 +127765,7 @@ jmh wKb dGu gdG -jPB +sUF jcQ jcQ jcQ @@ -167555,7 +167555,7 @@ tlL jhO muJ qFA -epX +xot kUq uJi kUq @@ -168067,7 +168067,7 @@ nlO iGy ohb rwh -vEp +eas sFc aCE pIt @@ -170602,7 +170602,7 @@ eIJ eIJ nKj ipm -mdn +mkd lOd gPW wKg @@ -173955,7 +173955,7 @@ tnb hRX hRX hRX -jmG +vKZ xyF pME rjE @@ -176810,7 +176810,7 @@ iPl dfn fbC kza -uLC +xck qPB eHu yly @@ -178849,7 +178849,7 @@ uxq izh iGI xCI -nhD +uOx qVO qVO sLY @@ -180636,7 +180636,7 @@ dUb dUb dUb drX -uGp +bvY vzx xvN iJc @@ -182478,7 +182478,7 @@ cwP xWT dTc vsK -gbv +qau soU soU soU diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 9c882016ed0..6115bb04679 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -7558,6 +7558,22 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"bQy" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/cytology{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/item/seeds/soya{ + pixel_x = 11; + pixel_y = -2 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "bQz" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/south, @@ -9696,15 +9712,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/hfr_room) -"cpE" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/morphine, -/obj/item/reagent_containers/syringe, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/vending/wallmed/directional/north, -/obj/effect/turf_decal/siding/dark_red, -/turf/open/floor/iron/dark, -/area/station/security/execution/transfer) "cpG" = ( /obj/structure/sign/poster/contraband/kudzu/directional/west, /obj/machinery/light/small/directional/west, @@ -11466,13 +11473,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/plating, /area/station/commons/toilet/locker) -"cNX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "cOb" = ( /obj/machinery/duct, /obj/effect/decal/cleanable/dirt, @@ -13945,6 +13945,12 @@ /obj/effect/mapping_helpers/mail_sorting/science/xenobiology, /turf/open/floor/iron, /area/station/science/xenobiology) +"duR" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "duV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14178,12 +14184,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, /area/station/service/theater) -"dxo" = ( -/obj/structure/bed/medical/emergency, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "dxr" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -16031,6 +16031,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/library) +"dWH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/storage) "dWO" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -16043,6 +16053,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"dWU" = ( +/mob/living/simple_animal/bot/mulebot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "QM #4" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "dXd" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -16838,6 +16859,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"eib" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "eif" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -17734,6 +17763,23 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"euG" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/regular, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -15; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/syringe, +/obj/structure/sign/poster/official/cleanliness/directional/east, +/obj/machinery/wall_healer/directional/north, +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) "euK" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -19021,6 +19067,15 @@ }, /turf/open/floor/iron, /area/station/commons/toilet/locker) +"eLa" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/bottle/morphine, +/obj/item/reagent_containers/syringe, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/wall_healer/directional/north, +/obj/effect/turf_decal/siding/dark_red, +/turf/open/floor/iron/dark, +/area/station/security/execution/transfer) "eLb" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, @@ -19668,6 +19723,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) +"eSZ" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/wall_healer/directional/west, +/obj/machinery/light/small/broken/directional/west, +/turf/open/floor/plating, +/area/station/medical/abandoned) "eTv" = ( /obj/structure/closet/crate/trashcart, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21272,14 +21335,6 @@ /obj/structure/chair/office, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"foc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "foh" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ name = "Ports to Distro" @@ -22467,11 +22522,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/main) -"fDV" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "fEd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/vacuum/directional/west, @@ -24273,14 +24323,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gab" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "gae" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -24999,13 +25041,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"gic" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) "gii" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -26697,23 +26732,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"gBA" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -15; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/bottle/multiver, -/obj/item/reagent_containers/syringe, -/obj/structure/sign/poster/official/cleanliness/directional/east, -/obj/machinery/vending/wallmed/directional/north, -/obj/effect/turf_decal/siding/dark_red, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/medical) "gBB" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -27541,16 +27559,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/explab) -"gLz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/south, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/storage) "gLH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -30577,15 +30585,6 @@ /obj/effect/turf_decal/bot/left, /turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) -"hBL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/vending/wallmed/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "hBT" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -33521,6 +33520,19 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"inY" = ( +/obj/structure/filingcabinet/white, +/obj/item/toy/figure/psychologist{ + pixel_x = -1; + pixel_y = 15 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "ioe" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -34111,17 +34123,6 @@ "ivA" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) -"ivB" = ( -/mob/living/simple_animal/bot/mulebot, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - location = "QM #4" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) "ivH" = ( /obj/machinery/light/small/directional/south, /obj/structure/sign/warning/radiation/directional/south, @@ -34596,6 +34597,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/science/robotics/lab) +"iCJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/firealarm/directional/west{ + pixel_y = -30 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "iCO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35977,14 +35988,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/carpet/royalblack, /area/station/service/chapel/office) -"iVl" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/vending/wallmed/directional/west, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/plating, -/area/station/medical/abandoned) "iVo" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -39405,22 +39408,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) -"jJC" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/cytology{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/obj/item/seeds/soya{ - pixel_x = 11; - pixel_y = -2 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jJD" = ( /obj/machinery/bookbinder, /obj/effect/turf_decal/bot_white, @@ -42820,6 +42807,19 @@ /obj/machinery/hydroponics/soil/rich, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"kBv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "kBz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -44957,6 +44957,11 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"lfy" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "lfz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -45427,14 +45432,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"lky" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lkF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -46589,11 +46586,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) -"lzh" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "lzo" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -47550,15 +47542,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"lJM" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/cargo/office) "lJN" = ( /obj/machinery/requests_console/directional/west{ department = "Research Director's Desk"; @@ -48751,13 +48734,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"mbA" = ( -/obj/structure/bed/medical/emergency, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "mbR" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -50928,14 +50904,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"mDl" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "mDo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53530,6 +53498,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"nlT" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "nma" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -53922,6 +53898,15 @@ /obj/effect/mapping_helpers/airalarm/tlv_no_checks, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"nsa" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/cargo/office) "nsd" = ( /obj/structure/table, /obj/item/rcl/pre_loaded, @@ -55239,6 +55224,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"nIG" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departures Lounge - Fore Starboard"; + dir = 6; + name = "departures camera" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/secondary/exit/departure_lounge) "nIQ" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/structure/mirror/directional/east, @@ -57000,17 +56995,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) -"ohH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/light/directional/south, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/storage) "ohI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -57637,17 +57621,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/command/gateway) -"ooL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) "ooQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -64633,19 +64606,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"pYr" = ( -/obj/structure/filingcabinet/white, -/obj/item/toy/figure/psychologist{ - pixel_x = -1; - pixel_y = 15 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "pYD" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -64986,6 +64946,14 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"qcq" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "qcu" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod 3"; @@ -67337,16 +67305,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"qHo" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Departures Lounge - Fore Starboard"; - dir = 6; - name = "departures camera" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/secondary/exit/departure_lounge) "qHs" = ( /obj/structure/statue/sandstone/venus{ dir = 1; @@ -68147,6 +68105,17 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"qRv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/light/directional/south, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/storage) "qRx" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, @@ -68299,6 +68268,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/processing) +"qTi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "qTs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68916,6 +68894,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark/side, /area/station/engineering/lobby) +"reh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "rem" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/sign/poster/random/directional/west, @@ -69854,6 +69839,10 @@ }, /turf/open/floor/iron/grimy, /area/station/service/library) +"roq" = ( +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "rov" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -69905,6 +69894,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"rpz" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "rpZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70579,13 +70578,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/service/chapel/funeral) -"ryU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "ryY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71003,6 +70995,11 @@ /obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron, /area/station/service/kitchen) +"rES" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "rEU" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/structure/steam_vent, @@ -71111,6 +71108,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/hallway) +"rGI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/wall_healer/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "rGU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -79323,16 +79329,6 @@ dir = 8 }, /area/station/service/kitchen/abandoned) -"tEW" = ( -/obj/structure/closet/boxinggloves, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "tEX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79981,10 +79977,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) -"tNg" = ( -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) "tNq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -81550,6 +81542,17 @@ /obj/effect/spawner/random/engineering/canister, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"ufO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/engineering/lobby) "ufR" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -82953,6 +82956,13 @@ /obj/effect/mapping_helpers/airlock/access/all/command/captain, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"uxv" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light/directional/south, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "uxA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -83584,6 +83594,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uEG" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) "uEJ" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85288,24 +85305,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"uZQ" = ( -/obj/structure/rack, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/mesh, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/syringe/multiver, -/obj/machinery/camera/directional/west{ - c_tag = "Bridge - Gateway Atrium"; - name = "command camera" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/command/gateway) "uZV" = ( /obj/effect/turf_decal/plaque{ icon_state = "L6" @@ -85688,6 +85687,24 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/science/research/abandoned) +"vfu" = ( +/obj/structure/rack, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe/multiver, +/obj/machinery/camera/directional/west{ + c_tag = "Bridge - Gateway Atrium"; + name = "command camera" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/command/gateway) "vfw" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -87120,15 +87137,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"vyr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "vys" = ( /obj/structure/flora/bush/jungle/c/style_random, /turf/open/misc/grass, @@ -89355,6 +89363,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wdr" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/cargo/office) "wdu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -89569,13 +89584,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"wfK" = ( -/obj/item/radio/intercom/directional/east, -/obj/machinery/newscaster/directional/south, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/office) "wfP" = ( /obj/machinery/computer/exodrone_control_console, /obj/effect/turf_decal/stripes/line{ @@ -89615,6 +89623,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"wgl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "wgn" = ( /obj/structure/closet/masks, /obj/effect/turf_decal/bot, @@ -91306,19 +91322,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"wAR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "wAT" = ( /obj/effect/spawner/random/structure/crate, /obj/structure/disposalpipe/segment, @@ -122137,7 +122140,7 @@ uCa aTz ygM fzF -ooL +ufO sys rCE uWj @@ -122687,7 +122690,7 @@ rZw iQF eRr pTC -jJC +bQy fpt uOF sPk @@ -126763,7 +126766,7 @@ laP xfq kEg gxL -vyr +qTi nAb vxZ fix @@ -131598,7 +131601,7 @@ cGM tMN qMS sQn -gic +uEG sjt aaY sAY @@ -131924,7 +131927,7 @@ uyB qSd kqM tXO -lzh +rES khb khb khb @@ -133495,7 +133498,7 @@ fMZ bXG xdN sYK -tNg +roq qmd qbg xfU @@ -134212,7 +134215,7 @@ qYo qYo qYo diL -gab +nlT drj bog kZd @@ -135753,7 +135756,7 @@ xms aaa wyH fIx -mDl +eib cQv drj bog @@ -135979,7 +135982,7 @@ kVP gyW ryg mGF -ryU +reh kVP iIO rrr @@ -137789,7 +137792,7 @@ qAV xSx xGC qAV -lJM +nsa mzb lkm mfK @@ -138367,7 +138370,7 @@ svO cSD mgE sKd -cNX +iCJ uNY iKg lke @@ -138862,14 +138865,14 @@ vIQ vIQ vIQ vIQ -wAR +kBv pBH ksK liC mrK oVI cng -uZQ +vfu bhP bmt ksK @@ -139395,7 +139398,7 @@ gnb dnj eiw fNm -mbA +uxv uNY keH jtz @@ -139652,7 +139655,7 @@ dOc iso rMf rmo -dxo +duR uNY eQC gQl @@ -140106,7 +140109,7 @@ lMK vwg wRf vKl -wfK +wdr hoC yfI wAl @@ -140186,7 +140189,7 @@ biv nPz oDE tUG -pYr +inY dki hIy dki @@ -140365,7 +140368,7 @@ toS hoC hoC hoC -lky +qcq erZ jwt rcI @@ -141118,7 +141121,7 @@ wHa fEo dIx tuZ -ivB +dWU mIA dgU nZK @@ -141460,7 +141463,7 @@ slE rHI dju dju -hBL +rGI vvh dju oXR @@ -141647,7 +141650,7 @@ qUG qUG fEm oSv -gLz +dWH xhW eAu fOz @@ -141904,7 +141907,7 @@ dbx olY gDv cNf -ohH +qRv xhW xhW nPo @@ -141982,7 +141985,7 @@ tIV tIV tIV mhW -fDV +lfy pYp tIV tIV @@ -142257,7 +142260,7 @@ bMh nyb jdg pPN -qHo +nIG hQF hQF hQF @@ -147327,7 +147330,7 @@ mVO nHs lkS nHs -foc +wgl whm sQL huv @@ -148581,7 +148584,7 @@ mSe pMa caH mSe -cpE +eLa xqc eEi vtt @@ -149170,7 +149173,7 @@ okj uKK iuA wHQ -iVl +eSZ rhw eDJ qMf @@ -150903,7 +150906,7 @@ iCo krO guZ lET -gBA +euG fQo aNh pWT @@ -151468,7 +151471,7 @@ cau mJx vNm wgn -tEW +rpz wvL qNK ujd diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 5c0c8563625..9056d1be868 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1782,19 +1782,6 @@ dir = 1 }, /area/station/medical/morgue) -"axm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light_switch/directional/east{ - pixel_x = 23 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "axr" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -3662,6 +3649,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"aYI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "aYJ" = ( /turf/open/floor/iron/white, /area/station/science/research) @@ -3731,12 +3724,6 @@ dir = 1 }, /area/mine/eva/lower) -"aZG" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "aZH" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 8 @@ -4106,10 +4093,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/wood, /area/station/service/library) -"bdW" = ( -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) "bea" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/icemoon, @@ -6229,14 +6212,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) -"bGm" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "bGn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6602,12 +6577,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/entry) -"bLt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "bLz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6709,6 +6678,14 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"bML" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "bMY" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) @@ -11234,6 +11211,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"daw" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/command/bridge) "daE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, @@ -14435,6 +14418,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"dVe" = ( +/obj/item/kirbyplants/random, +/obj/machinery/wall_healer/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "dVj" = ( /obj/effect/spawner/structure/window, /turf/open/floor/iron/dark, @@ -14980,6 +14970,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) +"edI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "edN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -19062,6 +19059,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"fmn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "fmq" = ( /obj/docking_port/stationary{ dir = 4; @@ -19770,10 +19774,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"fyq" = ( -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "fyr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -19928,6 +19928,11 @@ }, /turf/open/floor/iron/dark, /area/station/security/mechbay) +"fAO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron, +/area/station/command/bridge) "fAV" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -20716,14 +20721,6 @@ /obj/effect/spawner/random/entertainment/money_small, /turf/open/floor/wood/large, /area/station/commons/lounge) -"fME" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "fNa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -24908,6 +24905,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/evidence) +"gXi" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "gXk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30141,6 +30144,15 @@ /obj/structure/bookcase/random, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"iyf" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "iyg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -31755,13 +31767,6 @@ /obj/structure/sign/warning/radiation/rad_area/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"iYe" = ( -/obj/item/kirbyplants/random, -/obj/machinery/vending/wallmed/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "iYq" = ( /obj/structure/railing/corner{ dir = 4 @@ -32392,6 +32397,10 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark/smooth_half, /area/station/medical/morgue) +"jhb" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "jhf" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, @@ -33099,6 +33108,15 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jtu" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering Lobby" + }, +/obj/structure/window/spawner/directional/north, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "jtx" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red, @@ -35251,15 +35269,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/mining) -"jYG" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jYH" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -35490,15 +35499,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/fore) -"kbS" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "kcc" = ( /obj/machinery/camera/directional/west{ c_tag = "Security - Infirmary" @@ -50023,14 +50023,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"ohb" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/sign/departments/medbay/alt/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "ohp" = ( /turf/open/floor/glass, /area/station/maintenance/department/medical/central) @@ -50120,6 +50112,19 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) +"oit" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "oiy" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/service) @@ -51330,6 +51335,16 @@ /obj/structure/table, /turf/open/floor/wood, /area/station/command/meeting_room) +"oyt" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/directional/south{ + c_tag = "Starboard Primary Hallway Center" + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "oyv" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -52746,13 +52761,6 @@ "oQY" = ( /turf/open/floor/iron/white, /area/station/medical/virology) -"oRb" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "oRk" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -54423,6 +54431,10 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"poY" = ( +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "ppc" = ( /obj/item/trash/syndi_cakes, /obj/effect/turf_decal/stripes/red/line{ @@ -58287,6 +58299,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qsP" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "qsQ" = ( /obj/machinery/stasis, /obj/machinery/defibrillator_mount/directional/north, @@ -59133,11 +59152,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/janitor, /turf/open/floor/iron, /area/station/service/janitor) -"qGd" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron, -/area/station/command/bridge) "qGg" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -60535,6 +60549,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) +"qYE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/duct, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness) "qYF" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -61434,6 +61460,10 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, /area/station/science/breakroom) +"rlA" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rlB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61879,13 +61909,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/mine/eva) -"rsa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "rsf" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, @@ -64067,10 +64090,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"rZw" = ( -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) "rZE" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8 @@ -68608,12 +68627,6 @@ /obj/structure/rack, /turf/open/floor/plating, /area/mine/eva/lower) -"tnk" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/command/bridge) "tnp" = ( /obj/structure/table, /obj/item/folder/blue{ @@ -70765,6 +70778,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/ordnance) +"tUq" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "tUx" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -76295,14 +76317,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) -"vAd" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "vAm" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -79316,15 +79330,6 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel) -"wyN" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/camera/directional/east{ - c_tag = "Engineering Lobby" - }, -/obj/structure/window/spawner/directional/north, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "wyO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -82471,18 +82476,6 @@ /obj/machinery/light/blacklight/directional/east, /turf/open/floor/wood, /area/station/service/library) -"xsW" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/duct, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness) "xtc" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -83961,6 +83954,17 @@ "xMq" = ( /turf/closed/mineral/random/snow, /area/icemoon/underground/explored) +"xMC" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/sign/departments/medbay/alt/directional/north, +/obj/machinery/firealarm/directional/north{ + pixel_x = 26 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xMQ" = ( /obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/carpet, @@ -84530,15 +84534,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood, /area/station/command/meeting_room) -"xVv" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Starboard Primary Hallway Center" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "xVB" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ dir = 8 @@ -85469,6 +85464,14 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ylr" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "ylz" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/neutral/warning, @@ -187206,7 +187209,7 @@ ugs ttb bjU bOO -axm +oit wZr kwe gkT @@ -233177,7 +233180,7 @@ nrM oCO kxs lsi -fyq +rlA qnj qnj qnj @@ -237574,7 +237577,7 @@ iaF iaF ajw ajw -bdW +jhb pBE pBE uYc @@ -239084,7 +239087,7 @@ sDl hDU dAQ fVU -iYe +dVe hDU gpp aJA @@ -240387,7 +240390,7 @@ ozH bZg gst hYG -jYG +tUq dOw dOw yhe @@ -245297,7 +245300,7 @@ pvg nQW vsz fdy -oRb +fmn wHX nbi qzu @@ -245761,7 +245764,7 @@ gtB tny dLo ctj -aZG +gXi wYZ aKI peq @@ -246801,11 +246804,11 @@ nfk utR tmQ qnV -qGd +fAO cEv lhv iGH -bGm +ylr ybv ybv ybv @@ -247020,7 +247023,7 @@ xmO deY bUx kdT -bLt +aYI syN cAC mWM @@ -247576,7 +247579,7 @@ qWZ ydk tGF iUT -tnk +daw lpM rCD uEm @@ -248137,7 +248140,7 @@ gJN ckX iub inn -wyN +jtu vfU pdV gyR @@ -248369,7 +248372,7 @@ frN mhQ pzb iuv -rsa +edI cvS ewi cvS @@ -250636,7 +250639,7 @@ ugA hNp tFI eHb -xsW +qYE bdp nmH tiI @@ -253494,7 +253497,7 @@ qbG onP jyp hgh -kbS +iyf xxg ehU uau @@ -254779,7 +254782,7 @@ nOj vwO gnT hgh -ohb +xMC mTS obu mjI @@ -255034,7 +255037,7 @@ cpY lkr lso vwO -fME +qsP nKa dqO icA @@ -258118,7 +258121,7 @@ kKL kdF qGV hUx -xVv +oyt sZF sZF sZF @@ -262512,7 +262515,7 @@ via aYJ lAw aYJ -rZw +poY wib eLr hAm @@ -265572,7 +265575,7 @@ xBU iVU iFX qRr -vAd +bML omh wDr elw diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index b21913e628f..5a051782e52 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -209,14 +209,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"aeA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "afj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -1092,16 +1084,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"auO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) "ava" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, @@ -2215,6 +2197,13 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"aNH" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "aNN" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/disposal/bin, @@ -10059,16 +10048,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"dDf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "dDo" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer4, @@ -10756,6 +10735,15 @@ }, /turf/open/floor/wood/large, /area/station/commons/lounge) +"dOS" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/camera/directional/south{ + c_tag = "Medbay Psychology Office"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "dOY" = ( /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, @@ -12554,6 +12542,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"eri" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "erl" = ( /obj/structure/rack, /obj/effect/turf_decal/bot{ @@ -13019,6 +13014,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"exK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "exN" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -13806,13 +13808,6 @@ /obj/machinery/vending/wardrobe/coroner_wardrobe, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"eNA" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "eNR" = ( /turf/closed/wall, /area/station/ai_monitored/aisat/exterior) @@ -23265,13 +23260,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"ien" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) "iep" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -23546,13 +23534,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"iiH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iiL" = ( /obj/machinery/air_sensor/mix_tank, /turf/open/floor/engine/vacuum, @@ -24220,6 +24201,13 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/engineering/break_room) +"ita" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "itg" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/bar, @@ -25384,15 +25372,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, /area/space/nearstation) -"iNo" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/camera/directional/south{ - c_tag = "Medbay Psychology Office"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "iNB" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/glass, @@ -25690,26 +25669,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"iRw" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = -2 - }, -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/engineering/break_room) "iRy" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -26285,18 +26244,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"jbf" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "jbg" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -28479,17 +28426,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"jLS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "jMb" = ( /obj/structure/railing{ dir = 10 @@ -39315,14 +39251,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/work) -"nyr" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "nyu" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/door/airlock/security/glass{ @@ -40470,6 +40398,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"nTD" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = -2 + }, +/obj/item/trash/can{ + pixel_x = -8 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/engineering/break_room) "nTH" = ( /obj/structure/cable, /obj/machinery/computer/crew{ @@ -40553,6 +40501,20 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"nWd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "nWk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41855,11 +41817,6 @@ /obj/item/reagent_containers/cup/glass/bottle/goldschlager, /turf/open/space/basic, /area/space/nearstation) -"ouz" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "ouM" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -42684,6 +42641,17 @@ "oIg" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) +"oIC" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "oIG" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -44935,6 +44903,16 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"pyX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "pyY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -45305,17 +45283,6 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"pGC" = ( -/obj/structure/table, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/reagent_containers/spray/cleaner, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white, -/area/station/security/medical) "pGH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -48259,6 +48226,16 @@ /obj/machinery/computer/security/telescreen/ce/directional/south, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"qHp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "qHs" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -49972,6 +49949,14 @@ /obj/machinery/recharge_station, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rkf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "rkg" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -50214,20 +50199,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/science/research) -"rnt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "rnX" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/firealarm/directional/east, @@ -52612,6 +52583,18 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"scw" = ( +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "scB" = ( /obj/structure/chair/office/light, /turf/open/floor/iron/white, @@ -52847,6 +52830,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"shR" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "shV" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -56393,6 +56381,17 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/security/office) +"tti" = ( +/obj/structure/table, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/security/medical) "tts" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/closed/wall/r_wall, @@ -56931,6 +56930,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"tDY" = ( +/obj/structure/bed/medical/emergency, +/obj/machinery/camera/directional/west{ + c_tag = "Gateway - Atrium" + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/command/gateway) "tDZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/box, @@ -59076,16 +59086,6 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"uoE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "uoM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -61204,11 +61204,6 @@ "uYi" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) -"uYj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "uYl" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -62718,17 +62713,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) -"vxB" = ( -/obj/structure/bed/medical/emergency, -/obj/machinery/camera/directional/west{ - c_tag = "Gateway - Atrium" - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/command/gateway) "vxC" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -62932,13 +62916,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"vAg" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "vAH" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -65067,6 +65044,16 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/wood, /area/station/service/library) +"wkt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "wkv" = ( /obj/structure/railing{ dir = 8 @@ -67943,6 +67930,14 @@ /obj/item/pen/red, /turf/open/floor/wood, /area/station/service/lawoffice) +"xlt" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "xlv" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/computer/mech_bay_power_console{ @@ -68810,6 +68805,12 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"xAF" = ( +/obj/item/kirbyplants, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "xAR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -87211,7 +87212,7 @@ fcq jPE auh crr -dDf +wkt crr qer crr @@ -90543,7 +90544,7 @@ ksM lQf wsx dsJ -auO +qHp dtw lzD hIW @@ -92409,7 +92410,7 @@ yiJ sfA eQO xjI -iNo +dOS tSw tAH nwT @@ -94625,7 +94626,7 @@ qJi mzL hAL nRZ -pGC +tti jDf gWT vaH @@ -95700,7 +95701,7 @@ jLQ fgS jrk dhX -jLS +oIC gBD twl bcx @@ -95723,7 +95724,7 @@ nBB nbT xxU tFr -ouz +xAF eIO eIO eIO @@ -96524,7 +96525,7 @@ wnW tSw oBD iUm -eNA +eri hPk xMz xMz @@ -96973,8 +96974,8 @@ tKN lMJ dsQ mZL -jbf -nyr +scw +xlt acf hmq dJX @@ -97987,7 +97988,7 @@ lKZ dNX iVA mlK -vAg +ita dNX nyV dNX @@ -98563,7 +98564,7 @@ dXQ gmt qsx gmt -uYj +shR uzk gmt qhx @@ -100074,7 +100075,7 @@ kmZ buL pha sdp -vxB +tDY erl pbS eny @@ -104473,7 +104474,7 @@ aBX iio kjG gwf -ien +aNH mMX rhe rPA @@ -105930,7 +105931,7 @@ peF liO sSs gkM -aeA +rkf uKL uKL mKu @@ -107531,7 +107532,7 @@ tQC gsP phS huG -rnt +nWd ydS kCZ nKI @@ -107768,7 +107769,7 @@ xww xww aEr sDs -uoE +pyX obG gUe yks @@ -112657,7 +112658,7 @@ dFH ygb pEG cAj -iRw +nTD peM wUM cZw @@ -115266,7 +115267,7 @@ hbK hbK rMu xiL -iiH +exK fdZ mMK mMK diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 1351c9d8694..538b38ba037 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -557,6 +557,7 @@ /obj/machinery/mech_bay_recharge_port{ dir = 2 }, +/obj/machinery/airalarm/directional/east, /turf/open/floor/plating, /area/mine/mechbay) "di" = ( @@ -736,6 +737,7 @@ dir = 4 }, /obj/machinery/light/directional/west, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/edge{ dir = 4 }, @@ -912,6 +914,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/mine/production) "fD" = ( @@ -1238,6 +1241,7 @@ /obj/structure/cable, /obj/machinery/light/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, +/obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, @@ -1346,6 +1350,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, +/obj/machinery/wall_healer/directional/north, /turf/open/floor/iron/white, /area/mine/medical) "hD" = ( @@ -2016,6 +2021,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_edge, /area/mine/eva) "lh" = ( @@ -2217,6 +2223,7 @@ dir = 8 }, /obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/mine/lounge) "lP" = ( @@ -2650,6 +2657,7 @@ /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/light/directional/west, +/obj/machinery/wall_healer/directional/west, /turf/open/floor/iron/dark, /area/mine/production) "nl" = ( @@ -2908,6 +2916,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark/smooth_edge{ dir = 4 }, @@ -3630,7 +3639,6 @@ /area/mine/cafeteria) "sX" = ( /obj/machinery/mechpad, -/obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 }, @@ -3731,6 +3739,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white/smooth_corner, /area/mine/medical) "tE" = ( @@ -4206,6 +4215,7 @@ /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/checker, /area/mine/cafeteria) "wr" = ( @@ -4328,6 +4338,7 @@ dir = 10 }, /obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/mine/hydroponics) "xt" = ( @@ -5900,6 +5911,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, /turf/open/floor/iron/dark/smooth_edge{ dir = 8 }, @@ -6414,6 +6427,7 @@ /obj/item/mining_scanner, /obj/item/flashlight, /obj/item/clothing/glasses/meson, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/mine/storage/public) "Kp" = ( @@ -6558,6 +6572,7 @@ /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 8 }, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, @@ -6758,6 +6773,7 @@ "Mc" = ( /obj/structure/chair/wood/wings, /obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, /turf/open/floor/carpet/neon/simple/red/nodots, /area/mine/cafeteria) "Me" = ( @@ -7349,6 +7365,7 @@ dir = 4 }, /obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron/textured_edge{ dir = 8 }, @@ -8574,7 +8591,6 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "WJ" = ( -/obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -8947,6 +8963,13 @@ dir = 1 }, /area/mine/laborcamp/quarters) +"YD" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/mine/production) "YF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9034,6 +9057,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, +/obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/mine/cafeteria) "Zp" = ( @@ -49223,7 +49247,7 @@ RY RY dQ Cg -lb +YD pK Ob IL diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index 0745ce5a6d4..d6250e9941a 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -1437,6 +1437,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/starboard/central) +"akP" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "akT" = ( /obj/structure/sign/warning/directional/south, /obj/structure/hedge, @@ -2681,6 +2698,20 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) +"aun" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/line, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/computer/security/telescreen/cmo/directional/north, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "aup" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -7015,6 +7046,14 @@ }, /turf/open/floor/iron/dark/small, /area/station/engineering/atmos) +"bca" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/hedge, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "bcd" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -13152,14 +13191,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/small, /area/station/engineering/main) -"bXO" = ( -/obj/machinery/vending/medical, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/medical/storage) "bXP" = ( /obj/machinery/door/airlock/medical{ name = "Padded Cell"; @@ -18411,23 +18442,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/cargo/lobby) -"cMW" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/vending/wallmed/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "cMY" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/trimline/green/filled/line, @@ -23712,12 +23726,6 @@ }, /turf/open/floor/iron/white/small, /area/station/science/research) -"dAN" = ( -/obj/effect/turf_decal/siding/white/corner, -/obj/effect/turf_decal/trimline/green/line, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/checker, -/area/station/hallway/primary/port) "dAO" = ( /obj/machinery/door/poddoor/shutters{ id = "teleportershutters"; @@ -26875,13 +26883,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/lower) -"dZC" = ( -/obj/effect/turf_decal/siding/dark_red, -/obj/machinery/vending/wallmed/directional/north, -/obj/item/kirbyplants/random, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/security/execution/transfer) "dZF" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -44363,6 +44364,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"gCz" = ( +/obj/machinery/wall_healer/directional/west{ + pixel_x = -26 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/railing, +/obj/effect/turf_decal/siding, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "gCB" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -50473,6 +50488,20 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark, /area/station/command) +"hwT" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/science/lower) "hwY" = ( /obj/structure/cable, /obj/structure/railing{ @@ -53820,22 +53849,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"hWH" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/cargo/lower) "hWJ" = ( /obj/machinery/holopad/secure, /obj/effect/turf_decal/box/white{ @@ -54964,12 +54977,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"ifb" = ( -/obj/effect/turf_decal/trimline/yellow, -/obj/machinery/light/floor, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "ifj" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -55751,15 +55758,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/service/theater) -"ilC" = ( -/obj/structure/table/optable, -/obj/machinery/vending/wallmed/directional/north, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/siding{ - dir = 5 - }, -/turf/open/floor/iron/white/herringbone, -/area/station/command/heads_quarters/cmo) "ilH" = ( /obj/structure/table/glass, /obj/item/storage/box/syringes, @@ -62823,6 +62821,15 @@ }, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"jqs" = ( +/obj/structure/table/optable, +/obj/machinery/wall_healer/directional/north, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/turf/open/floor/iron/white/herringbone, +/area/station/command/heads_quarters/cmo) "jqy" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/catwalk_floor/iron_dark, @@ -65253,19 +65260,6 @@ /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"jGU" = ( -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/structure/filingcabinet/white, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/dark, -/area/station/cargo/office) "jGW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67598,23 +67592,6 @@ /obj/item/stock_parts/power_store/cell/high, /turf/open/floor/iron/dark/small, /area/station/command/gateway) -"kal" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 5 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/computer/crew{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "kam" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/cable, @@ -73937,12 +73914,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"kSZ" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/bot_white, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/dark/small, -/area/station/hallway/secondary/command) "kTa" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/broken_flooring/singular/directional/east, @@ -75704,20 +75675,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/medical/virology) -"ljq" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white, -/area/station/science/lower) "ljt" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -78210,6 +78167,17 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"lBD" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/table/glass, +/obj/machinery/computer/records/medical/laptop, +/obj/machinery/wall_healer/directional/north, +/obj/effect/turf_decal/trimline/dark_red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/white, +/area/station/security/medical) "lBP" = ( /obj/effect/turf_decal/tile/dark_blue, /obj/effect/turf_decal/siding/dark{ @@ -81381,14 +81349,6 @@ /obj/structure/table/glass, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"mdl" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/hedge, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "mdm" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/bot, @@ -84789,26 +84749,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"mDV" = ( -/obj/machinery/light/directional/west, -/obj/structure/bed/medical/emergency, -/obj/effect/turf_decal/bot_white{ - color = "#52B4E9" - }, -/obj/machinery/vending/wallmed/directional/west{ - pixel_x = -26 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "mDW" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -97181,17 +97121,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"ovQ" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/table/glass, -/obj/machinery/computer/records/medical/laptop, -/obj/machinery/vending/wallmed/directional/north, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/white, -/area/station/security/medical) "ovR" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -98596,20 +98525,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"oGT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "oGW" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/navbeacon{ @@ -102311,6 +102226,23 @@ }, /turf/open/floor/iron/dark/small, /area/station/maintenance/central) +"pfS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/wall_healer/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "pfY" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -107488,20 +107420,6 @@ dir = 1 }, /area/station/engineering/atmos) -"pRT" = ( -/obj/machinery/vending/wallmed/directional/west{ - pixel_x = -26 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/bot_white{ - color = "#52B4E9" - }, -/obj/structure/bed/medical/emergency, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/railing, -/obj/effect/turf_decal/siding, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "pRX" = ( /obj/structure/chair/sofa/bench/right, /turf/open/floor/glass/reinforced, @@ -111323,6 +111241,26 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/openspace, /area/station/maintenance/port/fore) +"qxn" = ( +/obj/machinery/light/directional/west, +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/machinery/wall_healer/directional/west{ + pixel_x = -26 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "qxo" = ( /obj/structure/chair/sofa/corp/left, /obj/structure/cable, @@ -113908,6 +113846,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/small, /area/station/engineering/atmos) +"qQp" = ( +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/sign/poster/official/get_your_legs/directional/north, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "qQq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -114917,6 +114864,12 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) +"qZF" = ( +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/hallway/secondary/service) "qZM" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -117076,6 +117029,14 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/science/lower) +"rpy" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/medical/storage) "rpD" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/stripes/line{ @@ -117652,6 +117613,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter) +"rtp" = ( +/obj/effect/turf_decal/trimline/yellow, +/obj/machinery/light/floor, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "rty" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -125304,22 +125271,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"sCX" = ( -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/obj/structure/rack, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/suture, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/syringe/multiver, -/obj/machinery/vending/wallmed/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "sDa" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -126034,12 +125985,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/execution/education) -"sIQ" = ( -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/dark/textured_large, -/area/station/hallway/secondary/service) "sIT" = ( /obj/structure/railing/corner{ dir = 1 @@ -130020,20 +129965,6 @@ /obj/effect/turf_decal/trimline/dark/corner, /turf/open/floor/iron/dark/textured_corner, /area/station/science/genetics) -"tog" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/blue/line, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/computer/security/telescreen/cmo/directional/north, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "toh" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -133756,6 +133687,12 @@ }, /turf/open/floor/iron/textured, /area/station/hallway/primary/starboard) +"tNF" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "tNK" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/glass, @@ -136394,15 +136331,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/aisat/exterior) -"ujm" = ( -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/sign/poster/official/get_your_legs/directional/north, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "ujo" = ( /obj/structure/table/optable, /obj/machinery/light/small/directional/north, @@ -136693,6 +136621,19 @@ /obj/structure/table/wood/fancy/black, /turf/open/floor/wood/large, /area/station/service/kitchen/diner) +"umE" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/structure/filingcabinet/white, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark, +/area/station/cargo/office) "umI" = ( /obj/structure/table/reinforced/rglass, /obj/item/paper_bin{ @@ -137163,6 +137104,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"uqB" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot_white, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/hallway/secondary/command) "uqH" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/line{ @@ -142302,6 +142249,12 @@ /obj/effect/turf_decal/trimline/blue, /turf/open/floor/iron/white/textured, /area/station/commons/fitness/recreation/pool) +"vee" = ( +/obj/effect/turf_decal/siding/white/corner, +/obj/effect/turf_decal/trimline/green/line, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/checker, +/area/station/hallway/primary/port) "veh" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north, @@ -145246,12 +145199,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/gateway) -"vyK" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "vyM" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 @@ -146479,6 +146426,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) +"vIL" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/machinery/wall_healer/directional/north, +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/security/execution/transfer) "vIM" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -148563,6 +148517,22 @@ /obj/structure/railing, /turf/open/floor/iron/dark/textured, /area/station/engineering/engine_smes) +"waz" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/structure/rack, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe/multiver, +/obj/machinery/wall_healer/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "waE" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -157045,6 +157015,20 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"xrm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "xrq" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -160369,6 +160353,22 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"xRb" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/cargo/lower) "xRc" = ( /obj/structure/table/glass, /obj/structure/window/spawner/directional/south, @@ -178213,7 +178213,7 @@ dPz rob euQ rPv -vyK +tNF tKx vdJ qgY @@ -191285,7 +191285,7 @@ fGC fGC fGC eof -ilC +jqs kEs lnD pAa @@ -197994,7 +197994,7 @@ viw gmA uWg awW -mdl +bca vyw aww pcR @@ -198202,7 +198202,7 @@ oZM oZM oZM mqG -hWH +xRb gXY osL xnF @@ -201834,7 +201834,7 @@ oyn mLr jkp seD -ljq +hwT mwq sMC upM @@ -203175,7 +203175,7 @@ sgp lbg nVK nEQ -ovQ +lBD dKQ qnH suG @@ -216253,7 +216253,7 @@ ccC ccC uak uak -tog +aun pHI tsk nUp @@ -216510,7 +216510,7 @@ gym gym gym uak -kal +akP pNr aoh vNa @@ -242989,7 +242989,7 @@ xDF ajW gGl hbN -sIQ +qZF bLu mDH xOa @@ -252241,7 +252241,7 @@ bwC vdN odr hYK -dAN +vee naa naa sax @@ -253995,7 +253995,7 @@ niR ihf kdm nkZ -bXO +rpy axH rXn pPJ @@ -255823,7 +255823,7 @@ xlX uxU iWJ ykO -cMW +pfS bwC bwC kef @@ -258371,11 +258371,11 @@ nox fVk uVd kCn -pRT +gCz jgD tDe rft -mDV +qxn pAH uVd jxl @@ -259377,7 +259377,7 @@ vyr ufN qze nhR -jGU +umE oCd wUK lbm @@ -260161,7 +260161,7 @@ tvq pxg pqa bxI -ujm +qQp mTe hLY afs @@ -262212,7 +262212,7 @@ jdi gYc tnJ aDo -oGT +xrm yhV aYc aYc @@ -262554,7 +262554,7 @@ eHT gFi eeG uWW -ifb +rtp iOj mMr cAe @@ -268202,7 +268202,7 @@ nlQ bAk uyy wYi -dZC +vIL qYy saU iaN @@ -274852,7 +274852,7 @@ xyo xWq eIH exz -kSZ +uqB eNS xjE vcF @@ -283084,7 +283084,7 @@ gJa mQG bqJ eKI -sCX +waz tUn tUn txW diff --git a/_maps/map_files/debug/gateway_test.dmm b/_maps/map_files/debug/gateway_test.dmm index d136530a07b..83c8511828f 100644 --- a/_maps/map_files/debug/gateway_test.dmm +++ b/_maps/map_files/debug/gateway_test.dmm @@ -34,7 +34,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/directional/west, /turf/open/indestructible, /area/misc/testroom/gateway_room) "j" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index cf6f7ce1f10..dfcce8dc3b2 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -425,6 +425,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"bW" = ( +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "bZ" = ( /obj/effect/turf_decal/tile/green, /obj/effect/light_emitter/thunderdome, @@ -974,13 +979,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "et" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -1117,12 +1115,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"eY" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/ferry) "fa" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/green{ @@ -2113,12 +2105,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"ju" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "jv" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -2500,6 +2486,17 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"lj" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/machinery/wall_healer/directional/north{ + use_power = 0 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "ln" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -2943,11 +2940,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"nB" = ( -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/ferry) "nC" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -3567,14 +3559,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin/storage) -"qn" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "qo" = ( /obj/structure/table/reinforced, /obj/item/folder, @@ -5280,6 +5264,13 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/centcom/tdome/observation) +"xI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "xN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, @@ -6929,6 +6920,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"Fm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "Fo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -9220,6 +9217,14 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"Rm" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "Rn" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -9364,6 +9369,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"RT" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "RV" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -9598,6 +9609,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"Th" = ( +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supply) "Tj" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/cup/glass/bottle/whiskey{ @@ -9646,12 +9662,6 @@ }, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) -"Tq" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) "Ts" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -9792,6 +9802,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin/storage) +"Ud" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supply) "Uf" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -9923,6 +9939,16 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/admin/storage) +"UK" = ( +/obj/structure/closet/secure_closet/ert_med, +/obj/machinery/wall_healer/directional/south{ + use_power = 0 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/armory) "UM" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -10079,16 +10105,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) -"Vu" = ( -/obj/structure/closet/secure_closet/ert_med, -/obj/machinery/vending/wallmed/directional/south{ - use_power = 0 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) "Vv" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -10522,11 +10538,6 @@ }, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) -"XA" = ( -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) "XC" = ( /obj/machinery/vending/snack, /obj/effect/turf_decal/delivery, @@ -10969,17 +10980,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"ZT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/machinery/vending/wallmed/directional/north{ - use_power = 0 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "ZX" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security" @@ -46625,7 +46625,7 @@ aa aa aa oe -nB +bW su ts pR @@ -46882,7 +46882,7 @@ aa aa aa mD -eY +RT sv tt PH @@ -50217,7 +50217,7 @@ iF iF iF On -ZT +lj To WX Ur @@ -50753,7 +50753,7 @@ bH bH sE sE -Vu +UK Ya aa aa @@ -51249,7 +51249,7 @@ yd GL oT FO -Tq +Ud YU Sh Ps @@ -51506,7 +51506,7 @@ hz mi pj nm -XA +Th Sx Nn yi @@ -52020,7 +52020,7 @@ os iR oJ lo -qn +Rm YU YU YU @@ -53029,8 +53029,8 @@ iS iZ Gl jq -ju -eq +Fm +xI vY jN jQ diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index a61fb71021d..816d2998012 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -6714,6 +6714,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/commons/dorms) +"blR" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/door/window/elevator/right/directional/west{ + transport_linked_id = "tram_xeno_lift" + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "bmp" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 1 @@ -9743,6 +9752,26 @@ /obj/machinery/vending/modularpc, /turf/open/floor/iron/white, /area/station/science/lobby) +"coa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/camera/directional/south{ + network = list("ss13","rd"); + c_tag = "Science - Xenobiology South" + }, +/obj/structure/closet{ + anchored = 1; + name = "Cold protection gear" + }, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/suit/hooded/wintercoat/science, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "coB" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -10506,6 +10535,13 @@ /obj/structure/thermoplastic/light, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"cAb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "cAc" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -10550,10 +10586,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"cAK" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "cBo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -10926,16 +10958,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"cHY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump/off/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "cHZ" = ( /obj/structure/railing, /turf/open/floor/glass/reinforced, @@ -13169,13 +13191,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/prison/workout) -"dwj" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "dwk" = ( /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -14823,6 +14838,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"dYW" = ( +/obj/machinery/camera/directional/south{ + pixel_x = 21; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "dZu" = ( /obj/machinery/mecha_part_fabricator, /obj/effect/turf_decal/delivery, @@ -15199,6 +15221,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lower) +"egT" = ( +/obj/item/experi_scanner{ + pixel_x = 5 + }, +/obj/item/experi_scanner, +/obj/item/experi_scanner{ + pixel_x = -5 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/white, +/area/station/science/research) "ehd" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/right/directional/east{ @@ -15522,13 +15557,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"enF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "eor" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -15880,6 +15908,15 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"evF" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/door/window/elevator/left/directional/east{ + transport_linked_id = "tram_xeno_lift" + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "evW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17865,6 +17902,24 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/commons/dorms) +"fhV" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/gauze, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medical - Treatment South-East" + }, +/obj/machinery/wall_healer/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "fid" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, @@ -17944,15 +17999,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"fjA" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/door/window/elevator/right/directional/west{ - transport_linked_id = "tram_xeno_lift" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fjN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -18129,6 +18175,16 @@ /obj/machinery/hydroponics/soil/rich, /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"fmH" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/security/medical) "fmJ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -20321,13 +20377,6 @@ /obj/machinery/air_sensor/nitrous_tank, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"gdz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "gdC" = ( /obj/machinery/door/airlock{ name = "Private Stall 2"; @@ -20438,19 +20487,6 @@ /obj/structure/fluff/iced_abductor, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"gfY" = ( -/obj/item/experi_scanner{ - pixel_x = 5 - }, -/obj/item/experi_scanner, -/obj/item/experi_scanner{ - pixel_x = -5 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) "gga" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Server Room" @@ -20563,6 +20599,35 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"gib" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) +"gie" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/stock_parts/power_store/cell/high{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/mmi{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/stock_parts/power_store/cell/high{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/science/explab) "gij" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21162,6 +21227,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"gsN" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/carpet, +/area/station/medical/psychology) "gsO" = ( /obj/structure/railing/corner{ dir = 8 @@ -21343,6 +21413,14 @@ /obj/effect/turf_decal/trimline/tram/corner, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"gwe" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/computer/crew, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gwy" = ( /obj/structure/sign/warning/no_smoking{ pixel_x = -28 @@ -22212,21 +22290,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) -"gNr" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes{ - pixel_x = -5; - pixel_y = 1 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gNy" = ( /turf/open/floor/iron/dark/herringbone, /area/station/commons/vacant_room) @@ -23608,6 +23671,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"hnu" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/processor/slime, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hnH" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/wood/large, @@ -23636,13 +23704,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"hox" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "hoA" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -24516,28 +24577,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"hIY" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table, -/obj/item/stock_parts/power_store/cell/high{ - pixel_x = 8; - pixel_y = 9 - }, -/obj/item/mmi{ - pixel_x = -1; - pixel_y = 5 - }, -/obj/item/stock_parts/power_store/cell/high{ - pixel_x = 8; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/science/explab) "hJa" = ( /obj/structure/table, /obj/item/electronics/apc, @@ -24769,6 +24808,11 @@ /obj/machinery/light/floor, /turf/open/floor/engine/air, /area/station/engineering/atmos) +"hNM" = ( +/obj/machinery/light/small/dim/directional/south, +/obj/machinery/camera/directional/south, +/turf/open/floor/engine, +/area/station/science/xenobiology) "hNR" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment{ @@ -26077,6 +26121,25 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"inC" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medical - Surgery B" + }, +/obj/machinery/wall_healer/directional/north, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/machinery/light_switch/directional/east{ + pixel_x = 22; + pixel_y = -9 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "inK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Recreation Area Maintenance Access" @@ -27544,14 +27607,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"iPT" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "iQC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -27567,22 +27622,6 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"iQG" = ( -/obj/machinery/button/elevator/directional/north{ - id = "tram_xeno_lift" - }, -/obj/machinery/lift_indicator/directional/north{ - linked_elevator_id = "tram_xeno_lift" - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/north, -/obj/machinery/door/window/elevator/left/directional/east{ - transport_linked_id = "tram_xeno_lift" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iQH" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -27658,6 +27697,16 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"iSr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/pump/off/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/xenobiology) "iSt" = ( /obj/structure/table/wood, /obj/item/staff/broom, @@ -27992,6 +28041,10 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) +"iYh" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "iYv" = ( /obj/structure/chair/office/light{ dir = 4 @@ -28707,6 +28760,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"jjJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/records/medical, +/obj/machinery/light/cold/directional/north, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "jjM" = ( /obj/structure/railing/corner/end/flip{ dir = 8 @@ -29080,6 +29142,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"jpD" = ( +/obj/structure/closet/secure_closet/exile, +/obj/effect/turf_decal/bot, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/command/gateway) "jpR" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/line{ @@ -29231,6 +29299,24 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"jsn" = ( +/obj/structure/rack, +/obj/structure/table, +/obj/machinery/computer/security/telescreen/test_chamber/directional/north, +/obj/item/grenade/chem_grenade{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/item/storage/box/beakers{ + pixel_x = 5; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "jst" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29728,6 +29814,14 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron, /area/station/security/checkpoint/medical) +"jzR" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/engineering/break_room) "jzW" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -29788,22 +29882,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) -"jAo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/extinguisher, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "jAt" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -30096,12 +30174,6 @@ }, /turf/open/space/openspace, /area/station/solars/starboard/fore) -"jGx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "jGD" = ( /obj/structure/chair{ dir = 1 @@ -31072,18 +31144,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"jYd" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "jYe" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -31822,6 +31882,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) +"kir" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Research and Development Shutter"; + dir = 8; + id = "rndlab1" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Research Lab Desk"; + req_access = list("science") + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/door/window/left/directional/west{ + name = "Robotics Desk"; + req_access = list("robotics") + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/lab) "kis" = ( /obj/machinery/computer/atmos_alert/station_only{ dir = 8 @@ -32278,6 +32359,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/checkpoint/science) +"kpx" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/box/red, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "kpC" = ( /obj/structure/chair/comfy/beige{ dir = 4 @@ -32864,12 +32957,6 @@ }, /turf/open/space/openspace, /area/space) -"kza" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "kzg" = ( /obj/structure/table, /obj/machinery/recharger, @@ -34320,6 +34407,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/meeting_room) +"kWc" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east{ + areastring = "/area/station/science/ordnance/burnchamber" + }, +/obj/structure/sign/warning/hot_temp/directional/south, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "kWd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -34489,12 +34590,11 @@ /turf/open/floor/iron/white, /area/station/science/lower) "kZa" = ( -/obj/machinery/camera/directional/south{ - pixel_x = 21; - pixel_y = 0 +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 }, -/turf/open/floor/engine, -/area/station/science/xenobiology) +/turf/open/floor/iron/white, +/area/station/science/ordnance) "kZh" = ( /turf/open/floor/eighties/red, /area/station/commons/fitness/recreation/entertainment) @@ -35661,6 +35761,10 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, /area/station/medical/virology) +"luo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply, +/turf/closed/wall, +/area/station/science/ordnance) "luy" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, @@ -35818,15 +35922,6 @@ }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"lxd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lxi" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/cable, @@ -35983,11 +36078,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"lyQ" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/processor/slime, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lyR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36479,6 +36569,22 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"lHt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/extinguisher, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lHu" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -37175,10 +37281,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"lTo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply, -/turf/closed/wall, -/area/station/science/ordnance) "lTs" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/fore) @@ -37580,14 +37682,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"mad" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/computer/records/medical, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "mai" = ( /obj/machinery/holopad, /obj/effect/landmark/start/scientist, @@ -38273,6 +38367,18 @@ /obj/effect/landmark/atmospheric_sanity/mark_all_station_areas_as_goal, /turf/open/space/basic, /area/space) +"mmt" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/west, +/obj/item/storage/medkit/regular{ + pixel_x = -6 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "mmv" = ( /obj/structure/table/glass, /obj/item/folder/red, @@ -38586,11 +38692,6 @@ /obj/machinery/teleport/hub, /turf/open/floor/circuit, /area/station/command/teleporter) -"msF" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/carpet, -/area/station/medical/psychology) "msS" = ( /turf/open/openspace, /area/station/maintenance/solars/port) @@ -38718,6 +38819,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"mwj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "mwt" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ dir = 1 @@ -39911,12 +40018,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/station/medical/storage) -"mVN" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 4 - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "mVS" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/door/window/left/directional/west{ @@ -41330,10 +41431,6 @@ /obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"nuu" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "nuw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43406,6 +43503,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"ogk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + pixel_x = 21; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "ogt" = ( /obj/structure/table/reinforced, /obj/item/clothing/ears/earmuffs{ @@ -43688,17 +43795,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/service/library) -"ols" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/bed/medical/emergency, -/obj/machinery/camera/directional/south{ - network = list("ss13","medbay"); - c_tag = "Medical - Lobby" - }, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "olG" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -43949,6 +44045,14 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"orm" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "orQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -44361,6 +44465,13 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"oAp" = ( +/obj/machinery/camera/directional/north{ + network = list("ss13","rd","xeno"); + c_tag = "Science - Xenobiology Lower Containment Chamber" + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "oAG" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/stripes{ @@ -44655,6 +44766,24 @@ "oGJ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/medical/chemistry) +"oGK" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/structure/ladder, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "tram_xeno_lift"; + pixel_x = 31; + pixel_y = -31 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "oGM" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -45521,6 +45650,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"oZt" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "oZA" = ( /obj/structure/chair/office{ dir = 8 @@ -47996,26 +48140,6 @@ "pQx" = ( /turf/open/misc/asteroid/dug, /area/station/science/explab) -"pQy" = ( -/obj/structure/table, -/obj/item/multitool/circuit{ - pixel_x = -7; - pixel_y = 0 - }, -/obj/item/multitool/circuit{ - pixel_x = 0; - pixel_y = 0 - }, -/obj/item/multitool/circuit{ - pixel_x = 7; - pixel_y = 0 - }, -/obj/machinery/camera/directional/south{ - network = list("ss13","rd"); - c_tag = "Science - Testing Lab" - }, -/turf/open/floor/iron, -/area/station/science/explab) "pQF" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -48131,15 +48255,6 @@ /obj/structure/sign/departments/evac/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"pUi" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/door/window/elevator/left/directional/east{ - transport_linked_id = "tram_xeno_lift" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "pUj" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 @@ -49294,12 +49409,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"qpb" = ( -/obj/structure/closet/secure_closet/exile, -/obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/command/gateway) "qpj" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/landmark/start/prisoner, @@ -49426,13 +49535,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/secondary/exit) -"qrW" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "qsa" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -50139,6 +50241,26 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/commons/storage/art) +"qEh" = ( +/obj/structure/table, +/obj/item/multitool/circuit{ + pixel_x = -7; + pixel_y = 0 + }, +/obj/item/multitool/circuit{ + pixel_x = 0; + pixel_y = 0 + }, +/obj/item/multitool/circuit{ + pixel_x = 7; + pixel_y = 0 + }, +/obj/machinery/camera/directional/south{ + network = list("ss13","rd"); + c_tag = "Science - Testing Lab" + }, +/turf/open/floor/iron, +/area/station/science/explab) "qEl" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -50149,6 +50271,13 @@ "qEH" = ( /turf/closed/wall, /area/station/solars/port) +"qEU" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "qFf" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -50206,11 +50335,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"qHa" = ( -/obj/machinery/light/directional/east, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "qHe" = ( /obj/machinery/camera/directional/north{ c_tag = "Secure - Gateway" @@ -50308,13 +50432,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"qIf" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/computer/crew, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "qIq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/light/directional/west, @@ -51047,18 +51164,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"qWf" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/box/red, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "qWy" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/south, @@ -51525,24 +51630,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"rdJ" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/camera/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medical - Treatment South-East" - }, -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "rdN" = ( /obj/machinery/mech_bay_recharge_port{ dir = 1 @@ -51623,10 +51710,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"rfi" = ( -/obj/machinery/camera/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rfQ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -52039,6 +52122,10 @@ "rmB" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) +"rmG" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "rmH" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -52235,26 +52322,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/center) -"roQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/directional/south{ - network = list("ss13","rd"); - c_tag = "Science - Xenobiology South" - }, -/obj/structure/closet{ - anchored = 1; - name = "Cold protection gear" - }, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/suit/hooded/wintercoat/science, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "roR" = ( /turf/closed/wall, /area/station/science/breakroom) @@ -53285,20 +53352,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/vacant_room) -"rLG" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east{ - areastring = "/area/station/science/ordnance/burnchamber" - }, -/obj/structure/sign/warning/hot_temp/directional/south, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "rLP" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -53442,14 +53495,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"rNW" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) "rOh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -53566,11 +53611,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"rPv" = ( -/obj/machinery/light/small/dim/directional/south, -/obj/machinery/camera/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rPH" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -54575,25 +54615,6 @@ dir = 4 }, /area/station/service/theater) -"siE" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/camera/directional/east{ - network = list("ss13","medbay"); - c_tag = "Medical - Surgery B" - }, -/obj/machinery/vending/wallmed/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/machinery/light_switch/directional/east{ - pixel_x = 22; - pixel_y = -9 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "siF" = ( /obj/machinery/bouldertech/refinery, /obj/machinery/conveyor{ @@ -54987,18 +55008,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/greater) -"sob" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/item/storage/medkit/advanced{ - pixel_x = -6 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "soe" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -55462,27 +55471,6 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) -"sva" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Research and Development Shutter"; - dir = 8; - id = "rndlab1" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Research Lab Desk"; - req_access = list("science") - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/window/left/directional/west{ - name = "Robotics Desk"; - req_access = list("robotics") - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/lab) "svc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -55963,6 +55951,12 @@ /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"sFI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/station/science/ordnance) "sGb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -57341,6 +57335,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"tfi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/gauze, +/obj/structure/table/glass, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "tfp" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/thinplating{ @@ -58253,12 +58257,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"twv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/station/science/ordnance) "twz" = ( /turf/open/openspace, /area/station/hallway/secondary/entry) @@ -58334,6 +58332,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"txu" = ( +/obj/structure/filingcabinet/white, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "txv" = ( /obj/item/book/bible, /obj/structure/altar/of_gods, @@ -58446,6 +58450,10 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"tzk" = ( +/obj/machinery/camera/directional/north, +/turf/open/floor/engine, +/area/station/science/xenobiology) "tzq" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -58759,13 +58767,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"tEx" = ( -/obj/machinery/camera/directional/north{ - network = list("ss13","rd","xeno"); - c_tag = "Science - Xenobiology Lower Containment Chamber" - }, -/turf/open/floor/engine/xenobio, -/area/station/science/xenobiology) "tED" = ( /obj/effect/turf_decal/tile/neutral/tram, /obj/effect/turf_decal/stripes/white/line, @@ -59754,16 +59755,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"tWO" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/item/reagent_containers/cup/bottle/multiver, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white, -/area/station/security/medical) "tWX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -59950,6 +59941,22 @@ "uax" = ( /turf/open/floor/iron, /area/station/cargo/storage) +"uaG" = ( +/obj/machinery/button/elevator/directional/north{ + id = "tram_xeno_lift" + }, +/obj/machinery/lift_indicator/directional/north{ + linked_elevator_id = "tram_xeno_lift" + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/north, +/obj/machinery/door/window/elevator/left/directional/east{ + transport_linked_id = "tram_xeno_lift" + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "uaJ" = ( /obj/machinery/computer/mechpad, /turf/open/floor/iron, @@ -60085,15 +60092,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/execution/transfer) -"udg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "udk" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -60250,6 +60248,18 @@ /obj/machinery/chem_master, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"ufH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/bed/medical/emergency, +/obj/machinery/camera/directional/south{ + network = list("ss13","medbay"); + c_tag = "Medical - Lobby" + }, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/hangover, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "ufM" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/shower/directional/west, @@ -60359,6 +60369,15 @@ "uid" = ( /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"uig" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/explab) "uip" = ( /obj/structure/closet/secure_closet/brig{ name = "Medical Cell Locker"; @@ -60888,13 +60907,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) -"upf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "upj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/item/radio/intercom/directional/south, @@ -61482,6 +61494,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) +"uyF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "uyJ" = ( /turf/open/floor/iron, /area/station/security/prison/workout) @@ -62203,6 +62222,15 @@ "uIt" = ( /turf/closed/wall, /area/station/security/evidence) +"uIx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "uIG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -62688,13 +62716,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) -"uRW" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "uSe" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -62940,26 +62961,6 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"uXn" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/camera/directional/south{ - network = list("ss13","rd"); - c_tag = "Science - Mixing Lab" - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/mixingchamber_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airalarm/tlv_no_checks, -/obj/effect/mapping_helpers/airalarm/link{ - chamber_id = "ordnanceburn" - }, -/obj/machinery/computer/atmos_control/ordnancemix{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "uXr" = ( /obj/structure/table, /obj/item/stack/cable_coil{ @@ -63900,6 +63901,13 @@ }, /turf/open/floor/wood/large, /area/station/service/theater) +"vmi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/directional/south, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vml" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -64155,12 +64163,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"vro" = ( -/obj/structure/filingcabinet/white, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "vrq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -64717,15 +64719,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/mid) -"vBl" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/smartfridge/extract/preloaded, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "vBn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65029,6 +65022,18 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"vFV" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vGc" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -65506,16 +65511,6 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"vOW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/camera/directional/north{ - pixel_x = 21; - pixel_y = 0 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vPg" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -65850,6 +65845,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/lawoffice) +"vVY" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "vWk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/window/left/directional/east{ @@ -65894,22 +65896,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"vWT" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, +"vXJ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/structure/ladder, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "tram_xeno_lift"; - pixel_x = 31; - pixel_y = -31 + dir = 4 }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/east, +/obj/machinery/smartfridge/extract/preloaded, /turf/open/floor/iron/white, /area/station/science/xenobiology) "vXL" = ( @@ -66065,6 +66058,12 @@ /obj/machinery/computer/records/medical, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"waF" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "waV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -66833,13 +66832,6 @@ /obj/machinery/light/floor, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"wpr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "wpH" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -66938,24 +66930,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wrz" = ( -/obj/structure/rack, -/obj/structure/table, -/obj/machinery/computer/security/telescreen/test_chamber/directional/north, -/obj/item/grenade/chem_grenade{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/item/storage/box/beakers{ - pixel_x = 5; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "wrJ" = ( /obj/structure/railing{ dir = 4 @@ -67031,6 +67005,16 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/commons/dorms) +"wtm" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/obj/machinery/door/window/elevator/right/directional/west{ + transport_linked_id = "tram_xeno_lift" + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "wts" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -67748,6 +67732,26 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"wFd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + network = list("ss13","rd"); + c_tag = "Science - Mixing Lab" + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/mixingchamber_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airalarm/tlv_no_checks, +/obj/effect/mapping_helpers/airalarm/link{ + chamber_id = "ordnanceburn" + }, +/obj/machinery/computer/atmos_control/ordnancemix{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "wFf" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -67997,6 +68001,11 @@ dir = 1 }, /area/station/command/bridge) +"wJA" = ( +/obj/machinery/light/directional/east, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "wJF" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70072,12 +70081,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"xAM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/burnchamber) "xAR" = ( /obj/machinery/door/airlock/security{ name = "Prison Workshop" @@ -70189,16 +70192,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"xCr" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/obj/machinery/light/directional/north, -/obj/machinery/door/window/elevator/right/directional/west{ - transport_linked_id = "tram_xeno_lift" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "xCs" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -70452,16 +70445,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"xKf" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, -/obj/structure/table/glass, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "xKt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port) @@ -71231,6 +71214,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xYQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/station/science/ordnance/burnchamber) "xYZ" = ( /mob/living/basic/bot/cleanbot, /obj/effect/turf_decal/stripes/line{ @@ -103511,7 +103500,7 @@ snQ iRL oXU gRY -jYd +vFV cWZ cWZ lbL @@ -104574,7 +104563,7 @@ fal aks lJv ulV -rNW +jzR rsz sjM unn @@ -115395,7 +115384,7 @@ rwb qVr bfH bfH -upf +vmi qVr aaa aaa @@ -116158,7 +116147,7 @@ oNT dUT gdC qVr -rfi +tzk oxe ahk hdA @@ -116172,7 +116161,7 @@ sml bfH bfH oxe -upf +vmi qVr aaa aaa @@ -116934,8 +116923,8 @@ mBm dHc pYZ aqB -vBl -gNr +vXJ +oZt lym pph aet @@ -117195,11 +117184,11 @@ jiQ asv asv jiQ -iQG +uaG uHF hjM tjP -roQ +coa qVr qVr qVr @@ -117447,7 +117436,7 @@ qVr qCW whn xcM -lyQ +hnu asv mln tjz @@ -117717,7 +117706,7 @@ eGt bql bfH bfH -rPv +hNM qVr aaa aaa @@ -118164,7 +118153,7 @@ uGW uGW njI kjN -dwj +vVY qxm iLu oys @@ -118223,11 +118212,11 @@ jiQ asv asv jiQ -xCr +wtm gJY coM bgH -jAo +lHt qVr qVr qVr @@ -118731,7 +118720,7 @@ qVr qVr kkx cJP -lxd +uIx mLE dGs dGs @@ -119242,7 +119231,7 @@ ebs hFH tYB qVr -vOW +ogk oxe bfH bfH @@ -119256,7 +119245,7 @@ uAF ahk hdA oxe -kZa +dYW qVr aaa aaa @@ -119481,7 +119470,7 @@ cJS nhj cVU oRz -pQy +qEh sQZ nhj prI @@ -119736,7 +119725,7 @@ owO owO cJS rKD -udg +uig cFW cFW nEB @@ -119992,8 +119981,8 @@ sQZ sQZ sQZ sQZ -wrz -hIY +jsn +gie tVK vIF yeZ @@ -120019,7 +120008,7 @@ bOi dUT aaa qVr -vOW +ogk bfH bfH qVr @@ -123090,13 +123079,13 @@ dhM pUC fXK lyC -wpr -hox +gib +cAb dfz vqO edP edP -uXn +wFd hBl hBl gkD @@ -123347,8 +123336,8 @@ wrn ure bKT bqU -qHa -nuu +wJA +rmG dfz uCz wRv @@ -123866,8 +123855,8 @@ lkK aeg gPB qOo -kza -jGx +mwj +kZa aej oAn aej @@ -124123,9 +124112,9 @@ qjp frV xwi vJC -qWf -rLG -xAM +kpx +kWc +xYQ eOZ gkD gkD @@ -124381,8 +124370,8 @@ frV frT ryK jLH -lTo -twv +luo +sFI aaa aaa aaa @@ -148503,7 +148492,7 @@ dFP dFP dFP dFP -gdz +uyF dFP ste mtr @@ -151814,7 +151803,7 @@ dTL mjM kBO tBO -tWO +fmH qZy run ayR @@ -153108,7 +153097,7 @@ yji rbT ndP pwm -qpb +jpD hAv dxC bsP @@ -154921,7 +154910,7 @@ aQO gPA hbV dbJ -sob +mmt eSH wJy xgZ @@ -155456,7 +155445,7 @@ lyx rIg qIs fSr -iPT +orm rVp rVp vgZ @@ -167033,7 +167022,7 @@ lWu tTN net xRx -siE +inC hsh gnM apC @@ -169591,9 +169580,9 @@ sSt jEK eoE xck -ols +ufH wyd -enF +dyI aHP aKq aKP @@ -170621,7 +170610,7 @@ rks rks wyd wyd -qrW +dyI gMT uHB jtr @@ -170632,7 +170621,7 @@ qDF uwk oXz gNE -rdJ +fhV jtr jtr jtr @@ -170877,7 +170866,7 @@ eSz eSz eSz qNI -qIf +gwe lEL qPd iTt @@ -171134,7 +171123,7 @@ eSz eSz eSz qNI -mad +jjJ jVw qPd jVw @@ -171391,7 +171380,7 @@ fWX eSz eSz qNI -xKf +tfi pps sqT sTF @@ -172943,7 +172932,7 @@ rcD nPe nPe nPe -msF +gsN ugt aNa gCI @@ -182187,7 +182176,7 @@ vnu sRZ oxL wwP -sva +kir wwP wwP wwP @@ -182469,7 +182458,7 @@ tBo tBo qVr gYw -cHY +iSr aLR sjT xfL @@ -182720,8 +182709,8 @@ pbH mAL nKU qVr -tEx -mVN +oAp +waF tBo tBo qVr @@ -182731,8 +182720,8 @@ itq qyQ qyQ gun -pUi -vWT +evF +oGK qVr aaa aaa @@ -183234,7 +183223,7 @@ qKE chE pHX qVr -cAK +iYh ttj hLj ttj @@ -183759,7 +183748,7 @@ ecg rUh rUh wAs -fjA +blR aDn qVr aaa @@ -184987,7 +184976,7 @@ lmZ noc aBg jur -vro +txu ipm fur pMd @@ -185279,7 +185268,7 @@ dpB nZO kvt wtw -gfY +egT syv hrh ieV @@ -189375,7 +189364,7 @@ kIo kIo qSm orX -uRW +qEU fmy aac aac diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index fcdeca02178..a0574691242 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -3933,16 +3933,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"brQ" = ( -/obj/effect/turf_decal/trimline/blue/arrow_ccw{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/lobby) "brS" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/cable, @@ -4115,18 +4105,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/herringbone, /area/station/hallway/primary/central) -"bvt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/tank_dispenser/oxygen{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/machinery/vending/wallmed/directional/south, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/command/gateway) "bvD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -4987,6 +4965,12 @@ "bJX" = ( /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"bKa" = ( +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white/smooth_half{ + dir = 8 + }, +/area/station/science/xenobiology) "bKK" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -7807,6 +7791,14 @@ dir = 8 }, /area/station/service/chapel) +"cPb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "cPc" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/north, @@ -8101,6 +8093,11 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/wood, /area/station/service/library) +"cTK" = ( +/obj/structure/cable, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "cTX" = ( /obj/machinery/computer/crew{ dir = 1 @@ -8991,18 +8988,6 @@ /obj/machinery/meter/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"djc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/vending/wallmed/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/shower/directional/east, -/obj/structure/fluff/shower_drain, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "dje" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -10709,6 +10694,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) +"dMp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/engineering/lobby) "dMC" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -12082,6 +12077,16 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/station/science/research) +"ekf" = ( +/obj/effect/turf_decal/trimline/blue/arrow_ccw{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/lobby) "eki" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -12223,16 +12228,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"emO" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/engineering/lobby) "eng" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18021,14 +18016,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/textured, /area/station/hallway/primary/central) -"gpT" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/item/storage/medkit/advanced, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "gpV" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -22006,12 +21993,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hGC" = ( -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/bot_red, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/cargo/sorting) "hGE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31195,13 +31176,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/aft/upper) -"kKU" = ( -/obj/structure/ladder, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/dark_green/opposingcorners, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "kLi" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/station/maintenance/department/medical/central) @@ -32267,6 +32241,13 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"led" = ( +/obj/structure/ladder, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "les" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -33740,6 +33721,25 @@ "lFG" = ( /turf/open/floor/glass, /area/station/command/meeting_room) +"lFH" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/table, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -14 + }, +/obj/item/storage/medkit/regular{ + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/white, +/area/station/security/medical) "lFK" = ( /obj/structure/chair, /obj/effect/turf_decal/stripes/line{ @@ -36360,6 +36360,18 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"mAD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/machinery/wall_healer/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/command/gateway) "mAF" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, @@ -37583,6 +37595,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"mXi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "mXj" = ( /obj/machinery/door/poddoor/shutters{ id = "warehouse"; @@ -38919,6 +38938,15 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"nux" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "nuC" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41964,13 +41992,6 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"oDo" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) "oDC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42222,12 +42243,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/lobby) -"oHh" = ( -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/white/smooth_half{ - dir = 8 - }, -/area/station/science/xenobiology) "oHi" = ( /obj/structure/cable, /turf/open/floor/grass, @@ -42723,6 +42738,15 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/purple, /area/station/service/library) +"oPE" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/secondary/exit/departure_lounge) "oPL" = ( /obj/item/clothing/head/chameleon/broken, /turf/open/misc/asteroid/airless, @@ -44675,6 +44699,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/commons/locker) +"pwB" = ( +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/bot_red, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/cargo/sorting) "pwE" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -56347,13 +56377,6 @@ }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) -"toN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "toT" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -57448,15 +57471,6 @@ dir = 8 }, /area/station/command/meeting_room) -"tIk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "tIr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -59530,6 +59544,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) +"usc" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "usq" = ( /obj/effect/turf_decal/tile/red, /obj/structure/disposalpipe/junction{ @@ -63480,6 +63501,18 @@ }, /turf/open/floor/engine, /area/station/medical/chemistry) +"vQt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/wall_healer/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/shower/directional/east, +/obj/structure/fluff/shower_drain, +/turf/open/floor/iron/white/textured, +/area/station/medical/treatment_center) "vQw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -63492,15 +63525,6 @@ "vQB" = ( /turf/closed/wall, /area/station/cargo/boutique) -"vQR" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/secondary/exit/departure_lounge) "vQT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64689,14 +64713,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"wnT" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/south{ - network = list("ss13","medbay") - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "wnX" = ( /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, @@ -66667,6 +66683,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"wWB" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wWD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66893,14 +66917,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"xas" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/vending/wallmed/directional/south, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "xay" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68547,25 +68563,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/cargo/boutique) -"xCE" = ( -/obj/structure/window/spawner/directional/east, -/obj/structure/table, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -14 - }, -/obj/item/storage/medkit/regular{ - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 8 - }, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/white, -/area/station/security/medical) "xCI" = ( /obj/structure/broken_flooring/side/directional/east, /obj/effect/decal/cleanable/dirt/dust, @@ -68890,11 +68887,6 @@ /obj/structure/window/fulltile, /turf/open/misc/asteroid, /area/station/asteroid) -"xIR" = ( -/obj/structure/cable, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) "xIV" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter) @@ -70320,6 +70312,14 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"yjC" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/south{ + network = list("ss13","medbay") + }, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "yjH" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, @@ -83248,7 +83248,7 @@ vhW wkg iyb wrU -djc +vQt ryE wrU wrU @@ -85249,7 +85249,7 @@ mmy uYI wMn cpB -xCE +lFH luz hqN eSS @@ -85796,7 +85796,7 @@ fXZ gli gli gli -oDo +usc gli gli hgi @@ -88614,7 +88614,7 @@ sUn kRM wBw rKW -hGC +pwB uWl iDs fad @@ -88903,7 +88903,7 @@ qfB fPs gpF avU -brQ +ekf vFH crg lwI @@ -91449,7 +91449,7 @@ bAw aYQ wEW noF -bvt +mAD bAw kxZ fMZ @@ -94775,7 +94775,7 @@ eEa kmu kmu xJe -toN +mXi wSi kmu rqj @@ -94820,7 +94820,7 @@ oKy rbH dMU kGF -vQR +oPE yiO tiT pCJ @@ -98601,7 +98601,7 @@ cLf cLf bqX cQP -gpT +wWB eon sZK sZK @@ -103524,7 +103524,7 @@ nxG nxG nxG hjJ -tIk +nux glH iAE xAm @@ -107619,7 +107619,7 @@ lNV svL cPt ixU -xIR +cTK dfM pBn cPo @@ -109974,7 +109974,7 @@ dpU jco oss vEZ -emO +dMp vEZ vEZ hmz @@ -149557,7 +149557,7 @@ egv tqV tqV njM -wnT +yjC fnh qxG jOB @@ -154184,7 +154184,7 @@ oRR nAs wYY tSn -xas +cPb xhJ mfP xOF @@ -159815,7 +159815,7 @@ qDQ vkR lRN hCs -kKU +led cmw xtG lIr @@ -188852,7 +188852,7 @@ jEt aMf rdn xSW -oHh +bKa wnA wnA wnA diff --git a/_maps/minigame/deathmatch/maint_mania.dmm b/_maps/minigame/deathmatch/maint_mania.dmm index b742b695c14..2433686e673 100644 --- a/_maps/minigame/deathmatch/maint_mania.dmm +++ b/_maps/minigame/deathmatch/maint_mania.dmm @@ -14,7 +14,7 @@ /turf/open/indestructible, /area/deathmatch) "cx" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/indestructible, /area/deathmatch) "cy" = ( diff --git a/_maps/shuttles/arrival_catwalk.dmm b/_maps/shuttles/arrival_catwalk.dmm index 837bfc84157..e50d54a186a 100644 --- a/_maps/shuttles/arrival_catwalk.dmm +++ b/_maps/shuttles/arrival_catwalk.dmm @@ -226,7 +226,7 @@ /area/shuttle/arrival) "CA" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw, -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 4 }, diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 527b50f66c3..8fab8347725 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -326,7 +326,7 @@ /turf/open/floor/iron, /area/shuttle/arrival) "uH" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/neutral/fourcorners, diff --git a/_maps/shuttles/arrival_kilo.dmm b/_maps/shuttles/arrival_kilo.dmm index b59cf8d160d..2776589602e 100644 --- a/_maps/shuttles/arrival_kilo.dmm +++ b/_maps/shuttles/arrival_kilo.dmm @@ -149,7 +149,7 @@ /turf/open/floor/grass, /area/shuttle/arrival) "aA" = ( -/obj/machinery/vending/wallmed/directional/west{ +/obj/machinery/wall_healer/free/directional/west{ use_power = 0 }, /obj/effect/turf_decal/tile/blue/opposingcorners, diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 9bfcf599bb2..3a9cd128fa5 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -271,7 +271,7 @@ /area/shuttle/escape) "bz" = ( /obj/machinery/stasis, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /turf/open/floor/mineral/titanium/white, @@ -387,7 +387,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "JM" = ( -/obj/machinery/vending/wallmed{ +/obj/machinery/wall_healer/free{ name = "Emergency NanoMed"; use_power = 0 }, diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 848f487020f..6df05e530ff 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -468,7 +468,7 @@ /area/shuttle/escape) "ca" = ( /obj/machinery/light/directional/south, -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /obj/effect/turf_decal/tile/bar/opposingcorners, diff --git a/_maps/shuttles/emergency_bballhooper.dmm b/_maps/shuttles/emergency_bballhooper.dmm index 49972dccae1..1d8fa1e0a8e 100644 --- a/_maps/shuttles/emergency_bballhooper.dmm +++ b/_maps/shuttles/emergency_bballhooper.dmm @@ -972,7 +972,7 @@ /obj/machinery/shower/directional/west{ name = "emergency shower" }, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ name = "Hooper's First Medical Kit" }, /obj/machinery/light/small/directional/east, diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index fd82a5b0e2b..609e2a749f3 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -255,7 +255,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "iP" = ( -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 38cdf4e6fec..60815016f83 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -303,7 +303,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "Dk" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index c1332f0ef1d..c91d4e781d9 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -404,7 +404,7 @@ pixel_x = 2; pixel_y = 7 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) "mn" = ( @@ -448,7 +448,7 @@ /obj/item/canvas, /obj/item/canvas, /obj/item/canvas, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /obj/machinery/light/directional/north, /turf/open/floor/sepia, /area/shuttle/escape) @@ -571,7 +571,7 @@ /area/shuttle/escape) "qn" = ( /obj/machinery/stasis, -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /obj/machinery/light/directional/north, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) @@ -1352,7 +1352,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "VT" = ( -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /turf/open/floor/carpet/green, /area/shuttle/escape) "Wp" = ( diff --git a/_maps/shuttles/emergency_catwalk.dmm b/_maps/shuttles/emergency_catwalk.dmm index 4ed285c7964..71f1d21923d 100644 --- a/_maps/shuttles/emergency_catwalk.dmm +++ b/_maps/shuttles/emergency_catwalk.dmm @@ -710,7 +710,7 @@ dir = 1 }, /obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/iron, /area/shuttle/escape) "Mj" = ( @@ -994,7 +994,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "We" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/floor/light/colour_cycle/dancefloor_b, /area/shuttle/escape) "WL" = ( diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index dccdcc4b139..72de7bc50d4 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -511,7 +511,7 @@ "cu" = ( /obj/machinery/light/directional/east, /obj/machinery/stasis, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index fc943e5287b..656d34288b2 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -307,7 +307,7 @@ /area/shuttle/escape) "RX" = ( /obj/item/toy/snappop/phoenix, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/bluespace, diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 33b31e4854f..a5dd675aa0e 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -384,7 +384,7 @@ pixel_x = 4; pixel_y = -1 }, -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -932,7 +932,7 @@ /obj/structure/chair/sofa/bench/right{ dir = 8 }, -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/shuttle/escape) @@ -2054,7 +2054,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /turf/open/floor/iron/dark/small, /area/shuttle/escape) "Cu" = ( diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 854f76f7a15..da90701ec5a 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -1067,7 +1067,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /turf/open/floor/iron, diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency_donut.dmm index 27f9cd7f1ac..1ea139604ab 100644 --- a/_maps/shuttles/emergency_donut.dmm +++ b/_maps/shuttles/emergency_donut.dmm @@ -402,14 +402,14 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "JG" = ( -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "KN" = ( /obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_fish.dmm b/_maps/shuttles/emergency_fish.dmm index 43ec2aa1620..2ed11465b3a 100644 --- a/_maps/shuttles/emergency_fish.dmm +++ b/_maps/shuttles/emergency_fish.dmm @@ -260,7 +260,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "pa" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /obj/structure/railing{ dir = 1 }, @@ -300,7 +300,7 @@ /turf/open/floor/mineral/titanium/tiled/white, /area/shuttle/escape) "qG" = ( -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /obj/structure/chair/comfy/shuttle{ dir = 8 }, @@ -662,7 +662,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "Mp" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -704,7 +704,7 @@ /area/shuttle/escape) "OR" = ( /obj/machinery/light/directional/north, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/dark/anticorner/contrasted{ @@ -835,7 +835,7 @@ /turf/template_noop, /area/template_noop) "Vo" = ( -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 8 @@ -895,7 +895,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "Ys" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/dark/half/contrasted{ diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 63cbc0dfc80..04c732eafbe 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -41,7 +41,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/open/floor/mineral/plastitanium/red, @@ -176,7 +176,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/west{ +/obj/machinery/wall_healer/free/directional/west{ use_power = 0 }, /obj/machinery/light/directional/west, @@ -222,7 +222,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "Z" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium/white, diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm index d93055c1e83..23e4c289186 100644 --- a/_maps/shuttles/emergency_humpback.dmm +++ b/_maps/shuttles/emergency_humpback.dmm @@ -126,7 +126,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "he" = ( -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /turf/open/floor/wood/large, /area/shuttle/escape) "hk" = ( @@ -297,7 +297,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "rL" = ( diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 1c8148a774a..43f92baecdf 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -906,7 +906,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "Br" = ( -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /obj/effect/turf_decal/stripes/line{ @@ -1227,7 +1227,7 @@ /area/shuttle/escape) "TQ" = ( /obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /obj/effect/turf_decal/stripes/line{ diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index d39e66077bb..3b8dbea2cc7 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -223,7 +223,7 @@ /turf/open/floor/iron/dark/textured, /area/shuttle/escape) "hu" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /obj/effect/turf_decal/tile/dark_blue{ dir = 8 }, @@ -1076,7 +1076,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "In" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, @@ -1240,7 +1240,7 @@ }, /area/shuttle/escape) "MA" = ( -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 840479edd81..572c24b5762 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -61,7 +61,7 @@ /turf/open/floor/plating, /area/shuttle/escape) "ek" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /obj/machinery/iv_drip, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape/luxury) @@ -870,7 +870,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "Jd" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /turf/open/floor/carpet/orange, /area/shuttle/escape/luxury) "JB" = ( @@ -1003,7 +1003,7 @@ /area/shuttle/escape) "Nu" = ( /obj/structure/chair/comfy/shuttle, -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/floor/carpet/red, /area/shuttle/escape/brig) "Om" = ( @@ -1170,7 +1170,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "Wx" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) "WF" = ( diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index f1064a77fda..b2fdab9a9a9 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -621,7 +621,7 @@ /area/shuttle/escape) "qi" = ( /obj/structure/chair/comfy/shuttle, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium/blue, @@ -741,7 +741,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index 89579283e93..e75faab75e5 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -128,7 +128,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "F" = ( -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /obj/machinery/light/small/directional/east, @@ -221,7 +221,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "W" = ( diff --git a/_maps/shuttles/emergency_nebula.dmm b/_maps/shuttles/emergency_nebula.dmm index a0dd9202b56..4a8fb7ecd97 100644 --- a/_maps/shuttles/emergency_nebula.dmm +++ b/_maps/shuttles/emergency_nebula.dmm @@ -807,7 +807,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /obj/machinery/light/directional/east, diff --git a/_maps/shuttles/emergency_northstar.dmm b/_maps/shuttles/emergency_northstar.dmm index 672dd9b58e2..d90758fe7d9 100644 --- a/_maps/shuttles/emergency_northstar.dmm +++ b/_maps/shuttles/emergency_northstar.dmm @@ -3,7 +3,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /turf/open/floor/iron/smooth_edge{ @@ -386,7 +386,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) "Jd" = ( diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 7a183d4ac44..dcd1f6e4643 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -247,7 +247,7 @@ /obj/machinery/stasis{ dir = 4 }, -/obj/machinery/vending/wallmed/directional/west{ +/obj/machinery/wall_healer/free/directional/west{ use_power = 0 }, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -500,7 +500,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/east{ +/obj/machinery/wall_healer/free/directional/east{ use_power = 0 }, /obj/machinery/light/small/directional/east, @@ -571,7 +571,7 @@ dir = 4 }, /obj/effect/turf_decal/bot, -/obj/machinery/vending/wallmed/directional/west{ +/obj/machinery/wall_healer/free/directional/west{ use_power = 0 }, /turf/open/floor/iron, diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index 84780e4332b..b0b75da383a 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -590,7 +590,7 @@ /obj/structure/table/glass, /obj/item/storage/medkit/regular, /obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /obj/effect/turf_decal/tile/blue/opposingcorners{ diff --git a/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm b/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm index 4eca7aeb766..3c69660fbed 100644 --- a/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm +++ b/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm @@ -242,7 +242,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/drip, -/obj/machinery/vending/wallmed/directional/south{ +/obj/machinery/wall_healer/free/directional/south{ use_power = 0 }, /turf/template_noop, diff --git a/_maps/shuttles/emergency_shadow.dmm b/_maps/shuttles/emergency_shadow.dmm index 731ad7bd2dd..f75edd678b3 100644 --- a/_maps/shuttles/emergency_shadow.dmm +++ b/_maps/shuttles/emergency_shadow.dmm @@ -789,7 +789,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape/brig) "IR" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) @@ -1037,7 +1037,7 @@ /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) "Ux" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, diff --git a/_maps/shuttles/emergency_tram.dmm b/_maps/shuttles/emergency_tram.dmm index 38b2608865b..7ab45a766ff 100644 --- a/_maps/shuttles/emergency_tram.dmm +++ b/_maps/shuttles/emergency_tram.dmm @@ -119,7 +119,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aF" = ( -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium, @@ -216,7 +216,7 @@ /area/shuttle/escape) "ba" = ( /obj/machinery/shower/directional/south, -/obj/machinery/vending/wallmed/directional/north{ +/obj/machinery/wall_healer/free/directional/north{ use_power = 0 }, /turf/open/floor/mineral/titanium/white, diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index e44665e39c7..8498e51bbf1 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -920,7 +920,7 @@ /turf/open/floor/wood, /area/shuttle/escape) "rK" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /turf/open/floor/iron/chapel, /area/shuttle/escape) "rL" = ( @@ -1072,7 +1072,7 @@ /turf/open/floor/stone, /area/shuttle/escape) "vx" = ( -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/floor/catwalk_floor, /area/shuttle/escape) "vy" = ( @@ -1370,7 +1370,7 @@ dir = 9 }, /mob/living/basic/bot/cleanbot, -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /turf/open/floor/wood, /area/shuttle/escape) "Ac" = ( diff --git a/_maps/shuttles/emergency_venture.dmm b/_maps/shuttles/emergency_venture.dmm index 29ad2a695d1..1bf7fb0c567 100644 --- a/_maps/shuttles/emergency_venture.dmm +++ b/_maps/shuttles/emergency_venture.dmm @@ -249,7 +249,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /turf/open/floor/iron/herringbone, /area/shuttle/escape) "lW" = ( @@ -573,7 +573,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 8 }, -/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/wall_healer/free/directional/east, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 }, @@ -605,7 +605,7 @@ /area/shuttle/escape) "Gt" = ( /obj/structure/chair/comfy/shuttle, -/obj/machinery/vending/wallmed/directional/north, +/obj/machinery/wall_healer/free/directional/north, /turf/open/floor/mineral/titanium, /area/shuttle/escape) "GM" = ( @@ -752,7 +752,7 @@ /turf/open/floor/mineral/titanium/yellow, /area/shuttle/escape) "Ru" = ( -/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/wall_healer/free/directional/west, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, diff --git a/_maps/shuttles/emergency_wawa.dmm b/_maps/shuttles/emergency_wawa.dmm index 46d2a986938..de864edd745 100644 --- a/_maps/shuttles/emergency_wawa.dmm +++ b/_maps/shuttles/emergency_wawa.dmm @@ -435,7 +435,7 @@ /turf/open/floor/iron/checker, /area/shuttle/escape) "lP" = ( -/obj/machinery/vending/wallmed/directional/south, +/obj/machinery/wall_healer/free/directional/south, /turf/open/floor/catwalk_floor, /area/shuttle/escape) "mT" = ( diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index 8c17d14812a..ee1bfe8d10f 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -262,14 +262,6 @@ /obj/effect/turf_decal/caution/red, /turf/open/floor/iron, /area/virtual_domain) -"ch" = ( -/obj/structure/table/wood, -/obj/machinery/light/directional/south, -/obj/item/papercutter{ - pixel_x = -4 - }, -/turf/open/floor/wood, -/area/virtual_domain) "cj" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/neutral{ @@ -893,15 +885,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/iron, /area/virtual_domain) -"hv" = ( -/obj/structure/bed/medical/emergency, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/iron, -/area/virtual_domain) "hw" = ( /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/iron, @@ -1838,6 +1821,14 @@ "ps" = ( /turf/closed/wall, /area/virtual_domain) +"pu" = ( +/obj/structure/table/wood, +/obj/machinery/light/directional/south, +/obj/item/papercutter{ + pixel_x = -4 + }, +/turf/open/floor/wood, +/area/virtual_domain) "pv" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -3698,19 +3689,6 @@ }, /turf/open/floor/iron, /area/virtual_domain) -"Fa" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/night{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/clothing/glasses/night, -/obj/item/clothing/glasses/night{ - pixel_x = -5; - pixel_y = -3 - }, -/turf/template_noop, -/area/virtual_domain/safehouse) "Fc" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral{ @@ -5207,6 +5185,15 @@ /obj/structure/frame/machine/secured, /turf/open/misc/dirt/jungle, /area/virtual_domain) +"RG" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/wall_healer/free/directional/west, +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/open/floor/iron, +/area/virtual_domain) "RI" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/decoration/showcase, @@ -5685,6 +5672,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/virtual_domain) +"VQ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/night{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/clothing/glasses/night, +/obj/item/clothing/glasses/night{ + pixel_x = -5; + pixel_y = -3 + }, +/turf/template_noop, +/area/virtual_domain/safehouse) "VT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -6726,7 +6726,7 @@ uS uS ML DP -ch +pu uS ND AP @@ -7276,7 +7276,7 @@ oD pB hX zQ -Fa +VQ hX hX hX @@ -7696,7 +7696,7 @@ Nh zg Fj NO -hv +RG uA yN Ff diff --git a/code/datums/components/payment.dm b/code/datums/components/payment.dm index edb9762ba7e..97cb86e08fb 100644 --- a/code/datums/components/payment.dm +++ b/code/datums/components/payment.dm @@ -102,7 +102,7 @@ return FALSE if(physical_cash_total < total_cost) - to_chat(user, span_notice("Insufficient funds. Aborting.")) + to_chat(user, span_warning("Insufficient funds. Aborting.")) return FALSE for(var/obj/cash_object in counted_money) qdel(cash_object) diff --git a/code/game/machinery/wall_healer.dm b/code/game/machinery/wall_healer.dm new file mode 100644 index 00000000000..89de765ecbe --- /dev/null +++ b/code/game/machinery/wall_healer.dm @@ -0,0 +1,566 @@ +/// A wall mounted machine that heals chip damage for a price +/obj/machinery/wall_healer + name = "\improper Deforest First Aid Station" + desc = "A wall-mounted first aid station, designed to treat minor injuries - just stick your hand in and try to relax." + icon = 'icons/obj/machines/wall_healer.dmi' + icon_state = "wall_healer" + base_icon_state = "wall_healer" + density = FALSE + interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND // manually handled + payment_department = ACCOUNT_MED + max_integrity = 150 + armor_type = /datum/armor/obj_machinery/wall_healer + + /// Cost per bandage dispensed. Note, always disregarded on red alert. + var/per_bandage_cost = (/obj/item/stack/medical/gauze::custom_price) / (/obj/item/stack/medical/gauze::amount) + /// Number of bandages to dispense on rmb. Never recharges but can be restocked. + var/num_bandages = 5 + /// Lazylist of bandages that have been restocked into the wall healer. + VAR_PRIVATE/list/stocked_bandages + + /// Cost per unit of healing applied. + /// Note: disregarded on red alert. + var/per_heal_cost = 2.5 + /// Amount of brute healing pooled + VAR_PRIVATE/brute_healing = MAX_LIVING_HEALTH * 0.4 + /// Amount of burn healing pooled + VAR_PRIVATE/burn_healing = MAX_LIVING_HEALTH * 0.4 + /// Amount of toxin healing pooled + VAR_PRIVATE/tox_healing = MAX_LIVING_HEALTH * 0.3 + /// Amount of blood to restore + VAR_PRIVATE/blood_healing = BLOOD_VOLUME_NORMAL * 0.1 + + /// Current mob using the wall healer + VAR_PRIVATE/mob/living/current_user + /// Current hand of the mob using the wall healer, if any (can be unset if in use by a simplemob, for example) + VAR_PRIVATE/obj/item/bodypart/current_hand + /// Ref of the last user to touch the wall healer - only set when there is no active user + VAR_PRIVATE/last_user_ref + /// Bar that props above the healer to show time until next injection + VAR_PRIVATE/datum/progressbar/wall_healer/injection_bar + + /// How long it takes to recharge the wall healer + var/recharge_cd_length = 30 SECONDS + /// How long it takes between injections + var/injection_cd_length = 4 SECONDS + /// Cooldown between chem recharges + COOLDOWN_DECLARE(recharge_cooldown) + /// Cooldown between chem injections + COOLDOWN_DECLARE(injection_cooldown) + /// Only sends messages every X injections to the same user to avoid spam + VAR_PRIVATE/antispam_counter = 0 + +/datum/armor/obj_machinery/wall_healer + melee = 50 + bullet = 30 + laser = 30 + energy = 40 + bomb = 10 + fire = 80 + acid = 80 + +/obj/machinery/wall_healer/Initialize(mapload) + . = ..() + if(!mapload) + brute_healing = 0 + burn_healing = 0 + tox_healing = 0 + blood_healing = 0 + update_appearance() + init_payment() + register_context() + +/obj/machinery/wall_healer/Destroy() + clear_using_mob() + QDEL_LAZYLIST(stocked_bandages) + return ..() + +/obj/machinery/wall_healer/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Heal self" + context[SCREENTIP_CONTEXT_RMB] = "Get gauze" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/stack/medical/gauze)) + context[SCREENTIP_CONTEXT_LMB] = "Restock" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/wall_healer/proc/refill_healing_pool(percent = 100) + var/amount_refilled = 0 + + var/pre_brute_healing = brute_healing + brute_healing = min(brute_healing + initial(brute_healing) * (percent / 100), initial(brute_healing)) + amount_refilled += brute_healing - pre_brute_healing + + var/pre_burn_healing = burn_healing + burn_healing = min(burn_healing + initial(burn_healing) * (percent / 100), initial(burn_healing)) + amount_refilled += burn_healing - pre_burn_healing + + var/pre_tox_healing = tox_healing + tox_healing = min(tox_healing + initial(tox_healing) * (percent / 100), initial(tox_healing)) + amount_refilled += tox_healing - pre_tox_healing + + var/pre_blood_healing = blood_healing + blood_healing = min(blood_healing + initial(blood_healing) * (percent / 100), initial(blood_healing)) + amount_refilled += blood_healing - pre_blood_healing + + if(amount_refilled > 0) + update_appearance() + + return amount_refilled + +/obj/machinery/wall_healer/proc/init_payment() + // Cost depends on service (so just use 0 here) + AddComponent(/datum/component/payment, 0, SSeconomy.get_dep_account(ACCOUNT_MED), PAYMENT_FRIENDLY) + desc += " Charges by the second, though all costs are waived on red alert." + +/obj/machinery/wall_healer/examine(mob/user) + . = ..() + var/total_bandages = num_bandages + LAZYLEN(stocked_bandages) + . += span_notice("It has [total_bandages] bandage\s stocked.\ + [total_bandages ? " [is_free(user) ? "Purchase" : "Retrieve"] a bandage with [EXAMINE_HINT("right-click")]." : ""]") + if(current_user) + . += span_notice("[current_user] currently [current_hand ? "has [current_user.p_their()] [current_hand.plaintext_zone] in" : "is using"] it.") + +/obj/machinery/wall_healer/update_overlays() + . = ..() + + var/brute_state = 7 - round(7 * (brute_healing / initial(brute_healing)), 1) + var/mutable_appearance/brute = mutable_appearance(icon, "bar[brute_state]", alpha = src.alpha, appearance_flags = RESET_COLOR) + brute.color = /datum/reagent/medicine/c2/libital::color + // no offset necessary + . += brute + + var/burn_state = 7 - round(7 * (burn_healing / initial(burn_healing)), 1) + var/mutable_appearance/burn = mutable_appearance(icon, "bar[burn_state]", alpha = src.alpha, appearance_flags = RESET_COLOR) + burn.color = /datum/reagent/medicine/c2/aiuri::color + burn.pixel_w += 4 + . += burn + + var/tox_state = 7 - round(7 * (tox_healing / initial(tox_healing)), 1) + var/mutable_appearance/tox = mutable_appearance(icon, "bar[tox_state]", alpha = src.alpha, appearance_flags = RESET_COLOR) + tox.color = /datum/reagent/medicine/c2/syriniver::color + tox.pixel_w += 8 + . += tox + + var/blood_state = 7 - round(7 * (blood_healing / initial(blood_healing)), 1) + var/mutable_appearance/blood = mutable_appearance(icon, "bar[blood_state]", alpha = src.alpha, appearance_flags = RESET_COLOR) + blood.color = /datum/reagent/blood::color + blood.pixel_w += 12 + . += blood + + if(is_operational) + . += emissive_appearance(icon, "bar_emissive", src, alpha = src.alpha) + . += mutable_appearance(icon, "bar_shadow", alpha = src.alpha, appearance_flags = RESET_COLOR) + +/obj/machinery/wall_healer/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + + playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + visible_message(span_warning("Sparks fly out of [src]!")) + balloon_alert(user, "safeties disabled") + obj_flags |= EMAGGED + return TRUE + +/// We want user to be right up to the wall mount to use it +/// However people may often map the machine over a table +/// In those contexts, they should be allowed to reach over the table +/obj/machinery/wall_healer/proc/loc_check(mob/checking) + var/turf/turf_loc = get_turf(src) + if(turf_loc.is_blocked_turf()) + return checking.Adjacent(turf_loc) + return checking.loc == turf_loc + +/obj/machinery/wall_healer/mouse_drop_receive(atom/dropped, mob/user, params) + . = ..() + if(.) + return . + if(!isliving(user) || !ishuman(dropped)) + balloon_alert(user, "incompatible!") + return FALSE + var/mob/living/who_put_user_in = user + var/mob/living/new_user = dropped + if(!loc_check(new_user)) + balloon_alert(who_put_user_in, "[new_user == who_put_user_in ? "get" : "bring [new_user.p_them()]"] closer!") + return FALSE + + if(do_after(user, 1 SECONDS, src)) + other_put_users_hand_in(new_user, who_put_user_in) + return TRUE + +/obj/machinery/wall_healer/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return . + if(!ishuman(user)) + balloon_alert(user, "incompatible!") + return FALSE + if(!loc_check(user)) + balloon_alert(user, "get closer!") + return FALSE + if(do_after(user, 0.5 SECONDS, src)) + user_put_in_own_hand(user) + return TRUE + +/obj/machinery/wall_healer/proc/user_put_in_own_hand(mob/living/user) + if(user == current_user) + clear_using_mob() + if(user.get_active_hand() == current_hand) + user.visible_message( + span_notice("[user] removes [user.p_their()] hand from [src]."), + span_notice("You remove your hand from [src]."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + else + add_fingerprint(user) + user.visible_message( + span_notice("[user] removes [user.p_their()] hand from [src] and puts it in [user.p_their()] other hand."), + span_notice("You remove your hand from [src] and put it in your other hand."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + set_using_mob(user) + return + else if(current_user) + user.visible_message( + span_notice("[user] tries to put [user.p_their()] hand in [src], but [current_user] is already using it."), + span_notice("You try to put your hand in [src], but [current_user] is already using it."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + return + + add_fingerprint(user) + if(is_operational) + user.visible_message( + span_notice("[user] puts [user.p_their()] hand in [src], and immediately some kind of sensor scans [user.p_their()] arm."), + span_notice("You put your hand in [src], and immediately some kind of sensor scans your arm."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + else + user.visible_message( + span_notice("[user] puts [user.p_their()] hand in [src], but it doesn't respond. Seems to be out of order."), + span_notice("You put your hand in [src], but it doesn't respond."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + set_using_mob(user) + +/obj/machinery/wall_healer/proc/other_put_users_hand_in(mob/living/user, mob/living/who_put_user_in) + if(who_put_user_in == user) + return user_put_in_own_hand(user) + + if(current_user == user) + clear_using_mob() + if(user.get_active_hand() == current_hand) + to_chat(who_put_user_in, span_notice("You remove [user]'s hand from [src].")) + user.visible_message( + span_notice("[who_put_user_in] removes [user]'s hand from [src]."), + span_notice("[who_put_user_in] remove your hand from [src]."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ignored_mobs = who_put_user_in, + ) + else + to_chat(who_put_user_in, span_notice("You remove [user]'s hand from [src] and put it in [user.p_their()] other hand.")) + user.visible_message( + span_notice("[who_put_user_in] removes [user.p_their()] hand from [src] and puts it in [user.p_their()] other hand."), + span_notice("[who_put_user_in] removes your hand from [src] and puts it in your other hand."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ignored_mobs = who_put_user_in, + ) + add_fingerprint(user) + set_using_mob(who_put_user_in) + return + + if(current_user) + to_chat(who_put_user_in, span_notice("You try to put [user]'s hand in [src], but [current_user] is already using it.")) + user.visible_message( + span_notice("[who_put_user_in] tries to put [user]'s hand in [src], but [current_user] is already using it."), + span_notice("[who_put_user_in] tries to put your hand in [src], but [current_user] is already using it."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ignored_mobs = who_put_user_in, + ) + return + + add_fingerprint(who_put_user_in) + if(is_operational) + to_chat(who_put_user_in, span_notice("You put [user]'s hand in [src], and immediately some kind of sensor scans [user.p_their()] arm.")) + user.visible_message( + span_notice("[who_put_user_in] puts [user.p_their()] hand in [src], and immediately some kind of sensor scans [user.p_their()] arm."), + span_notice("[who_put_user_in] puts your hand in [src], and immediately some kind of sensor scans your arm."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ignored_mobs = who_put_user_in, + ) + else + to_chat(who_put_user_in, span_notice("You put [user]'s hand in [src], but it doesn't respond. Seems to be out of order.")) + user.visible_message( + span_notice("[who_put_user_in] puts [user.p_their()] hand in [src], but it doesn't respond. Seems to be out of order."), + span_notice("[who_put_user_in] puts your hand in [src], but it doesn't respond."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ignored_mobs = who_put_user_in, + ) + set_using_mob(user) + +/obj/machinery/wall_healer/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. != SECONDARY_ATTACK_CALL_NORMAL || !isliving(user)) + return . + var/mob/living/living_user = user + if(!is_operational) + to_chat(user, span_warning("You try to retrieve some gauze, but [src] doesn't respond.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(num_bandages + LAZYLEN(stocked_bandages) <= 0) + to_chat(user, span_warning("You try to retrieve some gauze, but [src] seems to be out of stock.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(attempt_charge(src, user, extra_fees = floor(per_bandage_cost)) & COMPONENT_OBJ_CANCEL_CHARGE) + if(!living_user.get_idcard()) + to_chat(user, span_warning("No ID card found. Aborting.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if((obj_flags & EMAGGED) && prob(99)) + to_chat(user, span_warning("You try to retrieve some gauze, but it gets all jammed up in the access port.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/obj/item/stack/medical/gauze/bandage = LAZYACCESS(stocked_bandages, 1) + if(isnull(bandage)) + num_bandages-- + bandage = new(user.drop_location(), 1) + user.put_in_hands(bandage) + user.visible_message( + span_notice("[user] retrieves [bandage] from [src]."), + span_notice("You retrieve [bandage] from [src]."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/wall_healer/on_deconstruction(disassembled) + var/atom/drop_loc = drop_location() + for(var/obj/item/stack/medical/gauze/bandage as anything in stocked_bandages) + bandage.forceMove(drop_loc) + new /obj/item/stack/medical/gauze(drop_loc, num_bandages) + +/obj/machinery/wall_healer/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/medical/gauze)) + return NONE + if(!user.temporarilyRemoveItemFromInventory(tool)) + to_chat(user, span_warning("You try to restock [src] with [tool], but it seems stuck to your hand.")) + return ITEM_INTERACT_BLOCKING + user.visible_message( + span_notice("[user] restocks [src] with [tool]."), + span_notice("You restock [src] with [tool]."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + var/obj/item/stack/medical/gauze/bandage = tool + while(bandage.amount > 1) + var/obj/item/stack/medical/gauze/split_bandage = bandage.split_stack(1) + LAZYADD(stocked_bandages, split_bandage) + split_bandage.forceMove(src) + LAZYADD(stocked_bandages, bandage) + bandage.forceMove(src) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/wall_healer/proc/set_using_mob(mob/living/user) + if(last_user_ref != REF(user)) + COOLDOWN_RESET(src, injection_cooldown) + + antispam_counter = 0 + last_user_ref = null + + current_user = user + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(user_moved)) + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(clear_using_mob)) + + current_hand = user.get_active_hand() + if(current_hand) + RegisterSignals(current_hand, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(clear_using_mob)) + + injection_bar = new(user, injection_cd_length, src, COOLDOWN_TIMELEFT(src, injection_cooldown)) + +/obj/machinery/wall_healer/proc/clear_using_mob(...) + SIGNAL_HANDLER + if(current_hand) + UnregisterSignal(current_hand, COMSIG_BODYPART_REMOVED) + UnregisterSignal(current_hand, COMSIG_QDELETING) + current_hand = null + if(current_user) + last_user_ref = REF(current_user) + UnregisterSignal(current_user, COMSIG_MOVABLE_MOVED) + UnregisterSignal(current_user, COMSIG_QDELETING) + UnregisterSignal(current_user, COMSIG_CARBON_REMOVE_LIMB) + current_user = null + QDEL_NULL(injection_bar) + +/obj/machinery/wall_healer/proc/user_moved(...) + SIGNAL_HANDLER + if(current_user.loc == loc) + return + if(!QDELING(current_user)) + current_user.visible_message( + span_notice("[current_user] removes [current_user.p_their()] hand from [src]."), + span_notice("You remove your hand from [src]."), + span_hear("You hear a click."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + vision_distance = 5, + ) + clear_using_mob() + +/obj/machinery/wall_healer/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(current_user && current_user.loc != loc) + clear_using_mob() + +/obj/machinery/wall_healer/Exited(atom/movable/gone, direction) + . = ..() + LAZYREMOVE(stocked_bandages, gone) + +/// Checks if the machine is free for the given mob +/obj/machinery/wall_healer/proc/is_free(mob/living/for_who) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) + return TRUE // always free on red alert + if(!istype(for_who)) + return FALSE + var/obj/item/card/id/card = for_who.get_idcard(TRUE) + if(card?.registered_account?.account_job?.paycheck_department == payment_department) + return TRUE // free for doctors + return FALSE + +/obj/machinery/wall_healer/attempt_charge(atom/sender, atom/target, extra_fees) + if(is_free(target)) + return NONE + return ..() + +/obj/machinery/wall_healer/process() + if(!is_operational) + // puts off recharging until operational again + COOLDOWN_START(src, recharge_cooldown, recharge_cd_length * 0.5) + return + if(isnull(current_user)) + if(COOLDOWN_FINISHED(src, recharge_cooldown) && refill_healing_pool(10)) + COOLDOWN_START(src, recharge_cooldown, recharge_cd_length) + playsound(src, 'sound/machines/defib/defib_ready.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + return + + if(!COOLDOWN_FINISHED(src, injection_cooldown)) + return + + COOLDOWN_START(src, injection_cooldown, injection_cd_length) + antispam_counter++ + + var/arm_check = isnull(current_hand) ? (current_user.mob_biotypes & MOB_ORGANIC) : IS_ORGANIC_LIMB(current_hand) + if(!arm_check) + playsound(src, 'sound/machines/defib/defib_saftyOff.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + if(antispam_counter % 3 == 1) + to_chat(current_user, span_notice("Nothing happens. Seems [src] doesn't recognize non-organic [current_hand ? "limbs" : "beings"].")) + return + + if(!current_user.can_inject(null, current_hand)) + playsound(src, 'sound/machines/defib/defib_saftyOff.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + if(antispam_counter % 3 == 1) + to_chat(current_user, span_notice("Nothing happens. Seems [src] can't find any exposed flesh to work on.")) + return + + if(obj_flags & EMAGGED) + current_user.apply_damage(33, BRUTE, current_hand, sharpness = SHARP_POINTY) + playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + if(antispam_counter % 2 == 1) + to_chat(current_user, span_warning("You feel a sharp pain as the machine malfunctions, stabbing you with several instruments and needles!")) + use_energy(500 JOULES) + add_mob_blood(current_user) + return + + var/brute_healing_now = round(min(initial(brute_healing) * 0.1, brute_healing, current_user.getBruteLoss()), DAMAGE_PRECISION) + var/burn_healing_now = round(min(initial(burn_healing) * 0.1, burn_healing, current_user.getFireLoss()), DAMAGE_PRECISION) + var/tox_healing_now = round(min(initial(tox_healing) * 0.1, tox_healing, current_user.getToxLoss()), DAMAGE_PRECISION) + var/blood_healing_now = HAS_TRAIT(current_user, TRAIT_NOBLOOD) ? 0 : round(min(initial(blood_healing) * 0.1, blood_healing, max(BLOOD_VOLUME_OKAY - current_user.blood_volume, 0)), 0.1) + + var/cost = round(per_heal_cost * (brute_healing_now + burn_healing_now + tox_healing_now + blood_healing_now), 1) + if(attempt_charge(src, current_user, extra_fees = cost) & COMPONENT_OBJ_CANCEL_CHARGE) + playsound(src, 'sound/machines/defib/defib_saftyOff.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + // attempt charge sends a chat message on fail, except if the user has no ID card + if((antispam_counter % 3 == 1) && !current_user.get_idcard()) + to_chat(current_user, span_warning("No ID card found. Aborting.")) + return + + var/amount_healed = 0 + if(brute_healing_now) + amount_healed += current_user.adjustBruteLoss(-brute_healing_now, required_bodytype = BODYTYPE_ORGANIC) + brute_healing -= brute_healing_now + add_mob_blood(current_user) + if(burn_healing_now) + amount_healed += current_user.adjustFireLoss(-burn_healing_now, required_bodytype = BODYTYPE_ORGANIC) + burn_healing -= burn_healing_now + if(tox_healing_now) + amount_healed += current_user.adjustToxLoss(-tox_healing_now, required_biotype = MOB_ORGANIC) + tox_healing -= tox_healing_now + if(blood_healing_now) + current_user.blood_volume += blood_healing_now + amount_healed += blood_healing_now + blood_healing -= blood_healing_now + add_mob_blood(current_user) + + if(amount_healed) + playsound(src, 'sound/machines/defib/defib_SaftyOn.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + if(antispam_counter % 2 == 1) + to_chat(current_user, span_notice("Several instruments and syringes work on your [current_hand?.plaintext_zone || "body"]. You feel a bit better.")) + update_appearance() + use_energy(200 JOULES) // just some background power drain. we don't really care about whether this is actually successful + return + + playsound(src, 'sound/machines/defib/defib_saftyOff.ogg', 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + if(antispam_counter % 3 != 1) + return + var/missed_brute_healing = brute_healing_now > 0 && !current_user.getBruteLoss() + var/missed_burn_healing = burn_healing_now > 0 && !current_user.getFireLoss() + var/missed_tox_healing = tox_healing_now > 0 && !current_user.getToxLoss() + var/missed_blood_healing = blood_healing_now > 0 && current_user.blood_volume >= BLOOD_VOLUME_OKAY + if(missed_brute_healing || missed_burn_healing || missed_tox_healing || missed_blood_healing) + to_chat(current_user, span_notice("Nothing happens. Seems like [src] needs to recharge.")) + return + to_chat(current_user, span_notice("Nothing happens. Seems like you're in good enough shape.")) + +/// Subtype of progress bar used by the wall healer to show time until next injection +/// This subtype only exists so we can shove fastprocess processing off of the machine itself +/datum/progressbar/wall_healer + +/datum/progressbar/wall_healer/New(mob/User, goal_number, atom/target, starting_amount) + . = ..() + START_PROCESSING(SSfastprocess, src) + +/datum/progressbar/wall_healer/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/progressbar/wall_healer/process(seconds_per_tick) + var/obj/machinery/wall_healer/healer = bar_loc + if(!istype(healer)) + stack_trace("[type] instantiated on a non-wall-healer target [bar_loc || "null"] ([bar_loc?.type || "null"])") + return PROCESS_KILL + + update(COOLDOWN_FINISHED(healer, injection_cooldown) ? 0 : COOLDOWN_TIMELEFT(healer, injection_cooldown)) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/wall_healer, 32) + +/obj/machinery/wall_healer/free + name = "\improper Deforest Emergency First Aid Station" + +/obj/machinery/wall_healer/free/init_payment() + return + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/wall_healer/free, 32) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 53027e5b7df..0b7bc91aac2 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -6,19 +6,20 @@ panel_type = "wallmed-panel" density = FALSE products = list( - /obj/item/stack/medical/bandage = 1, - /obj/item/stack/medical/ointment = 1, - /obj/item/stack/medical/gauze = 1, - /obj/item/reagent_containers/hypospray/medipen/ekit = 1, - /obj/item/healthanalyzer/simple = 1, + /obj/item/stack/medical/bandage = 4, + /obj/item/stack/medical/ointment = 2, + /obj/item/reagent_containers/applicator/pill/multiver = 2, + /obj/item/stack/medical/gauze = 4, + /obj/item/reagent_containers/hypospray/medipen/ekit = 2, + /obj/item/healthanalyzer/simple = 2, ) contraband = list( /obj/item/storage/box/bandages = 1, /obj/item/storage/box/gum/happiness = 1, ) premium = list( - /obj/item/reagent_containers/applicator/patch/libital = 1, - /obj/item/reagent_containers/applicator/patch/aiuri = 1, + /obj/item/reagent_containers/applicator/patch/libital = 2, + /obj/item/reagent_containers/applicator/patch/aiuri = 2, ) refill_canister = /obj/item/vending_refill/wallmed default_price = PAYCHECK_CREW * 0.3 // Cheap since crew should be able to affort it in emergency situations diff --git a/icons/obj/machines/wall_healer.dmi b/icons/obj/machines/wall_healer.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f09ad6f7339da268b2716e900b2ce84e548f20b7 GIT binary patch literal 1010 zcmVV=-0C=2@(7g)7AQXn-*>e?#WH0$^JGlfyaY$|j3 z#4DPO&i%7b6W8R7-3x~{9Mp19$3Z;@4IFgkpc@C>S(no0Q}PG>!!=HeLN#mn0!!3~ z4m~dr-~a#v3`s;mRCt{2+&@ecVHn5pA7UsBJthaa*6QGLG2)_55(YJFgvCV@1_K(2 zBnA^=NIH-Z)5!#b@lPBaoE2jn3?vPc$^r`v45m-GQlv-IBg z-rn;h_x9;sdv_85005d!%V8@gAJ2G&*2RCE$sOPIz2LUuk46rSh3Yt7Y{1~{n|b@= z?>Z$(sevuU_Lc_+w(^dB^ZKpd{7`1cN_lf?Z-=J}?0D3^k|x0ZCx8DH^{41pz^N1Y zckY#wyRWytbRH}h8jIR>=mhxqepcP*&*feBur;^u!>7XAL2W8p0VHW^a!Reoe(TTQ zu%5hpst3dOjoTCPi6HXqE#bY%QiCUxNiQ0WYGY$Vy}i8^KbsjJANM*sI+V#|lt?53 zjc+soB+0gIt#54mZr3x%ab#JR!r^dL;*X7u$+9eMZ*MD+NCdiV;|Z|2xhW~^yIrDW zP#f}NWo1SC6`;}L8=nQ(wp~)Yo;i*q+qUI6PQ%5omkLl-Q~*%{nz{lE58cq(+M4?M z&iZQCyGE`6hn`Ygx_sT6h)?Lk#ctmLmKK*aH94hkUqAC_Pz^Gw085L@<<0|DVtf$z zzmdB`IejzFUzL;$D$n>JaN6rpf4WDKGvYbTUq9D(7gpyqud5o31d$@j$#??HMivfse$lbl+9WOb%?TCc>w19cXD^P_ zkJ{z?ATXeR`A}s=e+LLE5WfQe00000000000000~hS5bD<-9+g_|=VXbV*n&7E>e= zQ97LtGPW_|moL821aKTj(P&hbWd)vqiBu{j*L9W2WQZRy;|b8HPslLQ^cA3y?~XOm z>=jV1>w4L2)^lAqu&acLUmNkM0K^9X00000000000000000000Kt1C500y$ztQQJ} zw6n9L_V)IcqqZxZ?@{o4fF@@&0jhm>YPI7xGAclmqXINJDnOIt89@d@p-@R}00000 g00000005}Gf5lnp`=x&8AOHXW07*qoM6N<$g6sdt7ytkO literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 345871915cb..72fb69a151a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2208,6 +2208,7 @@ #include "code\game\machinery\teambuilder.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transformer.dm" +#include "code\game\machinery\wall_healer.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\camera\camera.dm" From 7a06cc69c2dace5814512ebd81e272014d4528e0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:06:47 +0000 Subject: [PATCH 061/107] Automatic changelog for PR #92677 [ci skip] --- html/changelogs/AutoChangeLog-pr-92677.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92677.yml diff --git a/html/changelogs/AutoChangeLog-pr-92677.yml b/html/changelogs/AutoChangeLog-pr-92677.yml new file mode 100644 index 00000000000..d0406d70548 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92677.yml @@ -0,0 +1,6 @@ +author: "Melber" +delete-after: True +changes: + - balance: "Advanced first aid kits in the bridge are back to being normal first aid kids" + - balance: "Emergency Nanomed vendors have larger stocks and better supplies" + - rscadd: "Replaces a majority of Emergency Nanomeds on stations and shuttles with Deforest First Aid Stations. Left clicking these stationary machines will heal minor damage and blood loss over time - at a (small) price. Right clicking them will provide gauze, also for a price. All costs are waived on shuttles, during red alert, or for medical staff. You can also click-drag to have other mobs use the machine. However, robotic limbs need not apply." \ No newline at end of file From 4756a4414186866b4c4401e9e5a716038505b9f1 Mon Sep 17 00:00:00 2001 From: Stonetear <89315023+Stonetear@users.noreply.github.com> Date: Sun, 7 Sep 2025 03:27:38 -0700 Subject: [PATCH 062/107] MODSuit procs now pass who clicked the UI button + misc code cleanup (#92424) ## About The Pull Request Most of these changes are centered around removing `mod.wearer` references in module function bubble alerts. However, I cleaned up a few other things that I thought were easy fixes. ~~This PR should be testmerged~~ nah send it. I think I did a pretty good job testing, but there might be a bug or two I missed. (debug modsuit should allow conflicting modules and have unlimited complexity btw) ### Track who clicks the activate button * Adds `mob/activator` to `on_select()`, `activate()`, `deactivate()`, `used()`, `on_activation()`, `on_deactivation()` and `on_use()` * `mod_ui` now passes `ui.user`, which is who actually clicked the button in the UI.1 * module action proc now passes the person clicking. * **Alert bubbles:** Modifies many module code bubbles to pass the activation bubble text to `mob/activator` instead of `mob.wearer` so that pAIs get feedback on why clicking the button isn't working. ### Cargo clamp * **Clamp code cleanup:** The cargo clamp now has a variable for the max creature weight it can support, and the logic is changed around a bit to support this. * The cargo clamp uses an `accepted_items` typecache. ### Code cleanup * **Button malfunction chance** is controlled by a `MOD_MALFUNCTION_PROB` define. * **Pathfinder runtime:** `mod_control`'s `GetAccess()` now checks if there is an access before returning it. (This previously caused runtimes when using the pathfinder module if you didn't swipe your ID) * **Pathfinder code tweaks:** Reworks the code for the pathfinder module a bit. Activation logic is now stored in the module instead of the implant. The suit is prevented from being recalled by pAIs, which is controlled by a variable. * Adds `MODULE_ALLOW_UNWORN`, which lets you activate modules in suits that aren't currently being worn. Module activation code now smoothly supports modules being activated while not worn. * Chameleon module now works when unworn. This will probably be a Part 1, with a Part 2 to follow. Actions are kinda funky and could probably be cleaned up a little better. Plus, I want to make selectable modules theoretically usable by the AI, even if I leave it disabled. ## Why It's Good For The Game This PR doesn't contain any balance changes, and I manually disabled any new serious functionality that pAIs might gain. (Such as being able to activate the pathfinder implant) They *can* use the chameleon module with no wearer- but I'm going to consider this a bug that they couldn't before. Paves the way for more pAI modsuit nonsense I'm doing downsteam. ## Changelog :cl: Stonetear refactor: MODsuit module code now knows who clicked the activation button. /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/ai/ai_blackboard.dm | 4 +- code/__DEFINES/mod.dm | 5 + code/datums/ai/objects/mod.dm | 14 +- code/modules/mod/mod_actions.dm | 4 +- code/modules/mod/mod_control.dm | 2 +- code/modules/mod/mod_ui.dm | 4 +- code/modules/mod/modules/_module.dm | 77 ++++---- code/modules/mod/modules/module_kinesis.dm | 2 +- code/modules/mod/modules/module_pathfinder.dm | 168 ++++++++++-------- code/modules/mod/modules/modules_antag.dm | 14 +- .../mod/modules/modules_engineering.dm | 8 +- code/modules/mod/modules/modules_general.dm | 24 +-- code/modules/mod/modules/modules_maint.dm | 18 +- code/modules/mod/modules/modules_ninja.dm | 12 +- code/modules/mod/modules/modules_science.dm | 12 +- code/modules/mod/modules/modules_security.dm | 22 +-- code/modules/mod/modules/modules_service.dm | 2 +- code/modules/mod/modules/modules_supply.dm | 40 +++-- code/modules/mod/modules/modules_timeline.dm | 21 +-- code/modules/mod/modules/modules_visor.dm | 12 +- 20 files changed, 256 insertions(+), 209 deletions(-) diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 1b94abc95c1..ebcd71345ee 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -171,8 +171,8 @@ ///Mob the MOD is trying to attach to #define BB_MOD_TARGET "BB_mod_target" -///The implant the AI was created from -#define BB_MOD_IMPLANT "BB_mod_implant" +///The module the AI was created from +#define BB_MOD_MODULE "BB_mod_module" ///Range for a MOD AI controller. #define MOD_AI_RANGE 200 diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 1a4bed1ca99..5760dc5a05f 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -7,6 +7,9 @@ /// Default time for a part of the suit to seal. #define MOD_ACTIVATION_STEP_TIME (1 SECONDS) +/// How likely the UI is to fail when malfunctioning +#define MOD_MALFUNCTION_PROB 75 + /// Passive module, just acts when put in naturally. #define MODULE_PASSIVE 0 /// Usable module, does something when you press a button. @@ -22,6 +25,8 @@ #define MODULE_ALLOW_INCAPACITATED (1<<1) /// This module can be used while the suit is off #define MODULE_ALLOW_INACTIVE (1<<2) +/// This module can be used (by button) while the suit is unworn +#define MODULE_ALLOW_UNWORN (1<<3) #define UNSEALED_LAYER "unsealed_layer" #define SEALED_LAYER "sealed_layer" diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm index 2b4c1f7e2b0..46b41adb1c8 100644 --- a/code/datums/ai/objects/mod.dm +++ b/code/datums/ai/objects/mod.dm @@ -1,8 +1,8 @@ -/// An AI controller for the MODsuit pathfinder module. It's activated by implant and attaches itself to the user. +/// An AI controller for the MODsuit pathfinder module. It's activated by module and attaches itself to the user. /datum/ai_controller/mod blackboard = list( BB_MOD_TARGET, - BB_MOD_IMPLANT, + BB_MOD_MODULE, ) can_idle = FALSE max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesn't run otherwise @@ -25,7 +25,7 @@ /datum/ai_controller/mod/SelectBehaviors(seconds_per_tick) current_behaviors = list() - if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_IMPLANT]) + if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_MODULE]) queue_behavior(/datum/ai_behavior/mod_attach) /datum/ai_controller/mod/get_access() @@ -37,12 +37,12 @@ /datum/ai_behavior/mod_attach/perform(seconds_per_tick, datum/ai_controller/controller) if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET])) return AI_BEHAVIOR_DELAY - var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] - implant.module.attach(controller.blackboard[BB_MOD_TARGET]) + var/obj/item/mod/module/pathfinder/module = controller.blackboard[BB_MOD_MODULE] + module.attach(controller.blackboard[BB_MOD_TARGET]) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED /datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded) . = ..() controller.clear_blackboard_key(BB_MOD_TARGET) - var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] - implant.end_recall(succeeded) + var/obj/item/mod/module/pathfinder/module = controller.blackboard[BB_MOD_MODULE] + module.end_recall(succeeded) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index d0424d9682d..8385b657671 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -32,7 +32,7 @@ /datum/action/item_action/mod/do_effect(trigger_flags) var/obj/item/mod/control/mod = target - if(mod.malfunctioning && prob(75)) + if(mod.malfunctioning && prob(MOD_MALFUNCTION_PROB)) mod.balloon_alert(usr, "button malfunctions!") return FALSE return TRUE @@ -182,7 +182,7 @@ . = ..() if(!.) return - module.on_select() + module.on_select(owner) /datum/action/item_action/mod/pinnable/module/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) current_button.cut_overlays() diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 883eee631d0..cb4689e81d0 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -378,7 +378,7 @@ return cell /obj/item/mod/control/GetAccess() - if(ai_controller) + if(ai_controller && req_access) return req_access.Copy() else return ..() diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 9a8e77f7e8e..e25c3b2a836 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -86,7 +86,7 @@ . = ..() if(.) return - if(malfunctioning && prob(75)) + if(malfunctioning && prob(MOD_MALFUNCTION_PROB)) balloon_alert(ui.user, "button malfunctions!") return switch(action) @@ -108,7 +108,7 @@ var/obj/item/mod/module/module = locate(params["ref"]) in modules if(!module) return - module.on_select() + module.on_select(ui.user) // We can now if("configure") var/obj/item/mod/module/module = locate(params["ref"]) in modules if(!module) diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 5f0be8207f9..57765677d46 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -105,32 +105,29 @@ return TRUE /// Called when the module is selected from the TGUI, radial or the action button -/obj/item/mod/module/proc/on_select() - if(!mod.wearer) - if(ismob(mod.loc)) - balloon_alert(mod.loc, "not equipped!") +/obj/item/mod/module/proc/on_select(mob/activator) + if(!mod.wearer && !(allow_flags & MODULE_ALLOW_UNWORN)) //No wearer and cannot be used unworn + balloon_alert(activator, "not equipped!") return - if(((!mod.active || mod.activating) && !(allow_flags & MODULE_ALLOW_INACTIVE)) || module_type == MODULE_PASSIVE) - if(mod.wearer) - balloon_alert(mod.wearer, "not active!") + if(((!mod.active || mod.activating) && !(allow_flags & (MODULE_ALLOW_INACTIVE | MODULE_ALLOW_UNWORN))) || module_type == MODULE_PASSIVE) // not active + balloon_alert(activator, "not active!") return - if(!has_required_parts(mod.mod_parts, need_active = TRUE)) - if(mod.wearer) - balloon_alert(mod.wearer, "required parts inactive!") - var/list/slot_strings = list() - for(var/slot in required_slots) - var/list/slot_list = parse_slot_flags(slot) - slot_strings += (length(slot_list) == 1 ? "" : "one of ") + english_list(slot_list, and_text = " or ") - to_chat(mod.wearer, span_warning("[src] requires these slots to be deployed: [english_list(slot_strings)]")) - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + if(!has_required_parts(mod.mod_parts, need_active = TRUE) && !(allow_flags & MODULE_ALLOW_UNWORN)) // Doesn't have parts + balloon_alert(activator, "required parts inactive!") + var/list/slot_strings = list() + for(var/slot in required_slots) + var/list/slot_list = parse_slot_flags(slot) + slot_strings += (length(slot_list) == 1 ? "" : "one of ") + english_list(slot_list, and_text = " or ") + to_chat(activator, span_warning("[src] requires these slots to be deployed: [english_list(slot_strings)]")) + playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return if(module_type != MODULE_USABLE) if(active) - deactivate() + deactivate(activator) else - activate() + activate(activator) else - used() + used(activator) SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) /// Apply a cooldown until this item can be used again @@ -141,16 +138,16 @@ SEND_SIGNAL(src, COMSIG_MODULE_COOLDOWN_STARTED, applied_cooldown) /// Called when the module is activated -/obj/item/mod/module/proc/activate() +/obj/item/mod/module/proc/activate(mob/activator) if(!COOLDOWN_FINISHED(src, cooldown_timer)) - balloon_alert(mod.wearer, "on cooldown!") + balloon_alert(activator, "on cooldown!") return FALSE if(!mod.active || mod.activating || !mod.get_charge()) - balloon_alert(mod.wearer, "unpowered!") + balloon_alert(activator, "unpowered!") return FALSE if(!(allow_flags & MODULE_ALLOW_PHASEOUT) && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) //specifically a to_chat because the user is phased out. - to_chat(mod.wearer, span_warning("You cannot activate this right now.")) + to_chat(activator, span_warning("You cannot activate this right now.")) return FALSE if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE @@ -160,25 +157,25 @@ mod.selected_module = src if(device) if(mod.wearer.put_in_hands(device)) - balloon_alert(mod.wearer, "[device] extended") + balloon_alert(activator, "[device] extended") RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) RegisterSignal(mod.wearer, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) else - balloon_alert(mod.wearer, "can't extend [device]!") + balloon_alert(activator, "can't extend [device]!") mod.wearer.transferItemToLoc(device, src, force = TRUE) return FALSE else var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK update_signal(used_button) - balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") // As of now, only wearers can "use" mods active = TRUE SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED) - on_activation() + on_activation(activator) update_clothing_slots() return TRUE /// Called when the module is deactivated -/obj/item/mod/module/proc/deactivate(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/proc/deactivate(mob/activator, display_message = TRUE, deleting = FALSE) active = FALSE if(module_type == MODULE_ACTIVE) mod.selected_module = null @@ -192,12 +189,15 @@ UnregisterSignal(mod.wearer, used_signal) used_signal = null SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED, mod.wearer) - on_deactivation(display_message = TRUE, deleting = FALSE) + on_deactivation(activator, display_message = TRUE, deleting = FALSE) update_clothing_slots() return TRUE /// Call to update all slots visually affected by this module /obj/item/mod/module/proc/update_clothing_slots() + if(!mod.wearer) + return + var/updated_slots = mod.slot_flags if (mask_worn_overlay) for (var/obj/item/part as anything in mod.get_parts()) @@ -208,24 +208,25 @@ mod.wearer.update_clothing(updated_slots) /// Called when the module is used -/obj/item/mod/module/proc/used() +/obj/item/mod/module/proc/used(mob/activator) if(!COOLDOWN_FINISHED(src, cooldown_timer)) - balloon_alert(mod.wearer, "on cooldown!") + balloon_alert(activator, "on cooldown!") return FALSE if(!check_power(use_energy_cost)) - balloon_alert(mod.wearer, "not enough charge!") + balloon_alert(activator, "not enough charge!") return FALSE if(!(allow_flags & MODULE_ALLOW_PHASEOUT) && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) //specifically a to_chat because the user is phased out. - to_chat(mod.wearer, span_warning("You cannot activate this right now.")) + to_chat(activator, span_warning("You cannot activate this right now.")) return FALSE if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE) return FALSE start_cooldown() - addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts + if(mod.wearer) + addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts update_clothing_slots() SEND_SIGNAL(src, COMSIG_MODULE_USED) - on_use() + on_use(activator) return TRUE /// Called when an activated module without a device is used @@ -257,15 +258,15 @@ return TRUE /// Called from the module's activate() -/obj/item/mod/module/proc/on_activation() +/obj/item/mod/module/proc/on_activation(mob/activator) return /// Called from the module's deactivate() -/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/proc/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) return /// Called from the module's used() -/obj/item/mod/module/proc/on_use() +/obj/item/mod/module/proc/on_use(mob/activator) return /// Called on the MODsuit's process if it is an active module diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 436d3dc9e87..f79701e7961 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -63,7 +63,7 @@ drain_power(use_energy_cost) grab_atom(target) -/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) clear_grab(playsound = !deleting) /obj/item/mod/module/anomaly_locked/kinesis/process(seconds_per_tick) diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 9f1cec7e9fa..4b948d6ed07 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -15,12 +15,22 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) + allow_flags = list(MODULE_ALLOW_INACTIVE|MODULE_ALLOW_UNWORN) /// The pathfinding implant. var/obj/item/implant/mod/implant + /// Whether the implant has been used or not + var/implant_inside = TRUE + /// The jet icon we apply to the MOD. + var/image/jet_icon + /// Allow suit activation - Lets this module be recalled from the MOD. + var/allow_suit_activation = FALSE // I'm not here to argue about balance + /obj/item/mod/module/pathfinder/Initialize(mapload) . = ..() implant = new(src) + jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER) + /obj/item/mod/module/pathfinder/Destroy() QDEL_NULL(implant) @@ -28,28 +38,28 @@ /obj/item/mod/module/pathfinder/Exited(atom/movable/gone, direction) if(gone == implant) - implant = null + implant_inside = FALSE update_icon_state() return ..() /obj/item/mod/module/pathfinder/update_icon_state() . = ..() - icon_state = implant ? "pathfinder" : "pathfinder_empty" + icon_state = implant_inside ? "pathfinder" : "pathfinder_empty" /obj/item/mod/module/pathfinder/examine(mob/user) . = ..() - if(implant) + if(implant_inside) . += span_notice("Use it on a human to implant them.") else . += span_warning("The implant is missing.") /obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) - if(!ishuman(target) || !implant) + if(!ishuman(target) || !implant_inside) // Not human, or no implant in module return if(!do_after(user, 1.5 SECONDS, target = target)) balloon_alert(user, "interrupted!") return - if(!implant.implant(target, user)) + if(!implant.implant(target, user)) // If implant fails balloon_alert(user, "can't implant!") return if(target == user) @@ -57,21 +67,29 @@ else target.visible_message(span_notice("[user] implants [target]."), span_notice("[user] implants you with [implant].")) playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) - module_type = MODULE_PASSIVE -/obj/item/mod/module/pathfinder/on_use() +/obj/item/mod/module/pathfinder/on_use(mob/activator) . = ..() - if (!ishuman(mod.wearer) || !implant) + if(mod.wearer && implant_inside) // implant them + try_implant(activator) + return + if(mod.wearer) + balloon_alert(activator, "suit already worn!") + else + recall(activator) + + +/// Assuming we have a wearer, attempt to implant them. +/obj/item/mod/module/pathfinder/proc/try_implant(mob/activator) + if(!ishuman(mod.wearer)) // Wearer isn't human return if(!implant.implant(mod.wearer, mod.wearer)) - balloon_alert(mod.wearer, "can't implant!") + balloon_alert(activator, "can't implant!") return - balloon_alert(mod.wearer, "implanted") + balloon_alert(activator, "implanted") + if(!(activator == mod.wearer)) // someone else implanted you + balloon_alert(mod.wearer, "pathfinder MOD tracker implanted!") playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) - module_type = MODULE_PASSIVE - var/datum/action/item_action/mod/pinnable/module/existing_action = pinned_to[REF(mod.wearer)] - if(existing_action) - mod.remove_item_action(existing_action) /obj/item/mod/module/pathfinder/proc/attach(mob/living/user) if(!ishuman(user)) @@ -87,27 +105,86 @@ playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) drain_power(use_energy_cost) +/obj/item/mod/module/pathfinder/proc/recall(mob/recaller) + if(!implant) + balloon_alert(recaller, "no target implant!") + return FALSE + if(recaller != implant.imp_in && !allow_suit_activation) // No pAI recalling + balloon_alert(recaller, "sector safety regulations prevent MOD-side recalling!") + return FALSE + if(mod.open) + balloon_alert(recaller, "cover open!") + return FALSE + if(mod.ai_controller) + balloon_alert(recaller, "already moving!") + return FALSE + if(ismob(get_atom_on_turf(mod))) + balloon_alert(recaller, "already on someone!") + return FALSE + if(mod.z != implant.imp_in.z || get_dist(implant.imp_in, mod) > MOD_AI_RANGE) + balloon_alert(recaller, "too far!") + return FALSE + var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(mod) + mod.ai_controller = mod_ai + mod_ai.set_movement_target(type, implant.imp_in) + mod_ai.set_blackboard_key(BB_MOD_TARGET, implant.imp_in) + mod_ai.set_blackboard_key(BB_MOD_MODULE, src) + mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + mod.AddElement(/datum/element/movetype_handler) + ADD_TRAIT(mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + animate(mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) + mod.add_overlay(jet_icon) + RegisterSignal(mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + balloon_alert(recaller, "suit recalled") + if(!(recaller == mod.wearer)) + balloon_alert(mod.wearer, "suit recalled") + return TRUE + +/obj/item/mod/module/pathfinder/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + var/matrix/mod_matrix = matrix() + mod_matrix.Turn(get_angle(source, implant.imp_in)) + source.transform = mod_matrix + +/obj/item/mod/module/pathfinder/proc/end_recall(successful = TRUE) + if(!mod) + return + QDEL_NULL(mod.ai_controller) + mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP + REMOVE_TRAIT(mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + mod.RemoveElement(/datum/element/movetype_handler) + mod.cut_overlay(jet_icon) + mod.transform = matrix() + UnregisterSignal(mod, COMSIG_MOVABLE_MOVED) + if(!successful) + balloon_alert(implant.imp_in, "suit lost connection!") + +// ########### +// THE INPLANT +// ########### + + /obj/item/implant/mod name = "MOD pathfinder implant" desc = "Lets you recall a MODsuit to you at any time." actions_types = list(/datum/action/item_action/mod_recall) + allow_multiple = TRUE // Surgrey is annoying if you loose your MOD /// The pathfinder module we are linked to. var/obj/item/mod/module/pathfinder/module - /// The jet icon we apply to the MOD. - var/image/jet_icon + + /obj/item/implant/mod/Initialize(mapload) . = ..() if(!istype(loc, /obj/item/mod/module/pathfinder)) return INITIALIZE_HINT_QDEL module = loc - jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER) /obj/item/implant/mod/Destroy() if(module?.mod?.ai_controller) - end_recall(successful = FALSE) + module.end_recall(successful = FALSE) module = null - jet_icon = null return ..() /obj/item/implant/mod/get_data() @@ -115,55 +192,6 @@ Name: Nakamura Engineering Pathfinder Implant
    \ Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
    " -/obj/item/implant/mod/proc/recall() - if(!module?.mod) - balloon_alert(imp_in, "no connected unit!") - return FALSE - if(module.mod.open) - balloon_alert(imp_in, "cover open!") - return FALSE - if(module.mod.ai_controller) - balloon_alert(imp_in, "already moving!") - return FALSE - if(ismob(get_atom_on_turf(module.mod))) - balloon_alert(imp_in, "already on someone!") - return FALSE - if(module.z != z || get_dist(imp_in, module.mod) > MOD_AI_RANGE) - balloon_alert(imp_in, "too far!") - return FALSE - var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(module.mod) - module.mod.ai_controller = mod_ai - mod_ai.set_movement_target(type, imp_in) - mod_ai.set_blackboard_key(BB_MOD_TARGET, imp_in) - mod_ai.set_blackboard_key(BB_MOD_IMPLANT, src) - module.mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP - module.mod.AddElement(/datum/element/movetype_handler) - ADD_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) - module.mod.add_overlay(jet_icon) - RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - balloon_alert(imp_in, "suit recalled") - return TRUE - -/obj/item/implant/mod/proc/end_recall(successful = TRUE) - if(!module?.mod) - return - QDEL_NULL(module.mod.ai_controller) - module.mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP - REMOVE_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - module.mod.RemoveElement(/datum/element/movetype_handler) - module.mod.cut_overlay(jet_icon) - module.mod.transform = matrix() - UnregisterSignal(module.mod, COMSIG_MOVABLE_MOVED) - if(!successful) - balloon_alert(imp_in, "suit lost connection!") - -/obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - - var/matrix/mod_matrix = matrix() - mod_matrix.Turn(get_angle(source, imp_in)) - source.transform = mod_matrix /datum/action/item_action/mod_recall name = "Recall MOD" @@ -185,7 +213,7 @@ /datum/action/item_action/mod_recall/do_effect(trigger_flags) var/obj/item/implant/mod/implant = target if(!COOLDOWN_FINISHED(src, recall_cooldown)) - implant.balloon_alert(implant.imp_in, "on cooldown!") + implant.balloon_alert(owner, "on cooldown!") return - if(implant.recall()) + if(implant.module.recall(owner)) // change this COOLDOWN_START(src, recall_cooldown, 15 SECONDS) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index b190d872d39..32b11f23c59 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -292,7 +292,7 @@ complexity = 2 incompatible_modules = list(/obj/item/mod/module/chameleon) cooldown_time = 0.5 SECONDS - allow_flags = MODULE_ALLOW_INACTIVE + allow_flags = list(MODULE_ALLOW_INACTIVE|MODULE_ALLOW_UNWORN) /// A list of all the items the suit can disguise as. var/list/possible_disguises = list() /// The path of the item we're disguised as. @@ -314,17 +314,17 @@ return_look() possible_disguises = null -/obj/item/mod/module/chameleon/used() +/obj/item/mod/module/chameleon/used(mob/activator) if(mod.active || mod.activating) - balloon_alert(mod.wearer, "unit active!") + balloon_alert(activator, "unit active!") return FALSE return ..() -/obj/item/mod/module/chameleon/on_use() +/obj/item/mod/module/chameleon/on_use(mob/activator) if(current_disguise) return_look() return - var/picked_name = tgui_input_list(mod.wearer, "Select look to change into", "Chameleon Settings", possible_disguises) + var/picked_name = tgui_input_list(activator, "Select look to change into", "Chameleon Settings", possible_disguises) if(!possible_disguises[picked_name] || mod.active || mod.activating) return current_disguise = possible_disguises[picked_name] @@ -506,10 +506,10 @@ if(disrupted.on_saboteur(src, 1 MINUTES)) mod.add_charge(DEFAULT_CHARGE_DRAIN * 250) -/obj/item/mod/module/stealth/wraith/on_activation() +/obj/item/mod/module/stealth/wraith/on_activation(mob/activator) return // Don't activate stealth when the module is activated because the stealth portion of the module is fully passive -/obj/item/mod/module/stealth/wraith/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/stealth/wraith/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) . = ..() UnregisterSignal(mod.wearer, list(COMSIG_LIVING_MOB_BUMP, COMSIG_ATOM_BUMPED, COMSIG_MOB_FIRED_GUN)) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index fa28e7aaee6..54c6f09b8b1 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -81,11 +81,11 @@ . = ..() UnregisterSignal(mod, COMSIG_MOD_UPDATE_SPEED) -/obj/item/mod/module/magboot/on_activation() +/obj/item/mod/module/magboot/on_activation(mob/activator) mod.wearer.add_traits(active_traits, REF(src)) mod.update_speed() -/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/magboot/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) mod.wearer.remove_traits(active_traits, REF(src)) mod.update_speed() @@ -140,7 +140,7 @@ if (key == "cut_tethers") SEND_SIGNAL(src, COMSIG_MOD_TETHER_SNAP) -/obj/item/mod/module/tether/on_deactivation(display_message, deleting) +/obj/item/mod/module/tether/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) SEND_SIGNAL(src, COMSIG_MOD_TETHER_SNAP) /obj/projectile/tether @@ -394,7 +394,7 @@ /obj/item/mod/module/constructor/on_part_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, REF(src)) -/obj/item/mod/module/constructor/on_use() +/obj/item/mod/module/constructor/on_use(mob/activator) rcd_scan(src, fade_time = 10 SECONDS) drain_power(use_energy_cost) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index da2440dec8f..c1fbaba91f0 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -171,12 +171,12 @@ return FALSE return TRUE -/obj/item/mod/module/jetpack/on_activation() +/obj/item/mod/module/jetpack/on_activation(mob/activator) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/full_speed) if (!stabilize) ADD_TRAIT(mod.wearer, TRAIT_NOGRAV_ALWAYS_DRIFT, REF(src)) -/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/jetpack/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/full_speed) REMOVE_TRAIT(mod.wearer, TRAIT_NOGRAV_ALWAYS_DRIFT, REF(src)) @@ -206,9 +206,9 @@ incompatible_modules = list(/obj/item/mod/module/jump_jet) required_slots = list(ITEM_SLOT_BACK) -/obj/item/mod/module/jump_jet/on_use() +/obj/item/mod/module/jump_jet/on_use(mob/activator) if (DOING_INTERACTION(mod.wearer, mod.wearer)) - balloon_alert(mod.wearer, "busy!") + balloon_alert(activator, "busy!") return balloon_alert(mod.wearer, "launching...") mod.wearer.Shake(duration = 1 SECONDS) @@ -438,12 +438,12 @@ /// Maximum range we can set. var/max_range = 5 -/obj/item/mod/module/flashlight/on_activation() +/obj/item/mod/module/flashlight/on_activation(mob/activator) set_light_flags(light_flags | LIGHT_ATTACHED) set_light_on(active) active_power_cost = base_power * light_range -/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/flashlight/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) set_light_flags(light_flags & ~LIGHT_ATTACHED) set_light_on(active) @@ -518,13 +518,13 @@ /// Time it takes for us to dispense. var/dispense_time = 0 SECONDS -/obj/item/mod/module/dispenser/on_use() +/obj/item/mod/module/dispenser/on_use(mob/activator) if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) balloon_alert(mod.wearer, "interrupted!") return FALSE var/obj/item/dispensed = new dispense_type(mod.wearer.loc) mod.wearer.put_in_hands(dispensed) - balloon_alert(mod.wearer, "[dispensed] dispensed") + balloon_alert(activator, "[dispensed] dispensed") playsound(src, 'sound/machines/click.ogg', 100, TRUE) drain_power(use_energy_cost) return dispensed @@ -627,9 +627,9 @@ UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT) -/obj/item/mod/module/dna_lock/on_use() +/obj/item/mod/module/dna_lock/on_use(mob/activator) dna = mod.wearer.dna.unique_enzymes - balloon_alert(mod.wearer, "dna updated") + balloon_alert(activator, "dna updated") drain_power(use_energy_cost) /obj/item/mod/module/dna_lock/emp_act(severity) @@ -855,11 +855,11 @@ container = null return ..() -/obj/item/mod/module/recycler/on_activation() +/obj/item/mod/module/recycler/on_activation(mob/activator) connector = AddComponent(/datum/component/connect_loc_behalf, mod.wearer, loc_connections) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) -/obj/item/mod/module/recycler/on_deactivation(display_message, deleting = FALSE) +/obj/item/mod/module/recycler/on_deactivation(mob/activator, display_message, deleting = FALSE) QDEL_NULL(connector) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_moved)) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 17804dcd406..2e0b2dba3a0 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -136,12 +136,12 @@ QDEL_NULL(rave_screen) return ..() -/obj/item/mod/module/visor/rave/on_activation() +/obj/item/mod/module/visor/rave/on_activation(mob/activator) rave_screen = mod.wearer.add_client_colour(/datum/client_colour/rave, REF(src)) rave_screen.update_color(rainbow_order[rave_number]) music_player.start_music(mod.wearer) -/obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/visor/rave/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) QDEL_NULL(rave_screen) if(isnull(music_player.active_song_sound)) return @@ -199,7 +199,7 @@ cooldown_time = 30 SECONDS required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) -/obj/item/mod/module/tanner/on_use() +/obj/item/mod/module/tanner/on_use(mob/activator) playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, TRUE) var/datum/reagents/holder = new() holder.add_reagent(/datum/reagent/spraytan, 10) @@ -223,7 +223,7 @@ var/blowing_time = 10 SECONDS var/oxygen_damage = 20 -/obj/item/mod/module/balloon/on_use() +/obj/item/mod/module/balloon/on_use(mob/activator) if(!do_after(mod.wearer, blowing_time, target = mod)) return FALSE mod.wearer.adjustOxyLoss(oxygen_damage) @@ -247,7 +247,7 @@ /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. var/num_sheets_dispensed = 0 -/obj/item/mod/module/paper_dispenser/on_use() +/obj/item/mod/module/paper_dispenser/on_use(mob/activator) if(!do_after(mod.wearer, 1 SECONDS, target = mod)) return FALSE @@ -316,7 +316,7 @@ /// If you use the module on a planetary turf, you fly up. To the sky. var/you_fucked_up = FALSE -/obj/item/mod/module/atrocinator/on_activation() +/obj/item/mod/module/atrocinator/on_activation(mob/activator) playsound(src, 'sound/effects/curse/curseattack.ogg', 50) mod.wearer.AddElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(check_upstairs)) @@ -325,13 +325,13 @@ passtable_on(mod.wearer, REF(src)) check_upstairs() //todo at some point flip your screen around -/obj/item/mod/module/atrocinator/deactivate(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/atrocinator/deactivate(mob/activator, display_message = TRUE, deleting = FALSE) if(you_fucked_up && !deleting) - to_chat(mod.wearer, span_danger("It's too late.")) + to_chat(activator, span_danger("It's too late.")) return FALSE return ..() -/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/atrocinator/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(!deleting) playsound(src, 'sound/effects/curse/curseattack.ogg', 50) qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 50fbda88467..e0674545004 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -19,7 +19,7 @@ /// The alpha applied when the cloak is on. var/stealth_alpha = 50 -/obj/item/mod/module/stealth/on_activation() +/obj/item/mod/module/stealth/on_activation(mob/activator) if(bumpoff) RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) @@ -28,7 +28,7 @@ animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_energy_cost) -/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/stealth/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(bumpoff) UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) @@ -72,11 +72,11 @@ cooldown_time = 3 SECONDS -/obj/item/mod/module/stealth/ninja/on_activation() +/obj/item/mod/module/stealth/ninja/on_activation(mob/activator) . = ..() ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, REF(src)) -/obj/item/mod/module/stealth/ninja/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/stealth/ninja/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) . = ..() REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, REF(src)) @@ -287,7 +287,7 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 cooldown_time = 8 SECONDS -/obj/item/mod/module/emp_shield/pulse/on_use() +/obj/item/mod/module/emp_shield/pulse/on_use(mob/activator) playsound(src, 'sound/effects/empulse.ogg', 60, TRUE) empulse(src, heavy_range = 4, light_range = 6) drain_power(use_energy_cost) @@ -420,7 +420,7 @@ return FALSE return ..() -/obj/item/mod/module/adrenaline_boost/on_use() +/obj/item/mod/module/adrenaline_boost/on_use(mob/activator) if(IS_SPACE_NINJA(mod.wearer)) mod.wearer.say(pick_list_replacements(NINJA_FILE, "lines"), forced = type) to_chat(mod.wearer, span_notice("You have used the adrenaline boost.")) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index 8cb15d35370..8a41d449edf 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -13,10 +13,10 @@ incompatible_modules = list(/obj/item/mod/module/reagent_scanner) required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) -/obj/item/mod/module/reagent_scanner/on_activation() +/obj/item/mod/module/reagent_scanner/on_activation(mob/activator) ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, REF(src)) -/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/reagent_scanner/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, REF(src)) /obj/item/mod/module/reagent_scanner/advanced @@ -29,12 +29,12 @@ removable = FALSE var/explosion_detection_dist = 21 -/obj/item/mod/module/reagent_scanner/advanced/on_activation() +/obj/item/mod/module/reagent_scanner/advanced/on_activation(mob/activator) . = ..() ADD_TRAIT(mod.wearer, TRAIT_RESEARCH_SCANNER, REF(src)) RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) -/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) . = ..() REMOVE_TRAIT(mod.wearer, TRAIT_RESEARCH_SCANNER, REF(src)) UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) @@ -61,13 +61,13 @@ accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) -/obj/item/mod/module/anomaly_locked/antigrav/on_activation() +/obj/item/mod/module/anomaly_locked/antigrav/on_activation(mob/activator) if(mod.wearer.has_gravity()) new /obj/effect/temp_visual/mook_dust(get_turf(src)) mod.wearer.AddElement(/datum/element/forced_gravity, 0) playsound(src, 'sound/effects/gravhit.ogg', 50) -/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) if(deleting) return diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index a19cd09db2b..14f5ad80254 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -82,7 +82,7 @@ /obj/item/mod/module/pepper_shoulders/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK) -/obj/item/mod/module/pepper_shoulders/on_use() +/obj/item/mod/module/pepper_shoulders/on_use(mob/activator) playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) var/datum/reagents/capsaicin_holder = new(10) capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10) @@ -117,7 +117,7 @@ /// Gun we have holstered. var/obj/item/gun/holstered -/obj/item/mod/module/holster/on_use() +/obj/item/mod/module/holster/on_use(mob/activator) if(!holstered) var/obj/item/gun/holding = mod.wearer.get_active_held_item() if(!holding) @@ -163,10 +163,10 @@ /// List of spans we add to the speaker. var/list/voicespan = list(SPAN_COMMAND) -/obj/item/mod/module/megaphone/on_activation() +/obj/item/mod/module/megaphone/on_activation(mob/activator) RegisterSignal(mod.wearer, COMSIG_MOB_SAY, PROC_REF(handle_speech)) -/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/megaphone/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) /obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args) @@ -203,7 +203,7 @@ idle_power_cost = linked_bodybag ? (DEFAULT_CHARGE_DRAIN * 3) : 0 return ..() -/obj/item/mod/module/criminalcapture/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/criminalcapture/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(!linked_bodybag) return packup() @@ -269,7 +269,7 @@ overlay_state_inactive = "module_mirage_grenade" dispense_type = /obj/item/grenade/mirage -/obj/item/mod/module/dispenser/mirage/on_use() +/obj/item/mod/module/dispenser/mirage/on_use(mob/activator) var/obj/item/grenade/mirage/grenade = ..() grenade.arm_grenade(mod.wearer) @@ -324,12 +324,12 @@ . = ..() projectile_effect = image('icons/effects/fields.dmi', "projectile_dampen_effect") -/obj/item/mod/module/projectile_dampener/on_activation() +/obj/item/mod/module/projectile_dampener/on_activation(mob/activator) if(istype(dampening_field)) QDEL_NULL(dampening_field) dampening_field = new(mod.wearer, field_radius, TRUE, src) -/obj/item/mod/module/projectile_dampener/on_deactivation(display_message, deleting = FALSE) +/obj/item/mod/module/projectile_dampener/on_deactivation(mob/activator, display_message, deleting = FALSE) QDEL_NULL(dampening_field) ///Active Sonar - Displays a hud circle on the turf of any living creatures in the given radius @@ -429,12 +429,12 @@ scanned_slice = 1 COOLDOWN_START(src, scan_cooldown, scan_cooldown_time) -/obj/item/mod/module/active_sonar/on_use() - balloon_alert(mod.wearer, "readying sonar...") +/obj/item/mod/module/active_sonar/on_use(mob/activator) + balloon_alert(activator, "readying sonar...") playsound(mod.wearer, 'sound/vehicles/mecha/skyfall_power_up.ogg', vol = 20, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) if(!do_after(mod.wearer, 1.1 SECONDS, target = mod)) return - playsound(mod.wearer, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE) // Should be audible for the radius of the sonar + playsound(src, 'sound/effects/ping_hit.ogg', vol = 75, vary = TRUE) // Should be audible for the radius of the sonar to_chat(mod.wearer, span_notice("You slam your fist into the ground, sending out a sonic wave that detects [detect_living_creatures()] living beings nearby!")) for(var/mob/living/creature as anything in keyed_creatures) new /obj/effect/temp_visual/sonar_ping(mod.wearer.loc, mod.wearer, creature) diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 3a53705e24b..9ca53939fb2 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -12,7 +12,7 @@ incompatible_modules = list(/obj/item/mod/module/bikehorn) cooldown_time = 1 SECONDS -/obj/item/mod/module/bikehorn/on_use() +/obj/item/mod/module/bikehorn/on_use(mob/activator) playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) drain_power(use_energy_cost) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 75223f92162..4ba54760aca 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -18,8 +18,8 @@ . = ..() AddComponent(/datum/component/gps/item, "MOD0", state = GLOB.deep_inventory_state, overlay_state = FALSE) -/obj/item/mod/module/gps/on_use() - attack_self(mod.wearer) +/obj/item/mod/module/gps/on_use(mob/activator) + attack_self(mod.wearer) // todo: refactor to make compatable with pAIs. Maybe ui_interact(activator) ///Hydraulic Clamp - Lets you pick up and drop crates. /obj/item/mod/module/clamp @@ -40,16 +40,28 @@ var/load_time = 3 SECONDS /// The max amount of crates you can carry. var/max_crates = 3 + /// Disallow mobs larger than this size in containers + var/max_mob_size = MOB_SIZE_SMALL + /// Items that allowed to be picked up by this module + var/list/accepted_items /// The crates stored in the module. var/list/stored_crates = list() + +/obj/item/mod/module/clamp/Initialize(mapload) + . = ..() + accepted_items = typecacheof(list( + /obj/structure/closet/crate, + /obj/item/delivery/big + )) + /obj/item/mod/module/clamp/on_select_use(atom/target) . = ..() if(!.) return if(!mod.wearer.Adjacent(target)) return - if(istype(target, /obj/structure/closet/crate) || istype(target, /obj/item/delivery/big)) + if(is_type_in_typecache(target, accepted_items)) var/atom/movable/picked_crate = target if(!check_crate_pickup(picked_crate)) return @@ -92,7 +104,7 @@ balloon_alert(mod.wearer, "too many crates!") return FALSE for(var/mob/living/mob in target.get_all_contents()) - if(mob.mob_size < MOB_SIZE_HUMAN) + if(mob.mob_size <= max_mob_size) continue balloon_alert(mod.wearer, "crate too heavy!") return FALSE @@ -124,10 +136,10 @@ overlay_state_active = "module_drill" required_slots = list(ITEM_SLOT_GLOVES) -/obj/item/mod/module/drill/on_activation() +/obj/item/mod/module/drill/on_activation(mob/activator) RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) -/obj/item/mod/module/drill/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/drill/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP) /obj/item/mod/module/drill/on_select_use(atom/target) @@ -202,7 +214,7 @@ ore.forceMove(src) ores += ore -/obj/item/mod/module/orebag/on_use() +/obj/item/mod/module/orebag/on_use(mob/activator) for(var/obj/item/ore as anything in ores) ore.forceMove(drop_location()) ores -= ore @@ -333,7 +345,7 @@ locker.throw_at(mod.wearer, range = 7, speed = 3, force = MOVE_FORCE_WEAK, \ callback = CALLBACK(src, PROC_REF(check_locker), locker)) -/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/magnet/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(istype(mod.wearer.pulling, /obj/structure/closet)) mod.wearer.stop_pulling() @@ -483,13 +495,13 @@ TRAIT_NO_SLIP_ALL, ) -/obj/item/mod/module/sphere_transform/activate() +/obj/item/mod/module/sphere_transform/activate(mob/activator) if(!mod.wearer.has_gravity()) - balloon_alert(mod.wearer, "no gravity!") + balloon_alert(activator, "no gravity!") return FALSE return ..() -/obj/item/mod/module/sphere_transform/on_activation() +/obj/item/mod/module/sphere_transform/on_activation(mob/activator) playsound(src, 'sound/items/modsuit/ballin.ogg', 100, TRUE) mod.wearer.add_filter("mod_ball", 1, alpha_mask_filter(icon = icon('icons/mob/clothing/modsuit/mod_modules.dmi', "ball_mask"), flags = MASK_INVERSE)) mod.wearer.add_filter("mod_blur", 2, angular_blur_filter(size = 15)) @@ -503,7 +515,7 @@ mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) -/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/sphere_transform/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(!deleting) playsound(src, 'sound/items/modsuit/ballin.ogg', 100, TRUE, frequency = -1) mod.wearer.remove_offsets(REF(src)) @@ -516,9 +528,9 @@ mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/sphere) UnregisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE) -/obj/item/mod/module/sphere_transform/used() +/obj/item/mod/module/sphere_transform/used(mob/activator) if(!lavaland_equipment_pressure_check(get_turf(src))) - balloon_alert(mod.wearer, "too much pressure!") + balloon_alert(activator, "too much pressure!") playsound(src, 'sound/items/weapons/gun/general/dry_fire.ogg', 25, TRUE) return FALSE return ..() diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 701cbc30421..0a18a559830 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -29,9 +29,10 @@ UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) -/obj/item/mod/module/eradication_lock/on_use() +/obj/item/mod/module/eradication_lock/on_use(mob/activator) true_owner_ckey = mod.wearer.ckey - balloon_alert(mod.wearer, "user remembered") + balloon_alert(activator, "user remembered") + playsound(src, 'sound/items/pshoom/pshoom.ogg', 25, TRUE) drain_power(use_energy_cost) ///Signal fired when the modsuit tries activating @@ -66,8 +67,8 @@ cooldown_time = 20 SECONDS required_slots = list(ITEM_SLOT_BACK) -/obj/item/mod/module/rewinder/on_use() - balloon_alert(mod.wearer, "anchor point set") +/obj/item/mod/module/rewinder/on_use(mob/activator) + balloon_alert(activator, "anchor point set") playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) //stops all mods from triggering during rewinding for(var/obj/item/mod/module/module as anything in mod.modules) @@ -110,13 +111,13 @@ ///The current timestop in progress. var/obj/effect/timestop/channelled/timestop -/obj/item/mod/module/timestopper/used() +/obj/item/mod/module/timestopper/used(mob/activator) if(timestop) - mod.balloon_alert(mod.wearer, "already freezing time!") + mod.balloon_alert(activator, "already freezing time!") return FALSE return ..() -/obj/item/mod/module/timestopper/on_use() +/obj/item/mod/module/timestopper/on_use(mob/activator) //stops all mods from triggering during timestop- including timestop itself for(var/obj/item/mod/module/module as anything in mod.modules) RegisterSignal(module, COMSIG_MODULE_TRIGGERED, PROC_REF(on_module_triggered)) @@ -159,14 +160,14 @@ ///The dummy for phasing from this module, the wearer is phased out while this exists. var/obj/effect/dummy/phased_mob/chrono/phased_mob -/obj/item/mod/module/timeline_jumper/used() +/obj/item/mod/module/timeline_jumper/used(mob/activator) var/area/noteleport_check = get_area(mod.wearer) if(noteleport_check && !check_teleport_valid(mod.wearer, get_turf(mod.wearer))) - to_chat(mod.wearer, span_danger("Some dull, universal force is between you and the [phased_mob ? "current timeline" : "stream between timelines"].")) + to_chat(activator, span_danger("Some dull, universal force is between you and the [phased_mob ? "current timeline" : "stream between timelines"].")) return FALSE return ..() -/obj/item/mod/module/timeline_jumper/on_use() +/obj/item/mod/module/timeline_jumper/on_use(mob/activator) if(!phased_mob) //phasing out mod.visible_message(span_warning("[mod.wearer] leaps out of the timeline!")) diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 7897ac404f2..c865cc3e670 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -12,12 +12,12 @@ /// The traits given by the visor. var/list/visor_traits = list() -/obj/item/mod/module/visor/on_activation() +/obj/item/mod/module/visor/on_activation(mob/activator) if(length(visor_traits)) mod.wearer.add_traits(visor_traits, REF(src)) mod.wearer.update_sight() -/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/visor/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) if(length(visor_traits)) mod.wearer.remove_traits(visor_traits, REF(src)) mod.wearer.update_sight() @@ -91,10 +91,10 @@ incompatible_modules = list(/obj/item/mod/module/night, /obj/item/mod/module/visor/night) required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) -/obj/item/mod/module/night/on_activation() - ADD_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) +/obj/item/mod/module/night/on_activation(mob/activator) + mod.wearer.add_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() -/obj/item/mod/module/night/on_deactivation(display_message = TRUE, deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) +/obj/item/mod/module/night/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) + mod.wearer.remove_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() From 78e865da06324eebb9542dc6e4c3d09795c599c2 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 10:27:55 +0000 Subject: [PATCH 063/107] Automatic changelog for PR #92424 [ci skip] --- html/changelogs/AutoChangeLog-pr-92424.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92424.yml diff --git a/html/changelogs/AutoChangeLog-pr-92424.yml b/html/changelogs/AutoChangeLog-pr-92424.yml new file mode 100644 index 00000000000..6c3ece0206a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92424.yml @@ -0,0 +1,4 @@ +author: "Stonetear" +delete-after: True +changes: + - refactor: "MODsuit module code now knows who clicked the activation button." \ No newline at end of file From 1b0d70ca7a2fca8a99269ebb10490758a6b79c42 Mon Sep 17 00:00:00 2001 From: arbuzik456 <114090591+arbuzik456@users.noreply.github.com> Date: Sun, 7 Sep 2025 20:08:04 +0800 Subject: [PATCH 064/107] Tongue great escape. Freak update (#92858) ## About The Pull Request there was this unused(?) hotkey "tongue" which were bugging me so its useless no more visuals: ![stongue](https://github.com/user-attachments/assets/f4534891-4f8f-4c6d-b3e8-bee007a2519f) ## Why It's Good For The Game ![phpto](https://github.com/user-attachments/assets/c4c77eff-9fc8-4d23-b9da-4ae317da9606) telling people how you really feel is awesomesauce ## Changelog :cl: add: Added tongue emote mechanic where you can stick out your tongue /:cl: --- code/__DEFINES/colors.dm | 1 + .../emote_bodypart_overlay.dm | 7 +++++++ code/modules/mob/living/emote.dm | 13 +++++++++++++ icons/mob/human/emote_visuals.dmi | Bin 1754 -> 1805 bytes 4 files changed, 21 insertions(+) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 54e0ee49ef3..87640a50bf3 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -124,6 +124,7 @@ #define COLOR_SCIENCE_PINK "#C96DBF" #define COLOR_MOSTLY_PURE_PINK "#E4005B" #define COLOR_ADMIN_PINK "#D100D1" +#define COLOR_TONGUE_PINK "#ff6ea0" #define COLOR_BLUSH_PINK "#DE5D83" #define COLOR_FADED_PINK "#ff80d5" #define COLOR_MAGENTA "#FF00FF" diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm index 344efc0ead0..cabb10558a0 100644 --- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm @@ -47,6 +47,13 @@ bodypart.add_bodypart_overlay(overlay) return overlay +/datum/bodypart_overlay/simple/emote/tongue + icon_state = "tongue" + draw_color = COLOR_TONGUE_PINK + layers = EXTERNAL_ADJACENT + offset_key = OFFSET_FACE + attached_body_zone = BODY_ZONE_HEAD + /datum/bodypart_overlay/simple/emote/blush icon_state = "blush" draw_color = COLOR_BLUSH_PINK diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 2c007f75ae5..1e9404f334d 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -14,6 +14,19 @@ . = ..() user.spin(TAUNT_EMOTE_DURATION, 0.1 SECONDS) +/datum/emote/living/tongue + key = "tongue" + key_third_person = "tongues" + message = "sticks their tongue out." + +/datum/emote/living/tongue/run_emote(mob/user, params, type_override, intentional) + var/mob/living/carbon/human/human_user = user + if(istype(human_user) && !human_user.get_organ_slot(ORGAN_SLOT_TONGUE)) + to_chat(human_user, span_warning("You don't have a tongue!")) + return + . = ..() + QDEL_IN(human_user.give_emote_overlay(/datum/bodypart_overlay/simple/emote/tongue), 5.2 SECONDS) + /datum/emote/living/blush key = "blush" key_third_person = "blushes" diff --git a/icons/mob/human/emote_visuals.dmi b/icons/mob/human/emote_visuals.dmi index 8a29603850f4ff6137f56ea3b460f83c483e9f36..8880693066d4322a9f030d52962cedb3ee7eb8cc 100644 GIT binary patch literal 1805 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Xt1r9c#$kCKlAAr<>s*s2hm(=3qqRfJl%=|nC zhKf0*{-?Q`97JNz*Bo`-KK(@I6tm5osxdF@eJU<9UY=pC_P4g1Nw=ufqF|okoUY*cw|Q%x5Mb(V_SENUVzMW1D71-J@4;OB+gf zh=nS={<;5^hO6`5+NMSx(X1;!4jw(X?(T~dV&z?&T31#WOk5;?{P*{kZQIXmF;t2@ zt`V}rAhwmmf3x(g`TmbD_-!e*ZCi9salO}1CYPx(yPj3nY-M0z2YdGd6Q=N_Y$K?e*_l%|E(k>*B<=g zv%`uR$-E6q>hDxBG(-zJD0nk8>M*iwVi7nY1{moX-Jt?9L2zn`x9e(#{|n?KjK z*XO@^Z0LKRnI$f}ck8nmpRX1F(E@6yVdF^QRG6UJ;4qDWDUyi>oUPFe*CVpmCo}G8 zzsqECd``9OYe9~G|2Of=U6hgA<}l?vvddAtK{4m`bmkq$qN;fgoxW-L=J9l9knKRu z-OJ~W{`hwa*#;Fp#vD5l*!yOZOC4;_4!A+oAY*W2;b3nmkAgqx3|45-O;}7yWY0k>KPpC zHtxG$)mFXnxZa!3yUMs9$Q0Yj&VLqnygH@&{iByZOrFmu-+$Zm+V{&ZzkJ;@S6=Db z^)1Ks&fTt@>$iM;zt}<3YulsGe+VjmBERa*%RO_if2@${7kHEX`)cf;8ugDJ>SEbz z@^5de-5H}7&)0tVdG-8QhQ?Ui`Sa>!_}b6+e{j-hIIvFcWo!d50q$d`K?(#W?rT?p zDdAUH_iLs<_Tjt_q+Z|NmK#6M|GYiW7kj@{J%76g#Mzen`_l@+nB?01UwOVi(%rqm z{@!63{d1RY+dv(A{BhwK!{^@XHiJU2_w>_G$Cux?|ND8D@VorpueGF0+9 z68^`Ri{E|U|6=QIi~Q%MJ7bPLEco%b!scIf-_P~mXHA{An*9SXoU$K%zkHsDYYx=wH`Q_j@o@ZtefVa^rOMyNB1T=O>?=Z~W)$ zC*@DO4>(LSrZhd`P0-ofLHQ%@_^#!*t4{KKH{kzJRb26EQ?u!{S;^=6%c5&?fJM|# z9&jl~S+;;UW6k|MTL$xI&yR8z<1PsE`5s7RzqLH!UU+uz4a+y#eEuuV{&PCb*bWR1 eN(;?v^$cB;18@9DigyFnZw#KUelF{r5}E)P8^pu_ literal 1754 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBM4mJh`29f4<4M1v7RY*jMOKNd)QD#9&W_}(6 zL&coZK1Z%Y1|lxke=e7J^-bAq*->A!pow~4_$D4R3t0Qay?cB4!T{FYQf$x8o?*Iu zcc0xNt1DkV1Rg4AZH-*#(Yw%7R_EHRkmt^~mu{c8CE@b2g_Po>d(5*WgZ_{+7MMAC1+! z-bKAVqxqMVVP^=}wQuvjnw#DPz zg6&xhg8P@UGrXJ5z-Y+Ca)d)bK-s~e2gq5?6tZ?z)Yba!@2_sX{y^-SP3@oPWZP>m z_p!75S(O#K_v^oF&jl3}j#WdHqv)kBXE$fS)>U744y?cF+fen|*7mR|=ezxp{kgBs zuIJ^rc~(?lgDrI}L^5q}AjsW!qy`neyy>bera|vC&x!Qcw8Yl7%dhllqod4 zy6Tegoi6WnN9SD+ZP?L~6`I`hMZ)~yrEJ4vH+))FU40lXcmK9poz8=6p{ozSEUB8e z?B&bEx)9{d}kDH51Dnv-gbDbsCasXVx)?tmWJOLFT~eGU)|br51Dj z&Oa|)xAlCX+;b}+JGwhy>#sTU9)|5n)m`)W_v_rR^Pj)9hPtix?7yq4j!C>ttc%!M z@3i%o&9NU_bWShNoHcKo$?v6WW4k|FT;HSfI*`2R%b9z%v?Vle%epjEb$h`W>;8;c6w5OS~md&nX z6kQ-&^?K_4d23?3b>sfly|1vkX5#zy+IeQiCfQr3x+efL-tNC5JUePBj5wsw0cB>0 zX~k0+fRSYSjd9!4yPyzD?s@+BWdty!=G*?WIag{Uo89wK$7w_U-oGZC`QZ-(I-P4!k?Ct)2*mz)D?T%xPankdzMFC}Jz2=H!xwNi`mF0ub{3e)X z&|-uve;j!h^85KV-~0LZH)pRqtlGczB!ea6|NPbJ52S$QPHx-#?eA}9zuQ^feY_~% zKp|~%xWfTEM9D>#m9V1kO#2rGhYMHp(tj9*qm^uDUIBxzDpUHw)-d)J+waBS+82Jk tXTyWd;(INpKCJsGCs44SN~OTF{N#V$F?G8#eSwt~gQu&X%Q~loCIBF~eR}`^ From cb7086770e8e757c1b1431927296bcfb9aef9db7 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:08:23 +0000 Subject: [PATCH 065/107] Automatic changelog for PR #92858 [ci skip] --- html/changelogs/AutoChangeLog-pr-92858.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92858.yml diff --git a/html/changelogs/AutoChangeLog-pr-92858.yml b/html/changelogs/AutoChangeLog-pr-92858.yml new file mode 100644 index 00000000000..20ac9f05393 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92858.yml @@ -0,0 +1,4 @@ +author: "arbuzik456" +delete-after: True +changes: + - rscadd: "Added tongue emote mechanic where you can stick out your tongue" \ No newline at end of file From 4f83c56eeebd963351ba8126b07817e841895586 Mon Sep 17 00:00:00 2001 From: sushi Date: Sun, 7 Sep 2025 08:08:51 -0400 Subject: [PATCH 066/107] Fix force say and close the say popup instead of just clearing it (#92883) ## About The Pull Request Changes `handleForceSay` to access the popups value via the `innerRef` instead of the `value` variable and changes `currentPrefix` into a Ref for similar reasons. I can't explain very well WHY this fixes it, as I'm no typescript developer, but I assume it has to do with how `handleForceSay` is being used as a subscription callback. So, the other functions being used that way may have similar issues but I'd rather not touch anymore than this. The condition within was also incorrect but just never got anywhere because `value` would always be empty. This also changes it to close the say popup rather than just clearing it. IMO it makes more sense to do this as currently this really only happens when you are taking damage or getting stunned, so it only going half way even though it ejected your text feels awkward. ## Why It's Good For The Game Fixes a feature that has been seemingly broken and forgotten about for over half a year. Maybe there's some context for why it was never fixed idk. But, yknow, its cool and I'd like to see it in game. ![dreamseeker_fPcVtN8LkH](https://github.com/user-attachments/assets/f66461f1-ae48-4edd-b5f6-6a81de227647) ## Changelog :cl: sushi fix: force say works again /:cl: --- tgui/packages/tgui-say/TguiSay.tsx | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tgui/packages/tgui-say/TguiSay.tsx b/tgui/packages/tgui-say/TguiSay.tsx index 785891e9f41..fc3cdc2a34a 100644 --- a/tgui/packages/tgui-say/TguiSay.tsx +++ b/tgui/packages/tgui-say/TguiSay.tsx @@ -27,13 +27,11 @@ export function TguiSay() { const chatHistory = useRef(new ChatHistory()); const messages = useRef(byondMessages); const scale = useRef(true); + const currentPrefix = useRef(null); // I initially wanted to make these an object or a reducer, but it's not really worth it. // You lose the granulatity and add a lot of boilerplate. const [buttonContent, setButtonContent] = useState(''); - const [currentPrefix, setCurrentPrefix] = useState< - keyof typeof RADIO_PREFIXES | null - >(null); const [lightMode, setLightMode] = useState(false); const [maxLength, setMaxLength] = useState(1024); const [size, setSize] = useState(WindowSize.Small); @@ -42,6 +40,10 @@ export function TguiSay() { const position = useRef([window.screenX, window.screenY]); const isDragging = useRef(false); + function setCurrentPrefix(prefix: keyof typeof RADIO_PREFIXES | null): void { + currentPrefix.current = prefix; + } + function handleArrowKeys(direction: KEY.Up | KEY.Down): void { const chat = chatHistory.current; const iterator = channelIterator.current; @@ -77,10 +79,10 @@ export function TguiSay() { // User is on a chat history message if (!chat.isAtLatest()) { chat.reset(); - setButtonContent(currentPrefix ?? iterator.current()); + setButtonContent(currentPrefix.current ?? iterator.current()); // Empty input, resets the channel - } else if (currentPrefix && iterator.isSay() && value?.length === 0) { + } else if (currentPrefix.current && iterator.isSay() && value?.length === 0) { setCurrentPrefix(null); setButtonContent(iterator.current()); } @@ -123,7 +125,7 @@ export function TguiSay() { function handleEnter(): void { const iterator = channelIterator.current; - const prefix = currentPrefix ?? ''; + const prefix = currentPrefix.current ?? ''; if (value?.length && value.length < maxLength) { chatHistory.current.add(value); @@ -138,15 +140,16 @@ export function TguiSay() { function handleForceSay(): void { const iterator = channelIterator.current; + const currentValue = innerRef.current?.value; // Only force say if we're on a visible channel and have typed something - if (!value || iterator.isVisible()) return; + if (!currentValue || !iterator.isVisible()) return; - const prefix = currentPrefix ?? ''; - const grunt = iterator.isSay() ? prefix + value : value; + const prefix = currentPrefix.current ?? ''; + const grunt = iterator.isSay() ? prefix + currentValue : currentValue; messages.current.forceSayMsg(grunt, iterator.current()); - unloadChat(); + handleClose(); } function handleIncrementChannel(): void { @@ -162,9 +165,9 @@ export function TguiSay() { const iterator = channelIterator.current; let newValue = event.currentTarget.value; - const newPrefix = getPrefix(newValue) || currentPrefix; + const newPrefix = getPrefix(newValue) || currentPrefix.current; // Handles switching prefixes - if (newPrefix && newPrefix !== currentPrefix) { + if (newPrefix && newPrefix !== currentPrefix.current) { setButtonContent(RADIO_PREFIXES[newPrefix]); setCurrentPrefix(newPrefix); newValue = newValue.slice(3); @@ -268,7 +271,7 @@ export function TguiSay() { const theme = (lightMode && 'lightMode') || - (currentPrefix && RADIO_PREFIXES[currentPrefix]) || + (currentPrefix.current && RADIO_PREFIXES[currentPrefix.current]) || channelIterator.current.current(); return ( From d2ec1056ab5aaf494cba4877fe8d65a6cbf39cf9 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:09:10 +0000 Subject: [PATCH 067/107] Automatic changelog for PR #92883 [ci skip] --- html/changelogs/AutoChangeLog-pr-92883.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92883.yml diff --git a/html/changelogs/AutoChangeLog-pr-92883.yml b/html/changelogs/AutoChangeLog-pr-92883.yml new file mode 100644 index 00000000000..eec242d8f00 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92883.yml @@ -0,0 +1,4 @@ +author: "sushi" +delete-after: True +changes: + - bugfix: "force say works again" \ No newline at end of file From e50dfc67c34a537a9943af14a550e2628f9735b5 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sun, 7 Sep 2025 16:02:54 -0400 Subject: [PATCH 068/107] Changes the tooltip for holders of the lockable_storage component to be accurate (#92737) ## About The Pull Request Previously, it would always say [left-click icon] open storage if you had an empty hand. This makes it so that if the item is on the ground, it'll say [right-click icon] open storage. if it's in your other hand, it'll still say [left-click icon]. ## Why It's Good For The Game fixes #87340 ## Changelog :cl: fix: tooltip for secure briefcases now shows correct button. /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/datums/components/lockable_storage.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/components/lockable_storage.dm b/code/datums/components/lockable_storage.dm index b6bf81cef9d..456bac0c45d 100644 --- a/code/datums/components/lockable_storage.dm +++ b/code/datums/components/lockable_storage.dm @@ -88,7 +88,10 @@ /datum/component/lockable_storage/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user) SIGNAL_HANDLER if(isnull(held_item)) - context[SCREENTIP_CONTEXT_LMB] = "Open storage" + if(source in user.held_items) + context[SCREENTIP_CONTEXT_LMB] = "Open storage" + return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_RMB] = "Open storage" return CONTEXTUAL_SCREENTIP_SET if(can_hack_open) From 7ccb4204c7649440a9ac882c3e2135116c9033ef Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 20:03:10 +0000 Subject: [PATCH 069/107] Automatic changelog for PR #92737 [ci skip] --- html/changelogs/AutoChangeLog-pr-92737.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92737.yml diff --git a/html/changelogs/AutoChangeLog-pr-92737.yml b/html/changelogs/AutoChangeLog-pr-92737.yml new file mode 100644 index 00000000000..84e004f5241 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92737.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - bugfix: "tooltip for secure briefcases now shows correct button." \ No newline at end of file From d1810f517029936f4e503e26baa264f398db43b2 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 00:30:10 +0000 Subject: [PATCH 070/107] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-92424.yml | 4 -- html/changelogs/AutoChangeLog-pr-92645.yml | 4 -- html/changelogs/AutoChangeLog-pr-92652.yml | 7 -- html/changelogs/AutoChangeLog-pr-92666.yml | 5 -- html/changelogs/AutoChangeLog-pr-92677.yml | 6 -- html/changelogs/AutoChangeLog-pr-92695.yml | 6 -- html/changelogs/AutoChangeLog-pr-92728.yml | 4 -- html/changelogs/AutoChangeLog-pr-92737.yml | 4 -- html/changelogs/AutoChangeLog-pr-92762.yml | 4 -- html/changelogs/AutoChangeLog-pr-92766.yml | 4 -- html/changelogs/AutoChangeLog-pr-92768.yml | 4 -- html/changelogs/AutoChangeLog-pr-92776.yml | 5 -- html/changelogs/AutoChangeLog-pr-92779.yml | 5 -- html/changelogs/AutoChangeLog-pr-92794.yml | 4 -- html/changelogs/AutoChangeLog-pr-92800.yml | 4 -- html/changelogs/AutoChangeLog-pr-92803.yml | 4 -- html/changelogs/AutoChangeLog-pr-92818.yml | 4 -- html/changelogs/AutoChangeLog-pr-92821.yml | 4 -- html/changelogs/AutoChangeLog-pr-92825.yml | 4 -- html/changelogs/AutoChangeLog-pr-92835.yml | 4 -- html/changelogs/AutoChangeLog-pr-92841.yml | 4 -- html/changelogs/AutoChangeLog-pr-92857.yml | 4 -- html/changelogs/AutoChangeLog-pr-92858.yml | 4 -- html/changelogs/AutoChangeLog-pr-92859.yml | 4 -- html/changelogs/AutoChangeLog-pr-92860.yml | 4 -- html/changelogs/AutoChangeLog-pr-92864.yml | 4 -- html/changelogs/AutoChangeLog-pr-92869.yml | 4 -- html/changelogs/AutoChangeLog-pr-92874.yml | 4 -- html/changelogs/AutoChangeLog-pr-92876.yml | 4 -- html/changelogs/AutoChangeLog-pr-92880.yml | 4 -- html/changelogs/AutoChangeLog-pr-92882.yml | 4 -- html/changelogs/AutoChangeLog-pr-92883.yml | 4 -- html/changelogs/archive/2025-09.yml | 82 ++++++++++++++++++++++ 33 files changed, 82 insertions(+), 138 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-92424.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92645.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92652.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92666.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92677.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92695.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92728.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92737.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92762.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92766.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92768.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92776.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92779.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92794.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92800.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92803.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92818.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92821.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92825.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92835.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92841.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92857.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92858.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92859.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92860.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92864.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92869.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92874.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92876.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92880.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92882.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92883.yml diff --git a/html/changelogs/AutoChangeLog-pr-92424.yml b/html/changelogs/AutoChangeLog-pr-92424.yml deleted file mode 100644 index 6c3ece0206a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92424.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Stonetear" -delete-after: True -changes: - - refactor: "MODsuit module code now knows who clicked the activation button." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92645.yml b/html/changelogs/AutoChangeLog-pr-92645.yml deleted file mode 100644 index af5d03c404a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92645.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "pebis36012" -delete-after: True -changes: - - bugfix: "Splattercasting touch spells no longer give infinite blood" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92652.yml b/html/changelogs/AutoChangeLog-pr-92652.yml deleted file mode 100644 index 8794b36aa5f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92652.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "the map reader now reads null & 0 values into lists" - - bugfix: "the map reader now parses associative lists(maps/alists) correctly in cases where = sign is embedded within a string" - - bugfix: "the map reader now parses associative lists(maps/alists) who's values themselves can be lists" - - bugfix: "the map reader can now parse nested lists to any degree" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92666.yml b/html/changelogs/AutoChangeLog-pr-92666.yml deleted file mode 100644 index 4a536a2a854..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92666.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "ore silo id restriction button in the UI now changes text & colour correctly" - - bugfix: "ore silo id restriction is now only enforced for station loaded silo and is optional in other cases" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92677.yml b/html/changelogs/AutoChangeLog-pr-92677.yml deleted file mode 100644 index d0406d70548..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92677.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melber" -delete-after: True -changes: - - balance: "Advanced first aid kits in the bridge are back to being normal first aid kids" - - balance: "Emergency Nanomed vendors have larger stocks and better supplies" - - rscadd: "Replaces a majority of Emergency Nanomeds on stations and shuttles with Deforest First Aid Stations. Left clicking these stationary machines will heal minor damage and blood loss over time - at a (small) price. Right clicking them will provide gauze, also for a price. All costs are waived on shuttles, during red alert, or for medical staff. You can also click-drag to have other mobs use the machine. However, robotic limbs need not apply." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92695.yml b/html/changelogs/AutoChangeLog-pr-92695.yml deleted file mode 100644 index f0a5a6a0f11..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92695.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - rscadd: "Toilets now require plumbing or water reclaimers to function, and can get clogged by small items." - - bugfix: "Trying to use plungers on plumbing objects will no longer hit them after finishing the interaction." - - code_imp: "Updated toilet item interaction code" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92728.yml b/html/changelogs/AutoChangeLog-pr-92728.yml deleted file mode 100644 index d62a5cf8a69..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92728.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "Chemmaster highlights selected icon & has its window scaled up" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92737.yml b/html/changelogs/AutoChangeLog-pr-92737.yml deleted file mode 100644 index 84e004f5241..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92737.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lelandkemble" -delete-after: True -changes: - - bugfix: "tooltip for secure briefcases now shows correct button." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92762.yml b/html/changelogs/AutoChangeLog-pr-92762.yml deleted file mode 100644 index b871b4ef58a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92762.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xander3359" -delete-after: True -changes: - - refactor: "change some attack procs to use item interaction" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92766.yml b/html/changelogs/AutoChangeLog-pr-92766.yml deleted file mode 100644 index b5222f8d20a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92766.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "The Multiphase X-01 has 12 lethal shots to match the capacity of the standard energy gun." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92768.yml b/html/changelogs/AutoChangeLog-pr-92768.yml deleted file mode 100644 index 196cea7cd29..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92768.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lelandkemble" -delete-after: True -changes: - - bugfix: "Escape pods no longer have planetary gravity" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92776.yml b/html/changelogs/AutoChangeLog-pr-92776.yml deleted file mode 100644 index 24dd7f5326f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92776.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "loganuk" -delete-after: True -changes: - - bugfix: "Stops coffee machines having melee god mode" - - qol: "Right clicking on coffee machine without coffee pot has correct message" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92779.yml b/html/changelogs/AutoChangeLog-pr-92779.yml deleted file mode 100644 index e3cc8b60870..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92779.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - rscdel: "Golems which somehow manage to grow wings and somehow manage to equip something that covers their jumpsuit can no longer fly. (Seriously, this will not affect anyone)" - - refactor: "Refactored clothing obscurity entirely. Items should be a loooot more consistent and what covers what, and should update a lot snappier. As always, report any oddities, like mysteriously disappearing articles of clothing, hair, or species parts" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92794.yml b/html/changelogs/AutoChangeLog-pr-92794.yml deleted file mode 100644 index 8ab72a7dccf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92794.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed organ fishing blocking alternate material rod loot from spawning" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92800.yml b/html/changelogs/AutoChangeLog-pr-92800.yml deleted file mode 100644 index 1e6a6f34fd7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92800.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uaioy" -delete-after: True -changes: - - balance: "wizard modsuit shield recharges slower" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92803.yml b/html/changelogs/AutoChangeLog-pr-92803.yml deleted file mode 100644 index 05b0171c189..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92803.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - admin: "Clientless mobs no longer log their emotes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92818.yml b/html/changelogs/AutoChangeLog-pr-92818.yml deleted file mode 100644 index 91beccc1c53..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92818.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - bugfix: "Fixed oversight from \"Material tab for the autolathe\" PR. You can now eject BS crystals, allien alloy and mythril from autolathe." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92821.yml b/html/changelogs/AutoChangeLog-pr-92821.yml deleted file mode 100644 index 13c68d5a8bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92821.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - bugfix: "Fixed wires interaction and fixed mech multitool/wirecutters interaction." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92825.yml b/html/changelogs/AutoChangeLog-pr-92825.yml deleted file mode 100644 index 2f7f4c6a05d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92825.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed mobs without guaranteed butcher drops not dropping any crusher trophies" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92835.yml b/html/changelogs/AutoChangeLog-pr-92835.yml deleted file mode 100644 index 3c3c5e83ba2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92835.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - qol: "Lets you rename the smoothbore disabler." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92841.yml b/html/changelogs/AutoChangeLog-pr-92841.yml deleted file mode 100644 index a893978a240..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92841.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lelandkemble" -delete-after: True -changes: - - spellcheck: "Fixes a bunch of manual's formatting, and updates Chef Recipes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92857.yml b/html/changelogs/AutoChangeLog-pr-92857.yml deleted file mode 100644 index 3d2d5370f2f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92857.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lelandkemble" -delete-after: True -changes: - - bugfix: "Arcade machine experiment now succeeds on output rather than input of tickets" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92858.yml b/html/changelogs/AutoChangeLog-pr-92858.yml deleted file mode 100644 index 20ac9f05393..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92858.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "arbuzik456" -delete-after: True -changes: - - rscadd: "Added tongue emote mechanic where you can stick out your tongue" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92859.yml b/html/changelogs/AutoChangeLog-pr-92859.yml deleted file mode 100644 index 5bb37665e07..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92859.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Krysonism" -delete-after: True -changes: - - balance: "vatbeasts, mega arachnids and butterbears now attack much quicker, in line with their old player controlled attack speed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92860.yml b/html/changelogs/AutoChangeLog-pr-92860.yml deleted file mode 100644 index 0697d093cb4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92860.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "sushi" -delete-after: True -changes: - - bugfix: "crates and other objects causing elevation will no longer leave behind magic elevating turfs upon destruction" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92864.yml b/html/changelogs/AutoChangeLog-pr-92864.yml deleted file mode 100644 index 6b7316de021..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92864.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "sushi" -delete-after: True -changes: - - rscadd: "recyclers will now deconstruct non-item objects that they eat instead of just deleting them" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92869.yml b/html/changelogs/AutoChangeLog-pr-92869.yml deleted file mode 100644 index 5318a9537e0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92869.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lelandkemble" -delete-after: True -changes: - - qol: "You can now hear heart attacks with a stethoscope" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92874.yml b/html/changelogs/AutoChangeLog-pr-92874.yml deleted file mode 100644 index 3a97ffbf133..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92874.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vinylspiders" -delete-after: True -changes: - - bugfix: "dead bodies in the morgue will no longer try to blink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92876.yml b/html/changelogs/AutoChangeLog-pr-92876.yml deleted file mode 100644 index 4665686d6f6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92876.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Webcomicartist" -delete-after: True -changes: - - qol: "The slot machine spins faster, allowing for more time-efficient gambling." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92880.yml b/html/changelogs/AutoChangeLog-pr-92880.yml deleted file mode 100644 index 69885b291e0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92880.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "zombie powder works through inhale(now faster acting)/ingest again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92882.yml b/html/changelogs/AutoChangeLog-pr-92882.yml deleted file mode 100644 index 433151a6286..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92882.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "no runtime for vendors using department cards" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92883.yml b/html/changelogs/AutoChangeLog-pr-92883.yml deleted file mode 100644 index eec242d8f00..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92883.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "sushi" -delete-after: True -changes: - - bugfix: "force say works again" \ No newline at end of file diff --git a/html/changelogs/archive/2025-09.yml b/html/changelogs/archive/2025-09.yml index fd0e72de5eb..e8a7124295b 100644 --- a/html/changelogs/archive/2025-09.yml +++ b/html/changelogs/archive/2025-09.yml @@ -152,3 +152,85 @@ - bugfix: prevents eaten remote signalers from following you between bodies nikothedude: - bugfix: Player-controlled medbots can now inject chloral on healthy targets +2025-09-08: + Aliceee2ch: + - bugfix: Fixed oversight from "Material tab for the autolathe" PR. You can now + eject BS crystals, allien alloy and mythril from autolathe. + - bugfix: Fixed wires interaction and fixed mech multitool/wirecutters interaction. + Krysonism: + - balance: vatbeasts, mega arachnids and butterbears now attack much quicker, in + line with their old player controlled attack speed. + Melber: + - balance: Advanced first aid kits in the bridge are back to being normal first + aid kids + - balance: Emergency Nanomed vendors have larger stocks and better supplies + - rscadd: Replaces a majority of Emergency Nanomeds on stations and shuttles with + Deforest First Aid Stations. Left clicking these stationary machines will heal + minor damage and blood loss over time - at a (small) price. Right clicking them + will provide gauze, also for a price. All costs are waived on shuttles, during + red alert, or for medical staff. You can also click-drag to have other mobs + use the machine. However, robotic limbs need not apply. + Melbert: + - rscdel: Golems which somehow manage to grow wings and somehow manage to equip + something that covers their jumpsuit can no longer fly. (Seriously, this will + not affect anyone) + - refactor: Refactored clothing obscurity entirely. Items should be a loooot more + consistent and what covers what, and should update a lot snappier. As always, + report any oddities, like mysteriously disappearing articles of clothing, hair, + or species parts + SmArtKar: + - bugfix: Fixed organ fishing blocking alternate material rod loot from spawning + - rscadd: Toilets now require plumbing or water reclaimers to function, and can + get clogged by small items. + - bugfix: Trying to use plungers on plumbing objects will no longer hit them after + finishing the interaction. + - code_imp: Updated toilet item interaction code + - bugfix: Fixed mobs without guaranteed butcher drops not dropping any crusher trophies + - admin: Clientless mobs no longer log their emotes + Stonetear: + - refactor: MODsuit module code now knows who clicked the activation button. + SyncIt21: + - bugfix: ore silo id restriction button in the UI now changes text & colour correctly + - bugfix: ore silo id restriction is now only enforced for station loaded silo and + is optional in other cases + - bugfix: no runtime for vendors using department cards + - bugfix: the map reader now reads null & 0 values into lists + - bugfix: the map reader now parses associative lists(maps/alists) correctly in + cases where = sign is embedded within a string + - bugfix: the map reader now parses associative lists(maps/alists) who's values + themselves can be lists + - bugfix: the map reader can now parse nested lists to any degree + - bugfix: Chemmaster highlights selected icon & has its window scaled up + - bugfix: zombie powder works through inhale(now faster acting)/ingest again + Webcomicartist: + - qol: The slot machine spins faster, allowing for more time-efficient gambling. + Xander3359: + - refactor: change some attack procs to use item interaction + arbuzik456: + - rscadd: Added tongue emote mechanic where you can stick out your tongue + lelandkemble: + - bugfix: Arcade machine experiment now succeeds on output rather than input of + tickets + - spellcheck: Fixes a bunch of manual's formatting, and updates Chef Recipes + - bugfix: Escape pods no longer have planetary gravity + - bugfix: tooltip for secure briefcases now shows correct button. + - qol: You can now hear heart attacks with a stethoscope + loganuk: + - bugfix: Stops coffee machines having melee god mode + - qol: Right clicking on coffee machine without coffee pot has correct message + necromanceranne: + - balance: The Multiphase X-01 has 12 lethal shots to match the capacity of the + standard energy gun. + - qol: Lets you rename the smoothbore disabler. + pebis36012: + - bugfix: Splattercasting touch spells no longer give infinite blood + sushi: + - bugfix: force say works again + - bugfix: crates and other objects causing elevation will no longer leave behind + magic elevating turfs upon destruction + - rscadd: recyclers will now deconstruct non-item objects that they eat instead + of just deleting them + uaioy: + - balance: wizard modsuit shield recharges slower + vinylspiders: + - bugfix: dead bodies in the morgue will no longer try to blink From b78fefd4d48b0da9f89253c6723995d788d7e8e2 Mon Sep 17 00:00:00 2001 From: Xander3359 <66163761+Xander3359@users.noreply.github.com> Date: Sun, 7 Sep 2025 20:50:16 -0400 Subject: [PATCH 071/107] Replaces T2 Tools with T1 Versions in CE Toolbelt (#92872) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About The Pull Request Removes the T2 tools from CE belt ## Why It's Good For The Game The T2 tools are bad because: 1. It encourages heads to play their subdepartment’s roles instead of their own, which is to manage their department, delegate tasks, and teach newer players. 2. It encourages bad command players to take the role for the gear instead of leaving it for the people who want it for the command. This also sets a bad precedent, people always point at the CE for reason why other heads should get more advanced gear, so this would be a hard bandaid to rip off but I think it is necessary. ## Changelog :cl: balance: Downgraded CE tools to T1 instead of T2 /:cl: --- code/game/objects/items/storage/belt.dm | 21 +++++++++---------- code/modules/jobs/job_types/chief_engineer.dm | 2 ++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index c708962ca29..213eaac9a55 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -54,24 +54,23 @@ preload = TRUE /obj/item/storage/belt/utility/chief/full/PopulateContents() - SSwardrobe.provide_type(/obj/item/screwdriver/power, src) - SSwardrobe.provide_type(/obj/item/crowbar/power, src) - SSwardrobe.provide_type(/obj/item/weldingtool/experimental, src) + SSwardrobe.provide_type(/obj/item/screwdriver, src) + SSwardrobe.provide_type(/obj/item/wrench, src) + SSwardrobe.provide_type(/obj/item/weldingtool, src) + SSwardrobe.provide_type(/obj/item/crowbar, src) + SSwardrobe.provide_type(/obj/item/wirecutters, src) SSwardrobe.provide_type(/obj/item/multitool, src) SSwardrobe.provide_type(/obj/item/stack/cable_coil, src) - SSwardrobe.provide_type(/obj/item/extinguisher/mini, src) - SSwardrobe.provide_type(/obj/item/analyzer, src) - //much roomier now that we've managed to remove two tools /obj/item/storage/belt/utility/chief/full/get_types_to_preload() var/list/to_preload = list() //Yes this is a pain. Yes this is the point - to_preload += /obj/item/screwdriver/power - to_preload += /obj/item/crowbar/power - to_preload += /obj/item/weldingtool/experimental + to_preload += /obj/item/screwdriver + to_preload += /obj/item/wrench + to_preload += /obj/item/weldingtool + to_preload += /obj/item/crowbar + to_preload += /obj/item/wirecutters to_preload += /obj/item/multitool to_preload += /obj/item/stack/cable_coil - to_preload += /obj/item/extinguisher/mini - to_preload += /obj/item/analyzer return to_preload /obj/item/storage/belt/utility/full/PopulateContents() diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 3a9a9fbc397..8b24da5ab06 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -69,6 +69,8 @@ backpack_contents = list( /obj/item/melee/baton/telescopic/silver = 1, /obj/item/construction/rcd/ce = 1, + /obj/item/extinguisher/mini = 1, + /obj/item/analyzer = 1, ) belt = /obj/item/storage/belt/utility/chief/full ears = /obj/item/radio/headset/heads/ce From ce24170f34f38d3b0a965e3dfa4b4f2dbb0b68b8 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 00:50:32 +0000 Subject: [PATCH 072/107] Automatic changelog for PR #92872 [ci skip] --- html/changelogs/AutoChangeLog-pr-92872.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92872.yml diff --git a/html/changelogs/AutoChangeLog-pr-92872.yml b/html/changelogs/AutoChangeLog-pr-92872.yml new file mode 100644 index 00000000000..1d5cb994cd1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92872.yml @@ -0,0 +1,4 @@ +author: "Xander3359" +delete-after: True +changes: + - balance: "Downgraded CE tools to T1 instead of T2" \ No newline at end of file From 1d66c7c85c373fe511319dadd90eb094ae49b733 Mon Sep 17 00:00:00 2001 From: nikothedude <59709059+nikothedude@users.noreply.github.com> Date: Sun, 7 Sep 2025 20:55:49 -0400 Subject: [PATCH 073/107] Readds medical sprays to the nanodrug plus (#92785) ## About The Pull Request Reverts a bit of https://github.com/tgstation/tgstation/pull/92134 - the change was not documented, and the creator expressed neutrality at it's return in discord. ## Why It's Good For The Game Diluted aiuri and libital sprays are good stopgaps for when chemists aren't making chems, or at roundstart, when your options for chems are the limited medkits. They're not exactly good at their job, they're impure, limited, but they get the job done. The change is also a bit out of scope for that PR (it wanted to change emergency vendors and not the nanodrug) and - again - undocumented. Feel free to close if this is actually bad for the game, I just really like using these as a doctor when better chems aren't available. ## Changelog :cl: add: 2 aiuri and 2 libital cans to nanodrug plus /:cl: --- code/modules/vending/medical.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index d8fadb9130f..21cabf95dd3 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -90,6 +90,8 @@ /obj/item/reagent_containers/cup/bottle/salglu_solution = 3, /obj/item/reagent_containers/cup/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, + /obj/item/reagent_containers/medigel/libital = 2, + /obj/item/reagent_containers/medigel/aiuri = 2, /obj/item/reagent_containers/medigel/sterilizine = 3, ) contraband = list( From 32d9d374e4aac43bb8c2ced00156e6f8f6864878 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 00:56:07 +0000 Subject: [PATCH 074/107] Automatic changelog for PR #92785 [ci skip] --- html/changelogs/AutoChangeLog-pr-92785.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92785.yml diff --git a/html/changelogs/AutoChangeLog-pr-92785.yml b/html/changelogs/AutoChangeLog-pr-92785.yml new file mode 100644 index 00000000000..2fb57051874 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92785.yml @@ -0,0 +1,4 @@ +author: "nikothedude" +delete-after: True +changes: + - rscadd: "2 aiuri and 2 libital cans to nanodrug plus" \ No newline at end of file From f8186a7db390c9c9b5c58f52794ac4aee5a5373c Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Sun, 7 Sep 2025 21:04:47 -0400 Subject: [PATCH 075/107] Adds a furnace that grants space protection to nearby people (#92342) ## About The Pull Request ##### Code bounty for holinka4ever Adds a furnace equippable to the back slot, which when active (it is a lamp), will form a bubble of space protection, affecting the user and people nearby, and will last 5 minutes before it dissipates and needs to be re-formed. This item requires a pyroclastic anomaly core to activate, while the bubble itself can only be formed in pressurized environments. It's researchable in the Anomaly technology node. The downsides of the item is it requires 2 hands to hold, can't be inserted into storage items (as it's bulky), can only be equipped to the bag slot, and has slowdown while on, which only affects you when you're in gravity anyways. ## Why It's Good For The Game The pyro anomaly is currently one of the more useless anomaly cores, not even getting a unique reactive armour variation. This hopefully gives it some purpose as a good tool to keep people alive in a spaced area at a good cost to the user. This is an item that shouldn't be overpowered, but also isn't just a selfish tool- when someone's crafting this item it's specifically aiming to help people, which I think is a benefit. ## Changelog :cl: JohnFulpWillard, sprites by PopLop add: Added a new pyroclastic anomaly locked item, the Space Furnace. Grants space immunity to people nearby while active. /:cl: --- code/datums/components/connect_range.dm | 2 +- code/datums/components/crafting/equipment.dm | 3 + .../datums/proximity_monitor/fields/bubble.dm | 150 +++++++++++++++ .../projectile_dampener.dm | 182 +++--------------- .../fields/space_protection.dm | 48 +++++ code/game/objects/items/devices/flashlight.dm | 124 ++++++++++++ code/game/objects/items/robot/items/tools.dm | 2 +- code/modules/mod/modules/modules_security.dm | 2 +- code/modules/research/designs/misc_designs.dm | 18 ++ .../research/techweb/nodes/research_nodes.dm | 1 + icons/effects/fields.dmi | Bin 2448 -> 5687 bytes icons/mob/clothing/back.dmi | Bin 118542 -> 136493 bytes icons/mob/inhands/items_lefthand.dmi | Bin 32366 -> 36914 bytes icons/mob/inhands/items_righthand.dmi | Bin 35095 -> 39270 bytes icons/obj/lighting.dmi | Bin 78523 -> 80638 bytes tgstation.dme | 2 + 16 files changed, 372 insertions(+), 162 deletions(-) create mode 100644 code/datums/proximity_monitor/fields/bubble.dm create mode 100644 code/datums/proximity_monitor/fields/space_protection.dm diff --git a/code/datums/components/connect_range.dm b/code/datums/components/connect_range.dm index 2a9225523d3..e001261ab12 100644 --- a/code/datums/components/connect_range.dm +++ b/code/datums/components/connect_range.dm @@ -26,8 +26,8 @@ return COMPONENT_INCOMPATIBLE src.connections = connections src.range = range - set_tracked(tracked) src.works_in_containers = works_in_containers + set_tracked(tracked) /datum/component/connect_range/Destroy() set_tracked(null) diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 84c031afe11..d6ea5442b8b 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -156,6 +156,9 @@ /obj/item/flashlight = 2, /obj/item/restraints/handcuffs/cable = 1 ) + blacklist = list( + /obj/item/flashlight/lamp/space_bubble, + ) category = CAT_EQUIPMENT /datum/crafting_recipe/flashlight_eyes/New() diff --git a/code/datums/proximity_monitor/fields/bubble.dm b/code/datums/proximity_monitor/fields/bubble.dm new file mode 100644 index 00000000000..d62abfa1ce2 --- /dev/null +++ b/code/datums/proximity_monitor/fields/bubble.dm @@ -0,0 +1,150 @@ +#define CHANGING_OFFSET "changing_offset" +#define OVERLAY_DATA "overlay_data" +#define STARTING_POSITION "starting_position" +#define ANIMATE_DAMPENER_TIME 1.5 SECONDS + +//Only use square radius for this! +/datum/proximity_monitor/advanced/bubble + edge_is_a_field = TRUE + + ///Assoc list of every direction and the image it'll take, so we can form a large radius. + var/list/effect_direction_images + ///list of all the visual effects we keep track of + var/list/edgeturf_effects = list() + ///atom that contains all the fields in its vis_contents + var/atom/movable/field_effect_holder/my_movable + +/datum/proximity_monitor/advanced/bubble/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, atom/projector) + . = ..() + setup_effect_directions() + if(_host != projector) + RegisterSignal(projector, COMSIG_QDELETING, PROC_REF(on_projector_del)) + var/atom/movable/movable_host = _host + my_movable = new(get_turf(movable_host)) + my_movable.transform = my_movable.transform.Scale(current_range, current_range) + my_movable.set_glide_size(movable_host.glide_size) + draw_effect() + +/datum/proximity_monitor/advanced/bubble/Destroy() + for(var/coordinates in edgeturf_effects) + var/obj/effect/overlay/vis/field/effect_to_remove = edgeturf_effects[coordinates] + edgeturf_effects -= coordinates + effect_to_remove.set_wobbly(wobble_duration = ANIMATE_DAMPENER_TIME) + animate(effect_to_remove, alpha = 0, time = ANIMATE_DAMPENER_TIME, flags = ANIMATION_PARALLEL) + QDEL_IN(my_movable, ANIMATE_DAMPENER_TIME) + my_movable = null + return ..() + +/datum/proximity_monitor/advanced/bubble/proc/setup_effect_directions() + effect_direction_images = list( + "[SOUTH]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south"), + "[NORTH]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north"), + "[WEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_west"), + "[EAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_east"), + "[NORTHWEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northwest"), + "[SOUTHWEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southwest"), + "[NORTHEAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northeast"), + "[SOUTHEAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast"), + ) + +/datum/proximity_monitor/advanced/bubble/on_moved(atom/movable/source, atom/old_loc) + . = ..() + my_movable.forceMove(get_turf(source)) + +/datum/proximity_monitor/advanced/bubble/on_z_change(datum/source) + recalculate_field(full_recalc = TRUE) + +///rendering all the field visuals. first we render the corners, then we connect them +/datum/proximity_monitor/advanced/bubble/proc/draw_effect() + var/max_pixel_offset = current_range * ICON_SIZE_ALL + var/top_right_corner = list(effect_direction_images["[NORTHEAST]"], max_pixel_offset, max_pixel_offset) + var/top_left_corner = list(effect_direction_images["[NORTHWEST]"], -max_pixel_offset, max_pixel_offset) + var/bottom_left_corner = list(effect_direction_images["[SOUTHWEST]"], -max_pixel_offset, -max_pixel_offset) + var/bottom_right_corner = list(effect_direction_images["[SOUTHEAST]"], max_pixel_offset, -max_pixel_offset) + + var/list/corners = list(top_right_corner, top_left_corner, bottom_left_corner, bottom_right_corner) + for(var/corner in corners) + draw_corner(corner) + + var/list/corners_to_connect = list( + list(OVERLAY_DATA = effect_direction_images["[NORTH]"], CHANGING_OFFSET = "x_offset", STARTING_POSITION = max_pixel_offset), + list(OVERLAY_DATA = effect_direction_images["[SOUTH]"], CHANGING_OFFSET = "x_offset", STARTING_POSITION = -max_pixel_offset), + list(OVERLAY_DATA = effect_direction_images["[WEST]"], CHANGING_OFFSET = "y_offset", STARTING_POSITION = -max_pixel_offset), + list(OVERLAY_DATA = effect_direction_images["[EAST]"], CHANGING_OFFSET = "y_offset", STARTING_POSITION = max_pixel_offset), + ) + for(var/direction in corners_to_connect) + draw_edge(direction, max_pixel_offset) + +///rendering the corners +/datum/proximity_monitor/advanced/bubble/proc/draw_corner(list/corner_data) + var/obj/effect/overlay/vis/field/corner_effect = new() + var/image/image_overlay = corner_data[1] + corner_effect.icon = image_overlay.icon + corner_effect.icon_state = image_overlay.icon_state + corner_effect.alpha = 0 + corner_effect.pixel_x = corner_data[2] + corner_effect.pixel_y = corner_data[3] + add_effect_to_host(corner_effect) + +///connecting the corners to one another +/datum/proximity_monitor/advanced/bubble/proc/draw_edge(list/edge_data, target_offset) + var/starting_offset = edge_data[STARTING_POSITION] + var/current_offset = (-1 * target_offset) + ICON_SIZE_ALL + var/image/overlay = edge_data[OVERLAY_DATA] + while(current_offset != target_offset) + var/obj/effect/overlay/vis/field/edge_effect = new() + edge_effect.alpha = 0 + edge_effect.icon = overlay.icon + edge_effect.icon_state = overlay.icon_state + + if(edge_data[CHANGING_OFFSET] == "x_offset") + edge_effect.pixel_y = starting_offset + edge_effect.pixel_x = current_offset + else + edge_effect.pixel_x = starting_offset + edge_effect.pixel_y = current_offset + add_effect_to_host(edge_effect) + current_offset += ICON_SIZE_ALL + +///handles adding the visual effect's data +/datum/proximity_monitor/advanced/bubble/proc/add_effect_to_host(obj/effect/overlay/vis/field/effect_to_add) + my_movable.vis_contents += effect_to_add + var/coordinate_x = effect_to_add.pixel_x / ICON_SIZE_ALL + var/coordinate_y = effect_to_add.pixel_y / ICON_SIZE_ALL + effect_to_add.transform = effect_to_add.transform.Scale(1 / current_range, 1 / current_range) + edgeturf_effects["[coordinate_x],[coordinate_y]"] = effect_to_add + effect_to_add.set_wobbly(wobble_duration = ANIMATE_DAMPENER_TIME) + animate(effect_to_add, alpha = 255, time = ANIMATE_DAMPENER_TIME, flags = ANIMATION_PARALLEL) + +/datum/proximity_monitor/advanced/bubble/proc/on_projector_del(datum/source) + SIGNAL_HANDLER + qdel(src) + +/obj/effect/overlay/vis/field + appearance_flags = PIXEL_SCALE|LONG_GLIDE + vis_flags = parent_type::vis_flags | VIS_INHERIT_PLANE + ///are we currently WOBBLING + var/wobbling_effect = FALSE + +/obj/effect/overlay/vis/field/proc/set_wobbly(wobble_duration) + if(wobbling_effect) + return + wobbling_effect = TRUE + apply_wibbly_filters(src) + addtimer(CALLBACK(src, PROC_REF(remove_wobbly)), wobble_duration) + +/obj/effect/overlay/vis/field/proc/remove_wobbly() + if(QDELETED(src)) + return + remove_wibbly_filters(src, remove_duration = 0.25 SECONDS) + addtimer(VARSET_CALLBACK(src, wobbling_effect, FALSE), 0.25 SECONDS) + +/atom/movable/field_effect_holder + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + appearance_flags = PIXEL_SCALE|LONG_GLIDE + plane = ABOVE_GAME_PLANE + +#undef CHANGING_OFFSET +#undef OVERLAY_DATA +#undef STARTING_POSITION +#undef ANIMATE_DAMPENER_TIME diff --git a/code/datums/proximity_monitor/fields/projectile_dampener/projectile_dampener.dm b/code/datums/proximity_monitor/fields/projectile_dampener/projectile_dampener.dm index 3185872efad..5c4237dc94f 100644 --- a/code/datums/proximity_monitor/fields/projectile_dampener/projectile_dampener.dm +++ b/code/datums/proximity_monitor/fields/projectile_dampener/projectile_dampener.dm @@ -1,96 +1,66 @@ -#define CHANGING_OFFSET "changing_offset" -#define OVERLAY_DATA "overlay_data" -#define STARTING_POSITION "starting_position" -#define ANIMATE_DAMPENER_TIME 1.5 SECONDS - //Projectile dampening field that slows projectiles and lowers their damage for an energy cost deducted every 1/5 second. -//Only use square radius for this! -/datum/proximity_monitor/advanced/projectile_dampener - edge_is_a_field = TRUE - var/static/list/effect_direction_images = list( - "[SOUTH]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south"), - "[NORTH]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north"), - "[WEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_west"), - "[EAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_east"), - "[NORTHWEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northwest"), - "[SOUTHWEST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southwest"), - "[NORTHEAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northeast"), - "[SOUTHEAST]" = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast"), - ) +/datum/proximity_monitor/advanced/bubble/projectile_dampener var/static/image/generic_edge = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_generic") ///overlay we apply to caught bullets var/static/image/new_bullet_overlay= image('icons/effects/fields.dmi', "projectile_dampen_effect") - ///list of all the visual effects we keep track of - var/list/edgeturf_effects = list() - ///atom that contains all the fields in its vis_contents - var/atom/movable/field_effect_holder/my_movable /// datum that holds the effects we apply on caught bullets var/datum/dampener_projectile_effects/bullet_effects -/datum/proximity_monitor/advanced/projectile_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, atom/projector, datum/dampener_projectile_effects/effects_typepath) - ..() - RegisterSignal(projector, COMSIG_QDELETING, PROC_REF(on_projector_del)) - var/atom/movable/movable_host = _host - my_movable = new(get_turf(_host)) - my_movable.transform = my_movable.transform.Scale(current_range, current_range) - my_movable.set_glide_size(movable_host.glide_size) - bullet_effects = effects_typepath ? new effects_typepath() : new - draw_effect() - -/datum/proximity_monitor/advanced/projectile_dampener/on_moved(atom/movable/source, atom/old_loc) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, atom/projector, datum/dampener_projectile_effects/effects_typepath) . = ..() - my_movable.Move(source.loc, get_dir(my_movable.loc, source.loc), source.glide_size) + bullet_effects = effects_typepath ? new effects_typepath() : new -/datum/proximity_monitor/advanced/projectile_dampener/on_z_change(datum/source) - recalculate_field(full_recalc = TRUE) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/Destroy() + bullet_effects = null + return ..() -/datum/proximity_monitor/advanced/projectile_dampener/field_edge_crossed(atom/movable/movable, turf/location, turf/old_location) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/field_edge_crossed(atom/movable/movable, turf/location, turf/old_location) . = ..() if(!isprojectile(movable)) return determine_wobble(location) -/datum/proximity_monitor/advanced/projectile_dampener/field_edge_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/field_edge_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) . = ..() if(!isprojectile(movable)) return determine_wobble(old_location) -/datum/proximity_monitor/advanced/projectile_dampener/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location) if(!isprojectile(movable) || HAS_TRAIT_FROM(movable, TRAIT_GOT_DAMPENED, REF(src))) return catch_bullet_effect(movable) -/datum/proximity_monitor/advanced/projectile_dampener/field_turf_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) - if(!isprojectile(movable) || get_dist(new_location, host) <= current_range) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/field_turf_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) + if(!isprojectile(movable) || get_dist(new_location, host) <= (edge_is_a_field ? current_range : current_range - 1)) return release_bullet_effect(movable) -/datum/proximity_monitor/advanced/projectile_dampener/setup_field_turf(turf/target) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/setup_field_turf(turf/target) for(var/atom/possible_projectile in target) if(isprojectile(possible_projectile)) catch_bullet_effect(possible_projectile) -/datum/proximity_monitor/advanced/projectile_dampener/cleanup_field_turf(turf/target) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/cleanup_field_turf(turf/target) for(var/atom/possible_projectile in target) if(isprojectile(possible_projectile) && HAS_TRAIT_FROM(possible_projectile, TRAIT_GOT_DAMPENED, REF(src))) release_bullet_effect(possible_projectile) ///proc that applies the wobbly effect on point of bullet entry -/datum/proximity_monitor/advanced/projectile_dampener/proc/determine_wobble(turf/location) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/proc/determine_wobble(turf/location) var/coord_x = location.x - host.x var/coord_y = location.y - host.y var/obj/effect/overlay/vis/field/my_field = edgeturf_effects["[coord_x],[coord_y]"] my_field?.set_wobbly(0.15 SECONDS) -/datum/proximity_monitor/advanced/projectile_dampener/proc/projectile_overlay_updated(atom/source, list/overlays) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/proc/projectile_overlay_updated(atom/source, list/overlays) SIGNAL_HANDLER if(!isnull(new_bullet_overlay) && HAS_TRAIT_FROM(source, TRAIT_GOT_DAMPENED, REF(src))) overlays += new_bullet_overlay ///a bullet has entered our field, apply the dampening effects to it -/datum/proximity_monitor/advanced/projectile_dampener/proc/catch_bullet_effect(obj/projectile/bullet) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/proc/catch_bullet_effect(obj/projectile/bullet) ADD_TRAIT(bullet,TRAIT_GOT_DAMPENED, REF(src)) RegisterSignal(bullet, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(projectile_overlay_updated)) SEND_SIGNAL(src, COMSIG_DAMPENER_CAPTURE, bullet) @@ -98,141 +68,35 @@ bullet.update_appearance() ///removing the effects after it has exited our field -/datum/proximity_monitor/advanced/projectile_dampener/proc/release_bullet_effect(obj/projectile/bullet) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/proc/release_bullet_effect(obj/projectile/bullet) REMOVE_TRAIT(bullet, TRAIT_GOT_DAMPENED, REF(src)) SEND_SIGNAL(src, COMSIG_DAMPENER_RELEASE, bullet) bullet_effects.remove_effects(bullet) bullet.update_appearance() UnregisterSignal(bullet, COMSIG_ATOM_UPDATE_OVERLAYS) -///rendering all the field visuals. first we render the corners, then we connect them -/datum/proximity_monitor/advanced/projectile_dampener/proc/draw_effect() - var/max_pixel_offset = current_range * ICON_SIZE_ALL - var/top_right_corner = list(effect_direction_images["[NORTHEAST]"], max_pixel_offset, max_pixel_offset) - var/top_left_corner = list(effect_direction_images["[NORTHWEST]"], -max_pixel_offset, max_pixel_offset) - var/bottom_left_corner = list(effect_direction_images["[SOUTHWEST]"], -max_pixel_offset, -max_pixel_offset) - var/bottom_right_corner = list(effect_direction_images["[SOUTHEAST]"], max_pixel_offset, -max_pixel_offset) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg - var/list/corners = list(top_right_corner, top_left_corner, bottom_left_corner, bottom_right_corner) - for(var/corner in corners) - draw_corner(corner) - - var/list/corners_to_connect = list( - list(OVERLAY_DATA = effect_direction_images["[NORTH]"], CHANGING_OFFSET = "x_offset", STARTING_POSITION = max_pixel_offset), - list(OVERLAY_DATA = effect_direction_images["[SOUTH]"], CHANGING_OFFSET = "x_offset", STARTING_POSITION = -max_pixel_offset), - list(OVERLAY_DATA = effect_direction_images["[WEST]"], CHANGING_OFFSET = "y_offset", STARTING_POSITION = -max_pixel_offset), - list(OVERLAY_DATA = effect_direction_images["[EAST]"], CHANGING_OFFSET = "y_offset", STARTING_POSITION = max_pixel_offset), - ) - for(var/direction in corners_to_connect) - draw_edge(direction, max_pixel_offset) - -///rendering the corners -/datum/proximity_monitor/advanced/projectile_dampener/proc/draw_corner(list/corner_data) - var/obj/effect/overlay/vis/field/corner_effect = new() - var/image/image_overlay = corner_data[1] - corner_effect.icon = image_overlay.icon - corner_effect.icon_state = image_overlay.icon_state - corner_effect.alpha = 0 - corner_effect.pixel_x = corner_data[2] - corner_effect.pixel_y = corner_data[3] - add_effect_to_host(corner_effect) - -///connecting the corners to one another -/datum/proximity_monitor/advanced/projectile_dampener/proc/draw_edge(list/edge_data, target_offset) - var/starting_offset = edge_data[STARTING_POSITION] - var/current_offset = (-1 * target_offset) + ICON_SIZE_ALL - var/image/overlay = edge_data[OVERLAY_DATA] - while(current_offset != target_offset) - var/obj/effect/overlay/vis/field/edge_effect = new() - edge_effect.alpha = 0 - edge_effect.icon = overlay.icon - edge_effect.icon_state = overlay.icon_state - - if(edge_data[CHANGING_OFFSET] == "x_offset") - edge_effect.pixel_y = starting_offset - edge_effect.pixel_x = current_offset - else - edge_effect.pixel_x = starting_offset - edge_effect.pixel_y = current_offset - add_effect_to_host(edge_effect) - current_offset += ICON_SIZE_ALL - -///handles adding the visual effect's data -/datum/proximity_monitor/advanced/projectile_dampener/proc/add_effect_to_host(obj/effect/overlay/vis/field/effect_to_add) - my_movable.vis_contents += effect_to_add - var/coordinate_x = effect_to_add.pixel_x / ICON_SIZE_ALL - var/coordinate_y = effect_to_add.pixel_y / ICON_SIZE_ALL - effect_to_add.transform = effect_to_add.transform.Scale(1 / current_range, 1 / current_range) - edgeturf_effects["[coordinate_x],[coordinate_y]"] = effect_to_add - effect_to_add.set_wobbly(wobble_duration = ANIMATE_DAMPENER_TIME) - animate(effect_to_add, alpha = 255, time = ANIMATE_DAMPENER_TIME, flags = ANIMATION_PARALLEL) - -/datum/proximity_monitor/advanced/projectile_dampener/proc/on_projector_del(datum/source) - SIGNAL_HANDLER - qdel(src) - -/datum/proximity_monitor/advanced/projectile_dampener/Destroy() - for(var/coordinates in edgeturf_effects) - var/obj/effect/overlay/vis/field/effect_to_remove = edgeturf_effects[coordinates] - edgeturf_effects -= coordinates - effect_to_remove.set_wobbly(wobble_duration = ANIMATE_DAMPENER_TIME) - animate(effect_to_remove, alpha = 0, time = ANIMATE_DAMPENER_TIME, flags = ANIMATION_PARALLEL) - QDEL_IN(my_movable, ANIMATE_DAMPENER_TIME) - my_movable = null - bullet_effects = null - return ..() - -/datum/proximity_monitor/advanced/projectile_dampener/peaceborg - -/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location) . = ..() if(!iscyborg(movable) || !HAS_TRAIT_FROM(movable, TRAIT_GOT_DAMPENED, REF(src))) ADD_TRAIT(movable, TRAIT_GOT_DAMPENED, REF(src)) -/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/field_turf_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) - if(!iscyborg(movable) || get_dist(new_location, host) <= current_range) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg/field_turf_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) + if(!iscyborg(movable) || get_dist(new_location, host) <= (edge_is_a_field ? current_range : current_range - 1)) return REMOVE_TRAIT(movable, TRAIT_GOT_DAMPENED, REF(src)) -/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/setup_field_turf(turf/target) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg/setup_field_turf(turf/target) for(var/atom/interesting_atom as anything in target) if(iscyborg(interesting_atom)) ADD_TRAIT(interesting_atom, TRAIT_GOT_DAMPENED, REF(src)) if(isprojectile(interesting_atom)) catch_bullet_effect(interesting_atom) -/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/cleanup_field_turf(turf/target) +/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg/cleanup_field_turf(turf/target) for(var/atom/interesting_atom as anything in target) if(iscyborg(interesting_atom)) REMOVE_TRAIT(interesting_atom, TRAIT_GOT_DAMPENED, REF(src)) if(isprojectile(interesting_atom)) release_bullet_effect(interesting_atom) - -/obj/effect/overlay/vis/field - appearance_flags = PIXEL_SCALE|LONG_GLIDE - vis_flags = parent_type::vis_flags | VIS_INHERIT_PLANE - ///are we currently WOBBLING - var/wobbling_effect = FALSE - -/obj/effect/overlay/vis/field/proc/set_wobbly(wobble_duration) - if(wobbling_effect) - return - wobbling_effect = TRUE - apply_wibbly_filters(src) - addtimer(CALLBACK(src, PROC_REF(remove_wobbly)), wobble_duration) - -/obj/effect/overlay/vis/field/proc/remove_wobbly() - if(QDELETED(src)) - return - remove_wibbly_filters(src, remove_duration = 0.25 SECONDS) - addtimer(VARSET_CALLBACK(src, wobbling_effect, FALSE), 0.25 SECONDS) - -/atom/movable/field_effect_holder - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - appearance_flags = PIXEL_SCALE|LONG_GLIDE - plane = ABOVE_GAME_PLANE - -#undef CHANGING_OFFSET -#undef OVERLAY_DATA -#undef STARTING_POSITION -#undef ANIMATE_DAMPENER_TIME diff --git a/code/datums/proximity_monitor/fields/space_protection.dm b/code/datums/proximity_monitor/fields/space_protection.dm new file mode 100644 index 00000000000..005b4fa86d8 --- /dev/null +++ b/code/datums/proximity_monitor/fields/space_protection.dm @@ -0,0 +1,48 @@ +//Bubble that grants space protection to those inside of it. +/datum/proximity_monitor/advanced/bubble/space_protection + edge_is_a_field = FALSE + ///List of all traits that's given to mobs in the field, which is our "space proof" we grant. + var/static/list/traits_to_give = list( + TRAIT_RESISTCOLD, + TRAIT_RESISTLOWPRESSURE, + TRAIT_NOBREATH, + ) + +/datum/proximity_monitor/advanced/bubble/space_protection/setup_effect_directions() + effect_direction_images = list( + "[SOUTH]" = image('icons/effects/fields.dmi', icon_state = "space_protection_south"), + "[NORTH]" = image('icons/effects/fields.dmi', icon_state = "space_protection_north"), + "[WEST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_west"), + "[EAST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_east"), + "[NORTHWEST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_northwest"), + "[SOUTHWEST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_southwest"), + "[NORTHEAST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_northeast"), + "[SOUTHEAST]" = image('icons/effects/fields.dmi', icon_state = "space_protection_southeast"), + ) + +/datum/proximity_monitor/advanced/bubble/space_protection/field_turf_crossed(atom/movable/movable, turf/old_location, turf/new_location) + if(!isliving(movable) || HAS_TRAIT_FROM(movable, traits_to_give[1], REF(src))) + return + give_space_immunity(movable) + +/datum/proximity_monitor/advanced/bubble/space_protection/field_turf_uncrossed(atom/movable/movable, turf/old_location, turf/new_location) + if(!isliving(movable) || get_dist(new_location, host) <= (edge_is_a_field ? current_range : current_range - 1)) + return + remove_space_immunity(movable) + +/datum/proximity_monitor/advanced/bubble/space_protection/setup_field_turf(turf/target) + for(var/mob/possible_mob in target) + give_space_immunity(possible_mob) + +/datum/proximity_monitor/advanced/bubble/space_protection/cleanup_field_turf(turf/target) + for(var/mob/possible_mob in target) + if(HAS_TRAIT_FROM(possible_mob, traits_to_give[1], REF(src))) + remove_space_immunity(possible_mob) + +///a mob has entered our field, apply the space protection to them. +/datum/proximity_monitor/advanced/bubble/space_protection/proc/give_space_immunity(mob/living/new_immunne) + new_immunne.add_traits(traits_to_give, REF(src)) + +///removing the effects after the mob has exited our field. +/datum/proximity_monitor/advanced/bubble/space_protection/proc/remove_space_immunity(mob/living/no_longer_immune) + no_longer_immune.remove_traits(traits_to_give, REF(src)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 136cfd75523..c34286cc858 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -1077,3 +1077,127 @@ #undef SUCCESS #undef NO_FUEL #undef ALREADY_LIT + +#define SLOWDOWN_ON 1 + +/obj/item/flashlight/lamp/space_bubble + name = "space furnace" + desc = "A heavy furnace capable of forming a temporary bubble that holds in breathable air." + icon_state = "space_lamp" + worn_icon_state = "space_lamp" + inhand_icon_state = "space_lamp" + w_class = WEIGHT_CLASS_HUGE + throw_range = 2 + slot_flags = ITEM_SLOT_BACK + item_flags = SLOWS_WHILE_IN_HAND + heat = 2500 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + ) + light_color = LIGHT_COLOR_ORANGE + start_on = FALSE + sound_on = 'sound/effects/fire_puff.ogg' + sound_off = 'sound/items/weapons/gun/bow/bow_fire.ogg' + + ///The timer we track until the bubble deletes itself. + var/bubble_timer + ///The amount of time that the bubble will survive for once turned on. This can't be changed normally but is a var for admins. + var/bubble_duration = (15 MINUTES) + ///Boolean on whether or not a pyroclastic anomaly core has been inserted, allowing the item to be used. + var/installed_pyro_core = FALSE + ///The proximity monitor & visual bubble that grants space protection to people nearby, while active. + var/datum/proximity_monitor/advanced/bubble/space_protection/space_bubble + +/obj/item/flashlight/lamp/space_bubble/Initialize(mapload) + AddElement(/datum/element/update_icon_updates_onmob) + . = ..() + AddComponent(/datum/component/two_handed, require_twohands = TRUE) + update_appearance(UPDATE_DESC) + +/obj/item/flashlight/lamp/space_bubble/Destroy(force) + if(space_bubble) + QDEL_NULL(space_bubble) + return ..() + +/obj/item/flashlight/lamp/space_bubble/init_slapcrafting() + return + +/obj/item/flashlight/lamp/space_bubble/update_icon_state() + . = ..() + if(light_on) + worn_icon_state = "[initial(worn_icon_state)]-on" + else + worn_icon_state = initial(worn_icon_state) + +/obj/item/flashlight/lamp/space_bubble/update_desc(updates) + . = ..() + if(installed_pyro_core) + desc = initial(desc) + return + desc = initial(desc) + " Requires a pyroclastic anomaly core to function." + +/obj/item/flashlight/lamp/space_bubble/get_temperature() + return light_on * heat + +/obj/item/flashlight/lamp/space_bubble/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(light_on && istype(tool, /obj/item/cigarette)) + var/obj/item/cigarette/cig = tool + if(cig.lit) + return NONE + cig.light(flavor_text = "[user] lights up \the [cig] using the burning coming out of the [src]. Damn.") + return ITEM_INTERACT_SUCCESS + if(!istype(tool, /obj/item/assembly/signaler/anomaly/pyro) || installed_pyro_core) + return NONE + user.balloon_alert(user, "core inserted") + qdel(tool) + installed_pyro_core = TRUE + playsound(src, 'sound/machines/crate/crate_open.ogg', 50, FALSE) + update_appearance(UPDATE_DESC) + return ITEM_INTERACT_SUCCESS + +/obj/item/flashlight/lamp/space_bubble/toggle_light(mob/user) + if(!installed_pyro_core) + user.balloon_alert(user, "core missing!") + return FALSE + var/datum/gas_mixture/environment = loc?.return_air() + var/affected_pressure = environment.return_pressure() + if(!light_on && (affected_pressure < ONE_ATMOSPHERE)) + user.balloon_alert(user, "no pressure!") + return FALSE + . = ..() + if(light_on) + if(istype(space_bubble)) + QDEL_NULL(space_bubble) + bubble_timer = addtimer(CALLBACK(src, PROC_REF(start_bubble_close), "dies down..."), bubble_duration, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_DELETE_ME) + space_bubble = new(src, 4, FALSE, src) + slowdown = SLOWDOWN_ON + drag_slowdown = SLOWDOWN_ON + user.update_equipment_speed_mods() + return + close_bubble(user) + +///Uses an arg for special flavortext to be balloon alerted to everyone, then gives an extra 5 seconds before killing the bubble. +/obj/item/flashlight/lamp/space_bubble/proc/start_bubble_close(special_flavortext) + if(special_flavortext) + balloon_alert_to_viewers(special_flavortext) + var/mob/living/potential_mob = recursive_loc_check(src, /mob/living) || null + addtimer(CALLBACK(src, PROC_REF(toggle_light), potential_mob), 5 SECONDS, TIMER_UNIQUE|TIMER_DELETE_ME) + +///Closes the bubble and cleans up after itself. Optional 'user' arg for the mob turning us off. +/obj/item/flashlight/lamp/space_bubble/proc/close_bubble(mob/user) + QDEL_NULL(space_bubble) + if(bubble_timer) + deltimer(bubble_timer) + slowdown = initial(slowdown) + drag_slowdown = initial(drag_slowdown) + if(user) + user.update_equipment_speed_mods() + +#undef SLOWDOWN_ON + +///Pre-core activated one for admin spawning. +/obj/item/flashlight/lamp/space_bubble/preactivated + installed_pyro_core = TRUE diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 40d044bd5eb..b77582cb9bd 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -30,7 +30,7 @@ /// The owner of the dampener var/mob/living/silicon/robot/host = null /// The field - var/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/dampening_field + var/datum/proximity_monitor/advanced/bubble/projectile_dampener/peaceborg/dampening_field /// Energy cost per tracked projectile damage amount per second var/projectile_damage_tick_ecost_coefficient = 10 /// Energy cost per tracked projectile per second diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 14f5ad80254..efe5d4646ef 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -318,7 +318,7 @@ /// Effect image on projectiles. var/image/projectile_effect /// The dampening field - var/datum/proximity_monitor/advanced/projectile_dampener/dampening_field + var/datum/proximity_monitor/advanced/bubble/projectile_dampener/dampening_field /obj/item/mod/module/projectile_dampener/Initialize(mapload) . = ..() diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index dd1298af175..f3fa22a6824 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1162,3 +1162,21 @@ RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +// Anomaly locked item + +/datum/design/space_furnace + name = "Space Furnace" + desc = "A heavy furnace capable of forming a temporary bubble that holds in breathable air. Requires a pyroclastic anomaly core to function." + id = "space_furnace" + build_type = PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT*5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT*2.5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, + ) + build_path = /obj/item/flashlight/lamp/space_bubble + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm index 41222be25bb..bf22457c7ba 100644 --- a/code/modules/research/techweb/nodes/research_nodes.dm +++ b/code/modules/research/techweb/nodes/research_nodes.dm @@ -80,6 +80,7 @@ "anomaly_refinery", "anomaly_neutralizer", "reactive_armour", + "space_furnace", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/icons/effects/fields.dmi b/icons/effects/fields.dmi index 1e428707876748652b734767c55c46a3616a5a51..a9394b6ab0655a7b0844e6e0d72de363e9cc4db8 100644 GIT binary patch literal 5687 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 Iy!Z6K06;0$KmY&$ literal 118542 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

    F(7M8e+l3vAd{#{Ntw?0ZN_Dmg)#TagXEE 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

    _YrRbz`O`02Wr^ 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 z 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 diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 82f46b35c6cc1ebbe17ed5825a35c51aac87a79e..a01a25ec3329bdc7fa023de15815c2e7b09bff47 100644 GIT binary patch literal 36914 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 literal 32366 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 H7eW6Gm!Cjo diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index b2e2fc8033b89cd8611267e6ec065d7350696f72..4e5c3ce2bb0d9ee9d45b0ea21206f84416dcac2d 100644 GIT binary patch literal 39270 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 literal 35095 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�{$7B4*o;y9kmf&fYV(toKI!!?}TD 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%0AmW7jvar9?zya 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 YE1r4FVL}70004lzw2D-Pgz2~c1AR@aqW}N^ literal 78523 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