From 9a3eee70d49f390bb71fa3f2d4aa3e10784c5fbb Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Wed, 12 Jun 2024 20:04:43 -0300 Subject: [PATCH 001/120] Cult pylons slowly close bleeding wounds (#83870) ## About The Pull Request Cult pylons will now slowly close bleeding wounds. ## Why It's Good For The Game Pylons were never updated alongside wounds, so it's an EXTREMELY common sight to see people dead or dying next to pylons purely from blood loss. Even havign 4 pylons near isn't enough to help you up - it doesn't oxy heal, so if you're in crit, you're fucked. The blood cult should be able to deal with blood loss. ## Changelog :cl: qol: Cult pylons slowly close bleeding wounds refactor: allowed aura healing to clot wounds shut /:cl: --- code/datums/components/aura_healing.dm | 9 +++++++++ code/modules/antagonists/cult/cult_structure_pylon.dm | 1 + 2 files changed, 10 insertions(+) diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index 18484deb2d618..e71a06de2fb23 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -29,6 +29,9 @@ /// Amount of blood to heal over a second var/blood_heal = 0 + /// Amount of bleed/pierce wound lowering per second. + var/wound_clotting = 0 + /// Map of organ (such as ORGAN_SLOT_BRAIN) to damage heal over a second var/list/organ_healing = null @@ -56,6 +59,7 @@ suffocation_heal = 0, stamina_heal = 0, blood_heal = 0, + wound_clotting = 0, organ_healing = null, simple_heal = 0, limit_to_trait = null, @@ -74,6 +78,7 @@ src.suffocation_heal = suffocation_heal src.stamina_heal = stamina_heal src.blood_heal = blood_heal + src.wound_clotting = wound_clotting src.organ_healing = organ_healing src.simple_heal = simple_heal src.limit_to_trait = limit_to_trait @@ -130,6 +135,10 @@ for (var/organ in organ_healing) candidate.adjustOrganLoss(organ, -organ_healing[organ] * seconds_per_tick) + var/mob/living/carbon/carbidate = candidate + for(var/datum/wound/iter_wound as anything in carbidate.all_wounds) + iter_wound.adjust_blood_flow(-wound_clotting * seconds_per_tick) + else if (isanimal(candidate)) var/mob/living/simple_animal/animal_candidate = candidate animal_candidate.adjustHealth(-simple_heal * seconds_per_tick, updating_health = FALSE) diff --git a/code/modules/antagonists/cult/cult_structure_pylon.dm b/code/modules/antagonists/cult/cult_structure_pylon.dm index 4bb7c83e7a769..e436601325d25 100644 --- a/code/modules/antagonists/cult/cult_structure_pylon.dm +++ b/code/modules/antagonists/cult/cult_structure_pylon.dm @@ -22,6 +22,7 @@ burn_heal = 0.4, \ blood_heal = 0.4, \ simple_heal = 1.2, \ + wound_clotting = 0.1, \ requires_visibility = FALSE, \ limit_to_trait = TRAIT_HEALS_FROM_CULT_PYLONS, \ healing_color = COLOR_CULT_RED, \ From aebc737f413fbeec8be322f0177fe03e65781561 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:05:04 +1200 Subject: [PATCH 002/120] Automatic changelog for PR #83870 [ci skip] --- html/changelogs/AutoChangeLog-pr-83870.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83870.yml diff --git a/html/changelogs/AutoChangeLog-pr-83870.yml b/html/changelogs/AutoChangeLog-pr-83870.yml new file mode 100644 index 0000000000000..1861be379923d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83870.yml @@ -0,0 +1,5 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "Cult pylons slowly close bleeding wounds" + - refactor: "allowed aura healing to clot wounds shut" \ No newline at end of file From 8169633c332548cd546eea9fc6f74b8749ea4f7f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 13 Jun 2024 00:21:55 +0000 Subject: [PATCH 003/120] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-83445.yml | 4 --- html/changelogs/AutoChangeLog-pr-83521.yml | 5 --- html/changelogs/AutoChangeLog-pr-83686.yml | 4 --- html/changelogs/AutoChangeLog-pr-83737.yml | 4 --- html/changelogs/AutoChangeLog-pr-83818.yml | 6 ---- html/changelogs/AutoChangeLog-pr-83857.yml | 5 --- html/changelogs/AutoChangeLog-pr-83858.yml | 4 --- html/changelogs/AutoChangeLog-pr-83870.yml | 5 --- html/changelogs/AutoChangeLog-pr-83873.yml | 4 --- html/changelogs/AutoChangeLog-pr-83878.yml | 4 --- html/changelogs/AutoChangeLog-pr-83883.yml | 4 --- html/changelogs/archive/2024-06.yml | 37 ++++++++++++++++++++++ 12 files changed, 37 insertions(+), 49 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-83445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83521.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83686.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83737.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83818.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83857.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83858.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83870.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83873.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83878.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83883.yml diff --git a/html/changelogs/AutoChangeLog-pr-83445.yml b/html/changelogs/AutoChangeLog-pr-83445.yml deleted file mode 100644 index 5c11c512dfeb6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - balance: "Taking stamina damage in stamcrit has diminishing returns associated, meaning you cannot be infinitely stamcrit." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83521.yml b/html/changelogs/AutoChangeLog-pr-83521.yml deleted file mode 100644 index 5ef70873333c6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83521.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - rscadd: "Character Loadouts" - - rscdel: "Pride Pin quirk (it's in the Loadout menu now)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83686.yml b/html/changelogs/AutoChangeLog-pr-83686.yml deleted file mode 100644 index 44cd7d3477090..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83686.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Capsandi" -delete-after: True -changes: - - sound: "Some ambience tracks are quieter now." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83737.yml b/html/changelogs/AutoChangeLog-pr-83737.yml deleted file mode 100644 index f8e4244a32aac..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83737.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kocma-san" -delete-after: True -changes: - - rscadd: "Added new keywords (%d, %date, %t, %time) for fields" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83818.yml b/html/changelogs/AutoChangeLog-pr-83818.yml deleted file mode 100644 index ba03c694b09d9..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83818.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - refactor: "Over 200 item interactions have been refactored to use a newer, easier-to-use system. Report any oddities with using items on other objects you may see (such as surgery, reagent containers like cups and spray bottles, or construction devices), especially using something at range (such as guns or chisels)" - - refactor: "Item-On-Modsuit interactions have changed slightly. While on combat mode, you will attempt to \"use\" the item on the suit instead of inserting it into the suit's storage. This means being on combat mode while the suit's panel is open will block you from inserting items entirely via click (but other methods such as hotkey, clicking on the storage boxes, and mousedrop will still work)." - - refactor: "The detective's scanner will now be inserted into storage items if clicked normally, and will scan the storage item if on combat mode" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83857.yml b/html/changelogs/AutoChangeLog-pr-83857.yml deleted file mode 100644 index 4b66dc9779c8b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83857.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "EMPs on carbons no longer happen twice" - - code_imp: "Moves organ emps under bodyparts, changes how bodyparts handle emp effects" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83858.yml b/html/changelogs/AutoChangeLog-pr-83858.yml deleted file mode 100644 index 47c6dcb25d774..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83858.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Goat" -delete-after: True -changes: - - bugfix: "Enviro suit lights no longer stay on when the welding visor is activated." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83870.yml b/html/changelogs/AutoChangeLog-pr-83870.yml deleted file mode 100644 index 1861be379923d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83870.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - qol: "Cult pylons slowly close bleeding wounds" - - refactor: "allowed aura healing to clot wounds shut" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83873.yml b/html/changelogs/AutoChangeLog-pr-83873.yml deleted file mode 100644 index bbd273f8372f2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83873.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - sound: "You can now experience tram crashes in higher fidelity than ever!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83878.yml b/html/changelogs/AutoChangeLog-pr-83878.yml deleted file mode 100644 index bf364164ec397..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83878.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: " RCD, RPLD & RTD cancels their build process if their design is changed during build." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83883.yml b/html/changelogs/AutoChangeLog-pr-83883.yml deleted file mode 100644 index 6e46203a27b5a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83883.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Rhials" -delete-after: True -changes: - - bugfix: "The \"mopper\" gimmick assistant outfit spawns with one cart instead of nine." \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index a8af888ec8988..dc4e56df83d7b 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -574,3 +574,40 @@ - bugfix: Medieval shuttle has actual engines now - bugfix: Shortsword has its original colours - bugfix: Crude helmet no longer makes you bald +2024-06-13: + Capsandi: + - sound: Some ambience tracks are quieter now. + Goat: + - bugfix: Enviro suit lights no longer stay on when the welding visor is activated. + Kocma-san: + - rscadd: Added new keywords (%d, %date, %t, %time) for fields + LT3: + - sound: You can now experience tram crashes in higher fidelity than ever! + Majkl-J: + - bugfix: EMPs on carbons no longer happen twice + - code_imp: Moves organ emps under bodyparts, changes how bodyparts handle emp effects + Melbert: + - rscadd: Character Loadouts + - rscdel: Pride Pin quirk (it's in the Loadout menu now) + - refactor: Over 200 item interactions have been refactored to use a newer, easier-to-use + system. Report any oddities with using items on other objects you may see (such + as surgery, reagent containers like cups and spray bottles, or construction + devices), especially using something at range (such as guns or chisels) + - refactor: Item-On-Modsuit interactions have changed slightly. While on combat + mode, you will attempt to "use" the item on the suit instead of inserting it + into the suit's storage. This means being on combat mode while the suit's panel + is open will block you from inserting items entirely via click (but other methods + such as hotkey, clicking on the storage boxes, and mousedrop will still work). + - refactor: The detective's scanner will now be inserted into storage items if clicked + normally, and will scan the storage item if on combat mode + - balance: Taking stamina damage in stamcrit has diminishing returns associated, + meaning you cannot be infinitely stamcrit. + Rhials: + - bugfix: The "mopper" gimmick assistant outfit spawns with one cart instead of + nine. + SyncIt21: + - bugfix: ' RCD, RPLD & RTD cancels their build process if their design is changed + during build.' + carlarctg: + - qol: Cult pylons slowly close bleeding wounds + - refactor: allowed aura healing to clot wounds shut From 8c6f3a3081f6d7bc9d52a12c1b2f9c937ed42e26 Mon Sep 17 00:00:00 2001 From: Kocma-san <112967882+Kocma-san@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:34:13 +0700 Subject: [PATCH 004/120] Fix of a inaccuracy in the fax interface (#83879) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About The Pull Request If there is only 1 fax in the entire game world, then even special networks were not shown in its interface. It's fixed now ![изображение_2024-06-11_234232078](https://github.com/tgstation/tgstation/assets/112967882/94f6e744-0829-4e30-aeff-e9f39b1ad8e9) ## Why It's Good For The Game This is a mistake, and they need to be corrected... Perhaps useful for those who create maps? ## Changelog :cl: fix: special networks are now displayed in the fax if it is the only one in the world /:cl: --- tgui/packages/tgui/interfaces/Fax.tsx | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Fax.tsx b/tgui/packages/tgui/interfaces/Fax.tsx index 4440f65134f67..059997456b55d 100644 --- a/tgui/packages/tgui/interfaces/Fax.tsx +++ b/tgui/packages/tgui/interfaces/Fax.tsx @@ -49,6 +49,9 @@ export const Fax = (props) => { (sortFax: FaxInfo) => sortFax.fax_name, ) : []; + const special_networks = data.syndicate_network + ? data.special_faxes + : data.special_faxes.filter((fax: FaxSpecial) => !fax.emag_needed); return ( @@ -81,14 +84,11 @@ export const Fax = (props) => {
- {faxes.length !== 0 ? ( + {faxes.length === 0 && special_networks.length === 0 ? ( + "The fax couldn't detect any other faxes on the network." + ) : ( - {(data.syndicate_network - ? data.special_faxes - : data.special_faxes.filter( - (fax: FaxSpecial) => !fax.emag_needed, - ) - ).map((special: FaxSpecial) => ( + {special_networks.map((special: FaxSpecial) => ( ))} - {faxes.map((fax: FaxInfo) => ( - - ))} + {faxes.length !== 0 + ? faxes.map((fax: FaxInfo) => ( + + )) + : null} - ) : ( - "The fax couldn't detect any other faxes on the network." )}
Date: Thu, 13 Jun 2024 14:34:32 +1200 Subject: [PATCH 005/120] Automatic changelog for PR #83879 [ci skip] --- html/changelogs/AutoChangeLog-pr-83879.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83879.yml diff --git a/html/changelogs/AutoChangeLog-pr-83879.yml b/html/changelogs/AutoChangeLog-pr-83879.yml new file mode 100644 index 0000000000000..905e79a29e9f0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83879.yml @@ -0,0 +1,4 @@ +author: "Kocma-san" +delete-after: True +changes: + - bugfix: "special networks are now displayed in the fax if it is the only one in the world" \ No newline at end of file From 17d39f7af007eae0e762b40abe59dc98e30c3e4c Mon Sep 17 00:00:00 2001 From: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Date: Thu, 13 Jun 2024 13:06:49 +0000 Subject: [PATCH 006/120] Upgrades bot voice lines (#83847) ## About The Pull Request As the title says. Upgrades the menu and allows you to create action button shortcuts. ![image](https://github.com/tgstation/tgstation/assets/37270891/902d5e2b-de50-463e-a566-062ee24cc138) ![image](https://github.com/tgstation/tgstation/assets/37270891/0ce025e3-2f38-4013-8cde-00af12584086) ![image](https://github.com/tgstation/tgstation/assets/37270891/88ad4a30-dd65-4275-912c-b341264d77fd) Additionally, bots can now select the radio channel if they have one. Lowers the cooldown for voice lines. ## Why It's Good For The Game Being able to more conveniently send a voice line by pressing a button without needing to open up an interface and navigate to the correct line will make using these a lot easier in relevant situations. Voice line cooldowns are lowered a bit just to make voice lines easier to use in relevant situations. I.e. 'Extinguishing fire' -> 5 seconds later -> 'Fire extinguished' Abuse should generally just be punished by the admins, the cooldown doesn't need to be too lengthy. ## Changelog :cl: qol: Bots can now bind voice lines to an action slot. Lowers cooldown for all bot voicelines to 5 seconds. /:cl: --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com> --- code/__DEFINES/cooldowns.dm | 1 + code/game/communications.dm | 18 ++ .../simple_animal/bot/bot_announcement.dm | 171 ++++++++++- .../tgui/interfaces/BotAnnouncement.tsx | 270 ++++++++++++++++++ 4 files changed, 451 insertions(+), 9 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/BotAnnouncement.tsx diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 0cb559b0e8f36..0ff525dac5ae0 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -66,6 +66,7 @@ #define MOB_SHARED_COOLDOWN_1 (1<<0) #define MOB_SHARED_COOLDOWN_2 (1<<1) #define MOB_SHARED_COOLDOWN_3 (1<<2) +#define MOB_SHARED_COOLDOWN_BOT_ANNOUNCMENT (1<<3) //TIMER COOLDOWN MACROS diff --git a/code/game/communications.dm b/code/game/communications.dm index 0be3ccf17bc0d..6d26a9779937d 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -129,6 +129,24 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_CTF_YELLOW]" = RADIO_CHANNEL_CTF_YELLOW )) +GLOBAL_LIST_INIT(radiocolors, list( + RADIO_CHANNEL_COMMON = "#008000", + RADIO_CHANNEL_SCIENCE = "#993399", + RADIO_CHANNEL_COMMAND = "#948f02", + RADIO_CHANNEL_MEDICAL = "#337296", + RADIO_CHANNEL_ENGINEERING = "#fb5613", + RADIO_CHANNEL_SECURITY = "#a30000", + RADIO_CHANNEL_CENTCOM = "#686868", + RADIO_CHANNEL_SYNDICATE = "#6d3f40", + RADIO_CHANNEL_SUPPLY = "#a8732b", + RADIO_CHANNEL_SERVICE = "#6eaa2c", + RADIO_CHANNEL_AI_PRIVATE = "#ff00ff", + RADIO_CHANNEL_CTF_RED = "#ff0000", + RADIO_CHANNEL_CTF_BLUE = "#0000ff", + RADIO_CHANNEL_CTF_GREEN = "#00ff00", + RADIO_CHANNEL_CTF_YELLOW = "#d1ba22" +)) + /datum/radio_frequency /// The frequency of this radio frequency. Of course. var/frequency diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm index eade5a291c439..061e6375088af 100644 --- a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm +++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm @@ -6,10 +6,15 @@ overlay_icon_state = "bg_tech_blue_border" button_icon = 'icons/obj/machines/wallmounts.dmi' button_icon_state = "intercom" - cooldown_time = 10 SECONDS + cooldown_time = 5 SECONDS + shared_cooldown = MOB_SHARED_COOLDOWN_BOT_ANNOUNCMENT melee_cooldown_time = 0 SECONDS /// List of strings to sound effects corresponding to automated messages we can play var/list/automated_announcements + /// Maximum amount of buttons this can have + var/max_buttons = 10 + /// List of buttons that automatically correspond to an announcement and channel + var/list/buttons = list() /datum/action/cooldown/bot_announcement/New(Target, original, list/automated_announcements) src.automated_announcements = automated_announcements @@ -29,15 +34,118 @@ return FALSE return TRUE +/datum/action/cooldown/bot_announcement/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BotAnnouncement", "Select announcement") + ui.set_autoupdate(TRUE) + ui.open() + +/datum/action/cooldown/bot_announcement/ui_state(mob/user) + return GLOB.conscious_state + +/datum/action/cooldown/bot_announcement/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(user != owner) + return UI_CLOSE + +/datum/action/cooldown/bot_announcement/ui_data(mob/user) + var/list/data = list() + + var/mob/living/simple_animal/bot/bot_owner = owner + if(istype(bot_owner)) + var/list/channels = list() + for(var/channel in bot_owner.internal_radio.channels) + channels += channel + data["channels"] = channels + else + data["channels"] = list() + var/list/lines = list() + for(var/line in automated_announcements) + lines += line + data["lines"] = lines + var/list/button_data = list() + for(var/datum/action/cooldown/bot_announcement_shortcut/button as anything in buttons) + button_data += list(list( + "name" = button.name, + "channel" = button.channel + )) + data["button_data"] = button_data + data["cooldown_left"] = next_use_time - world.time + return data + +/datum/action/cooldown/bot_announcement/Destroy() + QDEL_LIST(buttons) + return ..() + +/datum/action/cooldown/bot_announcement/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("announce") + var/picked = params["picked"] + var/channel = params["channel"] + if(!(picked in automated_announcements)) + return + announce(picked, channel) + StartCooldown() + return TRUE + if("set_button") + if(length(buttons) >= max_buttons) + return + var/picked = params["picked"] + var/channel = params["channel"] + if(!(picked in automated_announcements)) + return + create_shortcut(picked, channel) + return TRUE + if("remove_button") + var/index = text2num(params["index"]) + if(!index) + return + if(index < 1 || index > length(buttons)) + return + var/datum/action/button = buttons[index] + qdel(button) + return TRUE + /datum/action/cooldown/bot_announcement/Activate(trigger_flags, atom/target) - var/picked if (length(automated_announcements) > 1) - picked = tgui_input_list(owner, message = "Choose announcement to make.", title = "Select announcement", items = automated_announcements) - else - picked = pick(automated_announcements) - if (isnull(picked)) + ui_interact(owner) return - announce(picked) + else if(length(automated_announcements) == 1) + announce(automated_announcements[1]) + return ..() + +/datum/action/cooldown/bot_announcement/proc/create_shortcut(line, channel) + var/datum/action/cooldown/bot_announcement_shortcut/shortcut = new(src) + + shortcut.prefix = copytext(line, 1, 4) + var/color = GLOB.radiocolors["[channel]"] + if(color) + shortcut.prefix_color = color + shortcut.name = line + shortcut.message = line + shortcut.channel = channel + shortcut.linked = src + shortcut.Grant(owner) + RegisterSignal(shortcut, COMSIG_QDELETING, PROC_REF(on_shortcut_deleted)) + buttons += shortcut + +/datum/action/cooldown/bot_announcement/proc/on_shortcut_deleted(datum/shortcut) + SIGNAL_HANDLER + buttons -= shortcut + +/datum/action/cooldown/bot_announcement/Grant(mob/granted_to) + . = ..() + for(var/datum/action/action as anything in buttons) + action.Grant(granted_to) + +/datum/action/cooldown/bot_announcement/Remove(mob/removed_from) + for(var/datum/action/action as anything in buttons) + action.Remove(removed_from) return ..() /// Speak the provided line on the provided radio channel @@ -46,10 +154,9 @@ if (!(bot_owner.bot_mode_flags & BOT_MODE_ON)) return + bot_owner.say(line) if (channel && bot_owner.internal_radio.channels[channel]) bot_owner.internal_radio.talk_into(bot_owner, message = line, channel = channel) - else - bot_owner.say(line) if (length(automated_announcements) && !isnull(automated_announcements[line])) playsound(bot_owner, automated_announcements[line], vol = 50, vary = FALSE) @@ -62,3 +169,49 @@ if(!(bot_owner.medical_mode_flags & MEDBOT_SPEAK_MODE)) return return ..() + +/datum/action/cooldown/bot_announcement_shortcut + desc = "Play a prerecorded message for the benefit of those around you." + shared_cooldown = MOB_SHARED_COOLDOWN_BOT_ANNOUNCMENT + melee_cooldown_time = 0 SECONDS + background_icon_state = "bg_tech_blue" + overlay_icon_state = "bg_tech_blue_border" + button_icon = 'icons/obj/machines/wallmounts.dmi' + button_icon_state = "intercom" + /// The prefix that appears on this button + var/prefix + /// The color of the prefix that appears on the button + var/prefix_color = "#ffffff" + /// The prefix icon that's rendered on the button + var/mutable_appearance/prefix_icon + /// The message to send when this button is clicked + var/message + /// The channel to send this to when clicked + var/channel + + /// The linked bot_announcement ability + var/datum/action/cooldown/bot_announcement/linked + +/datum/action/cooldown/bot_announcement_shortcut/Destroy() + linked = null + return ..() + +/datum/action/cooldown/bot_announcement_shortcut/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + if(prefix_icon) + current_button.cut_overlay(prefix_icon) + if(!prefix) + return + if(!prefix_icon) + prefix_icon = mutable_appearance() + prefix_icon.maptext = MAPTEXT_SPESSFONT("[prefix]") + prefix_icon.maptext_x = -4 + prefix_icon.maptext_y = 8 + current_button.add_overlay(prefix_icon) + +/datum/action/cooldown/bot_announcement_shortcut/Activate(atom/target) + if(!message || !linked) + return + cooldown_time = linked.cooldown_time + linked.announce(message, channel) + return ..() diff --git a/tgui/packages/tgui/interfaces/BotAnnouncement.tsx b/tgui/packages/tgui/interfaces/BotAnnouncement.tsx new file mode 100644 index 0000000000000..3292e81a0e75f --- /dev/null +++ b/tgui/packages/tgui/interfaces/BotAnnouncement.tsx @@ -0,0 +1,270 @@ +import { createSearch } from 'common/string'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; +import { + Box, + Button, + Dropdown, + Icon, + Input, + Section, + Stack, + Tabs, +} from '../components'; +import { RADIO_CHANNELS } from '../constants'; +import { Window } from '../layouts'; + +type ButtonData = { + name: string; + channel: string; +}; + +type ButtonDataWithId = { + button: ButtonData; + index: number; +}; + +type StringWithId = { + string: string; + index: number; +}; + +type BotAnnouncementData = { + channels: string[]; + lines: string[]; + button_data: ButtonData[]; + cooldown_left: number; +}; + +enum TAB { + Announcements, + Shortcuts, +} + +export const BotAnnouncement = (props) => { + const { act, data } = useBackend(); + const { channels, lines, button_data, cooldown_left } = data; + + const [tab, setTab] = useState(TAB.Announcements); + const [selectedChannel, setSelectedChannel] = useState(null); + const [selectedLine, setSelectedLine] = useState(null); + const [selectedButton, setSelectedButton] = useState(null); + const [search, setSearch] = useState(''); + + let filteredLines: StringWithId[] = lines.map((val, index) => ({ + string: val, + index, + })); + let filteredShortcuts: ButtonDataWithId[] = button_data.map((val, index) => ({ + button: val, + index, + })); + + if (search !== '') { + if (tab === TAB.Announcements) { + const lineSearch = createSearch( + search, + (item: StringWithId) => item.string, + ); + filteredLines = filteredLines.filter(lineSearch); + } else { + const buttonSearch = createSearch( + search, + (item: ButtonDataWithId) => item.button.name, + ); + filteredShortcuts = filteredShortcuts.filter(buttonSearch); + } + } + + return ( + + +
+ + { + setSearch(''); + setTab(TAB.Announcements); + }} + > + Announcements + + { + setSearch(''); + setTab(TAB.Shortcuts); + }} + > + Shortcuts + + +
+
+ {tab === TAB.Announcements && ( + + {filteredLines.map((val) => ( + + + + ))} + + )} + {tab === TAB.Shortcuts && ( + + {filteredShortcuts.map((val) => ( + + + + ))} + + )} +
+
+ + + setSearch(newValue)} + fluid + autoFocus + placeholder="Search..." + /> + + + + {tab === TAB.Announcements ? ( + + { + if (value === 'No radio channel') { + setSelectedChannel(null); + } else { + setSelectedChannel(value); + } + }} + /> + + ) : ( + + )} + + + + + + + + + +
+
+
+ ); +}; From 521ac095c77a5920169ff76a2023114be35009eb Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:07:08 +1200 Subject: [PATCH 007/120] Automatic changelog for PR #83847 [ci skip] --- html/changelogs/AutoChangeLog-pr-83847.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83847.yml diff --git a/html/changelogs/AutoChangeLog-pr-83847.yml b/html/changelogs/AutoChangeLog-pr-83847.yml new file mode 100644 index 0000000000000..f28fc0a7bc5c5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83847.yml @@ -0,0 +1,4 @@ +author: "Watermelon914" +delete-after: True +changes: + - qol: "Bots can now bind voice lines to an action slot. Lowers cooldown for all bot voicelines to 5 seconds." \ No newline at end of file From c5490f5a560c9e23884d46831c5663c22764a986 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:55:00 +0200 Subject: [PATCH 008/120] Nerfs moon smile (#83248) ## About The Pull Request This pull request makes the Moon Smile spell a worse alpha strike by lowering the minimum duration of most of the effects and making the knockdown only occur if the targets sanity is low enough. Currently its knocking down at less than 40 sanity though this threshold can be lowered if desired. ## Why It's Good For The Game In its current state this spell is wayyyy too strong for how quickly you get it and I've heard a lot of frustration expressed about it. This PR attempts to tackle this by decreasing the minimum duration of its effects and locking the knockdown to lower sanity levels making it better in extended combat like the intent of the ability always was. ## Changelog :cl: balance: Moon Smile only does a knockdown if the targets sanity is low enough and the minimum duration of its abilities have been decreased /:cl: --- .../antagonists/heretic/magic/moon_smile.dm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 90a392691e9fa..35f2d77e3e6b6 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/spell/pointed/moon_smile name = "Smile of the moon" desc = "Lets you turn the gaze of the moon on someone \ - temporarily blinding, muting, deafening and knocking down a single target." + temporarily blinding, muting, deafening and knocking down a single target if their sanity is low enough." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -37,16 +37,19 @@ playsound(cast_on, 'sound/hallucinations/i_see_you1.ogg', 50, 1) to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) - cast_on.adjust_temp_blindness(moon_smile_duration + 5 SECONDS) - cast_on.set_eye_blur_if_lower(moon_smile_duration + 7 SECONDS) + cast_on.adjust_temp_blindness(moon_smile_duration + 1 SECONDS) + cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) //adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds - ears?.adjustEarDamage(0, (moon_smile_duration + 2 SECONDS) / (2 SECONDS)) + ears?.adjustEarDamage(0, (moon_smile_duration + 1 SECONDS) / (2 SECONDS)) - cast_on.adjust_silence(moon_smile_duration + 5 SECONDS) - cast_on.AdjustKnockdown(2 SECONDS) + cast_on.adjust_silence(moon_smile_duration + 1 SECONDS) cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) + + // Only knocksdown if the target has a low enough sanity + if(cast_on.mob_mood.sanity < 40) + cast_on.AdjustKnockdown(2 SECONDS) //Lowers sanity cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) return TRUE From 8fdff8f2debfbec57b3457316b356d70c9a82d16 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 02:55:19 +1200 Subject: [PATCH 009/120] Automatic changelog for PR #83248 [ci skip] --- html/changelogs/AutoChangeLog-pr-83248.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83248.yml diff --git a/html/changelogs/AutoChangeLog-pr-83248.yml b/html/changelogs/AutoChangeLog-pr-83248.yml new file mode 100644 index 0000000000000..800dfe930ed0c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83248.yml @@ -0,0 +1,4 @@ +author: "Rex9001" +delete-after: True +changes: + - balance: "Moon Smile only does a knockdown if the targets sanity is low enough and the minimum duration of its abilities have been decreased" \ No newline at end of file From a37a888ff8d8eb22681891fa359f1e58f3201538 Mon Sep 17 00:00:00 2001 From: GPeckman <21979502+GPeckman@users.noreply.github.com> Date: Thu, 13 Jun 2024 12:57:39 -0400 Subject: [PATCH 010/120] Adds logging for ore vent mobs spawned and killed (#83942) ## About The Pull Request Basically what the title says. Adds logging for every mob spawned by an ore vent by type (bosses included). Adds similar logging for spawned mobs being killed, that way people can tell if vents are being cheesed. ## Why It's Good For The Game Logging is good. Also this: ![free gbp](https://github.com/tgstation/tgstation/assets/21979502/329c75b7-f56b-4385-9a86-3d28965bc4f9) ## Changelog No player facing changes. --- .../objects/structures/lavaland/ore_vent.dm | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 18be9e12c54a5..c1e81862ac934 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -84,6 +84,7 @@ add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) RegisterSignal(src, COMSIG_SPAWNER_SPAWNED_DEFAULT, PROC_REF(anti_cheese)) + RegisterSignal(src, COMSIG_SPAWNER_SPAWNED, PROC_REF(log_mob_spawned)) return ..() /obj/structure/ore_vent/Destroy() @@ -282,6 +283,8 @@ tapped = TRUE //The Node Drone has survived the wave defense, and the ore vent is tapped. SSore_generation.processed_vents += src + log_game("Ore vent [key_name_and_tag(src)] was tapped") + SSblackbox.record_feedback("tally", "ore_vent_completed", 1, type) balloon_alert_to_viewers("vent tapped!") icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) @@ -427,6 +430,23 @@ /obj/structure/ore_vent/proc/anti_cheese() explosion(src, heavy_impact_range = 1, light_impact_range = 3, flame_range = 0, flash_range = 0, adminlog = FALSE) +/** + * Handle logging for mobs spawned + */ +/obj/structure/ore_vent/proc/log_mob_spawned(datum/source, mob/living/created) + SIGNAL_HANDLER + log_game("Ore vent [key_name_and_tag(src)] spawned the following mob: [key_name_and_tag(created)]") + SSblackbox.record_feedback("tally", "ore_vent_mobs_spawned", 1, created.type) + RegisterSignal(created, COMSIG_LIVING_DEATH, PROC_REF(log_mob_killed)) + +/** + * Handle logging for mobs killed + */ +/obj/structure/ore_vent/proc/log_mob_killed(datum/source, mob/living/killed) + SIGNAL_HANDLER + log_game("Vent-spawned mob [key_name_and_tag(killed)] was killed") + SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, killed.type) + //comes with the station, and is already tapped. /obj/structure/ore_vent/starter_resources name = "active ore vent" @@ -550,11 +570,13 @@ // Completely override the normal wave defense, and just spawn the boss. var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc) RegisterSignal(boss, COMSIG_LIVING_DEATH, PROC_REF(handle_wave_conclusion)) + SSblackbox.record_feedback("tally", "ore_vent_mobs_spawned", 1, summoned_boss) COOLDOWN_START(src, wave_cooldown, INFINITY) //Basically forever boss.say(boss.summon_line) //Pull their specific summon line to say. Default is meme text so make sure that they have theirs set already. /obj/structure/ore_vent/boss/handle_wave_conclusion() node = new /mob/living/basic/node_drone(loc) //We're spawning the vent after the boss dies, so the player can just focus on the boss. + SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, summoned_boss) COOLDOWN_RESET(src, wave_cooldown) return ..() From 747ecb967389a58944b91eb42af12eec7332ee7d Mon Sep 17 00:00:00 2001 From: Afevis Date: Thu, 13 Jun 2024 13:46:36 -0400 Subject: [PATCH 011/120] Fixes random organ unit test failures (#83900) don't have to remove languages from something that's qdeling. --- code/datums/brain_damage/mild.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 27b6150fe32b6..2af37fa13a8bc 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -25,7 +25,8 @@ /datum/brain_trauma/mild/hallucinations/on_lose() owner.remove_status_effect(/datum/status_effect/hallucination) - owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) + if(!QDELING(owner)) + owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA) return ..() /datum/brain_trauma/mild/stuttering From 053f8bc2ac81d903752112b3f87548522b4cb628 Mon Sep 17 00:00:00 2001 From: junkgle <133079191+junkgle01@users.noreply.github.com> Date: Thu, 13 Jun 2024 12:54:22 -0500 Subject: [PATCH 012/120] [no gbp] adds an id trim painter to meta qm's office (#83922) ## About The Pull Request see title. also fixes name of requests console ( and shifts an apc in the above hallway by one tile so i can stick a fire extinguisher in there without colliding wallmounts its still in the same area its just on a corner now it should be ok promise ) ## Why It's Good For The Game it's needed for head offices --- _maps/map_files/MetaStation/MetaStation.dmm | 2354 ++++++++++--------- 1 file changed, 1178 insertions(+), 1176 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 25448696a6025..dc42fb3fe9ce6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -276,15 +276,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/carpet, /area/station/commons/dorms) -"afQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen, -/obj/machinery/door/poddoor/preopen{ - id = "qmroom" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/qm) "afZ" = ( /obj/machinery/vending/coffee, /obj/structure/disposalpipe/segment, @@ -471,18 +462,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) -"ajv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"ajq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, +/obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, -/area/station/hallway/primary/central) +/area/station/cargo/lobby) "ajI" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -586,6 +575,26 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"alu" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/crate, +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) +"alw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "alA" = ( /obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /obj/structure/disposalpipe/sorting/mail{ @@ -738,6 +747,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"anX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/status_display/evac/directional/west, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "aok" = ( /turf/open/floor/iron, /area/station/cargo/storage) @@ -1106,17 +1129,6 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) -"awf" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/crate, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "awy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1259,6 +1271,19 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"azz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "azE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -1778,27 +1803,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"aIF" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_y = -8; - req_access = list("cargo") - }, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_y = 8; - req_access = list("cargo") - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "aIO" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/siding/purple{ @@ -1976,6 +1980,17 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"aKN" = ( +/obj/structure/chair/office, +/obj/machinery/requests_console/directional/north{ + department = "Quartermaster's Desk"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "aKO" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2035,6 +2050,44 @@ /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron/white, /area/station/science/lobby) +"aLW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/stamp/head/qm{ + pixel_x = 1; + pixel_y = 12 + }, +/obj/item/stamp/granted{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/stamp/void{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/money_medium{ + pixel_y = -6; + pixel_x = -3 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/clipboard{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/coin/gold{ + pixel_y = -5; + pixel_x = 10 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "aMb" = ( /obj/structure/table, /obj/item/cultivator, @@ -4080,6 +4133,28 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"bvl" = ( +/obj/machinery/newscaster/directional/east, +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/stack/package_wrap{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_y = 16 + }, +/obj/machinery/digital_clock/directional/north, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "bvJ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -4363,19 +4438,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"bBM" = ( -/obj/machinery/door/airlock/mining{ - name = "Quartermaster's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/diagonal, -/area/station/command/heads_quarters/qm) "bCc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5694,13 +5756,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"bZG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bZW" = ( /obj/structure/light_construct/directional/north, /turf/open/floor/plating, @@ -5742,6 +5797,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"caV" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "cbg" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -5761,21 +5821,6 @@ "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) -"cbE" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/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/siding/yellow/corner{ - dir = 8 - }, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "ccc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -5784,12 +5829,6 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"ccq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "ccD" = ( /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, @@ -5857,16 +5896,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/science/xenobiology) -"cew" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "cez" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -6383,17 +6412,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"cpS" = ( -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/spawner/directional/west, -/obj/machinery/light/small/directional/south, -/obj/structure/window/spawner/directional/east, -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/station/cargo/sorting) "cpU" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -6688,18 +6706,6 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"cuS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "cuZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -6994,15 +7000,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/station/service/library) -"cxI" = ( -/obj/structure/window/spawner/directional/south, -/obj/machinery/computer/cargo/request{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) "cxU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -7081,6 +7078,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/security/lockers) +"czD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "czG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7482,26 +7486,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"cJr" = ( -/obj/structure/table, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 2 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 5 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/item/reagent_containers/cup/soda_cans/random{ - pixel_x = -9 - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/storage) "cJt" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -7528,6 +7512,21 @@ /obj/structure/sign/directions/evac, /turf/closed/wall/r_wall, /area/station/medical/chemistry) +"cJS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "cJT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -7691,6 +7690,13 @@ }, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) +"cNg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "cNk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -7862,18 +7868,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"cRC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "cRU" = ( /obj/structure/bed, /obj/item/bedsheet/captain, @@ -8187,6 +8181,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"cXE" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/cargo/sorting) "cXH" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -8347,19 +8350,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"daZ" = ( -/obj/machinery/light/directional/west, -/obj/machinery/piratepad/civilian, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "dbh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8623,6 +8613,15 @@ "dfC" = ( /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"dfK" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/cargo_technician, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "dfO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8908,6 +8907,19 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, /area/space/nearstation) +"djn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "dkx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -8979,16 +8991,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/maintenance/port) -"dlN" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "dme" = ( /obj/effect/turf_decal/arrows{ dir = 1 @@ -9270,18 +9272,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"drQ" = ( -/obj/structure/window/spawner/directional/west, -/obj/structure/window/spawner/directional/east, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/station/cargo/sorting) "dsb" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -9458,6 +9448,18 @@ "duI" = ( /turf/closed/wall, /area/station/command/bridge) +"duW" = ( +/obj/machinery/computer/security, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/requests_console/directional/north{ + department = "Quartermaster's Desk"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "dve" = ( /obj/structure/cable, /obj/effect/spawner/random/maintenance, @@ -9473,11 +9475,6 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"dvC" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "dvJ" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9996,6 +9993,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) +"dHi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/effect/landmark/navigate_destination, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/lobby) "dHz" = ( /obj/effect/turf_decal/trimline/brown/corner{ dir = 1 @@ -10435,14 +10445,6 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"dPf" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dPh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, @@ -10675,6 +10677,32 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"dSH" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/shipping{ + pixel_x = -6; + pixel_y = 15 + }, +/obj/item/multitool{ + pixel_x = -3; + pixel_y = -4 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/storage/box/shipping{ + pixel_x = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "dSJ" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/random/directional/north, @@ -11799,17 +11827,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) -"eku" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/effect/landmark/start/quartermaster, -/obj/item/binoculars, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "eky" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11827,24 +11844,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"ekF" = ( -/obj/machinery/mineral/ore_redemption{ - dir = 4; - input_dir = 8; - output_dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Ore Redemption Window" - }, -/obj/machinery/door/window/left/directional/west{ - req_access = list("cargo"); - name = "Cargo Security Window" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/lobby) "ekG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12005,6 +12004,15 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"eml" = ( +/obj/machinery/light/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/cargo/lobby) "emN" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -12679,6 +12687,22 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"ezw" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/kirbyplants/random{ + pixel_x = -7 + }, +/obj/machinery/camera/directional/north, +/obj/machinery/digital_clock/directional/east, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "ezP" = ( /obj/structure/chair/office{ dir = 8 @@ -13162,6 +13186,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/hydroponics) +"eKG" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "eKP" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/freezerchamber) @@ -13270,6 +13304,17 @@ }, /turf/closed/wall/r_wall, /area/station/hallway/secondary/command) +"eMf" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/small/directional/south, +/obj/structure/window/spawner/directional/east, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/station/cargo/sorting) "eMG" = ( /obj/structure/closet/lasertag/blue, /obj/effect/landmark/start/hangover/closet, @@ -13301,6 +13346,11 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/science/research) +"eMY" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "eNb" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -13411,20 +13461,6 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"ePd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ePg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13554,6 +13590,20 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/cryo) +"eRd" = ( +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/delivery_chute{ + dir = 4; + name = "Crate Returns" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/spawner/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "eRn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, @@ -13752,21 +13802,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"eVD" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Fore - Port Corner" - }, -/obj/machinery/computer/piratepad_control/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "eVX" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14178,27 +14213,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron/white, /area/station/security/prison/mess) -"fdB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/button/door/directional/west{ - id = "qmroom"; - name = "Privacy Blast Doors Control" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "fdH" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -14761,6 +14775,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"flG" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/east, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/station/cargo/sorting) "flN" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -15263,6 +15289,14 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/storage) +"fwd" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "fwz" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, @@ -15566,23 +15600,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"fDN" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) -"fDR" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining{ - name = "Mining Office" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "fEg" = ( /obj/machinery/door/airlock{ name = "Service Hall" @@ -15865,32 +15882,11 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"fIl" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "fIo" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) -"fIr" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "fIE" = ( /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms/mainframe, @@ -16153,6 +16149,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"fNz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/stripes/corner, +/obj/item/reagent_containers/cup/soda_cans/pwr_game, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "fNI" = ( /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/wood, @@ -16266,20 +16272,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"fQK" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/tank_holder/extinguisher, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "fQW" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -16957,6 +16949,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) +"geR" = ( +/obj/structure/table, +/obj/item/papercutter{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/stamp/granted{ + pixel_x = -7 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "geV" = ( /obj/structure/sink/directional/east, /obj/machinery/light_switch/directional/west, @@ -17044,19 +17052,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"ggF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/mining{ - name = "Mining Office" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "ggH" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/iron/checker, @@ -17194,13 +17189,6 @@ /obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/iron, /area/station/service/janitor) -"gjK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "gjZ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -17713,12 +17701,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"gtF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "gtR" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -18341,6 +18323,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) +"gEx" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "gEF" = ( /obj/structure/rack, /obj/item/clothing/gloves/color/fyellow, @@ -18891,16 +18878,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gNB" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin/tagger, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/cargo/sorting) "gNC" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine, @@ -19232,17 +19209,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"gVd" = ( -/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/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "gVj" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, @@ -20379,6 +20345,19 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) +"hqD" = ( +/obj/machinery/door/airlock/mining{ + name = "Quartermaster's Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/diagonal, +/area/station/command/heads_quarters/qm) "hqE" = ( /obj/machinery/telecomms/bus/preset_four, /turf/open/floor/circuit/telecomms/mainframe, @@ -20634,6 +20613,23 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating, /area/station/security/checkpoint/customs) +"hvk" = ( +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/obj/item/stack/package_wrap{ + pixel_y = 5 + }, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/stack/package_wrap, +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/table, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "hvo" = ( /obj/structure/filingcabinet, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -20674,15 +20670,6 @@ /obj/effect/turf_decal/trimline/brown/filled/warning, /turf/open/floor/iron, /area/station/cargo/sorting) -"hvC" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "hvI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21393,6 +21380,16 @@ /obj/structure/fake_stairs/directional/south, /turf/open/floor/iron, /area/station/cargo/storage) +"hIu" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "hIx" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -21609,32 +21606,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/plating, /area/station/maintenance/port) -"hMp" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/shipping{ - pixel_x = -6; - pixel_y = 15 - }, -/obj/item/multitool{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/flashlight/lamp{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/storage/box/shipping{ - pixel_x = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "hMq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -21730,29 +21701,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"hOO" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Quartermaster"; - name = "Quartermaster's Fax Machine" - }, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/ore_update, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "hOR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/trash/soap{ @@ -21796,6 +21744,29 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hQc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Quartermaster"; + name = "Quartermaster's Fax Machine" + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/machinery/requests_console/directional/north{ + department = "Quartermaster's Desk"; + name = "Quartermaster's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/ore_update, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "hQu" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -22139,28 +22110,6 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron/white, /area/station/medical/virology) -"hVU" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Sort and Deliver"; - pixel_x = -2; - pixel_y = 12 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = -3 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/effect/turf_decal/trimline/white/corner, -/turf/open/floor/iron, -/area/station/cargo/sorting) "hVX" = ( /obj/structure/toilet{ pixel_y = 8 @@ -22424,15 +22373,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"hZP" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/lobby) "hZQ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/fore) @@ -22531,17 +22471,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"ibP" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "ibX" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -22619,24 +22548,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"icZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "idr" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -22921,6 +22832,21 @@ /obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"iit" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Fore - Port Corner" + }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "iix" = ( /obj/item/flashlight/lamp, /obj/machinery/newscaster/directional/west, @@ -23516,6 +23442,12 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"isA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "isI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -24211,16 +24143,6 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"iEs" = ( -/obj/structure/cable, -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot/left, -/obj/structure/window/spawner/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "iEv" = ( /obj/structure/closet, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -25302,6 +25224,10 @@ "iWU" = ( /turf/closed/wall/r_wall, /area/station/engineering/break_room) +"iWZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "iXb" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -25570,23 +25496,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"jbp" = ( -/obj/effect/spawner/random/bureaucracy/birthday_wrap, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/stack/package_wrap, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "jbF" = ( /obj/structure/table, /obj/effect/decal/cleanable/cobweb, @@ -25750,6 +25659,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) +"jfg" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "jfn" = ( /obj/machinery/door/airlock/medical/glass{ name = "Primary Treatment Centre" @@ -25893,10 +25810,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"jhh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "jhk" = ( /obj/structure/chair{ dir = 1 @@ -26106,6 +26019,34 @@ /obj/item/soap, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"jle" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/folder/yellow{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/ammo_casing/rocket{ + pixel_x = -2; + pixel_y = 19; + name = "Dud Rocket"; + desc = "An 84mm High Explosive rocket. This one's a dud. Pretty sure." + }, +/obj/item/computer_disk/quartermaster{ + pixel_x = 9; + pixel_y = 13 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = -7; + pixel_y = -4 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "jln" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/red, @@ -27105,6 +27046,28 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) +"jBy" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + name = "Sort and Deliver"; + pixel_x = -2; + pixel_y = 12 + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "packageExternal"; + name = "Crate Returns"; + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/white/corner, +/turf/open/floor/iron, +/area/station/cargo/sorting) "jBC" = ( /obj/structure/table, /obj/item/clothing/head/soft/grey{ @@ -27478,6 +27441,17 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/lounge) +"jIl" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/mining{ + name = "Mining Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jIz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -27704,6 +27678,22 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"jMb" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/light/directional/north, +/obj/structure/statue/gold/qm, +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "jMo" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, @@ -28051,16 +28041,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jRJ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "jRO" = ( /obj/structure/table, /obj/item/paper_bin, @@ -28258,6 +28238,22 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"jUs" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "jUu" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -28788,6 +28784,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"ken" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "keK" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -29038,6 +29045,27 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/theater) +"kkk" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/button/door/directional/west{ + id = "QMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_y = -8; + req_access = list("cargo") + }, +/obj/machinery/button/door/directional/west{ + id = "QMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_y = 8; + req_access = list("cargo") + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "kkr" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/door/poddoor/preopen{ @@ -29051,6 +29079,24 @@ /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) +"kkB" = ( +/obj/machinery/mineral/ore_redemption{ + dir = 4; + input_dir = 8; + output_dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Ore Redemption Window" + }, +/obj/machinery/door/window/left/directional/west{ + req_access = list("cargo"); + name = "Cargo Security Window" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/lobby) "kkU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/directional/west{ @@ -29499,6 +29545,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"ksM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "ksT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -29509,25 +29564,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) -"ksZ" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Security Post - Medbay"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/small/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) "ktl" = ( /obj/structure/sink/directional/east, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -31019,6 +31055,16 @@ /obj/structure/cable/layer3, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"kUG" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "kUJ" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -31408,6 +31454,17 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lay" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "laE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, /turf/closed/wall/r_wall, @@ -31801,6 +31858,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"liX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/lobby) "lje" = ( /obj/machinery/camera/directional/south{ c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage" @@ -32037,19 +32101,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"low" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "loA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -33989,12 +34040,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"mcd" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "mcl" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34598,6 +34643,20 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"mnP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "mnU" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34809,16 +34868,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"msL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/stripes/corner, -/obj/item/reagent_containers/cup/soda_cans/pwr_game, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "msN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/reagent_dispensers/watertank, @@ -35092,6 +35141,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) +"mwP" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "mwY" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/landmark/generic_maintenance_landmark, @@ -35918,6 +35975,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) +"mLp" = ( +/obj/effect/landmark/start/quartermaster, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "mLu" = ( /obj/machinery/camera/directional/south{ c_tag = "Science Hallway - RD Office"; @@ -37221,28 +37290,6 @@ dir = 8 }, /area/station/medical/morgue) -"niE" = ( -/obj/machinery/newscaster/directional/east, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 16 - }, -/obj/machinery/digital_clock/directional/north, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "niY" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -37613,22 +37660,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) -"npj" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/item/kirbyplants/random{ - pixel_x = -7 - }, -/obj/machinery/camera/directional/north, -/obj/machinery/digital_clock/directional/east, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "npv" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -37762,6 +37793,11 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"nrM" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/cafeteria) "nrV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /turf/open/floor/iron/dark, @@ -38106,6 +38142,17 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/medical/storage) +"nwm" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/landmark/start/quartermaster, +/obj/item/binoculars, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "nwq" = ( /obj/structure/table, /obj/machinery/firealarm/directional/south, @@ -38233,6 +38280,18 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/safe) +"nyb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "nyf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38779,11 +38838,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"nJi" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "nJn" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -38842,6 +38896,19 @@ /obj/effect/turf_decal/loading_area/white, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"nJJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "nJL" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/machinery/atmospherics/components/tank/air, @@ -38883,6 +38950,20 @@ }, /turf/open/space/basic, /area/space) +"nKu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/reagent_containers/cup/glass/waterbottle{ + pixel_y = 48; + pixel_x = 9 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "nKE" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -38936,6 +39017,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/service/library) +"nLx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "nLz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -39123,11 +39211,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"nOx" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/cargo/sorting) "nOK" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/stripes/white/line{ @@ -39181,6 +39264,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/garden) +"nPN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "nQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/trash/janitor_supplies, @@ -39358,15 +39448,6 @@ /obj/effect/turf_decal/trimline/dark_red/filled/line, /turf/open/floor/iron, /area/station/security/warden) -"nUc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "nUp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -39790,18 +39871,6 @@ "obG" = ( /turf/closed/wall, /area/station/service/theater) -"obJ" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "obN" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -42113,21 +42182,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"oUp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "oUu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42230,15 +42284,6 @@ "oWk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"oWw" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oWF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -42466,6 +42511,15 @@ "paD" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) +"paQ" = ( +/obj/structure/window/spawner/directional/south, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/sorting) "paU" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -42953,14 +43007,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"pks" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "pkx" = ( /obj/machinery/modular_computer/preset/research{ dir = 8 @@ -43814,20 +43860,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"pzL" = ( -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/delivery_chute{ - dir = 4; - name = "Crate Returns" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "pzT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, @@ -43873,16 +43905,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"pAA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/station/cargo/lobby) "pAD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/west, @@ -43984,6 +44006,19 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"pCs" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Mailroom" + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pCt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44594,6 +44629,18 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"pNk" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pNp" = ( /obj/machinery/light/small/broken/directional/west, /obj/structure/table, @@ -44716,22 +44763,6 @@ dir = 4 }, /area/station/service/chapel) -"pPv" = ( -/obj/structure/table, -/obj/item/papercutter{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/stamp/granted{ - pixel_x = -7 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pPH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -44919,19 +44950,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"pSP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "pSS" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/junction/flipped{ @@ -45012,6 +45030,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/central) +"pUk" = ( +/obj/machinery/camera/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "pUl" = ( /obj/machinery/shower/directional/east, /obj/effect/decal/cleanable/dirt, @@ -45094,6 +45121,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"pWb" = ( +/obj/machinery/light/directional/west, +/obj/machinery/piratepad/civilian, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "pWA" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=2.1-Leaving-Storage"; @@ -45838,6 +45878,18 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/plating, /area/station/ai_monitored/aisat/exterior) +"qjH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "qkl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -46555,22 +46607,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison) -"qzY" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/machinery/light/directional/north, -/obj/structure/statue/gold/qm, -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/effect/turf_decal/siding/yellow{ - dir = 10 - }, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "qAc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -47119,17 +47155,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"qJS" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "qJU" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -47417,44 +47442,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"qNP" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/stamp/head/qm{ - pixel_x = 1; - pixel_y = 12 - }, -/obj/item/stamp/granted{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/stamp/void{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/effect/spawner/random/entertainment/money_medium{ - pixel_y = -6; - pixel_x = -3 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/clipboard{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/item/coin/gold{ - pixel_y = -5; - pixel_x = 10 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "qNV" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47932,14 +47919,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) -"qUT" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "qVc" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, @@ -48159,21 +48138,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /turf/open/floor/iron/dark, /area/station/tcommsat/server) -"qYh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "qYt" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -49011,6 +48975,16 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"roG" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin/tagger, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -49236,6 +49210,20 @@ /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance) +"rtz" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/pdapainter/supply, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "rtD" = ( /obj/effect/turf_decal/tile/purple, /obj/machinery/light/directional/east, @@ -49545,18 +49533,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) -"rxP" = ( -/obj/machinery/computer/security, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) "rxY" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -50059,15 +50035,6 @@ "rGC" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom) -"rGK" = ( -/obj/machinery/camera/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "rHh" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -50502,34 +50469,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rOv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/folder/yellow{ - pixel_x = 8; - pixel_y = -1 - }, -/obj/item/ammo_casing/rocket{ - pixel_x = -2; - pixel_y = 19; - name = "Dud Rocket"; - desc = "An 84mm High Explosive rocket. This one's a dud. Pretty sure." - }, -/obj/item/computer_disk/quartermaster{ - pixel_x = 9; - pixel_y = 13 - }, -/obj/effect/spawner/random/entertainment/lighter{ - pixel_x = -7; - pixel_y = -4 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/qm) "rOz" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -50627,19 +50566,25 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"rQh" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 +"rQk" = ( +/obj/machinery/recharger{ + pixel_y = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/camera/directional/north{ + c_tag = "Security Post - Medbay"; + network = list("ss13","medbay") }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced, +/obj/machinery/requests_console/directional/north{ + department = "Quartermaster's Desk"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "rQl" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -51376,11 +51321,6 @@ /obj/item/plant_analyzer, /turf/open/floor/grass, /area/station/security/prison/garden) -"sce" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/cafeteria) "sch" = ( /turf/closed/wall, /area/station/security/medical) @@ -51965,18 +51905,6 @@ /obj/item/training_toolbox, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"soO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "soU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52227,6 +52155,18 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"sus" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "suD" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -52390,6 +52330,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white/side, /area/station/science/lobby) +"sxk" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/cargo/sorting) "sxn" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -52622,6 +52567,26 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"sCc" = ( +/obj/structure/table, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 2 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/item/reagent_containers/cup/soda_cans/random{ + pixel_x = -9 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/storage) "sCh" = ( /obj/structure/table/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53540,19 +53505,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) -"sRz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/effect/landmark/navigate_destination, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/lobby) "sRJ" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/item/kirbyplants/organic/plant16, @@ -54657,13 +54609,6 @@ dir = 8 }, /area/station/service/chapel) -"tlJ" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "tlK" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -55349,15 +55294,6 @@ "tyY" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) -"tzd" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/cargo_technician, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tzg" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, @@ -55538,17 +55474,6 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"tBU" = ( -/obj/structure/chair/office, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "tCC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -56342,6 +56267,19 @@ /obj/machinery/digital_clock/directional/south, /turf/open/floor/wood, /area/station/service/library) +"tPt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/mining{ + name = "Mining Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "tPw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -56385,6 +56323,32 @@ /obj/structure/filingcabinet/filingcabinet, /turf/open/floor/iron, /area/station/cargo/sorting) +"tQp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/machinery/button/door/directional/west{ + id = "qmroom"; + name = "Privacy Blast Doors Control"; + pixel_y = -7 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -22; + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/qm) "tQC" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, /obj/effect/turf_decal/delivery, @@ -56908,19 +56872,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"tZA" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Mailroom" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tZD" = ( /obj/effect/landmark/start/captain, /obj/structure/chair/comfy/brown, @@ -56945,15 +56896,6 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron, /area/station/commons/storage/tools) -"tZP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "tZX" = ( /obj/structure/window/spawner/directional/west, /obj/machinery/light/floor, @@ -56978,20 +56920,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"uai" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 48; - pixel_x = 9 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "uaj" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/siding/wood{ @@ -57262,6 +57190,13 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/station/hallway/primary/central) +"udU" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "ued" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57760,6 +57695,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"upN" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "upR" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -58339,20 +58280,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"uyW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "uyY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58577,13 +58504,6 @@ /obj/structure/sign/departments/aiupload/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) -"uDE" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "uDH" = ( /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ dir = 1 @@ -58849,6 +58769,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"uGU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uGX" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -59103,6 +59041,17 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"uLE" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "uLK" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -59624,6 +59573,21 @@ /obj/structure/sign/poster/official/nanotrasen_logo/directional/east, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"uVm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "uVv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -59648,6 +59612,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/science/research) +"uVG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen, +/turf/open/floor/plating, +/area/station/command/heads_quarters/qm) "uVJ" = ( /obj/effect/spawner/random/structure/grille, /obj/structure/girder, @@ -60041,6 +60011,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"vbF" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) "vbL" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -60128,6 +60105,16 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"vdW" = ( +/obj/structure/cable, +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot/left, +/obj/structure/window/spawner/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "veo" = ( /obj/structure/weightmachine/weightlifter{ color = "#f5a183"; @@ -60375,6 +60362,21 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"vjg" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/yellow/diagonal_edge, +/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/siding/yellow/corner{ + dir = 8 + }, +/turf/open/floor/iron/diagonal, +/area/station/cargo/storage) "vjk" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -60570,6 +60572,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"vlP" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "vlY" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/north{ @@ -62035,6 +62046,12 @@ }, /turf/open/floor/carpet/royalblue, /area/station/service/library) +"vKC" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "vKL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -62165,6 +62182,12 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"vNp" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "vNv" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63930,14 +63953,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"wrO" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "wrZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -64230,17 +64245,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"wwi" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wwj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64390,6 +64394,14 @@ /obj/machinery/bouldertech/refinery/smelter, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"wyS" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "wyV" = ( /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) @@ -65313,21 +65325,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"wSm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "wSq" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -65386,6 +65383,17 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, /area/station/engineering/atmos) +"wTv" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/modular_computer/preset/cargochat/cargo{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "wTF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66431,13 +66439,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"xmt" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) "xmD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/medical/memeorgans, @@ -66635,18 +66636,6 @@ /obj/item/storage/bag/tray, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"xqD" = ( -/obj/effect/landmark/start/quartermaster, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/diagonal_centre, -/obj/effect/turf_decal/tile/yellow/diagonal_edge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/turf/open/floor/iron/diagonal, -/area/station/cargo/storage) "xqI" = ( /obj/machinery/computer/security/labor{ dir = 8 @@ -66817,13 +66806,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"xtv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "xtw" = ( /obj/item/stack/rods, /turf/open/space/basic, @@ -68540,6 +68522,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"xYT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "xYV" = ( /obj/structure/table/glass, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -68788,13 +68785,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) -"ycY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/lobby) "ydb" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -69150,6 +69140,18 @@ /obj/effect/spawner/random/bureaucracy/stamp, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"ykb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) "ykn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -84048,7 +84050,7 @@ aaa fcq uEw fcq -rxP +duW uhI vrP hve @@ -86350,7 +86352,7 @@ yeq yeq cvv wcy -aIF +kkk fXZ sUc vsO @@ -86362,7 +86364,7 @@ exQ vQs cna hjt -fIl +gEx bGu slZ vQs @@ -86857,7 +86859,7 @@ apC sUD sWU mUz -fDR +jIl hWC cEY tqo @@ -86874,7 +86876,7 @@ xHC aok vlk fqe -jhh +iWZ ojW hpj uSO @@ -87114,7 +87116,7 @@ jGb uMj poj hnV -ggF +tPt gUH dAk dAk @@ -87135,7 +87137,7 @@ xbZ kZI nbd vKn -msL +fNz rgM vQs hyW @@ -87648,7 +87650,7 @@ vQs vde tGU hYl -nJi +caV rPp eIc vQs @@ -87885,7 +87887,7 @@ qHt dxo hlE oor -tBU +aKN uha tMY hDX @@ -88154,17 +88156,17 @@ dfk rQD nsh vWD -cJr +sCc liU nrB smB tik -nOx +sxk xwa fjw cwY sbF -drQ +flG bzH hyW xOw @@ -88386,7 +88388,7 @@ qGP sHu pkT sHu -dvC +eMY cVL jXu kIJ @@ -88421,9 +88423,9 @@ uya yhL nQR hYx -cpS +eMf iev -cRC +sus sly nxF sVY @@ -88677,7 +88679,7 @@ bzH gPN ebd ebd -hVU +jBy bzH bzH bBy @@ -88917,7 +88919,7 @@ lpS lpS bkF cbz -qzY +jMb kKO vQT hBo @@ -88925,19 +88927,19 @@ gWz kQv cgZ hIp -nUc +ksM lQf -gtF -pks -qUT +vKC +fwd +mwP oTw -bZG +nLx sHX uyh hvB sqt iev -pSP +djn iVs fLd fpy @@ -89174,8 +89176,8 @@ jXu kAI gfa eOl -cbE -xqD +vjg +mLp tvv xTe xTe @@ -89183,8 +89185,8 @@ tvv kQP wdM asT -sRz -ekF +dHi +kkB lVp bzH bzH @@ -89194,7 +89196,7 @@ rmL hOh lAi bzH -low +azz uxa mmm vjv @@ -89432,17 +89434,17 @@ twr nsT heR kQP -bBM +hqD kQP eTt -eku +nwm izI kQP -pzL -hvC +eRd +vlP qxJ -mcd -jbp +vNp +hvk bzH dGC uud @@ -89688,20 +89690,20 @@ jXu sxn ciE dUd -fQK +rtz fpV -fdB +tQp bEK ydp cNb mXO -cew +kUG rVn qxJ sik ryV -cxI -dPf +paQ +wyS ekb wpO wbW @@ -89943,29 +89945,29 @@ rlU aaa jXu jXu -qJS +ken kQP -hOO +hQc dFg wyV iqo wyV cJt mXO -awf +alu aUm jvv bNN rod mhM -tzd +dfK wuo tPW ayz bLj rnh iev -rQh +nJJ nqo qsX sVY @@ -90209,20 +90211,20 @@ wyV wyV oxX mXO -iEs +vdW oac fhB hxd dHz aqG -pPv +geR ekb lsU bQl -tZA +pCs bzH bzH -obJ +pNk ivB qaw sVY @@ -90452,34 +90454,34 @@ rlU trx uWn spf -xtv +czD lBg tWU wWe aTU -tlJ +jzE kQP -npj +ezw aSv -qNP -rOv +aLW +jle ukm dLh kQP -rGK -fDN +pUk +upN qxJ -pAA -hZP +ajq +eml bzH -niE -uai +bvl +nKu gxM jRo qCx -gNB +roG bzH -ePd +mnP tEr iOc sVY @@ -90706,7 +90708,7 @@ uEA mKr aaa rlU -xmt +vbF wHW wHW okj @@ -90714,19 +90716,19 @@ rlU qYC pNC lpt -jzE +cNg kQP kQP mXO -afQ +uVG kQP kQP kQP kQP rcR -dlN -ycY -fIr +hIu +liX +jUs nDG bzH bzH @@ -90734,9 +90736,9 @@ usJ kFa lak rUd -oWw -cuS -qYh +cXE +ykb +cJS ybn fLp sVY @@ -90979,21 +90981,21 @@ aHt eaQ aHt qlW -wrO -ibP -gjK -ccq -jRJ -eVD -daZ +jfg +lay +udU +isA +eKG +iit +pWb bzH -wwi +wTv sul pkF dtE -hMp +dSH aqG -ePd +mnP xOw iOc sVY @@ -91240,9 +91242,9 @@ mPK lgg kWP lgg -gVd +uLE cSu -uDE +nPN bzH aqG aqG @@ -91250,7 +91252,7 @@ mxx aqG aqG aqG -icZ +uGU mFo npY qwR @@ -91497,17 +91499,17 @@ bLh pPH hSg uTN -oUp +uVm sSV -tZP -uyW -ajv -ajv -wSm -ajv -ajv -ajv -soO +alw +anX +nyb +nyb +xYT +nyb +nyb +nyb +qjH vhB guR lsf @@ -91753,7 +91755,7 @@ jfX aUC iFC iBt -sce +nrM yaE tmK htd @@ -93329,7 +93331,7 @@ gqX htd oGK qPJ -ksZ +rQk waH vbV ixr From 66acc9007b7b3538801cb8e01574292403b5b402 Mon Sep 17 00:00:00 2001 From: MGOOOOOO <97645027+MGOOOOOO@users.noreply.github.com> Date: Thu, 13 Jun 2024 13:54:47 -0400 Subject: [PATCH 013/120] Fixes catwalk deconstruction not yielding iron rods (#83909) ## About The Pull Request Fixes #83875. ## Why It's Good For The Game I was able to reproduce this bug in master, catwalk deconstruction should definitely return the materials used. --- code/game/objects/structures/lattice.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 6d65705586a6a..cf6fe65abe274 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -112,6 +112,7 @@ ..() /obj/structure/lattice/catwalk/atom_deconstruct(disassembled = TRUE) + ..() var/turf/T = loc for(var/obj/structure/cable/C in T) C.deconstruct() From b9d3cb46e27017d75a05a9224386057c8e3a6762 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 05:54:54 +1200 Subject: [PATCH 014/120] Automatic changelog for PR #83922 [ci skip] --- html/changelogs/AutoChangeLog-pr-83922.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83922.yml diff --git a/html/changelogs/AutoChangeLog-pr-83922.yml b/html/changelogs/AutoChangeLog-pr-83922.yml new file mode 100644 index 0000000000000..a6841c8a93171 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83922.yml @@ -0,0 +1,4 @@ +author: "junkgle01" +delete-after: True +changes: + - bugfix: "added an id trim painter that was missing to MetaStation's QM office." \ No newline at end of file From 526151c9ad3dea8eb597c2617a2890023753bb71 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:55:49 -0700 Subject: [PATCH 015/120] Fixes two alt-click behaviors [no gbp] (#83898) ## About The Pull Request You can now alt click mod suit bags and extinguishers while resting Adds screentips to extinguishers ## Why It's Good For The Game Fixes #83896 --- code/game/objects/items/extinguisher.dm | 11 ++++++++++- code/modules/mod/mod_control.dm | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 4d956611bc3a7..be47d7009053b 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -18,7 +18,7 @@ attack_verb_simple = list("slam", "whack", "bash", "thunk", "batter", "bludgeon", "thrash") dog_fashion = /datum/dog_fashion/back resistance_flags = FIRE_PROOF - interaction_flags_click = NEED_DEXTERITY|NEED_HANDS + interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING /// The max amount of water this extinguisher can hold. var/max_water = 50 /// Does the welder extinguisher start with water. @@ -53,6 +53,15 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) + register_context() + +/obj/item/extinguisher/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item != src) + return + context[SCREENTIP_CONTEXT_LMB] = "Engage nozzle" + context[SCREENTIP_CONTEXT_ALT_LMB] = "Empty" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/extinguisher/empty starting_water = FALSE diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 05bcb44ae26a3..2452d404a933b 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -30,6 +30,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT siemens_coefficient = 0.5 alternate_worn_layer = HANDS_LAYER+0.1 //we want it to go above generally everything, but not hands + interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING /// The MOD's theme, decides on some stuff like armor and statistics. var/datum/mod_theme/theme = /datum/mod_theme /// Looks of the MOD. From c60df2bc7ecb80db17b874243ebdd6f0a369e041 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 05:57:05 +1200 Subject: [PATCH 016/120] Automatic changelog for PR #83909 [ci skip] --- html/changelogs/AutoChangeLog-pr-83909.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83909.yml diff --git a/html/changelogs/AutoChangeLog-pr-83909.yml b/html/changelogs/AutoChangeLog-pr-83909.yml new file mode 100644 index 0000000000000..272c81517cc08 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83909.yml @@ -0,0 +1,4 @@ +author: "MGOOOOOO" +delete-after: True +changes: + - bugfix: "Catwalk deconstruction yields iron rods as intended." \ No newline at end of file From 4140471dfbf82a3d640961c6f2eaa4d3fa781405 Mon Sep 17 00:00:00 2001 From: thegrb93 Date: Thu, 13 Jun 2024 14:01:07 -0400 Subject: [PATCH 017/120] Fix unable to interact with depowered shocked door (#83903) ## About The Pull Request Fixes bug where you can't interact with a shocked door without shock protection even if it is depowered. ## Why It's Good For The Game Prevents cheese where if you get lucky and depower a door, you can easily find its shock wire and also easily test if budget insuls you have work. --- code/datums/wires/airlock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index c26ddd524ce4c..8049f08d8dcf4 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -74,7 +74,7 @@ if(!..()) return FALSE var/obj/machinery/door/airlock/airlock = holder - if(!HAS_SILICON_ACCESS(user) && !isdrone(user) && airlock.isElectrified()) + if(!HAS_SILICON_ACCESS(user) && !isdrone(user) && airlock.isElectrified() && airlock.hasPower()) var/mob/living/carbon/carbon_user = user if (!istype(carbon_user) || carbon_user.should_electrocute(get_area(airlock))) return FALSE From 7220a4f8ec7d096907fbc68f45d29539103e1a0e Mon Sep 17 00:00:00 2001 From: MGOOOOOO <97645027+MGOOOOOO@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:01:53 -0400 Subject: [PATCH 018/120] No-gravity now properly ignores missing leg slowdown (#83882) ## About The Pull Request Fixes #74911. ## Why It's Good For The Game Issue #74911 confirms that the slowdown from missing legs is a bug, and I'd like to fix it. --- code/modules/movespeed/modifiers/mobs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 2770405a9f100..b72c631253b91 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -89,6 +89,7 @@ /datum/movespeed_modifier/limbless variable = TRUE movetypes = GROUND + blacklisted_movetypes = FLOATING flags = IGNORE_NOSLOW /datum/movespeed_modifier/simplemob_varspeed From 6163752e3c60c911249e76e4cfdc0cdcf3104b5a Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:02:19 -0400 Subject: [PATCH 019/120] Removes unused code from stock market and an unused market define. (#83872) ## About The Pull Request This PR removes a completely unused file, which added `/datum/supply_pack`s originally containing the materials for the mineral stock market contents, plus a define, MARKET_QUANTITY_HELPERS. Neither of these wound up being used in the final revision of the galactic mineral market, and I stumbled upon these to my horror that they're still in the code and completely unused as a result. Yikes! ## Why It's Good For The Game Removes unused code that is both not being utilized by the mineral market, but in fact was superseded by the current implementation during development and managed to slip it's way through review. ## Changelog No front facing changes, as the code was unused. --- code/__DEFINES/economy.dm | 19 ---------- .../modules/cargo/packs/stock_market_items.dm | 35 ------------------- tgstation.dme | 1 - 3 files changed, 55 deletions(-) delete mode 100644 code/modules/cargo/packs/stock_market_items.dm diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 184419c2b5c79..47e3db38e11c8 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -79,22 +79,3 @@ #define MARKET_EVENT_PROBABILITY 8 //Probability of a market event firing, in percent. Fires once per material, every stock market tick. #define MARKET_PROFIT_MODIFIER 0.8 //We don't make every sale a 1-1 of the actual buy price value, like with real life taxes and to encourage more smart trades - -/// Create quantity subtypes for stock market datums. -#define MARKET_QUANTITY_HELPERS(path) ##path/one {\ - amount = 1; \ -} \ -##path/five {\ - amount = 5; \ -} \ -##path/ten {\ - amount = 10; \ -} \ -##path/twenty_five {\ - amount = 25; \ -} \ -##path/fifty {\ - amount = 50; \ -} - - diff --git a/code/modules/cargo/packs/stock_market_items.dm b/code/modules/cargo/packs/stock_market_items.dm deleted file mode 100644 index 6206e8d0f4c93..0000000000000 --- a/code/modules/cargo/packs/stock_market_items.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * todo: make this a supply_pack/custom. Drop pod? ohoho yes. Would be VERY fun. - */ -/datum/supply_pack/market_materials - name = "A Single Sheet of Bananium" - desc = "Going market price for this kind of sheet, by Australicus Industrial Mining." - cost = CARGO_CRATE_VALUE * 2 - crate_name = "mineral stock sheet crate" - group = "Canisters & Materials" - /// What material we are trying to buy sheets of? - var/datum/material/material - /// How many sheets of the material we are trying to buy at once? - var/amount - -/datum/supply_pack/market_materials/get_cost() - for(var/datum/material/mat as anything in SSstock_market.materials_prices) - if(material == mat) - return SSstock_market.materials_prices[mat] * amount - -/datum/supply_pack/market_materials/fill(obj/structure/closet/crate/C) - . = ..() - new material.sheet_type(C, amount) - -/datum/supply_pack/market_materials/iron - name = "Iron Sheets" - crate_name = "iron stock crate" - material = /datum/material/iron -MARKET_QUANTITY_HELPERS(/datum/supply_pack/market_materials/iron) - - -/datum/supply_pack/market_materials/gold - name = "Gold Sheets" - crate_name = "gold stock crate" - material = /datum/material/gold -MARKET_QUANTITY_HELPERS(/datum/supply_pack/market_materials/gold) diff --git a/tgstation.dme b/tgstation.dme index 5a4f39a1d664f..2196f0559dd00 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3643,7 +3643,6 @@ #include "code\modules\cargo\packs\science.dm" #include "code\modules\cargo\packs\security.dm" #include "code\modules\cargo\packs\service.dm" -#include "code\modules\cargo\packs\stock_market_items.dm" #include "code\modules\cargo\packs\vending_restock.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\client_colour.dm" From daef72fdf9060ac1b3308503396a48e1a0b6a565 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:04:22 +1200 Subject: [PATCH 020/120] Automatic changelog for PR #83898 [ci skip] --- html/changelogs/AutoChangeLog-pr-83898.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83898.yml diff --git a/html/changelogs/AutoChangeLog-pr-83898.yml b/html/changelogs/AutoChangeLog-pr-83898.yml new file mode 100644 index 0000000000000..f9f81b5ac0d6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83898.yml @@ -0,0 +1,5 @@ +author: "jlsnow301" +delete-after: True +changes: + - rscadd: "Added screentips to extinguishers." + - bugfix: "Fixed alt-click interaction with extinguishers and mod control units." \ No newline at end of file From f29e96220922f6d09d8420b6a750bf0564d6f692 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:04:38 +1200 Subject: [PATCH 021/120] Automatic changelog for PR #83903 [ci skip] --- html/changelogs/AutoChangeLog-pr-83903.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83903.yml diff --git a/html/changelogs/AutoChangeLog-pr-83903.yml b/html/changelogs/AutoChangeLog-pr-83903.yml new file mode 100644 index 0000000000000..8dfd7f9479c1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83903.yml @@ -0,0 +1,4 @@ +author: "thegrb93" +delete-after: True +changes: + - bugfix: "Fix bug where you can't interact with a shocked door without shock protection even if it is depowered." \ No newline at end of file From 55e70d49d475a2499f875a78514353435011d004 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:04:47 +1200 Subject: [PATCH 022/120] Automatic changelog for PR #83882 [ci skip] --- html/changelogs/AutoChangeLog-pr-83882.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83882.yml diff --git a/html/changelogs/AutoChangeLog-pr-83882.yml b/html/changelogs/AutoChangeLog-pr-83882.yml new file mode 100644 index 0000000000000..dbbebbee00337 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83882.yml @@ -0,0 +1,4 @@ +author: "MGOOOOOO" +delete-after: True +changes: + - bugfix: "Missing legs no longer slow you down in non-gravity environments." \ No newline at end of file From 23df87ba698edb180965bcca362f9eef91fadc75 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:06:25 -0300 Subject: [PATCH 023/120] Corpses won't remain cultists when ghouled by a flesheretic (#83832) ## About The Pull Request Fixed cultists retaining their datum when ghouled, which resulted in double antag. ## Why It's Good For The Game Silly and weird and confusing and buggy. ## Changelog :cl: balance: Corpses won't remain cultists when ghouled by a flesheretic /:cl: --- code/modules/antagonists/heretic/status_effects/ghoul.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm index 5c19fb1bf9a20..b212f1a024ac8 100644 --- a/code/modules/antagonists/heretic/status_effects/ghoul.dm +++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm @@ -67,6 +67,7 @@ if(human_target.mind) var/datum/antagonist/heretic_monster/heretic_monster = human_target.mind.add_antag_datum(/datum/antagonist/heretic_monster) heretic_monster.set_owner(master_mind) + human_target.mind.remove_antag_datum(/datum/antagonist/cult) return TRUE From a13567b162caefffd9cb34f58d31e0245f1ef826 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:07:11 +1200 Subject: [PATCH 024/120] Automatic changelog for PR #83832 [ci skip] --- html/changelogs/AutoChangeLog-pr-83832.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83832.yml diff --git a/html/changelogs/AutoChangeLog-pr-83832.yml b/html/changelogs/AutoChangeLog-pr-83832.yml new file mode 100644 index 0000000000000..f1c94c6df1c85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83832.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - balance: "Corpses won't remain cultists when ghouled by a flesheretic" \ No newline at end of file From 10b6cb3496e1fbc164a95fc85b6176190b3a2ff8 Mon Sep 17 00:00:00 2001 From: lizelive Date: Thu, 13 Jun 2024 11:08:28 -0700 Subject: [PATCH 025/120] make janitorialcart hold more water (#83829) not 3 buckets in a trench coat ## About The Pull Request the cart is big so it should hold more water ## Why It's Good For The Game hives human janitors a point vs borgs or an assistant pulling a clean bot --- code/game/objects/structures/janitor.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/janitor.dm b/code/game/objects/structures/janitor.dm index 4f5bdf2812732..0413bcac53986 100644 --- a/code/game/objects/structures/janitor.dm +++ b/code/game/objects/structures/janitor.dm @@ -73,6 +73,7 @@ /obj/structure/mop_bucket/janitorialcart/Initialize(mapload) . = ..() + reagents.maximum_volume *= 2.5 GLOB.janitor_devices += src /obj/structure/mop_bucket/janitorialcart/Destroy() From 6c4a76f73849f2a7e5f080adf93af4cb0f43b49c Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:10:52 +1200 Subject: [PATCH 026/120] Automatic changelog for PR #83829 [ci skip] --- html/changelogs/AutoChangeLog-pr-83829.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83829.yml diff --git a/html/changelogs/AutoChangeLog-pr-83829.yml b/html/changelogs/AutoChangeLog-pr-83829.yml new file mode 100644 index 0000000000000..5278fb0c9ed23 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83829.yml @@ -0,0 +1,4 @@ +author: "lizelive" +delete-after: True +changes: + - qol: "make the cart hold 2.5x more water" \ No newline at end of file From 580dac31cd8e08923170c42c2ad69864f4529675 Mon Sep 17 00:00:00 2001 From: larentoun <31931237+larentoun@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:11:18 +0300 Subject: [PATCH 027/120] Tail Regained checks for owner and species + deleted unused mood_event datums (#83741) ## About The Pull Request Changed how tail regaining works. * If it's your tail, an infinite debuff is replaced with a timed one (new, on live there is no debuff) * If it's not your tail but of same species, I guess it works, but we are more sad (new) * If it's not your tail AND of different species, we are horrified (live) Also a little clearing up of unused mood datums ## Why It's Good For The Game Refactors good? Having your tail back good? --- code/datums/mood.dm | 2 +- code/datums/mood_events/dna_infuser_events.dm | 4 -- code/datums/mood_events/drug_events.dm | 6 --- .../mood_events/generic_negative_events.dm | 47 +++++-------------- .../mob/living/carbon/human/_species.dm | 2 +- code/modules/surgery/organs/external/tails.dm | 11 ++++- 6 files changed, 22 insertions(+), 50 deletions(-) diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 7671f92ed0f7b..2b2a83fc6964d 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -96,7 +96,7 @@ // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute // mood runtime, so 50% average uptime across the hour. if(HAS_TRAIT(mob_parent, TRAIT_DEPRESSION) && SPT_PROB(0.416, seconds_per_tick)) - add_mood_event("depression_mild", /datum/mood_event/depression_mild) + add_mood_event("depression", /datum/mood_event/depression) if(HAS_TRAIT(mob_parent, TRAIT_JOLLY) && SPT_PROB(0.416, seconds_per_tick)) add_mood_event("jolly", /datum/mood_event/jolly) diff --git a/code/datums/mood_events/dna_infuser_events.dm b/code/datums/mood_events/dna_infuser_events.dm index 06b7d6cbd4936..6da7235cfc1da 100644 --- a/code/datums/mood_events/dna_infuser_events.dm +++ b/code/datums/mood_events/dna_infuser_events.dm @@ -7,7 +7,3 @@ description = "There's a lot that could be on your mind right now. But this feeling of contentedness, a universal calling to simply sit back and observe is washing over you..." mood_change = 10 special_screen_obj = "mood_gondola" - -/datum/mood_event/obviously_not_listening - description = "Talking to someone and realizing they're clearly not listening is a bit upsetting." - mood_change = -1 diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 8ac323dda7a76..ad248ea73369b 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -59,12 +59,6 @@ /datum/mood_event/withdrawal_severe/add_effects(drug_name) description = "Oh god, I need some of that [drug_name]!" -/datum/mood_event/withdrawal_critical - mood_change = -10 - -/datum/mood_event/withdrawal_critical/add_effects(drug_name) - description = "[drug_name]! [drug_name]! [drug_name]!" - /datum/mood_event/happiness_drug description = "Can't feel a thing..." mood_change = 50 diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 892a88df49f59..fb877d1c1df56 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -53,26 +53,11 @@ mood_change = -8 timeout = 5 MINUTES -/datum/mood_event/depression_minimal - description = "I feel a bit down." - mood_change = -10 - timeout = 2 MINUTES - -/datum/mood_event/depression_mild +/datum/mood_event/depression description = "I feel sad for no particular reason." mood_change = -12 timeout = 2 MINUTES -/datum/mood_event/depression_moderate - description = "I feel miserable." - mood_change = -14 - timeout = 2 MINUTES - -/datum/mood_event/depression_severe - description = "I've lost all hope." - mood_change = -16 - timeout = 2 MINUTES - /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!" mood_change = -15 @@ -217,11 +202,6 @@ mood_change = -4 timeout = 4 MINUTES -/datum/mood_event/loud_gong - description = "That loud gong noise really hurt my ears!" - mood_change = -3 - timeout = 2 MINUTES - /datum/mood_event/notcreeping description = "The voices are not happy, and they painfully contort my thoughts into getting back on task." mood_change = -6 @@ -301,21 +281,11 @@ mood_change = -25 timeout = 4 MINUTES -/datum/mood_event/high_five_alone - description = "I tried getting a high-five with no one around, how embarassing!" - mood_change = -2 - timeout = 60 SECONDS - /datum/mood_event/high_five_full_hand description = "Oh god, I don't even know how to high-five correctly..." mood_change = -1 timeout = 45 SECONDS -/datum/mood_event/left_hanging - description = "But everyone loves high fives! Maybe people just... hate me?" - mood_change = -2 - timeout = 90 SECONDS - /datum/mood_event/too_slow description = "NO! HOW COULD I BE... TOO SLOW???" mood_change = -2 // multiplied by how many people saw it happen, up to 8, so potentially massive. the ULTIMATE prank carries a lot of weight @@ -385,16 +355,21 @@ description = "I feel off-balance without my tail." mood_change = -2 -/datum/mood_event/tail_regained_right - description = "My tail is back, but that was traumatic..." - mood_change = -2 - timeout = 5 MINUTES - /datum/mood_event/tail_regained_wrong description = "Is this some kind of sick joke?! This is NOT the right tail." mood_change = -12 // -8 for tail still missing + -4 bonus for being frakenstein's monster timeout = 5 MINUTES +/datum/mood_event/tail_regained_species + description = "This tail is not mine, but at least it balances me out..." + mood_change = -5 + timeout = 5 MINUTES + +/datum/mood_event/tail_regained_right + description = "My tail is back, but that was traumatic..." + mood_change = -2 + timeout = 5 MINUTES + /datum/mood_event/burnt_wings description = "MY PRECIOUS WINGS!!" mood_change = -10 diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 778522b4d422f..b9dca314b5189 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1500,7 +1500,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/clear_tail_moodlets(mob/living/carbon/human/former_tail_owner) former_tail_owner.clear_mood_event("tail_lost") former_tail_owner.clear_mood_event("tail_balance_lost") - former_tail_owner.clear_mood_event("wrong_tail_regained") + former_tail_owner.clear_mood_event("tail_regained") /// Returns a list of strings representing features this species has. /// Used by the preferences UI to know what buttons to show. diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 38b35bce45cb3..56479d0f22a10 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -28,10 +28,15 @@ receiver.clear_mood_event("tail_lost") receiver.clear_mood_event("tail_balance_lost") + // If it's your tail, an infinite debuff is replaced with a timed one + // If it's not your tail but of same species, I guess it works, but we are more sad + // If it's not your tail AND of different species, we are horrified if(IS_WEAKREF_OF(receiver, original_owner)) - receiver.clear_mood_event("wrong_tail_regained") + receiver.add_mood_event("tail_regained", /datum/mood_event/tail_regained_right) else if(type in receiver.dna.species.external_organs) - receiver.add_mood_event("wrong_tail_regained", /datum/mood_event/tail_regained_wrong) + receiver.add_mood_event("tail_regained", /datum/mood_event/tail_regained_species) + else + receiver.add_mood_event("tail_regained", /datum/mood_event/tail_regained_wrong) /obj/item/organ/external/tail/on_bodypart_insert(obj/item/bodypart/bodypart) var/obj/item/organ/external/spines/our_spines = bodypart.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) @@ -75,6 +80,8 @@ if(wag_flags & WAG_WAGGING) stop_wag(organ_owner) + organ_owner.clear_mood_event("tail_regained") + if(type in organ_owner.dna.species.external_organs) organ_owner.add_mood_event("tail_lost", /datum/mood_event/tail_lost) organ_owner.add_mood_event("tail_balance_lost", /datum/mood_event/tail_balance_lost) From 2d169db11c5fa071d155c6cd5448b781baa5e5a1 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:11:45 +1200 Subject: [PATCH 028/120] Automatic changelog for PR #83741 [ci skip] --- html/changelogs/AutoChangeLog-pr-83741.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83741.yml diff --git a/html/changelogs/AutoChangeLog-pr-83741.yml b/html/changelogs/AutoChangeLog-pr-83741.yml new file mode 100644 index 0000000000000..9cc8fa8717b14 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83741.yml @@ -0,0 +1,4 @@ +author: "larentoun" +delete-after: True +changes: + - balance: "Now regaining a tail has three states. If you got your tail back - you'll get a temporarily debuff in exchange of infinite \"tail missing\" debuff (new). If it's NOT your tail and of same species - this temporarily debuff will be a bit stronger (new). If it's NOT your tail and NOT of same species - it will be a considerably stronger debuff (currently on live)." \ No newline at end of file From 0d2ce3cd87d3d47efeeac2b9475fc0c6d79fa45f Mon Sep 17 00:00:00 2001 From: cnleth <113535457+cnleth@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:23:14 +0300 Subject: [PATCH 029/120] [Bounty] Juicing and distilling only consumes nutriment and vitamin (#83579) ## About The Pull Request This PR closes a bounty (https://tgstation13.org/phpBB/viewtopic.php?t=36203), but is also a change I'm personally interested in. Distilling and juicing now explicitly checks for nutriment and vitamin and ignores any other reagents, as per the bounty requirements, meaning potentially useful chems like oils don't get removed. ## Why It's Good For The Game More possibilities for cooking and ghetto chemistry, makes more sense because something like Frost Oil probably shouldn't turn into juice. --- code/game/objects/items.dm | 3 ++- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/grown/berries.dm | 2 +- code/modules/hydroponics/grown/sugarcane.dm | 4 ++-- code/modules/mining/lavaland/ash_flora.dm | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 08f4260e97b81..12f87382a1cd0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1019,7 +1019,8 @@ return FALSE if(ispath(juice_typepath)) - reagents.convert_reagent(/datum/reagent/consumable, juice_typepath, include_source_subtypes = TRUE) + reagents.convert_reagent(/datum/reagent/consumable/nutriment, juice_typepath, include_source_subtypes = FALSE) + reagents.convert_reagent(/datum/reagent/consumable/nutriment/vitamin, juice_typepath, include_source_subtypes = FALSE) reagents.trans_to(target_holder, reagents.total_volume, transferred_by = user) return TRUE diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index abc2c5b3bf88a..6edbfd382f964 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -118,7 +118,7 @@ var/quality_max = DRINK_FANTASTIC var/quality = round(LERP(quality_min, quality_max, purity_above_base)) for(var/datum/reagent/reagent in reagents.reagent_list) - if(!istype(reagent, /datum/reagent/consumable)) + if(reagent.type != /datum/reagent/consumable/nutriment && reagent.type != /datum/reagent/consumable/nutriment/vitamin) continue if(distill_reagent) var/data = list() diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 233765609200f..317f8ef2ed87f 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -208,7 +208,7 @@ icon_harvest = "lanternfruit-harvest" genes = list(/datum/plant_gene/trait/glow/yellow) mutatelist = null - reagents_add = list(/datum/reagent/sulfur = 0.07, /datum/reagent/consumable/sugar = 0.07, /datum/reagent/consumable/liquidelectricity = 0.07) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/sulfur = 0.07, /datum/reagent/consumable/sugar = 0.07, /datum/reagent/consumable/liquidelectricity = 0.07) graft_gene = /datum/plant_gene/trait/glow/yellow /obj/item/food/grown/lanternfruit diff --git a/code/modules/hydroponics/grown/sugarcane.dm b/code/modules/hydroponics/grown/sugarcane.dm index be2214ca1d048..1c5c55fece08d 100644 --- a/code/modules/hydroponics/grown/sugarcane.dm +++ b/code/modules/hydroponics/grown/sugarcane.dm @@ -14,7 +14,7 @@ yield = 4 instability = 15 growthstages = 2 - reagents_add = list(/datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/sugar = 0.25) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.25) mutatelist = list(/obj/item/seeds/bamboo, /obj/item/seeds/sugarcane/saltcane) /obj/item/food/grown/sugarcane @@ -66,7 +66,7 @@ plantname = "Saltcane" product = /obj/item/food/grown/sugarcane/saltcane genes = list(/datum/plant_gene/trait/repeated_harvest) - reagents_add = list(/datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/salt = 0.25) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/salt = 0.25) mutatelist = null /obj/item/food/grown/sugarcane/saltcane diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 16b8b3ec2f2b1..9cbc516697808 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -311,7 +311,7 @@ product = /obj/item/food/grown/ash_flora/shavings genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance) growing_icon = 'icons/obj/service/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/consumable/mintextract = 0.02) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/consumable/mintextract = 0.02) /obj/item/seeds/lavaland/porcini name = "pack of porcini mycelium" From cb0176ed1a998dceb799460aeffa99f00ad97426 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:23:51 +1200 Subject: [PATCH 030/120] Automatic changelog for PR #83579 [ci skip] --- html/changelogs/AutoChangeLog-pr-83579.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83579.yml diff --git a/html/changelogs/AutoChangeLog-pr-83579.yml b/html/changelogs/AutoChangeLog-pr-83579.yml new file mode 100644 index 0000000000000..20ec6214289cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83579.yml @@ -0,0 +1,6 @@ +author: "cnleth" +delete-after: True +changes: + - balance: "Juicing and distilling plants only consumes nutriment and vitamin" + - balance: "Lanternfruit and polypore mushrooms now contain nutriment" + - balance: "Increased the amount of nutriment in sugarcane and saltcane" \ No newline at end of file From 1ace708f68811cb296432ba3fc1f44c7abb35db3 Mon Sep 17 00:00:00 2001 From: JupiterJaeden <48777952+JupiterJaeden@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:21:16 -0400 Subject: [PATCH 031/120] Fixes conga lines when using ladders, and lets you pull objects (and conga lines) up and down with you in zero grav (#83833) ## About The Pull Request Fixes a bug where conga lines would break when going up and down ladders. Adds a quality of life improvement to allow you to pull objects up and down with you in zero gravity. A couple notes: This does NOT fix the bug where conga lines break when trying to go up and down stairs- I tried for like an hour to figure that one out and was stumped. I might try again in the future. This also does not fix another very minor bug I discovered where sometimes when you pull someone who is buckled TO an object like a chair, then change z levels via ladder (or now zero grav as well), the chair won't come with them until you pull them at least a tile in the new z level. This DOESNT happen if you pull the chair itself, if you do that it works correctly. I know WHY this bug occurs, but I was stumped on how to fix it, if any maintainers want me to explain it and give me some advice on it, I could open another PR to fix it. But it's honestly such a completely negligible impact on gameplay that I wouldn't consider it very important. ## Why It's Good For The Game Bug fixes and quality of life improvements. ## Changelog :cl: qol: you can now take pulled objects with you when going up and down in zero gravity fix: conga lines now work correctly when going up and down ladders, and in zero gravity /:cl: --- code/__DEFINES/movement.dm | 2 +- code/game/atoms_movable.dm | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index 540e5f7914c24..be3546ea102d1 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -103,7 +103,7 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define ZMOVE_CHECK_PULLS (ZMOVE_CHECK_PULLING|ZMOVE_CHECK_PULLEDBY) /// Flags used in "Move Upwards" and "Move Downwards" verbs. -#define ZMOVE_FLIGHT_FLAGS (ZMOVE_CAN_FLY_CHECKS|ZMOVE_INCAPACITATED_CHECKS|ZMOVE_CHECK_PULLS|ZMOVE_ALLOW_BUCKLED) +#define ZMOVE_FLIGHT_FLAGS (ZMOVE_CAN_FLY_CHECKS|ZMOVE_INCAPACITATED_CHECKS|ZMOVE_CHECK_PULLS|ZMOVE_ALLOW_BUCKLED|ZMOVE_INCLUDE_PULLED) /// Used when walking upstairs #define ZMOVE_STAIRS_FLAGS (ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED) /// Used for falling down open space. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 9789abb12a31e..d8ae957994794 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -401,6 +401,13 @@ . |= buckled.pulling if(pulling) . |= pulling + if (pulling.buckled_mobs) + . |= pulling.buckled_mobs + + //makes conga lines work with ladders and flying up and down; checks if the guy you are pulling is pulling someone, + //then uses recursion to run the same function again + if (pulling.pulling) + . |= pulling.pulling.get_z_move_affected(z_move_flags) /** * Checks if the destination turf is elegible for z movement from the start turf to a given direction and returns it if so. From 82970839c1a57305eec3efff5960deea9d17d117 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:21:35 +1200 Subject: [PATCH 032/120] Automatic changelog for PR #83833 [ci skip] --- html/changelogs/AutoChangeLog-pr-83833.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83833.yml diff --git a/html/changelogs/AutoChangeLog-pr-83833.yml b/html/changelogs/AutoChangeLog-pr-83833.yml new file mode 100644 index 0000000000000..eaa1fddfb87d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83833.yml @@ -0,0 +1,5 @@ +author: "JupiterJaeden" +delete-after: True +changes: + - qol: "you can now take pulled objects with you when going up and down in zero gravity" + - bugfix: "conga lines now work correctly when going up and down ladders, and in zero gravity" \ No newline at end of file From b6369a47b477e259eb177dc8307b33f3b1d90d38 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:58:41 +0530 Subject: [PATCH 033/120] Mouse drag & drop refactored attack chain (#83690) ## About The Pull Request Mouse drag & drop has been refactored into its own attack chain. The flowchart below summarizes it ![Flowchart](https://github.com/tgstation/tgstation/assets/110812394/d92047ff-d94c-44a6-9e87-354c3d525021) Brief summary of each proc is as follows **1. `atom/MouseDrop()`** - It is now non overridable. No subtype should ever touch this proc because it performs 2 basic checks a) Measures the time between mouse down & mouse release. If its less than `LENIENCY_TIME`(0.1 seconds) then the operation is not considered a drag but a simple click b) Measures the distance squared between the drag start & end point. If its less than `LENIENCY_DISTANCE`(16 pixels screen space) then the drag is considered too small and is discarded - These 2 sanity checks for drag & drop are applied across all operations without fail **2. `atom/base_mouse_drop_handler()`** - This is where atoms handle mouse drag & drop inside the world. Ideally it is non overridable in most cases because it also performs 2 checks - Is the dragged object & the drop target adjacent to the player?. Screen elements always return true for this case - Additional checks can be enforced by `can_perform_action()` done only on the dragged object. It uses the combined flags of `interaction_flags_mouse_drop` for both the dragged object & drop target to determine if the operation is feasible. We do this only on the dragged object because if both the dragged object & drop target are adjacent to the player then `can_perform_action()` will return the same results when done on either object so it makes no difference. Checks can be bypassed via the `IGNORE_MOUSE_DROP_CHECKS` which is used by huds & screen elements or in case you want to implement your own unique checks **3. `atom/mouse_drop_dragged()`** - Called on the object that is being dragged, drop target passed here as well, subtypes do their stuff here - `COMSIG_MOUSEDROP_ONTO` is sent afterwards. It does not require subtypes to call their parent proc **4. `atom/mouse_drop_receive()`** - Called on the drop target that is receiving the dragged object, subtypes do their stuff here - `COMSIG_MOUSEDROPPED_ONTO` is sent afterwards. It does not require subtypes to call their parent proc ## Why It's Good For The Game Implements basic sanity checks across all drag & drop operations. Allows us to reduce code like this https://github.com/tgstation/tgstation/blob/8c8311e624271a6f6decba8cd643b33b9904534a/code/game/machinery/dna_scanner.dm#L144-L145 Into this ``` if(!iscarbon(target)) return ``` I'm tired of seeing this code pattern `!Adjacent(user) || !user.Adjacent(target)` copy pasted all over the place. Let's just write that at the atom level & be done with it ## Changelog :cl: refactor: Mouse drag & drop attack chain has been refactored. Report any bugs on GitHub fix: You cannot close the cryo tube on yourself with Alt click like before /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/click.dm | 1 - .../signals_atom/signals_atom_mouse.dm | 5 +- code/__DEFINES/interaction_flags.dm | 6 ++ code/__DEFINES/mobs.dm | 4 +- code/_onclick/drag_drop.dm | 63 ++++++++++++++++--- code/_onclick/hud/action_button.dm | 3 +- code/_onclick/hud/movable_screen_objects.dm | 2 +- code/_onclick/hud/screen_objects.dm | 6 ++ code/datums/elements/climbable.dm | 2 + code/datums/elements/drag_pickup.dm | 4 +- code/datums/elements/strippable.dm | 4 +- code/datums/storage/storage.dm | 27 +++++--- code/game/atom/_atom.dm | 2 + code/game/machinery/autolathe.dm | 10 +-- .../game/machinery/dna_infuser/dna_infuser.dm | 6 +- code/game/machinery/dna_scanner.dm | 6 +- code/game/machinery/hypnochair.dm | 26 +++++--- code/game/machinery/iv_drip.dm | 20 +++--- code/game/machinery/launch_pad.dm | 15 ++--- code/game/machinery/pipe/pipe_dispenser.dm | 11 ++-- code/game/machinery/sleepers.dm | 6 +- code/game/machinery/suit_storage_unit.dm | 9 +-- code/game/objects/buckling.dm | 3 +- code/game/objects/items.dm | 5 +- code/game/objects/items/defib.dm | 5 +- .../objects/items/devices/radio/headset.dm | 10 ++- .../objects/items/implants/implantchair.dm | 11 +--- code/game/objects/items/pet_carrier.dm | 9 +-- code/game/objects/items/tanks/watertank.dm | 4 +- .../objects/structures/beds_chairs/chair.dm | 13 ++-- .../structures/crates_lockers/closets.dm | 7 +-- code/game/objects/structures/morgue.dm | 14 ++--- .../structures/transit_tubes/station.dm | 10 +-- code/game/turfs/closed/walls.dm | 3 +- code/modules/admin/verbs/light_debug.dm | 6 +- .../abductor/machinery/experiment.dm | 8 +-- .../fugitive/hunters/hunter_gear.dm | 7 +-- .../components/unary_devices/cryo.dm | 11 +++- code/modules/bitrunning/objects/netpod.dm | 8 +-- code/modules/clothing/clothing.dm | 9 ++- code/modules/clothing/head/tinfoilhat.dm | 7 ++- code/modules/clothing/shoes/cowboy.dm | 6 +- code/modules/clothing/shoes/sneakers.dm | 8 +-- .../machinery/monkeyrecycler.dm | 4 +- code/modules/mining/mine_items.dm | 10 +-- code/modules/mob/dead/dead.dm | 1 + code/modules/mob/dead/observer/observer.dm | 10 +-- code/modules/mob/living/basic/slime/slime.dm | 5 +- .../mob/living/carbon/alien/adult/adult.dm | 3 +- .../mob/living/carbon/carbon_defines.dm | 1 + code/modules/mob/living/living.dm | 25 +++++++- code/modules/mob/living/living_defines.dm | 1 - .../mob/living/simple_animal/bot/mulebot.dm | 14 +---- code/modules/mob/mob.dm | 16 +---- code/modules/mod/mod_control.dm | 10 +-- .../computers/item/computer.dm | 9 ++- .../computers/item/laptop.dm | 17 +++-- code/modules/paperwork/desk_bell.dm | 12 ++-- code/modules/paperwork/paper_cutter.dm | 7 +-- code/modules/paperwork/photocopier.dm | 9 ++- code/modules/plumbing/ducts.dm | 2 +- .../projectiles/guns/energy/laser_gatling.dm | 19 ++---- code/modules/reagents/chemistry/items.dm | 9 ++- .../machinery/portable_chem_mixer.dm | 6 +- code/modules/recycling/disposal/bin.dm | 2 +- .../modules/research/machinery/_production.dm | 10 +-- .../xenobiology/crossbreeding/_clothing.dm | 5 +- code/modules/shuttle/emergency.dm | 4 -- code/modules/vehicles/cars/car.dm | 7 ++- code/modules/vehicles/scooter.dm | 5 +- code/modules/vehicles/sealed.dm | 4 +- code/modules/vehicles/wheelchair.dm | 15 +++-- 72 files changed, 340 insertions(+), 304 deletions(-) diff --git a/code/__DEFINES/click.dm b/code/__DEFINES/click.dm index 5900dd54210ca..d650a32e81604 100644 --- a/code/__DEFINES/click.dm +++ b/code/__DEFINES/click.dm @@ -4,5 +4,4 @@ #define CLICK_ACTION_BLOCKING (1<<1) /// Either return state #define CLICK_ACTION_ANY (CLICK_ACTION_SUCCESS | CLICK_ACTION_BLOCKING) - /// Use NONE for continue interaction diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm index ae06585ae5f49..81cdd2c85966e 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -22,9 +22,10 @@ #define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" ///from base of atom/MouseDrop(): (/atom/over, /mob/user) #define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" - #define COMPONENT_NO_MOUSEDROP (1<<0) -///from base of atom/MouseDrop_T: (/atom/from, /mob/user) + #define COMPONENT_CANCEL_MOUSEDROP_ONTO (1<<0) +///from base of atom/handle_mouse_drop_receive: (/atom/from, /mob/user) #define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" + #define COMPONENT_CANCEL_MOUSEDROPPED_ONTO (1<<0) ///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params) #define COMSIG_MOUSE_SCROLL_ON "mousescroll_on" /// From /atom/movable/screen/click(): (atom/target, atom/location, control, params, mob/user) diff --git a/code/__DEFINES/interaction_flags.dm b/code/__DEFINES/interaction_flags.dm index 418466a0eb2c7..615fe5c4cbda2 100644 --- a/code/__DEFINES/interaction_flags.dm +++ b/code/__DEFINES/interaction_flags.dm @@ -20,6 +20,12 @@ #define INTERACT_ATOM_ALLOW_USER_LOCATION (1<<9) /// ignores mobility check #define INTERACT_ATOM_IGNORE_MOBILITY (1<<10) +// Bypass all adjacency checks for mouse drop +#define INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT (1<<11) +/// Bypass all can_perform_action checks for mouse drop +#define INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY (1<<12) +/// Bypass all adjacency and other checks for mouse drop +#define INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS (INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT | INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY) /// attempt pickup on attack_hand for items #define INTERACT_ITEM_ATTACK_HAND_PICKUP (1<<0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 0ca23dcf23a10..e8904f0bb1f86 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -827,8 +827,10 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define ALLOW_RESTING (1<<7) /// If this is accessible to creatures with ventcrawl capabilities #define NEED_VENTCRAWL (1<<8) +/// Skips adjacency checks +#define BYPASS_ADJACENCY (1<<9) /// Checks for base adjacency, but silences the error -#define SILENT_ADJACENCY (1<<9) +#define SILENT_ADJACENCY (1<<10) /// The default mob sprite size (used for shrinking or enlarging the mob sprite to regular size) #define RESIZE_DEFAULT_SIZE 1 diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index edecd0ba78f64..1bbc20d49133f 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -6,18 +6,64 @@ almost anything into a trash can. */ /atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + SHOULD_NOT_OVERRIDE(TRUE) + if(!usr || !over) return - if(SEND_SIGNAL(src, COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is receiving will verify themselves for adjacency. - return + var/proximity_check = usr.client.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) if(proximity_check) return proximity_check - if(!Adjacent(usr) || !over.Adjacent(usr)) - return // should stop you from dragging through windows + base_mouse_drop_handler(over, src_location, over_location, params) + +/** + * Called when all sanity checks for mouse dropping have passed. Handles adjacency & other sanity checks before delegating the event + * down to lower level handlers. Do not override unless you are trying to create hud & screen elements which do not require proximity + * or other checks + */ +/atom/proc/base_mouse_drop_handler(atom/over, src_location, over_location, params) + PROTECTED_PROC(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + + var/mob/user = usr + + if(SEND_SIGNAL(src, COMSIG_MOUSEDROP_ONTO, over, user) & COMPONENT_CANCEL_MOUSEDROP_ONTO) + return + + if(SEND_SIGNAL(over, COMSIG_MOUSEDROPPED_ONTO, src, user, params) & COMPONENT_CANCEL_MOUSEDROPPED_ONTO) + return + + // only if both dragged object & receiver agree to do checks do we proceed + var/combined_atom_flags = interaction_flags_atom | over.interaction_flags_atom + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS)) + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT)) + if(!Adjacent(user) || !over.Adjacent(user)) + return // should stop you from dragging through windows + + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY)) + var/combined_flags = interaction_flags_mouse_drop | over.interaction_flags_mouse_drop + if(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) + combined_flags |= BYPASS_ADJACENCY + else + combined_flags |= SILENT_ADJACENCY + if(!user.can_perform_action(src, combined_flags)) + return // is the mob not able to drag the object with both sides conditions applied + + mouse_drop_dragged(over, user, src_location, over_location, params) + + over.mouse_drop_receive(src, user, params) + +/// The proc that should be overridden by subtypes to handle mouse drop. Called on the atom being dragged +/atom/proc/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + PROTECTED_PROC(TRUE) + + return + +/// The proc that should be overridden by subtypes to handle mouse drop. Called on the atom receiving a dragged object +/atom/proc/mouse_drop_receive(atom/dropped, mob/user, params) + PROTECTED_PROC(TRUE) - over.MouseDrop_T(src,usr, params) return /// Handles treating drags as clicks if they're within some conditions @@ -78,11 +124,6 @@ return TRUE -// receive a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user, params) - SEND_SIGNAL(src, COMSIG_MOUSEDROPPED_ONTO, dropping, user, params) - - /client/MouseDown(datum/object, location, control, params) if(QDELETED(object)) //Yep, you can click on qdeleted things before they have time to nullspace. Fun. return @@ -146,6 +187,8 @@ return ..() /client/MouseDrop(atom/src_object, atom/over_object, atom/src_location, atom/over_location, src_control, over_control, params) + SHOULD_NOT_OVERRIDE(TRUE) + if (IS_WEAKREF_OF(src_object, middle_drag_atom_ref)) middragtime = 0 middle_drag_atom_ref = null diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 9d4343c132e9b..b2665e1f98ed0 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -105,7 +105,7 @@ closeToolTip(usr) return ..() -/atom/movable/screen/movable/action_button/MouseDrop(over_object) +/atom/movable/screen/movable/action_button/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) last_hovored_ref = null if(!can_use(usr)) return @@ -130,7 +130,6 @@ our_hud.position_action_relative(src, button) save_position() return - . = ..() our_hud.position_action(src, screen_loc) save_position() diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index e0a6c6873bd5a..7a0937974bd36 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -20,7 +20,7 @@ /atom/movable/screen/movable/snap snap2grid = TRUE -/atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/movable/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) var/position = mouse_params_to_position(params) if(!position) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6f30f2a51355d..2fc1fe644eec1 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -15,6 +15,7 @@ animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT appearance_flags = APPEARANCE_UI + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS /// A reference to the object in the slot. Grabs or items, generally, but any datum will do. var/datum/weakref/master_ref = null /// A reference to the owner HUD, if any. @@ -58,6 +59,10 @@ if(default_click) return ..() +///Screen elements are always on top of the players screen and don't move so yes they are adjacent +/atom/movable/screen/Adjacent(atom/neighbor, atom/target, atom/movable/mover) + return TRUE + /atom/movable/screen/examine(mob/user) return list() @@ -241,6 +246,7 @@ var/mutable_appearance/handcuff_overlay var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/hud/screen_gen.dmi', "blocked") var/held_index = 0 + interaction_flags_atom = NONE //so dragging objects into hands icon don't skip adjacency & other checks /atom/movable/screen/inventory/hand/update_overlays() . = ..() diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 56c16f303c4ed..004f05dd5f584 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -111,6 +111,8 @@ ///Handles climbing onto the atom when you click-drag /datum/element/climbable/proc/mousedrop_receive(atom/climbed_thing, atom/movable/dropped_atom, mob/user, params) SIGNAL_HANDLER + + . = COMPONENT_CANCEL_MOUSEDROPPED_ONTO if(user != dropped_atom || !isliving(dropped_atom)) return if(!HAS_TRAIT(dropped_atom, TRAIT_FENCE_CLIMBER) && !HAS_TRAIT(dropped_atom, TRAIT_CAN_HOLD_ITEMS)) // If you can hold items you can probably climb a fence diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm index ffce267a895a1..128ae79099644 100644 --- a/code/datums/elements/drag_pickup.dm +++ b/code/datums/elements/drag_pickup.dm @@ -17,8 +17,10 @@ /datum/element/drag_pickup/proc/pick_up(atom/source, atom/over, mob/user) SIGNAL_HANDLER + + . = COMPONENT_CANCEL_MOUSEDROP_ONTO var/mob/living/picker = user - if(!istype(picker) || picker.incapacitated() || !source.Adjacent(picker)) + if(!istype(picker) || !user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) return if(over == picker) diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 18dffff6aedff..3816d16097d52 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -36,11 +36,13 @@ /datum/element/strippable/proc/mouse_drop_onto(datum/source, atom/over, mob/user) SIGNAL_HANDLER + . = COMPONENT_CANCEL_MOUSEDROP_ONTO if (user == source) return - if (over != user) return + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return // Cyborgs buckle people by dragging them onto them, unless in combat mode. if (iscyborg(user)) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 0a86c9fb54568..28ecfcce8dc76 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -714,25 +714,35 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_mousedrop_onto(datum/source, atom/over_object, mob/user) SIGNAL_HANDLER - if(ismecha(user.loc) || user.incapacitated() || !user.canUseStorage()) + . = COMPONENT_CANCEL_MOUSEDROP_ONTO + if(ismecha(user.loc) || !user.canUseStorage()) return - parent.add_fingerprint(user) - if(istype(over_object, /atom/movable/screen/inventory/hand)) - if(real_location.loc != user) + if(real_location.loc != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) return var/atom/movable/screen/inventory/hand/hand = over_object user.putItemFromInventoryInHandIfPossible(parent, hand.held_index) + parent.add_fingerprint(user) else if(ismob(over_object)) - if(over_object != user) + if(over_object != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) return + parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(open_storage), user) else if(!istype(over_object, /atom/movable/screen)) + var/action_status + if(isturf(over_object)) + action_status = user.can_perform_turf_action(over_object) + else + action_status = user.can_perform_action(over_object, FORBID_TELEKINESIS_REACH) + if(!action_status) + return + + parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, user) /** @@ -779,18 +789,17 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_mousedropped_onto(datum/source, obj/item/dropping, mob/user) SIGNAL_HANDLER + . = COMPONENT_CANCEL_MOUSEDROPPED_ONTO if(!istype(dropping)) return if(dropping != user.get_active_held_item()) return + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return if(dropping.atom_storage) // If it has storage it should be trying to dump, not insert. return - if(!iscarbon(user) && !isdrone(user)) return - var/mob/living/user_living = user - if(user_living.incapacitated()) - return attempt_insert(dropping, user) diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index f182d14d97e67..ab4da3f2f7704 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -138,6 +138,8 @@ /// Flags to check for in can_perform_action. Used in alt-click checks var/interaction_flags_click = NONE + /// Flags to check for in can_perform_action for mouse drag & drop checks. To bypass checks see interaction_flags_atom mouse drop flags + var/interaction_flags_mouse_drop = NONE /** * Top level of the destroy chain for most atoms diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3ad109b30e544..8af032101ae14 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -9,6 +9,7 @@ circuit = /obj/item/circuitboard/machine/autolathe layer = BELOW_OBJ_LAYER processing_flags = NONE + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS ///Is the autolathe hacked via wiring var/hacked = FALSE @@ -380,18 +381,17 @@ busy = FALSE SStgui.update_uis(src) -/obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - . = ..() - if(!can_interact(usr) || (!HAS_SILICON_ACCESS(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) +/obj/machinery/autolathe/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(!can_interact(user) || (!HAS_SILICON_ACCESS(user) && !isAdminGhostAI(user)) && !Adjacent(user)) return if(busy) - balloon_alert(usr, "printing started!") + balloon_alert(user, "printing started!") return var/direction = get_dir(src, over_location) if(!direction) return drop_direction = direction - balloon_alert(usr, "dropping [dir2text(drop_direction)]") + balloon_alert(user, "dropping [dir2text(drop_direction)]") /obj/machinery/autolathe/click_alt(mob/user) if(!drop_direction) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 7e5c58ef94c78..cc2641d32971e 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -11,7 +11,9 @@ base_icon_state = "infuser" density = TRUE obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY circuit = /obj/item/circuitboard/machine/dna_infuser + /// maximum tier this will infuse var/max_tier_allowed = DNA_MUTANT_TIER_ONE ///currently infusing a vict- subject @@ -199,7 +201,7 @@ infusing_from = target // mostly good for dead mobs like corpses (drag to add). -/obj/machinery/dna_infuser/MouseDrop_T(atom/movable/target, mob/user) +/obj/machinery/dna_infuser/mouse_drop_receive(atom/target, mob/user, params) // if the machine is closed, already has a infusion target, or the target is not valid then no mouse drop. if(!is_valid_infusion(target, user)) return @@ -208,8 +210,6 @@ /// Verify that the given infusion source/mob is a dead creature. /obj/machinery/dna_infuser/proc/is_valid_infusion(atom/movable/target, mob/user) - if(user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !ISADVANCEDTOOLUSER(user)) - return FALSE var/datum/component/edible/food_comp = IS_EDIBLE(target) if(infusing_from) balloon_alert(user, "empty the machine first!") diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index dbcb36ff3cf52..4775642881fcc 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -6,8 +6,10 @@ base_icon_state = "scanner" density = TRUE obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open + interaction_flags_mouse_drop = NEED_DEXTERITY occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/internal/brain) circuit = /obj/item/circuitboard/machine/dnascanner + var/locked = FALSE var/damage_coeff var/scan_level @@ -140,8 +142,8 @@ /obj/machinery/dna_scannernew/interact(mob/user) toggle_open(user) -/obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user) - if(user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) +/obj/machinery/dna_scannernew/mouse_drop_receive(atom/target, mob/user, params) + if(!iscarbon(target)) return close_machine(target) diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index 4594e09a9af9a..f8f3ed49be598 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -7,13 +7,20 @@ circuit = /obj/item/circuitboard/machine/hypnochair density = TRUE opacity = FALSE - - var/mob/living/carbon/victim = null ///Keeps track of the victim to apply effects if it teleports away - var/interrogating = FALSE ///Is the device currently interrogating someone? - var/start_time = 0 ///Time when the interrogation was started, to calculate effect in case of interruption - var/trigger_phrase = "" ///Trigger phrase to implant - var/timerid = 0 ///Timer ID for interrogations - var/message_cooldown = 0 ///Cooldown for breakout message + interaction_flags_mouse_drop = NEED_DEXTERITY + + ///Keeps track of the victim to apply effects if it teleports away + var/mob/living/carbon/victim = null + ///Is the device currently interrogating someone? + var/interrogating = FALSE + ///Time when the interrogation was started, to calculate effect in case of interruption + var/start_time = 0 + ///Trigger phrase to implant + var/trigger_phrase = "" + ///Timer ID for interrogations + var/timerid = 0 + ///Cooldown for breakout message + var/message_cooldown = 0 /obj/machinery/hypnochair/Initialize(mapload) . = ..() @@ -194,8 +201,7 @@ to_chat(user, span_warning("[src]'s door won't budge!")) -/obj/machinery/hypnochair/MouseDrop_T(mob/target, mob/user) - if(HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !ISADVANCEDTOOLUSER(user)) +/obj/machinery/hypnochair/mouse_drop_receive(atom/target, mob/user, params) + if(!isliving(target)) return - close_machine(target) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 91104abf68123..4ac2a177e76bc 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -23,6 +23,7 @@ anchored = FALSE mouse_drag_pointer = MOUSE_ACTIVE_POINTER use_power = NO_POWER_USE + interaction_flags_mouse_drop = NEED_HANDS ///What are we sticking our needle in? var/atom/attached @@ -161,25 +162,22 @@ filling.color = mix_color_from_reagents(container_reagents.reagent_list) . += filling -/obj/machinery/iv_drip/MouseDrop(atom/target) - . = ..() - if(!Adjacent(target) || !usr.can_perform_action(src)) - return - if(!isliving(usr)) - to_chat(usr, span_warning("You can't do that!")) +/obj/machinery/iv_drip/mouse_drop_dragged(atom/target, mob/user) + if(!isliving(user)) + to_chat(user, span_warning("You can't do that!")) return if(!get_reagents()) - to_chat(usr, span_warning("There's nothing attached to the IV drip!")) + to_chat(user, span_warning("There's nothing attached to the IV drip!")) return - if(!target.is_injectable(usr)) - to_chat(usr, span_warning("Can't inject into this!")) + if(!target.is_injectable(user)) + to_chat(user, span_warning("Can't inject into this!")) return if(attached) visible_message(span_warning("[attached] is detached from [src].")) attached = null update_appearance(UPDATE_ICON) - usr.visible_message(span_warning("[usr] attaches [src] to [target]."), span_notice("You attach [src] to [target].")) - attach_iv(target, usr) + user.visible_message(span_warning("[user] attaches [src] to [target]."), span_notice("You attach [src] to [target].")) + attach_iv(target, user) /obj/machinery/iv_drip/attackby(obj/item/W, mob/user, params) if(use_internal_storage) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 9f889a4193f76..f8dc9887758d4 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -7,7 +7,9 @@ icon_state = "lpad-idle" active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2.5 hud_possible = list(DIAG_LAUNCHPAD_HUD) + interaction_flags_mouse_drop = NEED_DEXTERITY | NEED_HANDS circuit = /obj/item/circuitboard/machine/launchpad + /// The beam icon var/icon_teleport = "lpad-beam" /// To prevent briefcase pad deconstruction and such @@ -298,14 +300,13 @@ return FALSE return TRUE -/obj/machinery/launchpad/briefcase/MouseDrop(over_object, src_location, over_location) - . = ..() - if(over_object == usr) - if(!briefcase || !usr.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) +/obj/machinery/launchpad/briefcase/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) + if(over_object == user) + if(!briefcase) return - usr.visible_message(span_notice("[usr] starts closing [src]..."), span_notice("You start closing [src]...")) - if(do_after(usr, 3 SECONDS, target = usr)) - usr.put_in_hands(briefcase) + user.visible_message(span_notice("[usr] starts closing [src]..."), span_notice("You start closing [src]...")) + if(do_after(user, 3 SECONDS, target = user)) + user.put_in_hands(briefcase) moveToNullspace() //hides it from suitcase contents closed = TRUE update_indicator() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index d65f33e95878c..eb5b499bce79e 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -9,6 +9,8 @@ desc = "Dispenses countless types of pipes. Very useful if you need pipes." density = TRUE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_OFFLINE + interaction_flags_mouse_drop = NEED_DEXTERITY + var/wait = 0 var/piping_layer = PIPING_LAYER_DEFAULT ///color of pipe @@ -183,16 +185,12 @@ density = TRUE category = DISPOSAL_PIPEDISPENSER - //Allow you to drag-drop disposal pipes and transit tubes into it -/obj/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/pipe, mob/usr) - if(!usr.incapacitated()) - return - +/obj/machinery/pipedispenser/disposal/mouse_drop_receive(obj/structure/pipe, mob/user, params) if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) return - if (get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 ) + if (get_dist(user, src) > 1 || get_dist(src, pipe) > 1 ) return if (pipe.anchored) @@ -200,7 +198,6 @@ qdel(pipe) - //transit tube dispenser //inherit disposal for the dragging proc /obj/machinery/pipedispenser/disposal/transit_tube diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 836ea2cf09adf..63291035e784f 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -7,6 +7,7 @@ density = FALSE obj_flags = BLOCKS_CONSTRUCTION state_open = TRUE + interaction_flags_mouse_drop = NEED_DEXTERITY circuit = /obj/item/circuitboard/machine/sleeper payment_department = ACCOUNT_MED @@ -114,9 +115,8 @@ if(is_operational && occupant) open_machine() - -/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) - if(HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) +/obj/machinery/sleeper/mouse_drop_receive(atom/target, mob/user, params) + if(!iscarbon(target)) return close_machine(target) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index a5e301c21680b..ce513c4000ff5 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -9,6 +9,7 @@ power_channel = AREA_USAGE_EQUIP density = TRUE obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the unit is open + interaction_flags_mouse_drop = NEED_DEXTERITY max_integrity = 250 req_access = list() state_open = FALSE @@ -446,13 +447,9 @@ image.color = COLOR_RED return image -/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/living/user) - if(!istype(user) || user.stat || !Adjacent(user) || !Adjacent(A) || !isliving(A)) +/obj/machinery/suit_storage_unit/mouse_drop_receive(atom/A, mob/living/user, params) + if(!isliving(A)) return - if(isliving(user)) - var/mob/living/L = user - if(L.body_position == LYING_DOWN) - return var/mob/living/target = A if(!state_open) to_chat(user, span_warning("The unit's doors are shut!")) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index e2ad3af956a2b..fd57b24da099f 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -42,8 +42,7 @@ else return user_unbuckle_mob(buckled_mobs[1], user) -/atom/movable/MouseDrop_T(mob/living/M, mob/living/user) - . = ..() +/atom/movable/mouse_drop_receive(mob/living/M, mob/user, params) return mouse_buckle_handling(M, user) /** diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 12f87382a1cd0..1e5d8ab4a6694 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1064,8 +1064,11 @@ else apply_outline() //if the player's alive and well we send the command with no color set, so it uses the theme's color -/obj/item/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) +/obj/item/base_mouse_drop_handler(atom/over, src_location, over_location, params) + SHOULD_NOT_OVERRIDE(TRUE) + . = ..() + remove_filter(HOVER_OUTLINE_FILTER) //get rid of the hover effect in case the mouse exit isn't called if someone drags and drops an item and somthing goes wrong /obj/item/MouseExited() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index ac164df007c14..cbac185f675fe 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -136,11 +136,10 @@ ui_action_click() //checks for this are handled in defibrillator.mount.dm return ..() -/obj/item/defibrillator/MouseDrop(obj/over_object) - . = ..() +/obj/item/defibrillator/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) if(ismob(loc)) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + if(istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index ae806b594e1fd..1f2cd37a5ccef 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 0.75) subspace_transmission = TRUE canhear_range = 0 // can't hear headsets from very far away - + interaction_flags_mouse_drop = FORBID_TELEKINESIS_REACH slot_flags = ITEM_SLOT_EARS dog_fashion = null var/obj/item/encryptionkey/keyslot2 = null @@ -91,11 +91,9 @@ GLOBAL_LIST_INIT(channel_tokens, list( . = ..() .["headset"] = TRUE -/obj/item/radio/headset/MouseDrop(mob/over, src_location, over_location) - var/mob/headset_user = usr - if((headset_user == over) && headset_user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return attack_self(headset_user) - return ..() +/obj/item/radio/headset/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(user == over) + return attack_self(user) /// Grants all the languages this headset allows the mob to understand via installed chips. /obj/item/radio/headset/proc/grant_headset_languages(mob/grant_to) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index d76bd363e664c..5f833e3264875 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -5,6 +5,7 @@ icon_state = "implantchair" density = TRUE opacity = FALSE + interaction_flags_mouse_drop = NEED_DEXTERITY var/ready = TRUE var/replenishing = FALSE @@ -142,17 +143,11 @@ message_cooldown = world.time + 50 to_chat(user, span_warning("[src]'s door won't budge!")) - -/obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user) - if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !ISADVANCEDTOOLUSER(user)) +/obj/machinery/implantchair/mouse_drop_receive(mob/target, mob/user, params) + if(!isliving(target)) return - if(isliving(user)) - var/mob/living/L = user - if(L.body_position == LYING_DOWN) - return close_machine(target) - /obj/machinery/implantchair/close_machine(mob/living/user, density_to_set = TRUE) if((isnull(user) || istype(user)) && state_open) ..(user) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index e30cdaf39df34..2e2e622ff6c1b 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -18,6 +18,8 @@ throw_speed = 2 throw_range = 3 custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 7.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + interaction_flags_mouse_drop = NEED_DEXTERITY + var/open = TRUE var/locked = FALSE var/list/occupants = list() @@ -153,10 +155,9 @@ if(!open) . += "[base_icon_state]_[locked ? "" : "un"]locked" -/obj/item/pet_carrier/MouseDrop(atom/over_atom) - . = ..() - if(isopenturf(over_atom) && usr.can_perform_action(src, NEED_DEXTERITY) && usr.Adjacent(over_atom) && open && occupants.len) - usr.visible_message(span_notice("[usr] unloads [src]."), \ +/obj/item/pet_carrier/mouse_drop_dragged(atom/over_atom, mob/user, src_location, over_location, params) + if(isopenturf(over_atom) && open && occupants.len) + user.visible_message(span_notice("[user] unloads [src]."), \ span_notice("You unload [src] onto [over_atom].")) for(var/V in occupants) remove_occupant(V, over_atom) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 4bfcd92c2dbf9..45c20e9908bf4 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -14,6 +14,7 @@ max_integrity = 200 armor_type = /datum/armor/item_watertank resistance_flags = FIRE_PROOF + interaction_flags_mouse_drop = ALLOW_RESTING var/obj/item/noz var/volume = 500 @@ -93,12 +94,11 @@ else return ..() -/obj/item/watertank/MouseDrop(obj/over_object) +/obj/item/watertank/mouse_drop_dragged(atom/over_object) var/mob/M = loc if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - return ..() /obj/item/watertank/attackby(obj/item/attacking_item, mob/user, params) if(attacking_item == noz) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index fbf6a55e2073c..e8b5ed4c13d43 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -11,6 +11,8 @@ integrity_failure = 0.1 custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) layer = OBJ_LAYER + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY + var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 1 var/item_chair = /obj/item/chair // if null it can't be picked up @@ -261,18 +263,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) /obj/structure/chair/stool/narsie_act() return -/obj/structure/chair/MouseDrop(over_object, src_location, over_location) - . = ..() - if(over_object == usr && Adjacent(usr)) +/obj/structure/chair/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) + if(over_object == user) if(!item_chair || has_buckled_mobs()) return - if(!usr.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) - return - usr.visible_message(span_notice("[usr] grabs \the [src.name]."), span_notice("You grab \the [src.name].")) + user.visible_message(span_notice("[user] grabs \the [src.name]."), span_notice("You grab \the [src.name].")) var/obj/item/C = new item_chair(loc) C.set_custom_materials(custom_materials) TransferComponents(C) - usr.put_in_hands(C) + user.put_in_hands(C) qdel(src) /obj/structure/chair/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 61b5d104e55a4..f98b29e1932b1 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -911,13 +911,9 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/proc/after_weld(weld_state) return -/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) +/obj/structure/closet/mouse_drop_receive(atom/movable/O, mob/living/user, params) if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return - if(!istype(user) || user.incapacitated() || user.body_position == LYING_DOWN) - return - if(!Adjacent(user) || !user.Adjacent(O)) - return if(user == O) //try to climb onto it return ..() if(!opened) @@ -951,7 +947,6 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) log_combat(user, O, "stuffed", addition = "inside of [src]") else O.forceMove(T) - return 1 /obj/structure/closet/relaymove(mob/living/user, direction) if(user.stat || !isturf(loc)) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index d52a4df28cbc2..9baf7cb14fb8f 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -518,6 +518,7 @@ GLOBAL_LIST_EMPTY(crematoriums) density = TRUE anchored = TRUE pass_flags_self = PASSTABLE | LETPASSTHROW + max_integrity = 350 ///The bodycontainer we are a tray to. @@ -558,10 +559,10 @@ GLOBAL_LIST_EMPTY(crematoriums) if(carried_mob == user) //Piggyback user. return user.unbuckle_mob(carried_mob) - MouseDrop_T(carried_mob, user) + mouse_drop_receive(carried_mob, user) -/obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user) - if(!ismovable(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) +/obj/structure/tray/mouse_drop_receive(atom/movable/O as mob|obj, mob/user, params) + if(!ismovable(O) || O.anchored || O.loc == user) return if(!ismob(O)) if(!istype(O, /obj/structure/closet/body_bag)) @@ -570,16 +571,9 @@ GLOBAL_LIST_EMPTY(crematoriums) var/mob/M = O if(M.buckled) return - if(!ismob(user) || user.incapacitated()) - return - if(isliving(user)) - var/mob/living/L = user - if(L.body_position == LYING_DOWN) - return O.forceMove(src.loc) if (user != O) visible_message(span_warning("[user] stuffs [O] into [src].")) - return /* * Crematorium tray diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 3eeb81cb8aca5..8fc1426c5f36d 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -14,6 +14,7 @@ exit_delay = 1 enter_delay = 2 tube_construction = /obj/structure/c_transit_tube/station + var/open_status = STATION_TUBE_CLOSED var/pod_moving = FALSE var/cooldown_delay = 50 @@ -40,14 +41,9 @@ pod.update_appearance() return - //pod insertion -/obj/structure/transit_tube/station/MouseDrop_T(obj/structure/c_transit_tube_pod/R, mob/user) - if(isliving(user)) - var/mob/living/L = user - if(L.incapacitated()) - return - if (!istype(R) || get_dist(user, src) > 1 || get_dist(src,R) > 1) +/obj/structure/transit_tube/station/mouse_drop_receive(obj/structure/c_transit_tube_pod/R, mob/user, params) + if (!istype(R) || get_dist(user, src) > 1 || get_dist(src, R) > 1) return for(var/obj/structure/transit_tube_pod/pod in loc) return //no fun allowed diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index b5829a4364cd7..4b0f7961d51ff 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -34,8 +34,7 @@ var/list/dent_decals -/turf/closed/wall/MouseDrop_T(atom/dropping, mob/user, params) - ..() +/turf/closed/wall/mouse_drop_receive(atom/dropping, mob/user, params) if(dropping != user) return if(!iscarbon(dropping) && !iscyborg(dropping)) diff --git a/code/modules/admin/verbs/light_debug.dm b/code/modules/admin/verbs/light_debug.dm index eac81f6ed294b..5738e06eeeab5 100644 --- a/code/modules/admin/verbs/light_debug.dm +++ b/code/modules/admin/verbs/light_debug.dm @@ -129,8 +129,7 @@ GLOBAL_LIST_EMPTY(light_debugged_atoms) last_hovored_ref = WEAKREF(over_object) over_object.MouseEntered(over_location, over_control, params) -/atom/movable/screen/light_button/MouseDrop(over_object) - . = ..() +/atom/movable/screen/light_button/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) last_hovored_ref = null /atom/movable/screen/light_button/MouseEntered(location, control, params) @@ -330,8 +329,7 @@ GLOBAL_LIST_EMPTY(light_debugged_atoms) icon_state = "light_move" mouse_drag_pointer = 'icons/effects/mouse_pointers/light_drag.dmi' -/atom/movable/screen/light_button/move/MouseDrop(over_object) - . = ..() +/atom/movable/screen/light_button/move/mouse_drop_dragged(atom/over_object) if(!ismovable(loc)) return var/atom/movable/movable_owner = loc diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 711923daa442f..a549171b66150 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -5,6 +5,8 @@ icon_state = "experiment-open" density = FALSE state_open = TRUE + interaction_flags_mouse_drop = NEED_DEXTERITY + var/points = 0 var/credits = 0 var/list/history @@ -21,10 +23,8 @@ console = null return ..() -/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) - if(user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) - return - if(isabductor(target)) +/obj/machinery/abductor/experiment/mouse_drop_receive(mob/target, mob/user, params) + if(!ishuman(target) || isabductor(target)) return close_machine(target) diff --git a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm index 31f312ae5407b..2905dff3a0f58 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_gear.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_gear.dm @@ -7,16 +7,15 @@ icon_state = "bluespace-prison" density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //ha ha no getting out!! + interaction_flags_mouse_drop = NEED_DEXTERITY /obj/machinery/fugitive_capture/examine(mob/user) . = ..() . += span_notice("Add a prisoner by dragging them into the machine.") -/obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user) +/obj/machinery/fugitive_capture/mouse_drop_receive(mob/target, mob/user, params) var/mob/living/fugitive_hunter = user - if(!isliving(fugitive_hunter)) - return - if(HAS_TRAIT(fugitive_hunter, TRAIT_UI_BLOCKED) || !Adjacent(fugitive_hunter) || !target.Adjacent(fugitive_hunter) || !ishuman(target)) + if(!isliving(fugitive_hunter) || !ishuman(target)) return var/mob/living/carbon/human/fugitive = target var/datum/antagonist/fugitive/fug_antag = fugitive.mind.has_antag_datum(/datum/antagonist/fugitive) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index bab9cf52f7c79..d81cd2bc5377f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -80,6 +80,7 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.75 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.5 flags_1 = PREVENT_CLICK_UNDER_1 + interaction_flags_mouse_drop = NEED_DEXTERITY ///If TRUE will eject the mob once healing is complete var/autoeject = TRUE @@ -641,15 +642,19 @@ return ..() /obj/machinery/cryo_cell/click_alt(mob/user) - if(state_open) + //Required so players don't close the cryo on themselves without a doctor's help + if(get_turf(user) == get_turf(src)) + return CLICK_ACTION_BLOCKING + + if(state_open ) close_machine() else open_machine() balloon_alert(user, "door [state_open ? "opened" : "closed"]") return CLICK_ACTION_SUCCESS -/obj/machinery/cryo_cell/MouseDrop_T(mob/target, mob/user) - if(user.incapacitated() || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) +/obj/machinery/cryo_cell/mouse_drop_receive(mob/target, mob/user, params) + if(!iscarbon(target)) return if(isliving(target)) diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm index a1a681cab055f..cf8be61f62f3d 100644 --- a/code/modules/bitrunning/objects/netpod.dm +++ b/code/modules/bitrunning/objects/netpod.dm @@ -11,6 +11,8 @@ max_integrity = 300 obj_flags = BLOCKS_CONSTRUCTION state_open = TRUE + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY + /// Whether we have an ongoing connection var/connected = FALSE /// A player selected outfit by clicking the netpod @@ -93,12 +95,10 @@ return ..() -/obj/machinery/netpod/MouseDrop_T(mob/target, mob/user) +/obj/machinery/netpod/mouse_drop_receive(mob/target, mob/user, params) var/mob/living/carbon/player = user - if(!iscarbon(player) || !Adjacent(player) || !ISADVANCEDTOOLUSER(player) || !is_operational || !state_open) - return - if(player.buckled || HAS_TRAIT(player, TRAIT_HANDS_BLOCKED)) + if(!iscarbon(player) || !is_operational || !state_open || player.buckled) return close_machine(target) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e9ec547755d5e..cd32002d0434b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -63,17 +63,16 @@ if(!icon_state) item_flags |= ABSTRACT -/obj/item/clothing/MouseDrop(atom/over_object) - . = ..() - var/mob/M = usr +/obj/item/clothing/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) + var/mob/M = user if(ismecha(M.loc)) // stops inventory actions in a mech return - if(!M.incapacitated() && loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) + if(loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) - add_fingerprint(usr) + add_fingerprint(user) /obj/item/food/clothing name = "temporary moth clothing snack item" diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index 4b265778e237c..74ce320a8aba0 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -8,6 +8,7 @@ clothing_flags = ANTI_TINFOIL_MANEUVER var/datum/brain_trauma/mild/phobia/conspiracies/paranoia var/warped = FALSE + interaction_flags_mouse_drop = NEED_HANDS /datum/armor/costume_foilhat laser = -5 @@ -42,10 +43,10 @@ user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) to_chat(user, span_warning("As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ")) -/obj/item/clothing/head/costume/foilhat/MouseDrop(atom/over_object) +/obj/item/clothing/head/costume/foilhat/mouse_drop_dragged(atom/over_object, mob/user) //God Im sorry - if(!warped && iscarbon(usr)) - var/mob/living/carbon/C = usr + if(!warped && iscarbon(user)) + var/mob/living/carbon/C = user if(src == C.head) to_chat(C, span_userdanger("Why would you want to take this off? Do you want them to get into your mind?!")) return diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index 73c5a9d0d958c..4295b91cad2f5 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -5,6 +5,8 @@ armor_type = /datum/armor/shoes_cowboy custom_price = PAYCHECK_CREW can_be_tied = FALSE + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY + var/max_occupants = 4 /// Do these boots have spur sounds? var/has_spurs = FALSE @@ -52,9 +54,9 @@ user.say(pick("Hot damn!", "Hoo-wee!", "Got-dang!"), spans = list(SPAN_YELL), forced=TRUE) user.client?.give_award(/datum/award/achievement/misc/hot_damn, user) -/obj/item/clothing/shoes/cowboy/MouseDrop_T(mob/living/target, mob/living/user) +/obj/item/clothing/shoes/cowboy/mouse_drop_receive(mob/living/target, mob/living/user, params) . = ..() - if(!(user.mobility_flags & MOBILITY_USE) || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !isliving(target) || !user.Adjacent(target) || target.stat == DEAD) + if(!(user.mobility_flags & MOBILITY_USE) || !isliving(target)) return if(contents.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index 8d3d9f1764564..953d5bd9a1cb8 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -10,6 +10,7 @@ greyscale_config_inhand_left = /datum/greyscale_config/sneakers/inhand_left greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right flags_1 = IS_PLAYER_COLORABLE_1 + interaction_flags_mouse_drop = NEED_HANDS /obj/item/clothing/shoes/sneakers/black name = "black shoes" @@ -146,10 +147,9 @@ return FALSE return ..() -/obj/item/clothing/shoes/sneakers/orange/MouseDrop(atom/over) - var/mob/m = usr - if(ishuman(m)) - var/mob/living/carbon/human/c = m +/obj/item/clothing/shoes/sneakers/orange/mouse_drop_dragged(atom/over_object, mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/c = user if(c.shoes == src && attached_cuffs) to_chat(c, span_warning("You need help taking these off!")) return diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm index d340d4d478d30..ca8f6bcafc632 100644 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm @@ -6,8 +6,10 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) icon = 'icons/obj/machines/kitchen.dmi' icon_state = "grinder" layer = BELOW_OBJ_LAYER + interaction_flags_mouse_drop = NEED_DEXTERITY density = TRUE circuit = /obj/item/circuitboard/machine/monkey_recycler + var/stored_matter = 0 var/cube_production = 0.2 var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy() @@ -59,7 +61,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) else return ..() -/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user) +/obj/machinery/monkey_recycler/mouse_drop_receive(mob/living/target, mob/living/user, params) if(!istype(target)) return if(ismonkey(target)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 3d10c3f5c47fd..53fd78cf94d49 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -160,6 +160,7 @@ close_sound = 'sound/machines/trapdoor/trapdoor_shut.ogg' set_dir_on_move = TRUE can_buckle = TRUE + /// Whether we're on a set of rails or just on the ground var/on_rails = FALSE /// How many turfs we are travelling, also functions as speed (more momentum = faster) @@ -295,17 +296,16 @@ update_rail_state(FALSE) return ..() -/obj/structure/closet/crate/miningcar/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - . = ..() - if(!isliving(usr) || !usr.Adjacent(over) || !usr.Adjacent(src)) +/obj/structure/closet/crate/miningcar/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(!isliving(user)) return if(on_rails) if(isopenturf(over)) - try_take_off_rails(usr, over) + try_take_off_rails(user, over) return if(istype(over, /obj/structure/minecart_rail) || (isopenturf(over) && (locate(/obj/structure/minecart_rail) in over))) - try_put_on_rails(usr, get_turf(over)) + try_put_on_rails(user, get_turf(over)) return /** diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 30d273db7daae..4d74e029860a6 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -5,6 +5,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF move_resist = INFINITY + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS throwforce = 0 /mob/dead/Initialize(mapload) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2ef79e5465cbb..f90cda9456388 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -691,15 +691,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp GLOB.manifest.ui_interact(src) //this is called when a ghost is drag clicked to something. -/mob/dead/observer/MouseDrop(atom/over) - if(!usr || !over) - return - if (isobserver(usr) && usr.client.holder && (isliving(over) || iscameramob(over)) ) - if (usr.client.holder.cmd_ghost_drag(src,over)) +/mob/dead/observer/mouse_drop_dragged(atom/over, mob/user) + if (isobserver(user) && user.client.holder && (isliving(over) || iscameramob(over))) + if (user.client.holder.cmd_ghost_drag(src,over)) return - return ..() - /mob/dead/observer/Topic(href, href_list) ..() if(usr == src) diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm index 63c738b965294..4aa4cf72c4e4b 100644 --- a/code/modules/mob/living/basic/slime/slime.dm +++ b/code/modules/mob/living/basic/slime/slime.dm @@ -204,12 +204,11 @@ . += "Growth: [amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" . += "Power Level: [powerlevel]/[SLIME_MAX_POWER]" -/mob/living/basic/slime/MouseDrop(atom/movable/target_atom as mob|obj) - if(isliving(target_atom) && target_atom != src && usr == src) +/mob/living/basic/slime/mouse_drop_dragged(atom/target_atom, mob/user) + if(isliving(target_atom) && target_atom != src && user == src) var/mob/living/food = target_atom if(can_feed_on(food)) start_feeding(food) - return ..() ///Slimes can hop off mobs they have latched onto /mob/living/basic/slime/resist_buckle() diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index d2ee7432b3cc9..c15efb77a4a19 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -8,6 +8,7 @@ melee_damage_lower = 20 //Refers to unarmed damage, aliens do unarmed attacks. melee_damage_upper = 20 max_grab = GRAB_AGGRESSIVE + var/caste = "" var/alt_icon = 'icons/mob/nonhuman-player/alienleap.dmi' //used to switch between the two alien icon files. var/leap_on_click = 0 @@ -91,7 +92,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( if(. <= GRAB_AGGRESSIVE) ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) -/mob/living/carbon/alien/adult/MouseDrop_T(atom/dropping, atom/user) +/mob/living/carbon/alien/adult/mouse_drop_receive(atom/dropping, mob/user, params) if(devour_lad(dropping)) return return ..() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 7b61b4cb8ea85..44b7db6ee0b11 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -121,3 +121,4 @@ var/bodyshape = BODYSHAPE_HUMANOID COOLDOWN_DECLARE(bleeding_message_cd) + diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 40070192b24c7..b5e538461f2da 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1314,6 +1314,21 @@ if(!istype(target)) CRASH("Missing target arg for can_perform_action") + if(!(interaction_flags_atom & INTERACT_ATOM_IGNORE_INCAPACITATED)) + var/ignore_flags = NONE + if(interaction_flags_atom & INTERACT_ATOM_IGNORE_RESTRAINED) + ignore_flags |= IGNORE_RESTRAINTS + if(!(interaction_flags_atom & INTERACT_ATOM_CHECK_GRAB)) + ignore_flags |= IGNORE_GRAB + + if(incapacitated(ignore_flags)) + to_chat(src, span_warning("You are incapacitated at the moment!")) + return FALSE + + if(stat == DEAD || stat != CONSCIOUS) + to_chat(src, span_warning("You are in no physical condition to do this!")) + return FALSE + // If the MOBILITY_UI bitflag is not set it indicates the mob's hands are cutoff, blocked, or handcuffed // Note - AI's and borgs have the MOBILITY_UI bitflag set even though they don't have hands // Also if it is not set, the mob could be incapcitated, knocked out, unconscious, asleep, EMP'd, etc. @@ -1323,11 +1338,14 @@ // NEED_HANDS is already checked by MOBILITY_UI for humans so this is for silicons if((action_bitflags & NEED_HANDS)) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + to_chat(src, span_warning("You can't do that right now!")) + return FALSE if(!can_hold_items(isitem(target) ? target : null)) // almost redundant if it weren't for mobs to_chat(src, span_warning("You don't have the physical ability to do this!")) return FALSE - if(!Adjacent(target) && (target.loc != src) && !recursive_loc_check(src, target)) + if(!(action_bitflags & BYPASS_ADJACENCY) && !Adjacent(target) && (target.loc != src) && !recursive_loc_check(src, target)) if(HAS_SILICON_ACCESS(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) if(!(action_bitflags & SILENT_ADJACENCY)) @@ -1335,7 +1353,8 @@ return FALSE else // just a normal carbon mob if((action_bitflags & FORBID_TELEKINESIS_REACH)) - to_chat(src, span_warning("You are too far away!")) + if(!(action_bitflags & SILENT_ADJACENCY)) + to_chat(src, span_warning("You are too far away!")) return FALSE var/datum/dna/mob_DNA = has_dna() @@ -1812,7 +1831,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) ..() update_z(new_turf?.z) -/mob/living/MouseDrop_T(atom/dropping, atom/user) +/mob/living/mouse_drop_receive(atom/dropping, atom/user, params) var/mob/living/U = user if(isliving(dropping)) var/mob/living/M = dropping diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 9834267047a05..acc49dd572145 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -2,7 +2,6 @@ see_invisible = SEE_INVISIBLE_LIVING hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) pressure_resistance = 10 - hud_type = /datum/hud/living ///Tracks the current size of the mob in relation to its original size. Use update_transform(resize) to change it. diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 71292405faa7d..51b2f3954973d 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -27,7 +27,6 @@ mob_size = MOB_SIZE_LARGE buckle_prevents_pull = TRUE // No pulling loaded shit bot_mode_flags = ~BOT_MODE_ROUNDSTART_POSSESSION - req_one_access = list(ACCESS_ROBOTICS, ACCESS_CARGO) radio_key = /obj/item/encryptionkey/headset_cargo radio_channel = RADIO_CHANNEL_SUPPLY @@ -378,13 +377,8 @@ // mousedrop a crate to load the bot // can load anything if hacked -/mob/living/simple_animal/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) - var/mob/living/L = user - - if (!istype(L)) - return - - if(user.incapacitated() || (istype(L) && L.body_position == LYING_DOWN)) +/mob/living/simple_animal/bot/mulebot/mouse_drop_receive(atom/movable/AM, mob/user, params) + if(!isliving(user)) return if(!istype(AM) || isdead(AM) || iscameramob(AM) || istype(AM, /obj/effect/dummy/phased_mob)) @@ -392,7 +386,6 @@ load(AM) - // called to load a crate /mob/living/simple_animal/bot/mulebot/proc/load(atom/movable/AM) if(load || AM.anchored) @@ -812,8 +805,7 @@ icon_state = "paranormalmulebot0" base_icon = "paranormalmulebot" - -/mob/living/simple_animal/bot/mulebot/paranormal/MouseDrop_T(atom/movable/AM, mob/user) +/mob/living/simple_animal/bot/mulebot/paranormal/mouse_drop_receive(atom/movable/AM, mob/user, params) var/mob/living/L = user if(user.incapacitated() || (istype(L) && L.body_position == LYING_DOWN)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4219e8e3c38d3..ca393cf25666f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -889,20 +889,6 @@ set category = null return -/** - * Controls if a mouse drop succeeds (return null if it doesnt) - */ -/mob/MouseDrop(mob/M) - . = ..() - if(M != usr) - return - if(usr == src) - return - if(!Adjacent(usr)) - return - if(isAI(M)) - return - ///Is the mob muzzled (default false) /mob/proc/is_muzzled() return FALSE @@ -1172,6 +1158,8 @@ * * ALLOW_SILICON_REACH - If silicons are allowed to perform action from a distance (silicons can operate airlocks from far away) * * ALLOW_RESTING - If resting on the floor is allowed to perform action () * * ALLOW_VENTCRAWL - Mobs with ventcrawl traits can alt-click this to vent + * * BYPASS_ADJACENCY - The target does not have to be adjacent + * * SILENT_ADJACENCY - Adjacency is required but errors are not printed * * silence_adjacency: Sometimes we want to use this proc to check interaction without allowing it to throw errors for base case adjacency * Alt click uses this, as otherwise you can detect what is interactable from a distance via the error message diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 2452d404a933b..c386f7f51c634 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -13,6 +13,7 @@ base_icon_state = "control" w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK + interaction_flags_mouse_drop = NEED_HANDS strip_delay = 10 SECONDS armor_type = /datum/armor/none actions_types = list( @@ -228,9 +229,9 @@ playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) return FALSE -/obj/item/mod/control/MouseDrop(atom/over_object) - if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) - return ..() +/obj/item/mod/control/mouse_drop_dragged(atom/over_object, mob/user) + if(user != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) + return for(var/obj/item/part as anything in get_parts()) if(part.loc != src) balloon_alert(wearer, "retract parts first!") @@ -239,8 +240,7 @@ if(!wearer.incapacitated()) var/atom/movable/screen/inventory/hand/ui_hand = over_object if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) - add_fingerprint(usr) - return ..() + add_fingerprint(user) /obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench) if(seconds_electrified && get_charge() && shock(user)) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index a17a9bb8ed054..a490af9be8d4b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -12,6 +12,7 @@ max_integrity = 100 armor_type = /datum/armor/item_modular_computer light_system = OVERLAY_LIGHT_DIRECTIONAL + interaction_flags_mouse_drop = NEED_HANDS | ALLOW_RESTING ///The ID currently stored in the computer. var/obj/item/card/id/computer_id_slot @@ -334,11 +335,9 @@ update_appearance() return TRUE -/obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) - var/mob/M = usr - if((!istype(over_object, /atom/movable/screen)) && usr.can_perform_action(src)) - return attack_self(M) - return ..() +/obj/item/modular_computer/mouse_drop_dragged(atom/over_object, mob/user) + if(!istype(over_object, /atom/movable/screen)) + return attack_self(user) /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 523c241724ed5..5053b6c6b2cbe 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -11,6 +11,8 @@ hardware_flag = PROGRAM_LAPTOP max_idle_programs = 3 w_class = WEIGHT_CLASS_NORMAL + interaction_flags_mouse_drop = NEED_HANDS + // No running around with open laptops in hands. item_flags = SLOWS_WHILE_IN_HAND @@ -58,20 +60,15 @@ try_toggle_open(usr) -/obj/item/modular_computer/laptop/MouseDrop(obj/over_object, src_location, over_location) - . = ..() - if(over_object == usr || over_object == src) - try_toggle_open(usr) +/obj/item/modular_computer/laptop/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) + if(over_object == user || over_object == src) + try_toggle_open(user) return if(istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object - var/mob/M = usr - - if(M.stat != CONSCIOUS || HAS_TRAIT(M, TRAIT_HANDS_BLOCKED)) - return - if(!isturf(loc) || !Adjacent(M)) + if(!isturf(loc)) return - M.put_in_hand(src, H.held_index) + user.put_in_hand(src, H.held_index) /obj/item/modular_computer/laptop/attack_hand(mob/user, list/modifiers) . = ..() diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index e193bbc98b102..c3964b7292c0b 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -9,6 +9,7 @@ anchored = FALSE pass_flags = PASSTABLE // Able to place on tables max_integrity = 5000 // To make attacking it not instantly break it + /// The amount of times this bell has been rang, used to check the chance it breaks var/times_rang = 0 /// Is this bell broken? @@ -110,17 +111,14 @@ desc = "The cornerstone of any customer service job. This one's been modified for hyper-performance." ring_cooldown_length = 0 -/obj/structure/desk_bell/MouseDrop(obj/over_object, src_location, over_location) +/obj/structure/desk_bell/mouse_drop_dragged(atom/over_object, mob/user) if(!istype(over_object, /obj/vehicle/ridden/wheelchair)) return - if(!Adjacent(over_object) || !Adjacent(usr)) - return var/obj/vehicle/ridden/wheelchair/target = over_object if(target.bell_attached) - usr.balloon_alert(usr, "already has a bell!") + user.balloon_alert(user, "already has a bell!") return - usr.balloon_alert(usr, "attaching bell...") - if(!do_after(usr, 0.5 SECONDS)) + user.balloon_alert(user, "attaching bell...") + if(!do_after(user, 0.5 SECONDS)) return target.attach_bell(src) - return ..() diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 8e4fedf2fdad6..1315ca3a81d23 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -177,12 +177,7 @@ new /obj/item/paper/paperslip(get_turf(src)) update_appearance() -/obj/item/papercutter/MouseDrop(atom/over_object) - . = ..() - var/mob/user = usr - if(user.incapacitated() || !Adjacent(user)) - return - +/obj/item/papercutter/mouse_drop_dragged(atom/over_object, mob/user) if(over_object == user) user.put_in_hands(src) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0712e516de451..b7796ad070a87 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -66,6 +66,8 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) power_channel = AREA_USAGE_EQUIP max_integrity = 300 integrity_failure = 0.33 + interaction_flags_mouse_drop = NEED_DEXTERITY | ALLOW_RESTING + /// A reference to a mob on top of the photocopier trying to copy their ass. Null if there is no mob. var/mob/living/ass /// A reference to the toner cartridge that's inserted into the copier. Null if there is no cartridge. @@ -87,6 +89,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) /// A stack for all the empty paper we have newly inserted (LIFO) var/list/paper_stack = list() + /obj/machinery/photocopier/Initialize(mapload) . = ..() toner_cartridge = new(src) @@ -586,8 +589,8 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) new /obj/effect/decal/cleanable/oil(get_turf(src)) toner_cartridge.charges = 0 -/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) - if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.can_perform_action(src, action_bitflags = ALLOW_RESTING) || target == ass || copier_blocked()) +/obj/machinery/photocopier/mouse_drop_receive(mob/target, mob/user, params) + if(!istype(target) || target.anchored || target.buckled || target == ass || copier_blocked()) return add_fingerprint(user) if(target == user) @@ -626,7 +629,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) return TRUE /** - * Checks if the copier is deleted, or has something dense at its location. Called in `MouseDrop_T()` + * Checks if the copier is deleted, or has something dense at its location. Called in `mouse_drop_receive()` */ /obj/machinery/photocopier/proc/copier_blocked() if(QDELETED(src)) diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 87a46107a4bdd..de4a900579219 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -295,7 +295,7 @@ All the important duct code: disconnect_duct() return ..() -/obj/machinery/duct/MouseDrop_T(atom/drag_source, mob/living/user) +/obj/machinery/duct/mouse_drop_receive(atom/drag_source, mob/living/user, params) if(!istype(drag_source, /obj/machinery/duct)) return var/obj/machinery/duct/other = drag_source diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index a27ee66a1ff5e..0f5e7d3deac58 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -11,6 +11,7 @@ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE + var/obj/item/gun/energy/minigun/gun var/obj/item/stock_parts/cell/minigun/battery var/armed = FALSE //whether the gun is attached, FALSE is attached, TRUE is the gun is wielded. @@ -63,22 +64,14 @@ if(armed) user.dropItemToGround(gun, TRUE) -/obj/item/minigunpack/MouseDrop(atom/over_object) - . = ..() +/obj/item/minigunpack/mouse_drop_dragged(atom/over_object, mob/user) if(armed) return - if(iscarbon(usr)) - var/mob/M = usr - - if(!over_object) - return - - if(!M.incapacitated()) - - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) + if(iscarbon(user)) + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object + user.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/minigunpack/update_icon_state() icon_state = armed ? "notholstered" : "holstered" diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 6517cbc433909..d307f96dc264c 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -14,6 +14,8 @@ item_flags = NOBLUDGEON resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY + interaction_flags_mouse_drop = NEED_HANDS + ///How many pages the booklet holds var/number_of_pages = 50 @@ -41,11 +43,8 @@ user.put_in_active_hand(src) return ..() -/obj/item/ph_booklet/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - var/mob/living/user = usr - if(!isliving(user) || !Adjacent(user)) - return - if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) +/obj/item/ph_booklet/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(!isliving(user)) return if(!number_of_pages) to_chat(user, span_warning("[src] is empty!")) diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 25a7eecbd374f..5396839e13dcd 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -10,6 +10,7 @@ custom_price = PAYCHECK_CREW * 10 custom_premium_price = PAYCHECK_CREW * 14 interaction_flags_click = FORBID_TELEKINESIS_REACH + interaction_flags_mouse_drop = FORBID_TELEKINESIS_REACH ///Creating an empty slot for a beaker that can be added to dispense into var/obj/item/reagent_containers/beaker @@ -243,11 +244,10 @@ update_appearance() return TRUE -/obj/item/storage/portable_chem_mixer/MouseDrop(obj/over_object) - . = ..() +/obj/item/storage/portable_chem_mixer/mouse_drop_dragged(atom/over_object) if(ismob(loc)) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + if(istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 2771bc1adb25d..4b54cf9f4b023 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -164,7 +164,7 @@ user.visible_message(span_notice("[user.name] places \the [I] into \the [src]."), span_notice("You place \the [I] into \the [src].")) /// Mouse drop another mob or self -/obj/machinery/disposal/MouseDrop_T(mob/living/target, mob/living/user) +/obj/machinery/disposal/mouse_drop_receive(mob/living/target, mob/living/user, params) if(istype(target)) stuff_mob_in(target, user) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 16ccedaf778b8..04c777bb1c073 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -3,6 +3,7 @@ desc = "Makes researched and prototype items with materials and energy." /// Energy cost per full stack of materials spent. Material insertion is 40% of this. active_power_usage = 0.05 * STANDARD_CELL_RATE + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS /// The efficiency coefficient. Material costs and print times are multiplied by this number; var/efficiency_coeff = 1 @@ -438,18 +439,17 @@ SStgui.update_uis(src) icon_state = initial(icon_state) -/obj/machinery/rnd/production/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - . = ..() - if(!can_interact(usr) || (!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) +/obj/machinery/rnd/production/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(!can_interact(user) || (!HAS_SILICON_ACCESS(user) && !isAdminGhostAI(user)) && !Adjacent(user)) return if(busy) - balloon_alert(usr, "busy printing!") + balloon_alert(user, "busy printing!") return var/direction = get_dir(src, over_location) if(!direction) return drop_direction = direction - balloon_alert(usr, "dropping [dir2text(drop_direction)]") + balloon_alert(user, "dropping [dir2text(drop_direction)]") /obj/machinery/rnd/production/click_alt(mob/user) if(drop_direction == 0) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 4fb51d223bd66..c174856a62a31 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -16,6 +16,7 @@ Slimecrossing Armor armor_type = /datum/armor/mask_nobreath flags_cover = MASKCOVERSMOUTH resistance_flags = NONE + interaction_flags_mouse_drop = NEED_HANDS /datum/armor/mask_nobreath bio = 50 @@ -125,8 +126,8 @@ Slimecrossing Armor return return ..() -/obj/item/clothing/head/peaceflower/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - if(at_peace_check(usr)) +/obj/item/clothing/head/peaceflower/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + if(at_peace_check(user)) return return ..() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index fad856df2b51c..6740424cf801a 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -805,10 +805,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/pod, 32) atom_storage?.show_contents(user) return TRUE -/obj/item/storage/pod/MouseDrop(over_object, src_location, over_location) - if(can_interact(usr)) - return ..() - /obj/item/storage/pod/attack_hand_secondary(mob/user, list/modifiers) if(!can_interact(user)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 46a9c6f7f56ca..19bf0f20eb23a 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -1,6 +1,7 @@ /obj/vehicle/sealed/car layer = ABOVE_MOB_LAYER move_resist = MOVE_FORCE_VERY_STRONG + ///Bitflags for special behavior such as kidnapping var/car_traits = NONE ///Sound file(s) to play when we drive around @@ -21,9 +22,9 @@ if(car_traits & CAN_KIDNAP) initialize_controller_action_type(/datum/action/vehicle/sealed/dump_kidnapped_mobs, VEHICLE_CONTROL_DRIVE) -/obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/M) - if(M.incapacitated() || (HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && !is_driver(M))) - return FALSE +/obj/vehicle/sealed/car/mouse_drop_receive(atom/dropping, mob/M, params) + if(HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && !is_driver(M)) + return if((car_traits & CAN_KIDNAP) && isliving(dropping) && M != dropping) var/mob/living/kidnapped = dropping kidnapped.visible_message(span_warning("[M] starts forcing [kidnapped] into [src]!")) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 0cfde3de8adf9..0b842b8ed9cbe 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -161,9 +161,8 @@ victim.visible_message(span_danger("[victim] straight up gets grinded into the ground by [skater]'s [src]! Radical!")) addtimer(CALLBACK(src, PROC_REF(grind)), 0.1 SECONDS) -/obj/vehicle/ridden/scooter/skateboard/MouseDrop(atom/over_object) - . = ..() - var/mob/living/carbon/skater = usr +/obj/vehicle/ridden/scooter/skateboard/mouse_drop_dragged(atom/over_object, mob/user) + var/mob/living/carbon/skater = user if(!istype(skater)) return if (over_object == skater) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 0ecc492f6d598..821a69d8f8269 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,5 +1,7 @@ /obj/vehicle/sealed flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + interaction_flags_mouse_drop = NEED_HANDS + var/enter_delay = 2 SECONDS var/mouse_pointer var/headlights_toggle = FALSE @@ -20,7 +22,7 @@ if(istype(E)) E.vehicle_entered_target = src -/obj/vehicle/sealed/MouseDrop_T(atom/dropping, mob/M) +/obj/vehicle/sealed/mouse_drop_receive(atom/dropping, mob/M, params) if(!istype(dropping) || !istype(M)) return ..() if(M == dropping) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 92386b0fbc3c8..b94257bb45f2b 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -6,7 +6,9 @@ layer = OBJ_LAYER max_integrity = 100 armor_type = /datum/armor/ridden_wheelchair - density = FALSE //Thought I couldn't fix this one easily, phew + density = FALSE + interaction_flags_mouse_drop = ALLOW_RESTING + /// Run speed delay is multiplied with this for vehicle move delay. var/delay_multiplier = 6.7 /// This variable is used to specify which overlay icon is used for the wheelchair, ensures wheelchair can cover your legs @@ -122,17 +124,14 @@ fire = 30 acid = 40 -/obj/vehicle/ridden/wheelchair/MouseDrop(over_object, src_location, over_location) //Lets you collapse wheelchair - . = ..() - if(over_object != usr || !Adjacent(usr) || !foldabletype) - return FALSE - if(!ishuman(usr) || !usr.can_perform_action(src, ALLOW_RESTING)) +/obj/vehicle/ridden/wheelchair/mouse_drop_dragged(atom/over_object, mob/user) //Lets you collapse wheelchair + if(over_object != user || !foldabletype || !ishuman(user)) return FALSE if(has_buckled_mobs()) return FALSE - usr.visible_message(span_notice("[usr] collapses [src]."), span_notice("You collapse [src].")) + user.visible_message(span_notice("[user] collapses [src]."), span_notice("You collapse [src].")) var/obj/vehicle/ridden/wheelchair/wheelchair_folded = new foldabletype(get_turf(src)) - usr.put_in_hands(wheelchair_folded) + user.put_in_hands(wheelchair_folded) qdel(src) /obj/item/wheelchair/attack_self(mob/user) //Deploys wheelchair on in-hand use From 4d4a886e9cb209ed066c220aa21548bcb5097141 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:29:22 +1200 Subject: [PATCH 034/120] Automatic changelog for PR #83690 [ci skip] --- html/changelogs/AutoChangeLog-pr-83690.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83690.yml diff --git a/html/changelogs/AutoChangeLog-pr-83690.yml b/html/changelogs/AutoChangeLog-pr-83690.yml new file mode 100644 index 0000000000000..469f74740c999 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83690.yml @@ -0,0 +1,5 @@ +author: "SyncIt21" +delete-after: True +changes: + - refactor: "Mouse drag & drop attack chain has been refactored. Report any bugs on GitHub" + - bugfix: "You cannot close the cryo tube on yourself with Alt click like before" \ No newline at end of file From 47be0bffc2e374e7a638f30fd781f36eab64ffb5 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:59:45 +0530 Subject: [PATCH 035/120] Ctrl click refactor (#83784) ## About The Pull Request Same idea as #82656 but for ctrl click & ctrl shift click cause why not - Does your signal & `can_perform_action()` checks using `interaction_flags_click` flags before delegating the event down to `ctrl_click()` proc. - The one new change now is that `ctrl_click()` proc is now blocking, meaning returning `CLICK_ACTION_SUCCESS` or `CLICK_ACTION_BLOCKING` will stop the object from getting grabbed/pulled. So remember to return these values if you want to stop the grab action or return `NONE` if you want to process the click but still want the object to get grabbed as well ## Changelog :cl: refactor: Ctrl click & Ctrl shift click has been refactored. Please report bugs on GitHub /:cl: --- .../signals/signals_mob/signals_mob_main.dm | 4 +- .../dcs/signals/signals_xeno_control.dm | 6 - code/_onclick/click.dm | 52 -------- code/_onclick/click_ctrl.dm | 122 ++++++++++++++++++ code/_onclick/cyborg.dm | 6 +- code/datums/components/food_storage.dm | 6 +- code/game/atom/_atom.dm | 2 +- code/game/objects/items.dm | 12 ++ .../objects/items/devices/pressureplates.dm | 7 +- code/game/objects/items/his_grace.dm | 5 +- code/game/objects/items/inspector.dm | 8 +- code/game/objects/items/storage/bags.dm | 5 +- .../antagonists/heretic/items/keyring.dm | 6 +- .../components/binary_devices/passive_gate.dm | 7 +- .../binary_devices/pressure_valve.dm | 7 +- .../components/binary_devices/pump.dm | 7 +- .../binary_devices/temperature_gate.dm | 7 +- .../binary_devices/temperature_pump.dm | 7 +- .../components/binary_devices/volume_pump.dm | 5 +- .../gas_recipe_machines/crystallizer.dm | 10 +- .../components/trinary_devices/filter.dm | 7 +- .../components/trinary_devices/mixer.dm | 7 +- .../unary_devices/bluespace_sender.dm | 10 +- .../components/unary_devices/cryo.dm | 7 +- .../unary_devices/outlet_injector.dm | 7 +- .../components/unary_devices/thermomachine.dm | 11 +- code/modules/basketball/hoop.dm | 12 +- code/modules/cargo/universal_scanner.dm | 5 +- code/modules/clothing/shoes/clown.dm | 7 +- .../clothing/spacesuits/_spacesuits.dm | 13 +- code/modules/clothing/under/_under.dm | 8 +- .../food_and_drinks/machinery/microwave.dm | 11 +- code/modules/hydroponics/hydroponics.dm | 16 +-- code/modules/mob/dead/observer/observer.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 3 +- .../computers/item/computer.dm | 5 +- .../modular_computers/computers/item/pda.dm | 7 +- code/modules/power/cable.dm | 3 +- .../machinery/portable_chem_mixer.dm | 3 +- .../reagents/reagent_containers/misc.dm | 3 +- code/modules/recycling/sortingmachinery.dm | 4 +- .../research/xenobiology/xenobio_camera.dm | 67 +++++----- code/modules/transport/tram/tram_remote.dm | 3 +- tgstation.dme | 1 + 44 files changed, 299 insertions(+), 216 deletions(-) create mode 100644 code/_onclick/click_ctrl.dm diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 1735619967154..8ada1c30be3c3 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -185,8 +185,10 @@ #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" ///from base of mob/ranged_secondary_attack(): (atom/target, modifiers) #define COMSIG_MOB_ATTACK_RANGED_SECONDARY "mob_attack_ranged_secondary" -///From base of atom/ctrl_click(): (atom/A) +///From base of /mob/base_click_ctrl: (atom/A) #define COMSIG_MOB_CTRL_CLICKED "mob_ctrl_clicked" +///From base of /mob/base_click_ctrl_shift: (atom/A) +#define COMSIG_MOB_CTRL_SHIFT_CLICKED "mob_ctrl_shift_clicked" ///From base of mob/update_movespeed():area #define COMSIG_MOB_MOVESPEED_UPDATED "mob_update_movespeed" /// From /atom/movable/screen/zone_sel/proc/set_selected_zone. diff --git a/code/__DEFINES/dcs/signals/signals_xeno_control.dm b/code/__DEFINES/dcs/signals/signals_xeno_control.dm index 595f44f4f9174..c67756a64f385 100644 --- a/code/__DEFINES/dcs/signals/signals_xeno_control.dm +++ b/code/__DEFINES/dcs/signals/signals_xeno_control.dm @@ -1,14 +1,8 @@ //Xenobio hotkeys -///from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" ///from slime AltClickOn(): (/mob) #define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" ///from slime ShiftClickOn(): (/mob) #define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" ///from turf ShiftClickOn(): (/mob) #define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" -///from turf AltClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" -///from monkey CtrlClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0caa2fff50f53..4dde5a7f04aeb 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -341,65 +341,13 @@ if(user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) -/** - * Ctrl click - * For most objects, pull - */ -/mob/proc/CtrlClickOn(atom/A) - A.CtrlClick(src) - return - -/atom/proc/CtrlClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user) - SEND_SIGNAL(user, COMSIG_MOB_CTRL_CLICKED, src) - - var/mob/living/ML = user - if(istype(ML)) - ML.pulled(src) - if(!can_interact(user)) - return FALSE - -/mob/living/CtrlClick(mob/living/user) - if(!isliving(user) || !user.CanReach(src) || user.incapacitated()) - return ..() - - if(world.time < user.next_move) - return FALSE - - if(user.grab(src)) - user.changeNext_move(CLICK_CD_MELEE) - return TRUE - - return ..() - -/mob/proc/CtrlMiddleClickOn(atom/A) - if(check_rights_for(client, R_ADMIN)) - client.toggle_tag_datum(A) - else - A.CtrlClick(src) - return - /mob/proc/TurfAdjacent(turf/tile) return tile.Adjacent(src) -/** - * Control+Shift click - * Unused except for AI - */ -/mob/proc/CtrlShiftClickOn(atom/A) - A.CtrlShiftClick(src) - return - /mob/proc/ShiftMiddleClickOn(atom/A) src.pointed(A) return -/atom/proc/CtrlShiftClick(mob/user) - if(!can_interact(user)) - return FALSE - SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user) - return - /* Misc helpers face_atom: turns the mob towards what you clicked on diff --git a/code/_onclick/click_ctrl.dm b/code/_onclick/click_ctrl.dm new file mode 100644 index 0000000000000..bb0491b2bb923 --- /dev/null +++ b/code/_onclick/click_ctrl.dm @@ -0,0 +1,122 @@ +/** + * Ctrl click + */ +/mob/proc/CtrlClickOn(atom/A) + base_click_ctrl(A) + +/** + * ### Base proc for ctrl click interaction left click. + * + * If you wish to add custom `click_ctrl` behavior for a single type, use that proc. + */ +/mob/proc/base_click_ctrl(atom/target) + SHOULD_NOT_OVERRIDE(TRUE) + + // Check if they've hooked in to prevent src from ctrl clicking anything + if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON) + return TRUE + + // If it has a signal handler that returns a click action, done. + if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL, src) & CLICK_ACTION_ANY) + return TRUE + + var/can_use_click_action = FALSE + if(isturf(target)) + // Turfs are special because they can't be used with can_perform_action + can_use_click_action = can_perform_turf_action(target) + else + can_use_click_action = can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY) + if(!can_use_click_action) + return TRUE + + // If it has a custom click_alt that returns success/block, done. + return target.click_ctrl(src) & CLICK_ACTION_ANY + +/** + * Ctrl click + * For most objects, pull + */ +/mob/living/base_click_ctrl(atom/target) + SHOULD_NOT_OVERRIDE(TRUE) + + . = ..() + if(. || world.time < next_move || !CanReach(target)) + return + + . = TRUE + if(grab(target)) + changeNext_move(CLICK_CD_MELEE) + return + pulled(target) + +/** + * Ctrl mouse wheel click + * Except for tagging datumns same as control click + */ +/mob/proc/CtrlMiddleClickOn(atom/A) + if(check_rights_for(client, R_ADMIN)) + client.toggle_tag_datum(A) + return + CtrlClickOn(A) + +/** + * ## Custom ctrl click interaction + * Override this to change default ctrl click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`. + * + * ### Guard clauses + * Consider adding `interaction_flags_click` before adding unique guard clauses. + * + * ### Return flags + * Forgetting your return will cause the default ctrl click behavior to occur thereafter. + * + * Returning any value besides NONE will stop the attack chain and thus stop the object from getting pulled/grabbed + **/ +/atom/proc/click_ctrl(mob/user) + SHOULD_CALL_PARENT(FALSE) + return NONE + + +/** + * Control+Shift click + * Unused except for AI + */ +/mob/proc/CtrlShiftClickOn(atom/A) + base_click_ctrl_shift(A) + +/** + * ### Base proc for ctrl shift click interaction left click. + * + * If you wish to add custom `click_ctrl_shift` behavior for a single type, use that proc. + */ +/mob/proc/base_click_ctrl_shift(atom/target) + SHOULD_NOT_OVERRIDE(TRUE) + + // Check if they've hooked in to prevent src from ctrl clicking anything + if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_SHIFT_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON) + return + + // If it has a signal handler that returns a click action, done. + if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL_SHIFT, src) & CLICK_ACTION_ANY) + return + + var/can_use_click_action = FALSE + if(isturf(target)) + // Turfs are special because they can't be used with can_perform_action + can_use_click_action = can_perform_turf_action(target) + else + can_use_click_action = can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY) + if(!can_use_click_action) + return + + // Proceed with ctrl shift click + target.click_ctrl_shift(src) + +/** + * ## Custom ctrl shift click interaction + * + * ### Guard clauses + * Consider adding `interaction_flags_click` before adding unique guard clauses. + **/ +/atom/proc/click_ctrl_shift(mob/user) + SHOULD_CALL_PARENT(FALSE) + return NONE diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 026376a9af562..4e9777ae9cd8d 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -97,9 +97,8 @@ /mob/living/silicon/robot/CtrlClickOn(atom/target) target.BorgCtrlClick(src) - /atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden - CtrlShiftClick(user) + user.base_click_ctrl_shift(src) /obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code. if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) @@ -116,9 +115,8 @@ else ..() - /atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overridden - CtrlClick(user) + user.base_click_ctrl(src) /obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm index cb1008f88f0c8..873c1646adbe1 100644 --- a/code/datums/components/food_storage.dm +++ b/code/datums/components/food_storage.dm @@ -90,16 +90,16 @@ var/atom/food = parent if(QDELETED(stored_item)) - return + return CLICK_ACTION_BLOCKING if(!food.can_interact(user)) - return + return CLICK_ACTION_BLOCKING user.visible_message(span_notice("[user.name] begins tearing at \the [parent]."), \ span_notice("You start to rip into \the [parent].")) INVOKE_ASYNC(src, PROC_REF(begin_remove_item), user) - return COMPONENT_CANCEL_ATTACK_CHAIN + return CLICK_ACTION_SUCCESS /** Inserts the item into the food, after a do_after. * diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index ab4da3f2f7704..9eaec1b48378e 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -136,7 +136,7 @@ ///whether ghosts can see screentips on it var/ghost_screentips = FALSE - /// Flags to check for in can_perform_action. Used in alt-click checks + /// Flags to check for in can_perform_action. Used in alt-click & ctrl-click checks var/interaction_flags_click = NONE /// Flags to check for in can_perform_action for mouse drag & drop checks. To bypass checks see interaction_flags_atom mouse drop flags var/interaction_flags_mouse_drop = NONE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1e5d8ab4a6694..79dd9d7e6ed05 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -296,6 +296,18 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" return CONTEXTUAL_SCREENTIP_SET +/obj/item/click_ctrl(mob/user) + SHOULD_NOT_OVERRIDE(TRUE) + + //If the item is on the ground & not anchored we allow the player to drag it + . = item_ctrl_click(user) + if(. & CLICK_ACTION_ANY) + return (isturf(loc) && !anchored) ? NONE : . //allow the object to get dragged on the floor + +/// Subtypes only override this proc for ctrl click purposes. obeys same principles as ctrl_click() +/obj/item/proc/item_ctrl_click(mob/user) + SHOULD_CALL_PARENT(FALSE) + return NONE /// Called when an action associated with our item is deleted /obj/item/proc/on_action_deleted(datum/source) diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 1b6a5ee6db7b8..18bb026745ac0 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -75,15 +75,16 @@ sigdev = null return ..() -/obj/item/pressure_plate/CtrlClick(mob/user) +/obj/item/pressure_plate/item_ctrl_click(mob/user) if(protected) to_chat(user, span_warning("You can't quite seem to turn this pressure plate off...")) - return + return CLICK_ACTION_BLOCKING active = !active - if (active == TRUE) + if (active) to_chat(user, span_notice("You turn [src] on.")) else to_chat(user, span_notice("You turn [src] off.")) + return CLICK_ACTION_SUCCESS ///Called from COMSIG_OBJ_HIDE to toggle the active part, because yeah im not making a special exception on the element to support it /obj/item/pressure_plate/proc/ToggleActive(datum/source, underfloor_accessibility) diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 83af88f003bf1..d1e128c0b5b10 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -65,8 +65,9 @@ else ..() -/obj/item/his_grace/CtrlClick(mob/user) //you can't pull his grace - return +/obj/item/his_grace/item_ctrl_click(mob/user) + //you can't pull his grace + return NONE /obj/item/his_grace/examine(mob/user) . = ..() diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index ab5db9b65ce9c..fec567071fca8 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -17,6 +17,7 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_TINY + interaction_flags_click = NEED_DEXTERITY throw_range = 1 throw_speed = 1 ///How long it takes to print on time each mode, ordered NORMAL, FAST, HONK @@ -71,14 +72,15 @@ return return ..() -/obj/item/inspector/CtrlClick(mob/living/user) - if(!user.can_perform_action(src, NEED_DEXTERITY) || !cell_cover_open || !cell) - return ..() +/obj/item/inspector/item_ctrl_click(mob/user) + if(!cell_cover_open || !cell) + return CLICK_ACTION_BLOCKING user.visible_message(span_notice("[user] removes \the [cell] from [src]!"), \ span_notice("You remove [cell].")) cell.add_fingerprint(user) user.put_in_hands(cell) cell = null + return CLICK_ACTION_SUCCESS /obj/item/inspector/examine(mob/user) . = ..() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index d7164988ddb68..e363687618988 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -273,11 +273,10 @@ . = ..() . += span_notice("Ctrl-click to activate seed extraction.") -/obj/item/storage/bag/plants/portaseeder/CtrlClick(mob/user) - if(user.incapacitated()) - return +/obj/item/storage/bag/plants/portaseeder/item_ctrl_click(mob/user) for(var/obj/item/plant in contents) seedify(plant, 1) + return CLICK_ACTION_SUCCESS // ----------------------------- // Sheet Snatcher diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm index e1768b0fed390..dc1291bc03437 100644 --- a/code/modules/antagonists/heretic/items/keyring.dm +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -118,12 +118,12 @@ var/obj/item/card/id/card = fused_ids[cardname] shapeshift(card) -/obj/item/card/id/advanced/heretic/CtrlClick(mob/user) - . = ..() +/obj/item/card/id/advanced/heretic/item_ctrl_click(mob/user) if(!IS_HERETIC(user)) - return + return CLICK_ACTION_BLOCKING inverted = !inverted balloon_alert(user, "[inverted ? "now" : "no longer"] creating inverted rifts") + return CLICK_ACTION_SUCCESS ///Changes our appearance to the passed ID card /obj/item/card/id/advanced/heretic/proc/shapeshift(obj/item/card/id/advanced/card) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index fe6f9423b433d..572e910d3fe08 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -30,13 +30,14 @@ Passive gate is similar to the regular pump except: context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize target pressure" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/passive_gate/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/binary/passive_gate/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/passive_gate/click_alt(mob/user) if(target_pressure == MAX_OUTPUT_PRESSURE) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index c331332213517..399feff12146f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -22,13 +22,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize target pressure" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/pressure_valve/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/binary/pressure_valve/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/pressure_valve/click_alt(mob/user) if(target_pressure == MAX_OUTPUT_PRESSURE) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 035f3a0f99603..63ba340f27ff4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -35,13 +35,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize target pressure" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/binary/pump/click_ctrl(mob/user) + if(is_operational) set_on(!on) balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/pump/click_alt(mob/user) if(target_pressure == MAX_OUTPUT_PRESSURE) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm index d1202dbec942b..b5a3740245a31 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -27,13 +27,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize target temperature" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/temperature_gate/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/binary/temperature_gate/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/temperature_gate/click_alt(mob/user) if(target_temperature == max_temperature) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 2615b964ed802..3976e8db750c1 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -22,13 +22,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize transfer rate" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/temperature_pump/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/binary/temperature_pump/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/temperature_pump/click_alt(mob/user) if(heat_transfer_rate == max_heat_transfer_rate) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 41dc549b85833..ae8965ae0561e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -33,13 +33,14 @@ )) register_context() -/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/volume_pump/click_ctrl(mob/user) if(can_interact(user)) set_on(!on) balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/binary/volume_pump/click_alt(mob/user) if(transfer_rate == MAX_TRANSFER_RATE) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 989156867491f..f0482c210a66a 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -88,17 +88,17 @@ else icon_state = "[base_icon_state]-off" -/obj/machinery/atmospherics/components/binary/crystallizer/CtrlClick(mob/living/user) - if(!can_interact(user)) - return +/obj/machinery/atmospherics/components/binary/crystallizer/click_ctrl(mob/user) + if(!is_operational) + return CLICK_ACTION_BLOCKING if(panel_open) balloon_alert(user, "close panel!") - return + return CLICK_ACTION_BLOCKING on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_icon() - return ..() + return CLICK_ACTION_SUCCESS ///Checks if the reaction temperature is inside the range of temperature + a little deviation /obj/machinery/atmospherics/components/binary/crystallizer/proc/check_temp_requirements() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index c6b4bd43be473..25217de538ce1 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -24,13 +24,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize transfer rate" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/trinary/filter/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/trinary/filter/click_alt(mob/user) if(transfer_rate == MAX_TRANSFER_RATE) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index f832adcb4ea2e..12a3c7971601b 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -27,13 +27,14 @@ context[SCREENTIP_CONTEXT_ALT_LMB] = "Maximize target pressure" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/trinary/mixer/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/trinary/mixer/click_alt(mob/user) if(target_pressure == MAX_OUTPUT_PRESSURE) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 7d2efbd932103..6957389c351b7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -149,16 +149,14 @@ GLOBAL_LIST_EMPTY_TYPED(bluespace_senders, /obj/machinery/atmospherics/component update_appearance() return TRUE -/obj/machinery/atmospherics/components/unary/bluespace_sender/CtrlClick(mob/living/user) - if(!panel_open) - if(!can_interact(user)) - return +/obj/machinery/atmospherics/components/unary/bluespace_sender/click_ctrl(mob/user) + if(!panel_open && is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return - . = ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/atmospherics/components/unary/bluespace_sender/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index d81cd2bc5377f..1435816499f87 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -635,11 +635,12 @@ return FALSE return ..() -/obj/machinery/cryo_cell/CtrlClick(mob/user) - if(can_interact(user) && !state_open) +/obj/machinery/cryo_cell/click_ctrl(mob/user) + if(is_operational && !state_open) set_on(!on) balloon_alert(user, "turned [on ? "on" : "off"]") - return ..() + return CLICK_ACTION_SUCCESS + return CLICK_ACTION_BLOCKING /obj/machinery/cryo_cell/click_alt(mob/user) //Required so players don't close the cryo on themselves without a doctor's help diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 771301b60e438..3f87ca671fdc9 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -54,13 +54,14 @@ multi_tool.set_buffer(src) return ITEM_INTERACT_SUCCESS -/obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user) - if(can_interact(user)) +/obj/machinery/atmospherics/components/unary/outlet_injector/click_ctrl(mob/user) + if(is_operational) on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() - return ..() + return CLICK_ACTION_BLOCKING + return CLICK_ACTION_SUCCESS /obj/machinery/atmospherics/components/unary/outlet_injector/click_alt(mob/user) if(volume_rate == MAX_TRANSFER_RATE) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 01def672bf7aa..2fe1a8e430fa1 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -313,19 +313,20 @@ update_appearance() -/obj/machinery/atmospherics/components/unary/thermomachine/CtrlClick(mob/living/user) +/obj/machinery/atmospherics/components/unary/thermomachine/click_ctrl(mob/user) if(!anchored) - return ..() + return NONE if(panel_open) balloon_alert(user, "close panel!") - return - if(!can_interact(user)) - return + return CLICK_ACTION_BLOCKING + if(!is_operational) + return CLICK_ACTION_BLOCKING on = !on balloon_alert(user, "turned [on ? "on" : "off"]") investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) update_appearance() + return CLICK_ACTION_SUCCESS /obj/machinery/atmospherics/components/unary/thermomachine/update_layer() return diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index b26fa462b0999..72669df017d90 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -17,6 +17,7 @@ anchored = TRUE density = TRUE layer = ABOVE_MOB_LAYER + interaction_flags_click = NEED_DEXTERITY | NEED_HANDS | FORBID_TELEKINESIS_REACH /// Keeps track of the total points scored var/total_score = 0 /// The chance to score a ball into the hoop based on distance @@ -133,16 +134,13 @@ baller.adjustStaminaLoss(STAMINA_COST_DUNKING_MOB) baller.stop_pulling() -/obj/structure/hoop/CtrlClick(mob/living/user) - if(!user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH|NEED_HANDS)) - return - +/obj/structure/hoop/click_ctrl(mob/user) user.balloon_alert_to_viewers("resetting score...") playsound(src, 'sound/machines/locktoggle.ogg', 50, TRUE) if(do_after(user, 5 SECONDS, target = src)) total_score = 0 update_appearance() - return ..() + return CLICK_ACTION_SUCCESS /obj/structure/hoop/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(!isitem(AM)) @@ -182,8 +180,8 @@ return NONE // No resetting the score for minigame hoops -/obj/structure/hoop/minigame/CtrlClick(mob/living/user) - return +/obj/structure/hoop/minigame/click_ctrl(mob/user) + return CLICK_ACTION_BLOCKING /obj/structure/hoop/minigame/score(obj/item/toy/basketball/ball, mob/living/baller, points) var/is_team_hoop = !(baller.ckey in team_ckeys) diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 434162a36d953..fdcbc9ba2bb9b 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -122,11 +122,12 @@ new_custom_price = chosen_price to_chat(user, span_notice("[src] will now give things a [new_custom_price] cr tag.")) -/obj/item/universal_scanner/CtrlClick(mob/user) - . = ..() +/obj/item/universal_scanner/item_ctrl_click(mob/user) + . = CLICK_ACTION_BLOCKING if(scanning_mode == SCAN_SALES_TAG) payments_acc = null to_chat(user, span_notice("You clear the registered account.")) + return CLICK_ACTION_SUCCESS /obj/item/universal_scanner/click_alt(mob/user) if(!scanning_mode == SCAN_SALES_TAG) diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index 76395a56efd5e..699d6fa627bf5 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -30,18 +30,19 @@ if(is_clown_job(user.mind?.assigned_role)) user.clear_mood_event("clownshoes") -/obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user) +/obj/item/clothing/shoes/clown_shoes/item_ctrl_click(mob/user) if(!isliving(user)) - return + return CLICK_ACTION_BLOCKING if(user.get_active_held_item() != src) to_chat(user, span_warning("You must hold the [src] in your hand to do this!")) - return + return CLICK_ACTION_BLOCKING if (!enabled_waddle) to_chat(user, span_notice("You switch off the waddle dampeners!")) enabled_waddle = TRUE else to_chat(user, span_notice("You switch on the waddle dampeners!")) enabled_waddle = FALSE + return CLICK_ACTION_SUCCESS /obj/item/clothing/shoes/clown_shoes/jester name = "jester shoes" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index bb8ee57b15cf4..a30156abe1f43 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -13,7 +13,7 @@ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS armor_type = /datum/armor/helmet_space flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - + interaction_flags_click = NEED_DEXTERITY cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -201,12 +201,11 @@ return CLICK_ACTION_SUCCESS /// Remove the cell whent he cover is open on CTRL+Click -/obj/item/clothing/suit/space/CtrlClick(mob/living/user) - if(user.can_perform_action(src, NEED_DEXTERITY)) - if(cell_cover_open && cell) - remove_cell(user) - return - return ..() +/obj/item/clothing/suit/space/item_ctrl_click(mob/user) + . = CLICK_ACTION_BLOCKING + if(cell_cover_open && cell) + remove_cell(user) + return CLICK_ACTION_SUCCESS // Remove the cell when using the suit on its self /obj/item/clothing/suit/space/attack_self(mob/user) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 40f8068aef56d..2168177abcba1 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -339,15 +339,13 @@ if(H.w_uniform == src) H.update_suit_sensors() -/obj/item/clothing/under/CtrlClick(mob/user) - . = ..() - if(.) - return +/obj/item/clothing/under/item_ctrl_click(mob/user) if(!can_toggle_sensors(user)) - return + return CLICK_ACTION_BLOCKING sensor_mode = SENSOR_COORDS balloon_alert(user, "set to tracking") + return CLICK_ACTION_SUCCESS /// Checks if the toggler is allowed to toggle suit sensors currently /obj/item/clothing/under/proc/can_toggle_sensors(mob/toggler) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 0f1be89410a41..0cb9867723455 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -479,13 +479,18 @@ visible_message(span_notice("[user] sets \the [src] to [vampire_charging_enabled ? "charge" : "cook"]."), blind_message = span_notice("You hear \the [src] make an informative beep!")) return CLICK_ACTION_SUCCESS -/obj/machinery/microwave/CtrlClick(mob/user) - . = ..() - if(user.can_perform_action(src) && cell_powered && !isnull(cell) && anchored) +/obj/machinery/microwave/click_ctrl(mob/user) + if(!anchored) + return NONE + + if(cell_powered && !isnull(cell)) user.put_in_hands(cell) balloon_alert(user, "removed cell") cell = null update_appearance() + return CLICK_ACTION_SUCCESS + + return CLICK_ACTION_BLOCKING /obj/machinery/microwave/ui_interact(mob/user) . = ..() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 9b23f0b25b0f3..3f47982e16ee9 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -9,6 +9,7 @@ pixel_z = 8 obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics + interaction_flags_click = FORBID_TELEKINESIS_REACH use_power = NO_POWER_USE ///The amount of water in the tray (max 100) var/waterlevel = 0 @@ -1086,19 +1087,16 @@ if(user) user.examinate(src) -/obj/machinery/hydroponics/CtrlClick(mob/user) - . = ..() - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return +/obj/machinery/hydroponics/click_ctrl(mob/user) if(!powered()) to_chat(user, span_warning("[name] has no power.")) update_use_power(NO_POWER_USE) - return + return CLICK_ACTION_BLOCKING if(!anchored) - return + return CLICK_ACTION_BLOCKING set_self_sustaining(!self_sustaining) to_chat(user, span_notice("You [self_sustaining ? "activate" : "deactivated"] [src]'s autogrow function[self_sustaining ? ", maintaining the tray's health while using high amounts of power" : ""].")) - + return CLICK_ACTION_SUCCESS /obj/machinery/hydroponics/attack_hand_secondary(mob/user, list/modifiers) . = ..() @@ -1184,8 +1182,8 @@ deconstruct(disassembled = TRUE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/hydroponics/soil/CtrlClick(mob/user) - return //Soil has no electricity. +/obj/machinery/hydroponics/soil/click_ctrl(mob/user) + return CLICK_ACTION_BLOCKING //Soil has no electricity. /obj/machinery/hydroponics/soil/on_deconstruction(disassembled) new /obj/item/stack/ore/glass(drop_location(), 3) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index f90cda9456388..556a959e4f8eb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -983,8 +983,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp game = create_mafia_game() game.ui_interact(usr) -/mob/dead/observer/CtrlShiftClick(mob/user) - if(isobserver(user) && check_rights(R_SPAWN)) +/mob/dead/observer/CtrlShiftClickOn(atom/target) + if(check_rights(R_SPAWN)) change_mob_type(/mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering /mob/dead/observer/examine(mob/user) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 97470f30d12e0..539dfd64ce353 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -33,8 +33,7 @@ return ITEM_INTERACT_SUCCESS return . -/mob/living/carbon/CtrlShiftClick(mob/user) - ..() +/mob/living/carbon/click_ctrl_shift(mob/user) if(iscarbon(user)) var/mob/living/carbon/carbon_user = user carbon_user.give(src) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index a490af9be8d4b..0e2071a84b910 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -472,10 +472,7 @@ update_appearance(UPDATE_ICON) return ..() -/obj/item/modular_computer/CtrlShiftClick(mob/user) - . = ..() - if(.) - return +/obj/item/modular_computer/click_ctrl_shift(mob/user) if(!inserted_disk) return user.put_in_hands(inserted_disk) diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 8935161089b33..ec0d4a94e2bb6 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -158,12 +158,9 @@ playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) -/obj/item/modular_computer/pda/CtrlClick(mob/user) - . = ..() - if(.) - return - +/obj/item/modular_computer/pda/item_ctrl_click(mob/user) remove_pen(user) + return CLICK_ACTION_SUCCESS ///Finds how hard it is to send a virus to this tablet, checking all programs downloaded. /obj/item/modular_computer/pda/proc/get_detomatix_difficulty() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ee2a20eb788f1..e55442f31fd1f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -758,9 +758,10 @@ GLOBAL_LIST(hub_radial_layer_list) C.deconstruct() // remove adversary cable auto_propagate_cut_cable(src) // update the powernets -/obj/structure/cable/multilayer/CtrlClick(mob/living/user) +/obj/structure/cable/multilayer/click_ctrl(mob/user) to_chat(user, span_warning("You push the reset button.")) addtimer(CALLBACK(src, PROC_REF(Reload)), 10, TIMER_UNIQUE) //spam protect + return CLICK_ACTION_SUCCESS // This is a mapping aid. In order for this to be placed on a map and function, all three layers need to have their nodes active /obj/structure/cable/multilayer/connected diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 5396839e13dcd..016e55012c570 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -260,7 +260,7 @@ update_appearance() return CLICK_ACTION_SUCCESS -/obj/item/storage/portable_chem_mixer/CtrlClick(mob/living/user) +/obj/item/storage/portable_chem_mixer/item_ctrl_click(mob/user) if(atom_storage.locked == STORAGE_FULLY_LOCKED) atom_storage.locked = STORAGE_NOT_LOCKED replace_beaker(user) @@ -270,3 +270,4 @@ atom_storage.hide_contents(usr) update_appearance() + return CLICK_ACTION_SUCCESS diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index 40be7c5f43d09..f7152204f9ebc 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -50,13 +50,14 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/reagent_containers/cup/maunamug/CtrlClick(mob/living/user) +/obj/item/reagent_containers/cup/maunamug/item_ctrl_click(mob/user) if(on) change_power_status(FALSE) else if(!cell || cell.charge <= 0) return FALSE //No power, so don't turn on change_power_status(TRUE) + return CLICK_ACTION_SUCCESS /obj/item/reagent_containers/cup/maunamug/proc/change_power_status(status) on = status diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 59b3d13c3424d..f02bfff4a0987 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -395,10 +395,10 @@ new_barcode.cut_multiplier = cut_multiplier // Also the registered percent cut. user.put_in_hands(new_barcode) -/obj/item/sales_tagger/CtrlClick(mob/user) - . = ..() +/obj/item/sales_tagger/item_ctrl_click(mob/user) payments_acc = null to_chat(user, span_notice("You clear the registered account.")) + return CLICK_ACTION_SUCCESS /obj/item/sales_tagger/click_alt(mob/user) var/potential_cut = input("How much would you like to pay out to the registered card?","Percentage Profit ([round(cut_min*100)]% - [round(cut_max*100)]%)") as num|null diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 9724bd776d87e..ea4ef0e9b7ed1 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -92,17 +92,13 @@ /obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) ..() - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl)) - RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl)) + RegisterSignal(user, COMSIG_MOB_CTRL_CLICKED, PROC_REF(XenoClickCtrl)) RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt)) RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift)) RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift)) /obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) + UnregisterSignal(user, COMSIG_MOB_CTRL_CLICKED) UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) @@ -372,30 +368,6 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) ..() -/mob/living/basic/slime/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) - ..() - -/mob/living/carbon/human/species/monkey/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) - ..() - -/turf/open/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) - ..() - -/// Scans the target slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/basic/slime/target_slime) - SIGNAL_HANDLER - - var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/xeno_console = remote_eye.origin - - if(!xeno_console.validate_area(user, remote_eye, target_slime.loc)) - return - - slime_scan(target_slime, user) - ///Feeds a stored potion to a slime /obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/basic/slime/target_slime) SIGNAL_HANDLER @@ -437,9 +409,22 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo slime_place(target_turf) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoClickCtrl(mob/living/user, atom/target) + SIGNAL_HANDLER + + if(isopenturf(target)) + XenoTurfClickCtrl(user, target) + else if(ismonkey(target)) + XenoMonkeyClickCtrl(user, target) + else if(isslime(target)) + XenoSlimeClickCtrl(user, target) + + return COMSIG_MOB_CANCEL_CLICKON + ///Places a monkey from the internal storage /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/target_turf) - SIGNAL_HANDLER + if(!isopenturf(target_turf)) + return var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control var/obj/machinery/computer/camera_advanced/xenobio/xeno_console = remote_eye.origin @@ -451,18 +436,30 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo ///Picks up a dead monkey for recycling /obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/human/target_mob) - SIGNAL_HANDLER if(!ismonkey(target_mob)) return var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control var/obj/machinery/computer/camera_advanced/xenobio/xeno_console = remote_eye.origin - if(!xeno_console.validate_area(user, remote_eye, target_mob.loc)) - return - if(!xeno_console.connected_recycler) to_chat(user, span_warning("There is no connected monkey recycler. Use a multitool to link one.")) return + if(!xeno_console.validate_area(user, remote_eye, target_mob.loc)) + return + xeno_console.monkey_recycle(user, target_mob) + +/// Scans the target slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/basic/slime/target_slime) + if(!isslime(target_slime)) + return + + var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/xeno_console = remote_eye.origin + + if(!xeno_console.validate_area(user, remote_eye, target_slime.loc)) + return + + slime_scan(target_slime, user) diff --git a/code/modules/transport/tram/tram_remote.dm b/code/modules/transport/tram/tram_remote.dm index 3a45ec4e6650e..65c2cff8727a6 100644 --- a/code/modules/transport/tram/tram_remote.dm +++ b/code/modules/transport/tram/tram_remote.dm @@ -45,7 +45,7 @@ to_chat(user, span_notice("You change the platform ID on [src] to [selected_platform].")) ///set safety bypass -/obj/item/assembly/control/transport/remote/CtrlClick(mob/user) +/obj/item/assembly/control/transport/remote/item_ctrl_click(mob/user) switch(options) if(!RAPID_MODE) options |= RAPID_MODE @@ -53,6 +53,7 @@ options &= ~RAPID_MODE update_appearance() balloon_alert(user, "mode: [options ? "fast" : "safe"]") + return CLICK_ACTION_SUCCESS /obj/item/assembly/control/transport/remote/examine(mob/user) . = ..() diff --git a/tgstation.dme b/tgstation.dme index 2196f0559dd00..c1edbfe6146b5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -556,6 +556,7 @@ #include "code\_onclick\ai.dm" #include "code\_onclick\click.dm" #include "code\_onclick\click_alt.dm" +#include "code\_onclick\click_ctrl.dm" #include "code\_onclick\cyborg.dm" #include "code\_onclick\drag_drop.dm" #include "code\_onclick\item_attack.dm" From 307185e1b47da504afe79081e663e13440bd8c54 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:30:09 +1200 Subject: [PATCH 036/120] Automatic changelog for PR #83784 [ci skip] --- html/changelogs/AutoChangeLog-pr-83784.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83784.yml diff --git a/html/changelogs/AutoChangeLog-pr-83784.yml b/html/changelogs/AutoChangeLog-pr-83784.yml new file mode 100644 index 0000000000000..366f1a3ee2a4e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83784.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - refactor: "Ctrl click & Ctrl shift click has been refactored. Please report bugs on GitHub" \ No newline at end of file From c4338135038d890d6c516426bb0fa75098d4ed57 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:38:45 +1000 Subject: [PATCH 037/120] Makes that one random frog in the freezing cold plasma facility more atmospherically resistant (#83928) ## About The Pull Request Makes the random frog in the icemoon plasma facility more atmospherically resistant so that it survives in its environment. ## Why It's Good For The Game Please stop failing my PRs by dying in the cold, Peter. ## Changelog :cl: fix: Peter Jr. is capable of surviving in the environment they spawn in. /:cl: --------- Co-authored-by: Jacquerel --- code/modules/mob/living/basic/vermin/frog.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 5f7cfe6d90d2c..65b5dcbb277b9 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -81,7 +81,8 @@ /mob/living/basic/frog/icemoon_facility name = "Peter Jr." desc = "They seem a little cold." - minimum_survivable_temperature = ICEBOX_MIN_TEMPERATURE + minimum_survivable_temperature = BODYTEMP_COLD_ICEBOX_SAFE + pressure_resistance = 200 habitable_atmos = null gold_core_spawnable = NO_SPAWN From 747f48248c5f3f895a3381753f85d29ea16796e0 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:39:04 +1200 Subject: [PATCH 038/120] Automatic changelog for PR #83928 [ci skip] --- html/changelogs/AutoChangeLog-pr-83928.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83928.yml diff --git a/html/changelogs/AutoChangeLog-pr-83928.yml b/html/changelogs/AutoChangeLog-pr-83928.yml new file mode 100644 index 0000000000000..c99f4b3352e4e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83928.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Peter Jr. is capable of surviving in the environment they spawn in." \ No newline at end of file From 114c87c943dd9927f34b395083bfb7ab9f5aadac Mon Sep 17 00:00:00 2001 From: Afevis Date: Thu, 13 Jun 2024 16:48:37 -0400 Subject: [PATCH 039/120] Fixes station trait based event weight modifiers being added for events that aren't valid on the current map (#83897) ``` [2024-06-12 02:12:22.135] RUNTIME: runtime error: Cannot execute /datum/round_event_control/met... (/datum/round_event_control/meteor_wave/dust_storm).valid for map(). - proc name: New (/datum/station_trait/random_event_weight_modifier/New) - source file: code/datums/station_traits/negative_traits.dm,296 - usr: null - src: Dust Stormfront (/datum/station_trait/random_event_weight_modifier/dust_storms) - call stack: - Dust Stormfront (/datum/station_trait/random_event_weight_modifier/dust_storms): New() - Station (/datum/controller/subsystem/processing/station): setup trait(/datum/station_trait/random_ev... (/datum/station_trait/random_event_weight_modifier/dust_storms)) - Station (/datum/controller/subsystem/processing/station): SetupTraits() - Station (/datum/controller/subsystem/processing/station): Initialize() - Master (/datum/controller/master): init subsystem(Station (/datum/controller/subsystem/processing/station)) - Master (/datum/controller/master): Initialize(10, 0, 1) - ``` :cl: ShizCalev fix: Fixed a bug with station traits being added to modify weights for events that couldn't actually occur on the current map! /:cl: --- code/controllers/subsystem/processing/station.dm | 11 +++++++++-- code/datums/station_traits/negative_traits.dm | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 8c57ab08fe842..883ab37456d2c 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -95,8 +95,7 @@ PROCESSING_SUBSYSTEM_DEF(station) return - for(var/i in subtypesof(/datum/station_trait)) - var/datum/station_trait/trait_typepath = i + for(var/datum/station_trait/trait_typepath as anything in subtypesof(/datum/station_trait)) // If forced, (probably debugging), just set it up now, keep it out of the pool. if(initial(trait_typepath.force)) @@ -115,6 +114,14 @@ PROCESSING_SUBSYSTEM_DEF(station) if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_REQUIRES_AI) && !CONFIG_GET(flag/allow_ai)) //can't have AI traits without AI continue + if(ispath(trait_typepath, /datum/station_trait/random_event_weight_modifier)) //Don't add event modifiers for events that can't occur on our map. + var/datum/station_trait/random_event_weight_modifier/random_trait_typepath = trait_typepath + var/datum/round_event_control/event_to_check = initial(random_trait_typepath.event_control_path) + if(event_to_check) + event_to_check = new event_to_check() + if(!event_to_check.valid_for_map()) + continue + selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight) var/positive_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/positive_station_traits))) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 509b6bdcbdbc8..266725cf337fc 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -285,7 +285,7 @@ weight = 0 /// The path to the round_event_control that we modify. - var/event_control_path + var/datum/round_event_control/event_control_path /// Multiplier applied to the weight of the event. var/weight_multiplier = 1 /// Flat modifier added to the amount of max occurances the random event can have. From 0562e7dfaf5e5faa6a9482c1dc4c16c4caebc069 Mon Sep 17 00:00:00 2001 From: Afevis Date: Thu, 13 Jun 2024 16:49:51 -0400 Subject: [PATCH 040/120] Fixes autolathes printing the wrong number of cables (#83805) Fixes #83798 :cl: ShizCalev fix: Autolathes now print the correct number of cable coils. /:cl: also cleaned up an unused maxstack var --- code/game/machinery/autolathe.dm | 17 ++++++++++++++--- code/modules/research/designs.dm | 2 -- .../designs/autolathe/engineering_designs.dm | 2 -- .../research/designs/autolathe/materials.dm | 12 ------------ .../autolathe/multi-department_designs.dm | 7 ------- .../designs/autolathe/service_designs.dm | 1 - .../research/designs/smelting_designs.dm | 6 ------ 7 files changed, 14 insertions(+), 33 deletions(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 8af032101ae14..6ed033886e60a 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -350,15 +350,26 @@ var/atom/movable/created if(is_stack) - created = new design.build_path(target, items_remaining) + var/obj/item/stack/stack_item = initial(design.build_path) + var/max_stack_amount = initial(stack_item.max_amount) + var/number_to_make = (initial(stack_item.amount) * items_remaining) + while(number_to_make > max_stack_amount) + created = new stack_item(null, max_stack_amount) //it's imporant to spawn things in nullspace, since obj's like stacks qdel when they enter a tile/merge with other stacks of the same type, resulting in runtimes. + created.pixel_x = created.base_pixel_x + rand(-6, 6) + created.pixel_y = created.base_pixel_y + rand(-6, 6) + created.forceMove(target) + number_to_make -= max_stack_amount + + created = new stack_item(null, number_to_make) + else - created = new design.build_path(target) + created = new design.build_path(null) split_materials_uniformly(materials_needed, material_cost_coefficient, created) created.pixel_x = created.base_pixel_x + rand(-6, 6) created.pixel_y = created.base_pixel_y + rand(-6, 6) - created.forceMove(target) SSblackbox.record_feedback("nested tally", "lathe_printed_items", 1, list("[type]", "[created.type]")) + created.forceMove(target) if(is_stack) items_remaining = 0 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index b196a06d30118..0420c732637a1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -41,8 +41,6 @@ other types of metals and chemistry for reagents). var/list/category = list() /// List of reagents required to create one unit of the product. Currently only supported by the limb grower. var/list/reagents_list = list() - /// The maximum number of units of whatever is produced by this can be produced in one go. - var/maxstack = 1 /// How many times faster than normal is this to build on the protolathe var/lathe_time_factor = 1 /// Bitflags indicating what departmental lathes should be allowed to process this design. diff --git a/code/modules/research/designs/autolathe/engineering_designs.dm b/code/modules/research/designs/autolathe/engineering_designs.dm index 945966035f3d1..6d1bfed8ea1df 100644 --- a/code/modules/research/designs/autolathe/engineering_designs.dm +++ b/code/modules/research/designs/autolathe/engineering_designs.dm @@ -433,7 +433,6 @@ build_type = PROTOLATHE materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) build_path = /obj/item/stack/thermoplastic - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, @@ -446,7 +445,6 @@ build_type = PROTOLATHE materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) build_path = /obj/item/stack/thermoplastic/light - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, diff --git a/code/modules/research/designs/autolathe/materials.dm b/code/modules/research/designs/autolathe/materials.dm index 5805005a39739..cc07a59ea7e2c 100644 --- a/code/modules/research/designs/autolathe/materials.dm +++ b/code/modules/research/designs/autolathe/materials.dm @@ -8,7 +8,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/rods name = "Iron Rod" @@ -20,7 +19,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/glass name = "Glass" @@ -32,7 +30,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/rglass name = "Reinforced Glass" @@ -44,7 +41,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE /datum/design/silver @@ -57,7 +53,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/gold name = "Gold" @@ -69,7 +64,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/diamond name = "Diamond" @@ -81,7 +75,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/plasma name = "Plasma" @@ -93,7 +86,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/uranium name = "Uranium" @@ -105,7 +97,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/bananium name = "Bananium" @@ -117,7 +108,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/titanium name = "Titanium" @@ -129,7 +119,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 /datum/design/plastic name = "Plastic" @@ -141,4 +130,3 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, ) - maxstack = 50 diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index b83938b54433a..ea1c94ff89c27 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -163,7 +163,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING, ) - maxstack = MAXCOIL departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE /datum/design/toolbox @@ -430,7 +429,6 @@ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/stack/ducts - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_PLUMBING, @@ -471,7 +469,6 @@ RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE, ) - maxstack = 30 departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO /datum/design/holodisk @@ -492,7 +489,6 @@ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/stack/tile/circuit - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, @@ -506,7 +502,6 @@ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/stack/tile/circuit/green - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, @@ -519,7 +514,6 @@ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/stack/tile/circuit/red - maxstack = 50 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, @@ -532,7 +526,6 @@ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 1.5) build_path = /obj/item/stack/conveyor - maxstack = 30 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MACHINERY, diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index e34fc5166c89c..e7177037e522c 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -474,7 +474,6 @@ materials = list(/datum/material/plastic =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/stack/sticky_tape category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT) - maxstack = 5 category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE, ) diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 925a2d3189783..b65ca64c6f5d0 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -10,7 +10,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/plastitanium_alloy name = "Plastitanium" @@ -22,7 +21,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/plaglass_alloy name = "Plasma Glass" @@ -34,7 +32,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/plasmarglass_alloy name = "Reinforced Plasma Glass" @@ -46,7 +43,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/titaniumglass_alloy name = "Titanium Glass" @@ -58,7 +54,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/plastitaniumglass_alloy name = "Plastitanium Glass" @@ -70,7 +65,6 @@ RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING - maxstack = 50 /datum/design/alienalloy name = "Alien Alloy" From 3072e815ac97528dade2fe2184485b5e05339403 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:50:04 +1200 Subject: [PATCH 041/120] Automatic changelog for PR #83897 [ci skip] --- html/changelogs/AutoChangeLog-pr-83897.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83897.yml diff --git a/html/changelogs/AutoChangeLog-pr-83897.yml b/html/changelogs/AutoChangeLog-pr-83897.yml new file mode 100644 index 0000000000000..3752407fe3cb2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83897.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Fixed a bug with station traits being added to modify weights for events that couldn't actually occur on the current map!" \ No newline at end of file From 70345c7adbd8da6e5e84c423585a78fa25b194af Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 08:57:42 +1200 Subject: [PATCH 042/120] Automatic changelog for PR #83805 [ci skip] --- html/changelogs/AutoChangeLog-pr-83805.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83805.yml diff --git a/html/changelogs/AutoChangeLog-pr-83805.yml b/html/changelogs/AutoChangeLog-pr-83805.yml new file mode 100644 index 0000000000000..82fcaaa39ede4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83805.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Autolathes now print the correct number of cable coils." \ No newline at end of file From 06b2e0aae1ac35f527a40a914f98f29aff4de51e Mon Sep 17 00:00:00 2001 From: Goat <126099705+Goat-Real@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:58:17 -0600 Subject: [PATCH 043/120] Make PKA and PKC fireproof (#83865) ## About The Pull Request adds a `resistance_tag = FIRE_PROOF` to both the PKA and PKC ## Why It's Good For The Game Miner equipment should be fireproof. The explorer suit does not burn so their weapons should not either. fix #83851 ## Changelog :cl: Goat qol: Mining's PKAs and PKCs are now fireproof. /:cl: --- code/modules/mining/equipment/kinetic_crusher.dm | 1 + code/modules/projectiles/guns/energy/kinetic_accelerator.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a9fa376d5b2c7..fd0983a5d2fd8 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -15,6 +15,7 @@ desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, \ forming a high-tech club. While it is an effective mining tool, it did little to aid any but the most skilled and/or \ suicidal miners against local fauna." + resistance_flags = FIRE_PROOF force = 0 //You can't hit stuff unless wielded w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 65b2b72c7d256..c7fefc745f7e0 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -7,6 +7,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/kinetic) item_flags = NONE obj_flags = UNIQUE_RENAME + resistance_flags = FIRE_PROOF weapon_weight = WEAPON_LIGHT can_bayonet = TRUE knife_x_offset = 20 From d8a9dbd95af65762d6820833c5066c71f6c0235f Mon Sep 17 00:00:00 2001 From: Addust <80979251+Addust@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:59:01 +0100 Subject: [PATCH 044/120] The Syndicate now imports warm air instead of cold air to the icemoon listening post (#83881) ## About The Pull Request oopsies i left it on prefab instead of instance like an IDIOT when i fixed bridge ATs! ![image](https://github.com/tgstation/tgstation/assets/80979251/a9d01821-ec71-4e2b-ac58-52e1e1f0b8b6) this fixes that also adds window shutters to the window because tests are failing and i want to rerun them ## Why It's Good For The Game fix good ## Changelog :cl: fix: the syndicate now imports warm air instead of cold air to their icemoon listening post /:cl: --- .../icemoon_underground_comms_agent.dmm | 142 +++++------------- 1 file changed, 39 insertions(+), 103 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm index e0e5a97fc6510..5e03988f8d3e7 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -29,10 +29,7 @@ /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "ce" = ( /obj/machinery/modular_computer/preset{ @@ -65,17 +62,11 @@ /area/ruin/comms_agent) "dP" = ( /obj/structure/closet/crate/secure/freezer/commsagent, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "eE" = ( /obj/structure/cable, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "eT" = ( /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/icemoon{ @@ -135,10 +126,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "ig" = ( /obj/effect/turf_decal/siding/wood, @@ -148,17 +136,11 @@ /obj/effect/turf_decal/siding/wideplating/light/corner{ dir = 8 }, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "in" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "iZ" = ( /obj/effect/turf_decal/siding/wood{ @@ -174,10 +156,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "ka" = ( /obj/machinery/seed_extractor, @@ -213,19 +192,13 @@ /obj/effect/decal/cleanable/cobweb, /obj/item/storage/bag/trash, /obj/structure/closet/crate/bin, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "kL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "la" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -250,10 +223,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "mr" = ( /obj/effect/turf_decal/siding/wood{ @@ -262,10 +232,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "mM" = ( /obj/structure/ore_box, @@ -351,6 +318,9 @@ /obj/structure/filingcabinet, /obj/item/paperwork, /obj/item/paper/monitorkey, +/obj/item/paper/fluff/ruins/listeningstation/briefing{ + pixel_x = -2 + }, /turf/open/floor/wood/tile, /area/ruin/comms_agent) "sc" = ( @@ -395,10 +365,7 @@ pixel_x = 6; pixel_y = 4 }, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "ud" = ( /obj/effect/decal/cleanable/dirt, @@ -423,17 +390,11 @@ }, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/tank_holder/extinguisher, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "up" = ( /obj/effect/decal/cleanable/food/flour, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "uY" = ( /obj/effect/mapping_helpers/broken_floor, @@ -444,19 +405,21 @@ "vB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/listeningstation/briefing{ - pixel_x = -2 +/obj/item/pen/survival{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/machinery/button/door{ + id = "syndie_lpost_icemoon_windows"; + name = "Window Shutters"; + req_access = list("syndicate") }, -/obj/item/pen/survival, /turf/open/floor/wood/tile, /area/ruin/comms_agent) "vK" = ( /obj/effect/turf_decal/siding/wideplating/light, /obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "vV" = ( /obj/structure/toilet{ @@ -554,10 +517,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "zJ" = ( /obj/machinery/biogenerator, @@ -571,10 +531,7 @@ /obj/machinery/coffeemaker/impressa{ pixel_y = 4 }, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "Bx" = ( /obj/effect/baseturf_helper/asteroid/snow, @@ -669,10 +626,7 @@ "FZ" = ( /obj/effect/baseturf_helper/reinforced_plating/ceiling, /obj/structure/cable, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "Gp" = ( /obj/structure/fluff/empty_sleeper/syndicate{ @@ -687,10 +641,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "GI" = ( /obj/structure/closet/crate/hydroponics, @@ -752,10 +703,7 @@ pixel_y = 4 }, /obj/item/storage/box/coffeepack, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "JD" = ( /obj/structure/closet/cabinet, @@ -894,10 +842,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "MH" = ( /turf/closed/mineral/snowmountain/icemoon, @@ -979,10 +924,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/mapping_helpers/apc/syndicate_access, /obj/structure/cable, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "Qx" = ( /obj/structure/cable, @@ -999,10 +941,7 @@ /obj/item/pipe/trinary/flippable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "QT" = ( /obj/structure/table, @@ -1011,10 +950,7 @@ pixel_y = 4 }, /obj/item/crowbar/red, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "QU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1127,6 +1063,9 @@ /area/ruin/comms_agent) "XU" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "syndie_lpost_icemoon_windows" + }, /turf/open/floor/plating, /area/ruin/comms_agent) "Yz" = ( @@ -1157,10 +1096,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS"; - name = "bridge" - }, +/turf/open/floor/wood, /area/ruin/comms_agent) "ZE" = ( /obj/structure/sink/directional/east, From cc2dda58471e21fceb2b2c8923f25a75625a0761 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:00:39 +1200 Subject: [PATCH 045/120] Automatic changelog for PR #83865 [ci skip] --- html/changelogs/AutoChangeLog-pr-83865.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83865.yml diff --git a/html/changelogs/AutoChangeLog-pr-83865.yml b/html/changelogs/AutoChangeLog-pr-83865.yml new file mode 100644 index 0000000000000..a7a2155399395 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83865.yml @@ -0,0 +1,4 @@ +author: "Goat" +delete-after: True +changes: + - qol: "Mining's PKAs and PKCs are now fireproof." \ No newline at end of file From 8a89c9587c31b8d5245847b3e966867e2a51d4e0 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 09:01:18 +1200 Subject: [PATCH 046/120] Automatic changelog for PR #83881 [ci skip] --- html/changelogs/AutoChangeLog-pr-83881.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83881.yml diff --git a/html/changelogs/AutoChangeLog-pr-83881.yml b/html/changelogs/AutoChangeLog-pr-83881.yml new file mode 100644 index 0000000000000..146834986bc92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83881.yml @@ -0,0 +1,4 @@ +author: "Addust" +delete-after: True +changes: + - bugfix: "the syndicate now imports warm air instead of cold air to their icemoon listening post" \ No newline at end of file From e26dd115510da10a21a54b2274c5341963da7a79 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 14 Jun 2024 00:25:53 +0000 Subject: [PATCH 047/120] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-83248.yml | 4 -- html/changelogs/AutoChangeLog-pr-83579.yml | 6 --- html/changelogs/AutoChangeLog-pr-83690.yml | 5 -- html/changelogs/AutoChangeLog-pr-83741.yml | 4 -- html/changelogs/AutoChangeLog-pr-83784.yml | 4 -- html/changelogs/AutoChangeLog-pr-83805.yml | 4 -- html/changelogs/AutoChangeLog-pr-83829.yml | 4 -- html/changelogs/AutoChangeLog-pr-83832.yml | 4 -- html/changelogs/AutoChangeLog-pr-83833.yml | 5 -- html/changelogs/AutoChangeLog-pr-83847.yml | 4 -- html/changelogs/AutoChangeLog-pr-83865.yml | 4 -- html/changelogs/AutoChangeLog-pr-83879.yml | 4 -- html/changelogs/AutoChangeLog-pr-83881.yml | 4 -- html/changelogs/AutoChangeLog-pr-83882.yml | 4 -- html/changelogs/AutoChangeLog-pr-83897.yml | 4 -- html/changelogs/AutoChangeLog-pr-83898.yml | 5 -- html/changelogs/AutoChangeLog-pr-83903.yml | 4 -- html/changelogs/AutoChangeLog-pr-83909.yml | 4 -- html/changelogs/AutoChangeLog-pr-83922.yml | 4 -- html/changelogs/AutoChangeLog-pr-83928.yml | 4 -- html/changelogs/archive/2024-06.yml | 56 ++++++++++++++++++++++ 21 files changed, 56 insertions(+), 85 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-83248.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83579.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83690.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83741.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83784.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83805.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83829.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83832.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83833.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83847.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83865.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83879.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83881.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83882.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83897.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83898.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83903.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83909.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83922.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83928.yml diff --git a/html/changelogs/AutoChangeLog-pr-83248.yml b/html/changelogs/AutoChangeLog-pr-83248.yml deleted file mode 100644 index 800dfe930ed0c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83248.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Rex9001" -delete-after: True -changes: - - balance: "Moon Smile only does a knockdown if the targets sanity is low enough and the minimum duration of its abilities have been decreased" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83579.yml b/html/changelogs/AutoChangeLog-pr-83579.yml deleted file mode 100644 index 20ec6214289cb..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83579.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "cnleth" -delete-after: True -changes: - - balance: "Juicing and distilling plants only consumes nutriment and vitamin" - - balance: "Lanternfruit and polypore mushrooms now contain nutriment" - - balance: "Increased the amount of nutriment in sugarcane and saltcane" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83690.yml b/html/changelogs/AutoChangeLog-pr-83690.yml deleted file mode 100644 index 469f74740c999..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83690.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - refactor: "Mouse drag & drop attack chain has been refactored. Report any bugs on GitHub" - - bugfix: "You cannot close the cryo tube on yourself with Alt click like before" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83741.yml b/html/changelogs/AutoChangeLog-pr-83741.yml deleted file mode 100644 index 9cc8fa8717b14..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83741.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "larentoun" -delete-after: True -changes: - - balance: "Now regaining a tail has three states. If you got your tail back - you'll get a temporarily debuff in exchange of infinite \"tail missing\" debuff (new). If it's NOT your tail and of same species - this temporarily debuff will be a bit stronger (new). If it's NOT your tail and NOT of same species - it will be a considerably stronger debuff (currently on live)." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83784.yml b/html/changelogs/AutoChangeLog-pr-83784.yml deleted file mode 100644 index 366f1a3ee2a4e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83784.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - refactor: "Ctrl click & Ctrl shift click has been refactored. Please report bugs on GitHub" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83805.yml b/html/changelogs/AutoChangeLog-pr-83805.yml deleted file mode 100644 index 82fcaaa39ede4..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83805.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Autolathes now print the correct number of cable coils." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83829.yml b/html/changelogs/AutoChangeLog-pr-83829.yml deleted file mode 100644 index 5278fb0c9ed23..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83829.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lizelive" -delete-after: True -changes: - - qol: "make the cart hold 2.5x more water" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83832.yml b/html/changelogs/AutoChangeLog-pr-83832.yml deleted file mode 100644 index f1c94c6df1c85..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83832.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - balance: "Corpses won't remain cultists when ghouled by a flesheretic" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83833.yml b/html/changelogs/AutoChangeLog-pr-83833.yml deleted file mode 100644 index eaa1fddfb87d6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83833.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "JupiterJaeden" -delete-after: True -changes: - - qol: "you can now take pulled objects with you when going up and down in zero gravity" - - bugfix: "conga lines now work correctly when going up and down ladders, and in zero gravity" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83847.yml b/html/changelogs/AutoChangeLog-pr-83847.yml deleted file mode 100644 index f28fc0a7bc5c5..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83847.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Watermelon914" -delete-after: True -changes: - - qol: "Bots can now bind voice lines to an action slot. Lowers cooldown for all bot voicelines to 5 seconds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83865.yml b/html/changelogs/AutoChangeLog-pr-83865.yml deleted file mode 100644 index a7a2155399395..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83865.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Goat" -delete-after: True -changes: - - qol: "Mining's PKAs and PKCs are now fireproof." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83879.yml b/html/changelogs/AutoChangeLog-pr-83879.yml deleted file mode 100644 index 905e79a29e9f0..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83879.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kocma-san" -delete-after: True -changes: - - bugfix: "special networks are now displayed in the fax if it is the only one in the world" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83881.yml b/html/changelogs/AutoChangeLog-pr-83881.yml deleted file mode 100644 index 146834986bc92..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83881.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Addust" -delete-after: True -changes: - - bugfix: "the syndicate now imports warm air instead of cold air to their icemoon listening post" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83882.yml b/html/changelogs/AutoChangeLog-pr-83882.yml deleted file mode 100644 index dbbebbee00337..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83882.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MGOOOOOO" -delete-after: True -changes: - - bugfix: "Missing legs no longer slow you down in non-gravity environments." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83897.yml b/html/changelogs/AutoChangeLog-pr-83897.yml deleted file mode 100644 index 3752407fe3cb2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83897.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Fixed a bug with station traits being added to modify weights for events that couldn't actually occur on the current map!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83898.yml b/html/changelogs/AutoChangeLog-pr-83898.yml deleted file mode 100644 index f9f81b5ac0d6c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83898.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "jlsnow301" -delete-after: True -changes: - - rscadd: "Added screentips to extinguishers." - - bugfix: "Fixed alt-click interaction with extinguishers and mod control units." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83903.yml b/html/changelogs/AutoChangeLog-pr-83903.yml deleted file mode 100644 index 8dfd7f9479c1e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83903.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "thegrb93" -delete-after: True -changes: - - bugfix: "Fix bug where you can't interact with a shocked door without shock protection even if it is depowered." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83909.yml b/html/changelogs/AutoChangeLog-pr-83909.yml deleted file mode 100644 index 272c81517cc08..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83909.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MGOOOOOO" -delete-after: True -changes: - - bugfix: "Catwalk deconstruction yields iron rods as intended." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83922.yml b/html/changelogs/AutoChangeLog-pr-83922.yml deleted file mode 100644 index a6841c8a93171..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83922.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "junkgle01" -delete-after: True -changes: - - bugfix: "added an id trim painter that was missing to MetaStation's QM office." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83928.yml b/html/changelogs/AutoChangeLog-pr-83928.yml deleted file mode 100644 index c99f4b3352e4e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83928.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Peter Jr. is capable of surviving in the environment they spawn in." \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index dc4e56df83d7b..abab7965e9b21 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -611,3 +611,59 @@ carlarctg: - qol: Cult pylons slowly close bleeding wounds - refactor: allowed aura healing to clot wounds shut +2024-06-14: + Addust: + - bugfix: the syndicate now imports warm air instead of cold air to their icemoon + listening post + Goat: + - qol: Mining's PKAs and PKCs are now fireproof. + JupiterJaeden: + - qol: you can now take pulled objects with you when going up and down in zero gravity + - bugfix: conga lines now work correctly when going up and down ladders, and in + zero gravity + Kocma-san: + - bugfix: special networks are now displayed in the fax if it is the only one in + the world + MGOOOOOO: + - bugfix: Missing legs no longer slow you down in non-gravity environments. + - bugfix: Catwalk deconstruction yields iron rods as intended. + Rex9001: + - balance: Moon Smile only does a knockdown if the targets sanity is low enough + and the minimum duration of its abilities have been decreased + ShizCalev: + - bugfix: Autolathes now print the correct number of cable coils. + - bugfix: Fixed a bug with station traits being added to modify weights for events + that couldn't actually occur on the current map! + SyncIt21: + - refactor: Ctrl click & Ctrl shift click has been refactored. Please report bugs + on GitHub + - refactor: Mouse drag & drop attack chain has been refactored. Report any bugs + on GitHub + - bugfix: You cannot close the cryo tube on yourself with Alt click like before + Watermelon914: + - qol: Bots can now bind voice lines to an action slot. Lowers cooldown for all + bot voicelines to 5 seconds. + carlarctg: + - balance: Corpses won't remain cultists when ghouled by a flesheretic + cnleth: + - balance: Juicing and distilling plants only consumes nutriment and vitamin + - balance: Lanternfruit and polypore mushrooms now contain nutriment + - balance: Increased the amount of nutriment in sugarcane and saltcane + jlsnow301: + - rscadd: Added screentips to extinguishers. + - bugfix: Fixed alt-click interaction with extinguishers and mod control units. + junkgle01: + - bugfix: added an id trim painter that was missing to MetaStation's QM office. + larentoun: + - balance: Now regaining a tail has three states. If you got your tail back - you'll + get a temporarily debuff in exchange of infinite "tail missing" debuff (new). + If it's NOT your tail and of same species - this temporarily debuff will be + a bit stronger (new). If it's NOT your tail and NOT of same species - it will + be a considerably stronger debuff (currently on live). + lizelive: + - qol: make the cart hold 2.5x more water + necromanceranne: + - bugfix: Peter Jr. is capable of surviving in the environment they spawn in. + thegrb93: + - bugfix: Fix bug where you can't interact with a shocked door without shock protection + even if it is depowered. From 2d6197d32e0a1b93fc28fac37c7d96fabaa382d7 Mon Sep 17 00:00:00 2001 From: Goat <126099705+Goat-Real@users.noreply.github.com> Date: Thu, 13 Jun 2024 18:32:14 -0600 Subject: [PATCH 048/120] Replace the cyborg labeler in the service hallway in ice with a regular one (#83923) ## About The Pull Request Replaces the cyborg hand labeler in the service hall on ice with a regular one. ## Why It's Good For The Game cyborg tools shouldn't be placed, it's also unusable for humans. --- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 9299d821e6fb7..1e2662c209e36 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -22520,7 +22520,7 @@ /obj/item/pen{ pixel_x = -5 }, -/obj/item/hand_labeler/borg{ +/obj/item/hand_labeler{ pixel_y = -3 }, /turf/open/floor/wood, From 491a19cd6d1d353879bab2d01292c25753734b1e Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:33:08 +1200 Subject: [PATCH 049/120] Automatic changelog for PR #83923 [ci skip] --- html/changelogs/AutoChangeLog-pr-83923.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83923.yml diff --git a/html/changelogs/AutoChangeLog-pr-83923.yml b/html/changelogs/AutoChangeLog-pr-83923.yml new file mode 100644 index 0000000000000..8463ac2cda24b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83923.yml @@ -0,0 +1,4 @@ +author: "Goat-Real" +delete-after: True +changes: + - bugfix: "Icebox's service hall now now has a regular hand labeler." \ No newline at end of file From 1e851842c09254443945fdd379f93194f94e03c9 Mon Sep 17 00:00:00 2001 From: EnterTheJake <102721711+EnterTheJake@users.noreply.github.com> Date: Fri, 14 Jun 2024 06:00:58 +0200 Subject: [PATCH 050/120] Resprites the Rust Heretic's Blade (#83930) --- icons/mob/inhands/64x64_lefthand.dmi | Bin 31018 -> 35259 bytes icons/mob/inhands/64x64_righthand.dmi | Bin 30129 -> 34744 bytes icons/obj/weapons/khopesh.dmi | Bin 11000 -> 18179 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 5d4d7c9e7689ff21676fe5ab577b2b8ec450157d..e0545c0d89395facca2d350a41247914ddbb3843 100644 GIT binary patch literal 35259 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 literal 31018 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]=HQB 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 A=Kufz literal 30129 zcmeFZ2T)UA*Ebpj1VoBT5h(#d0TrSm(us(Opfu@SMS7P`ARt8)5Rf8L14^$VAUzRK zQ0cw*PJqw@srSVH|GoElzVCVGZ8LYiJ9C{$PCRFqwbx$zw|;BweR!j-smgTf!YL34 z#H9A%-eVAm`VQ~`(VwK;k)sm_fvCj&^^834S$kN$uy^yccXa`QeAAN>n;lxOpMKTz zOE>J$ME!T_v^SSnZo~n5$g|>#LMyrnwf8lMrskjblMCoWX%KLsv0Yi1Tn1!h;|Q(> ztJ1uX(PV>n&b%DDXc0F1S?k=(FB~K}H$M53K9__{22S-NpBEJy*tg_*-B8eQ;kXb@ z+OkBJuzu*%$~UG_RO~*bs7h)$K!Nj^xO-b0KFS}WeVEq-qv3&M6Mfg3U1;P=D!Nbf)Hia%iG?WVsKjoVrL`At!(Nn(Z?@+$~smg!5;$MBy=)dtep8J&`oF+l+ z45p&yc~xykV@+tXu+_!~lWYlv38Z{7R}c$B+n5HVy&5wEZ?3s{S>q?hKH&K$U z^uveqLxsA+?MD$oZ)KxYDb?~J1qr0&oVvZ`NK&ksW$l71j0~&j&N_VQ?1k_EscUHH zKYkqlswXXt5NXl3?dOr;vpJqSIH=dH`Ga3lQoq4_^Y;ysnwr}1Ths{pv;(-8yie=Z zPxe^pN_up7@ihrTLehhS((p6IUMH(roQm=3)Y>*SHmf-hwK?G+wx(?rrK2NT8=J?r zH%|Rs`(y)or8})ye~Yt)LrEkP>BfnOuTmddaJ3@C>L{X_)?cM$|VW{S^3nhbMzI< z0a1EAG8zW)pGY4T9D@eI2WBhc2hs}cORXl%sh9H z&yJ{E`wW^gqRD#0a5`P^NT3Ca5|K{yb5xuCXIT98fF$IR;4vt6DbQ$LU|q_j=5gX!3)AfX0OQ_>ZfrcGfmFyD6aXYk>Krq@)ZZ z2!y{(_>V2-lh+sl6UORJt#~p_ri5AIS1$W~ZDzE=?XTHT6v2FZ!XY{;N@8p0netys z1GI1D5aZ=>_?fVU*3D3U(r(`0 zU042*fJF~(6{4h2_D%}B$Nurtr_wF*cF()d$Myz**gcpaI3U(EhI|o5f1;b1 z!OY5G|1RMDN3i$rR{R?&|6RQNk1GBJvGjLN|AF2AA-euk zXC#9bEr|E-;;-dLP>CnsK<$`>`2*R|n=FG}N4mm+cgPZ?K{WvC4&S0M-oXIK>g8+l zs`XF$d1xJ{iZxo;X2^Q6ojaGXa1b8UWuR1=hRo8${SCJHWal-;8QLrWLpR5(uQvE5 zD9{7=2_S8?!$$zj9UO|{S(jGvvRyM@@vOu z<8L_m>2Be@@`?mG-0_L6)Bm^T7Be|z_JeZZ7`8U|l?KpYu17Kt%F|G0EVM7zgY%D+ z_2rOuhTayxpXDybaDrbTVQN9MZHt6;02Xm5&x-ZRiV7>yva>xS(TdM$^Dpe8MhK zC+j_WqBgx?rH~h3pRb31jd`(Pf@Y<0<=0G98|m+Ux9ijT$Y(aAY{Gjvb>N~%0AS<4 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 O0R Date: Fri, 14 Jun 2024 16:01:18 +1200 Subject: [PATCH 051/120] Automatic changelog for PR #83930 [ci skip] --- html/changelogs/AutoChangeLog-pr-83930.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83930.yml diff --git a/html/changelogs/AutoChangeLog-pr-83930.yml b/html/changelogs/AutoChangeLog-pr-83930.yml new file mode 100644 index 0000000000000..bdc7a577125a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83930.yml @@ -0,0 +1,4 @@ +author: "EnterTheJake" +delete-after: True +changes: + - image: "Rust Heretic's blade now has a new, slicker sprite." \ No newline at end of file From 832cecdbb1118fc8b45fbc1d41a1a928d5be2eef Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 14 Jun 2024 07:01:38 +0300 Subject: [PATCH 052/120] New Slime Sprites (#83891) --- code/__DEFINES/research/slimes.dm | 6 +-- code/modules/mob/living/basic/slime/slime.dm | 10 ++-- .../mob_spawn/corpses/nonhuman_corpses.dm | 2 +- code/modules/power/cell.dm | 2 +- .../xenobiology/crossbreeding/_misc.dm | 2 +- .../research/xenobiology/xenobiology.dm | 46 +++++++++--------- icons/mob/simple/slimes.dmi | Bin 59434 -> 111204 bytes 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm index 344514afb76e3..f54248a21a3ac 100644 --- a/code/__DEFINES/research/slimes.dm +++ b/code/__DEFINES/research/slimes.dm @@ -44,12 +44,12 @@ #define SLIME_TYPE_BLUE "blue" #define SLIME_TYPE_BLUESPACE "bluespace" #define SLIME_TYPE_CERULEAN "cerulean" -#define SLIME_TYPE_DARK_BLUE "dark blue" -#define SLIME_TYPE_DARK_PURPLE "dark purple" +#define SLIME_TYPE_DARK_BLUE "dark-blue" +#define SLIME_TYPE_DARK_PURPLE "dark-purple" #define SLIME_TYPE_GOLD "gold" #define SLIME_TYPE_GREEN "green" #define SLIME_TYPE_GREY "grey" -#define SLIME_TYPE_LIGHT_PINK "light pink" +#define SLIME_TYPE_LIGHT_PINK "light-pink" #define SLIME_TYPE_METAL "metal" #define SLIME_TYPE_OIL "oil" #define SLIME_TYPE_ORANGE "orange" diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm index 4aa4cf72c4e4b..4864cb82016a7 100644 --- a/code/modules/mob/living/basic/slime/slime.dm +++ b/code/modules/mob/living/basic/slime/slime.dm @@ -6,13 +6,13 @@ /mob/living/basic/slime name = "grey baby slime (123)" icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey baby slime" + icon_state = "grey-baby" pass_flags = PASSTABLE | PASSGRILLE gender = NEUTER faction = list(FACTION_SLIME, FACTION_NEUTRAL) - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" + icon_living = "grey-baby" + icon_dead = "grey-baby-dead" attack_sound = 'sound/weapons/bite.ogg' @@ -187,8 +187,8 @@ /mob/living/basic/slime/regenerate_icons() cut_overlays() - var/icon_text = "[slime_type.colour] [life_stage] slime" - icon_dead = "[icon_text] dead" + var/icon_text = "[slime_type.colour]-[life_stage]" + icon_dead = "[icon_text]-dead" if(stat != DEAD) icon_state = icon_text if(current_mood && current_mood != SLIME_MOOD_NONE && !stat) diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index 5145c3cc6ed5d..571bac86e7cae 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -20,7 +20,7 @@ /obj/effect/mob_spawn/corpse/slime mob_type = /mob/living/basic/slime icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey baby slime" //sets the icon in the map editor + icon_state = "grey-baby-dead" //sets the icon in the map editor ///the color of the slime you're spawning. var/slime_species = /datum/slime_type/grey diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d7ad6a6b3f27a..dc2b4e9812a03 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -464,7 +464,7 @@ name = "EMP-proof slime core" desc = "A yellow slime core infused with plasma. Its organic nature makes it immune to EMPs." icon = 'icons/mob/simple/slimes.dmi' - icon_state = "yellow slime extract" + icon_state = "yellow-core" custom_materials = null maxcharge = STANDARD_CELL_CHARGE * 5 charge_light_type = null diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 4053bfe7fd169..75fabc77cf153 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -84,7 +84,7 @@ Slimecrossing Items name = "hypercharged slime core" desc = "A charged yellow slime extract, infused with plasma. It almost hurts to touch." icon = 'icons/mob/simple/slimes.dmi' - icon_state = "yellow slime extract" + icon_state = "yellow-core" rating = 7 custom_materials = null maxcharge = 50 * STANDARD_CELL_CHARGE diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index f06665c506e5a..34d7f4d507a46 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -4,7 +4,7 @@ name = "slime extract" desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey slime extract" + icon_state = "grey-core" force = 0 w_class = WEIGHT_CLASS_TINY throwforce = 0 @@ -93,7 +93,7 @@ /obj/item/slime_extract/grey name = "grey slime extract" - icon_state = "grey slime extract" + icon_state = "grey-core" crossbreed_modification = "reproductive" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -118,7 +118,7 @@ /obj/item/slime_extract/gold name = "gold slime extract" - icon_state = "gold slime extract" + icon_state = "gold-core" crossbreed_modification = "symbiont" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -149,7 +149,7 @@ /obj/item/slime_extract/silver name = "silver slime extract" - icon_state = "silver slime extract" + icon_state = "silver-core" crossbreed_modification = "consuming" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -177,7 +177,7 @@ /obj/item/slime_extract/metal name = "metal slime extract" - icon_state = "metal slime extract" + icon_state = "metal-core" crossbreed_modification = "industrial" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -201,7 +201,7 @@ /obj/item/slime_extract/purple name = "purple slime extract" - icon_state = "purple slime extract" + icon_state = "purple-core" crossbreed_modification = "regenerative" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -220,7 +220,7 @@ /obj/item/slime_extract/darkpurple name = "dark purple slime extract" - icon_state = "dark purple slime extract" + icon_state = "dark-purple-core" crossbreed_modification = "self-sustaining" activate_reagents = list(/datum/reagent/toxin/plasma) @@ -243,7 +243,7 @@ /obj/item/slime_extract/orange name = "orange slime extract" - icon_state = "orange slime extract" + icon_state = "orange-core" crossbreed_modification = "burning" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -263,7 +263,7 @@ /obj/item/slime_extract/yellow name = "yellow slime extract" - icon_state = "yellow slime extract" + icon_state = "yellow-core" crossbreed_modification = "charged" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -286,7 +286,7 @@ /obj/item/slime_extract/red name = "red slime extract" - icon_state = "red slime extract" + icon_state = "red-core" crossbreed_modification = "sanguine" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -306,7 +306,7 @@ /obj/item/slime_extract/blue name = "blue slime extract" - icon_state = "blue slime extract" + icon_state = "blue-core" crossbreed_modification = "stabilized" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -325,7 +325,7 @@ /obj/item/slime_extract/darkblue name = "dark blue slime extract" - icon_state = "dark blue slime extract" + icon_state = "dark-blue-core" crossbreed_modification = "chilling" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -348,7 +348,7 @@ /obj/item/slime_extract/pink name = "pink slime extract" - icon_state = "pink slime extract" + icon_state = "pink-core" crossbreed_modification = "gentle" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -376,7 +376,7 @@ /obj/item/slime_extract/green name = "green slime extract" - icon_state = "green slime extract" + icon_state = "green-core" crossbreed_modification = "mutative" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) @@ -400,7 +400,7 @@ /obj/item/slime_extract/lightpink name = "light pink slime extract" - icon_state = "light pink slime extract" + icon_state = "light-pink-core" crossbreed_modification = "loyal" activate_reagents = list(/datum/reagent/toxin/plasma) @@ -424,7 +424,7 @@ /obj/item/slime_extract/black name = "black slime extract" - icon_state = "black slime extract" + icon_state = "black-core" crossbreed_modification = "transformative" activate_reagents = list(/datum/reagent/toxin/plasma) @@ -445,7 +445,7 @@ /obj/item/slime_extract/oil name = "oil slime extract" - icon_state = "oil slime extract" + icon_state = "oil-core" crossbreed_modification = "detonating" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -469,7 +469,7 @@ /obj/item/slime_extract/adamantine name = "adamantine slime extract" - icon_state = "adamantine slime extract" + icon_state = "adamantine-core" crossbreed_modification = "crystalline" activate_reagents = list(/datum/reagent/toxin/plasma) @@ -499,7 +499,7 @@ /obj/item/slime_extract/bluespace name = "bluespace slime extract" - icon_state = "bluespace slime extract" + icon_state = "bluespace-core" crossbreed_modification = "warping" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE @@ -535,7 +535,7 @@ /obj/item/slime_extract/pyrite name = "pyrite slime extract" - icon_state = "pyrite slime extract" + icon_state = "pyrite-core" crossbreed_modification = "prismatic" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -562,7 +562,7 @@ /obj/item/slime_extract/cerulean name = "cerulean slime extract" - icon_state = "cerulean slime extract" + icon_state = "cerulean-core" crossbreed_modification = "recurring" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -582,7 +582,7 @@ /obj/item/slime_extract/sepia name = "sepia slime extract" - icon_state = "sepia slime extract" + icon_state = "sepia-core" crossbreed_modification = "lengthened" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -604,7 +604,7 @@ /obj/item/slime_extract/rainbow name = "rainbow slime extract" - icon_state = "rainbow slime extract" + icon_state = "rainbow-core" crossbreed_modification = "hyperchromatic" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. diff --git a/icons/mob/simple/slimes.dmi b/icons/mob/simple/slimes.dmi index 922d7ec8ea88f9f51e5f0c85749046e288123f14..92c8b82c8dbb87f976384e6ba82decb3528c7339 100644 GIT binary patch literal 111204 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 FKLE7c4X6MB literal 59434 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%0AV)VhsFk6T(V!?WmtxhG;;z_-7 ziwb*;@eYb&1IF+5$a~jewVv1vl;j)e8Ru7wzE=%SWK_CKzzlknvS)u*L_U_ca32ZJf{`Znuc+K83jOsWV*c?}rk9pZY?8XJFU zfP5TMq_934C^#NvXAAo4#L2X)hNgPC?@sVHXFoPu#32trqTFSkX4rOO3G!%+g-QFK z3P*S7Zg4QoUNadvo>bkdV0(zO=V3^*uu^KV2c*#;{;>8c%lqbaiGF>99sT^ws)=${ z&vGszsoHcyg@00~t@Be}DK-0Qj0r4GIfX9Rt!S~nG#S6H1B+s=-63;AiY&^FEI^D| zqxMpzxvW6*xvX_(I*_PC5t7oeK=%BrCYDDjlMCQi4j1Yu3dPqyS=nXM`X5S$To4nNppvkjv{gaZ6djXk>L|ao>KHygr^O7=PFw%aiYby^%K>&z>rX!;sdH!*dEx5dm zxA~}UZ-bwybuWJp&;&hEn7P&{KdH}a`f7S62}g?|Cj)h6@I zI;l%W6wbfZ%c5plzYWJTNl@Lq|80Qv@b^jpN+5qO z2X*h)w;C11&PwROXx}rzH;&O!Zs`_x0Gg$O7=&b~@1*U^ z1C8amxn9%1=4)B$+vO<$fsGk&zE_I@$fMe?G^c2s`%&Db!*4mouQ9uLHX*N#KLaHJ z`hiuSW50NRDz3=XVc_0fhY@|mUwpdl{qD`wE3sXW9#3d~{tjII+U#x+-TnF)6sNOn|r;=ZDFU#7qdl)TBA zgK6njfrxmq1Wp0u@1hW?Ya>WhRFyr}tGk_F{onip)mU3TwvUxTY`q3#7vfGRUZyzY zCvSC^r7XmOdaP(k?yaCEUR*H^?B{-SV>m0EdDJ&?0VSwFwMi3J+fucS3`KKr9lZ;L z-J%Sb-emp_*0-_`U=6qdI-&+~>MOCEAFfu#vr#Ox$PDU|Q$TAyQDC;ew0B&f3+ z6f7IOszCXelL|NM@D4R#{%!M&>l-Wv*5$W|n=#waj`uAEnSqyea& z?-im!LR_`h)<@OW7E_@!zsT9|Ke*SSK>SBIkXCx->i5%N zR+97eg-p-N??2MWZx$6d60OQmz7Ea^;cXxfF~D3+2mrO_((g(@JRrI3E@WNC-?+j^I}fi37tKKz6`m&>><+x3q5oHV_Qq zi+fqQ5KHIjDPx3{Imvr#zNxIfEli`)yp4|eyqTJmiU_A?mCl&&aFu~*y{WAHuZ@s# z!N+R6Q0n9>E)q{2d5%{lD*CPiSBw9XoEHHoFzJqvgdYG4dokFOm3~T%ri3oMRY=)g}WjT6>gi@Im@8c?kc2KDPB1S4uUA_tE6hPfVKSg_=)=uLf6gvG!7=T(;agw>s5g!=e?zu0h@7rK;>B-2b>5h=dY`} zOV(i>;$@wocQJHy6zs6r!XDH4m&0H+{lS_(bQ}q0yJMR`{^5?2IVYgp7}oQ5b>NJ< zPs4_h65N_QR4QzAcL%(;9z~Ts|8>@bHd$xf%{6@a-*HoJJ$~J?u_gUwvvj@<%P$ke z67Oxbqm<-i3OcdrX=NOd$K_S`2LQQJm!~$ zF~OM#ZtO3M$HRSJa#TX(f8XC#sIXx$JT`xSm#pzb`k&w zzrHboyFURx|NV5Bi~@f8H{who$^Z8Oan7%zzV&o$N&k3n!_giXVcXM$%emDe*r?6v zPpt&k% zN;!M=khMITayiB&p%}1vth1UxN3C}Y4H(~fxV5``v+SMN*zQXac+Zw33k`VP@nCG@ zoY$QzTT5=xcX0>uUeULMioZ%2y_%ik8gqWCcdNfYt9GmK{c19*#=3PMB(*m7Ajqy} zZk`VU?MPko-SjTE7u)pTd*LvbHVnyf?1$jW;2G7O` z2ZH+|=0U|zm%W5D+F@H={pzxSa5#*>#NvsLu952+GjrQh4Kaco9$%L#DWJ{Y%n z_TOI-9OlpTiq7BJdTJiNI5B{7`}N<`{`gip^i~n-C(6Hb92~+^`n^G;@qNJYR5flN zCW@ETOIv8;H~Gd*W1Ag%+y@JzgQkkC?OIdhH8N^)$_FmaMnKM1( zVSTg3{w0f$S7Si?+!b~ZK#JJE_%7!ASH!Kn`juwjBwke?X$NwB z-&(maNOu!-+N|)z(K3!{pKnpHzv}al%;Q>M4#hAJqQ{mrA0-G}#&^Y#R8DChyr5i& zmyikNMVAy__WadwjNjK@b!aA+fdXlGA+hO@VN|dC}XUuJ1f6 zm@9Rz!LETiL|R=Vn=rkp;ugB|{becImsqF>fWP%d_~0#T(H(4ZSi~Tc?>ZyLxt;VS zmd=W0yCvbh#@L>V6DCbJ>2*a%V7P;+x@CyNkCk=_;{J{%F_AmHmAW10lIBa}4^AJQ zju(98QRcRrwlRN6A}6&pv`D`Csv$oymqV1|van*=C<%>B>mVm5y?wOC708SF1+(Eg z7iq0y&F8Nt5ZwQnX(;D1Ayw-joV1{xeb%z^Xn_Q&4eA5@V&72wE}$=-Rt11^dX*Q{ ze_^}q0C4L9!DD*wTECLcpCyISPs;|-r;g`KAvx8xj11x_pLgy|u+P7GASC@~j3cbOqVK3D)6l*@_|pYIWcjLK-cBT~ z_r2!14>Wk`YfOW>o0ycquL}{tTrREH>&SntGc4<2(1yC8#>)<_regwn9INAwoDZU5 z9M}4DJ~Iu+&Z5gnCtnSAxO}5cmf^L?2i?jx<`qHrtiUD)qLe%&uq%icT}rKknC%#~ zBYrmd5k?CEI%YRO3IK_3_8*7ET3d8QB)a~!b6aq~3NgfY~PNNwMi+Q2K3 zR(WzydA+_Cdu*ztgqfO}I&ioWaItUG;!CZgUi{wf1QMve&tpvM|V zmBLTcRLctgO#D=Co}_5CSSGQrp9HzOLa|b~**<;2mci+m+`;!T?LwZV_>TU30?+P@ zFNB3F`}gm@wN*bZL#OLw#spnn>t|@dj@)-w7mT+62~FppBv#e7Mg5CE8J+&@0;d?1 z6U2f34AKOoR2MdGM&-|j4$9=_YwC276VmyhTuTShmEMzV{$4NutwvGF8HoB0zr;Et z^+9eG{0W06i=>BNV`-mwtoQT=pd(LON1~VGQV|b4^sC6(RINW0=l;1U?lZ zd;*NhU3!adsQ!6E+jiS-kht99 zK@4MT30a{bdukC@fTLD_qG#X*c#6Tcu!|lQ8UkQNN41vizi?dMX4>hn5mM>joigj2 znbXiJI;}kntVsU+@nc!_x9JC*{R#J1YO)%&0fe5gxO zJv*R}?9xyPpd87QoLi#(qB`(JSkrYPviJ`T3KAc?Ye;3!9Gk&nwoQJq{wSs?-I}RR z*)$P**zO7HNfJlXy>ctFdK*DNucf{H!uzaL4vk)l{X%*N8y;rEP3CxM#@CULbfox9 z#4~=)ozDp9k7-Kx0uoGH&-V#1%gd1G&qXitdJdF-r$_72B}IwN&~J z`}z!A^~Ks4-qS^|+#gl?G%V-S3)bG|Il=29Rdk8u) ziE=H7L#rtXriI(e8gv>tqQ1jSIRYjVB6yZw@8>QYVUczty^z-o-8!zrL1w-S*QXQX zMlTlXH(tX79O7U-;67tmYITlh25r>*rTYc%pRxo=HFwVrN3~I|y!sT*@`@t0onTQC#Q#=yoFiT_kY+ID*+Yqr+1FJ3NKwqNRj&(--Ewz77f&0_ls}e2M%M6e>Qb;k*{oz zEPX4^{V{GL4S!2~$m9dE(QJP)AVJPIB6ZcoQGwwJ?wbwYCjf2>G0uh`d)IYZkhQ_x*2|!%+>zlTUfL2$Zv>~?X zBcC5^E9@yKykxGjxI0?#goqULF_l~&6Zoul8odjtssaS&PLrp^QGT0hKDJ93TBonY zP8KjZ<;35;{>JSTw~7pkDgrXan1?o#?Gqpp zq{#V!8POv7=rDHLcu}!~SGX2OY4xo>}RcoRw+;0x1~ZAK8~_G$+jLf$?$G<{EujXOois3k9x9`y(g*Bl1Tx+KK-C_ ztN}SODQA^P`&9HxS5Xm@CXG6owOhr$#XXr^$Hau2#p>pG8AH`tW}b}V^s^{?7Uj;R zzG7ar<*OId6&svZGcE6G$YAPG+Bv%^Pv%iW-RkL#fB6+sIwX%Oyx!i;mzRgG)SIx42M6E^I?LL9`a^<<-ivQTU zVCctC=mx`2lajBsTtP0hQd~U6zve7?azuiD3YVp{D+JaSg&k4x>o0qR^ z8AoZ!y?Up(rdmx*E(tKG-!V#W54R@PD>qw?bca+|ef-0rE}P{bZyflK%AS3?^p4%@ zRg^;42a`httDT`S_9eosSsU@FrK|fDk`KE`5NhSG#=%fmURil2RRLs})oN%RZ!scaLQ!7QIfZ*WPR+nPOy9kLv#Eym&mn?e_ zp*`a}S|eL_hLTAKR- z@%;Ut<=B_`e+>VrPNo(bkA}8b_{O+Win}@vPTjw?)fGo$a3`p{LW&Bs&J@xoG*V%E z)VJdgoOQ<+Fl8!BN+M?}%xHC}e(u zAygi$*pJxYtol%7nW^g+%#N2wx#2Lxd!h~^hN!ZetTXC@J zaLlRdUgbwhEn6#R0YK!bkJPfn*}RGGaDWtH!H^(%Iz2Z*f=LqI!}E4h zP*kaYiSU7KbgON~B$R1h9rRZjcG4f(K?Rs-wOc+0X4o<87!rV#(VD-Q^6+)PvrvB} z{_IXa*{Pn~Ux}^k0lYEF|v9&+&x)GLY5 zckGhKS&MRwD{8b<*7+PrgrAe&SzOB*-qKUX)gox-f;AkwQ(AA8gL$f4|4e6b^l^zQ zfWy2r8C`7Wg*SniZrIxRD=8|LPQC?zh^+d95+N9CS(0AE2$~TpbGB}w!ssce^XfgZ z;k4m+%BjI!$pKw2e{_DMNb9$w9a`!)_Vz5h<@fsvVA+d6Fjk-~T)GcFF+sEppZ z%ty&;=8VPM?*bl$J@V-_9ry6lIpjQAbRTJX_SJtAUUJY~N1aXnyw7>x;iW$t$xn-d zTkl@|vonxcf*AkB0y2GvEAaQ%h+gePo4yi-PV|P0JvR%}zvb(i5@kR&iODBg9VdTE zc9N}$utr&rA-XD1DnN=?L}Xjg*Tkm2S^sXFRs>(}yETK8c1v2(O&>nUX0Pp($ipb` z8iV?&z8hu8qU!I5`7icV=V)-`*w*nD$Hu)W*_ewwXZ0`|q?`@!sUCdsUpqiOZr?_6 zoeVu>#jsYZXqXb!Q+!!A)OY^SB#b4fFEYOOQ`@itr@EO#6!f~Lzo2F-Q1_Gs#{JY= z_koX5)6cOfHr8&8-7au!CxD5-^7W7YsNp=6jIk2gErFHs8$A{1*Sci@NP=Tksd4ae zG{w&RA(st5nl$s7uAsJ537{PkD)_D_kDi`(4%`($I{Ju?{MPc6-4GX7v9c$kIAg^^x>X?r}zqWN7yrtjyXS0 z+07q<&artnLsO;(ANj9H-n97F$G|%^0SVFZp1+#(4&Ozr%2_21oCu~L@W62IMFY6e zeGp+OqZ)UMI|uOH0@skNB?ZpuD%Xs^dk^NxID&%tp4{Gi%&nYv3xvi%vlS7vO)(ea z&mLbPur4FvKE(i;()TJ>Wb+~d6o^rZye~*BI(a;b62dO<6=neWdJxdOTY^AtLpTuV zqO{#4t_EvKul;)Hhvd7K*=lmd&q)R^GERBDm!F}-=w4IJ#{@4iGd!Y4~y?vaX6i0u|vDaV1=D{5-v)gH)QbT59^J0<#(Rn`2#4JU+ldM z>(Fuf4S4oTSy$=mVrptdrBCsvpum|l+~+yj5$%qdsuS&1${hN<*d^Cg@AFmoI1RA? zBhQeK$leF}>wk4Tnxgl@Q6l~9@p8Pd(QPnxx0nbqE-I~dz4>~OOUhH&@GE~o^q+u? zBzi4<`!Ic1RZv)?cOt8Qpn#``ek0j+A2zeH&z%LOW&JaVb{1ZOUKH$01P(NXkKk7x zTW+J*U~Duk=K(|STW&exj~nIh26yDhs2>5m;5Ww3$>uHKB~Vxl*YZk zx2bfKS=pPWV#r2qe_#t7VZ(T{jhm>TTXR-R_oH%(De?Bt>`Z@S;fPvWgBLe!@005b zo4QMO7R9gk0*g2)^uW2V^C~rWho*g8RmWlb0cu>Z-}@~=wTeUR_iA$k%=5=G3+&(^ zFQzcdUz3TX%8UlynpOzaQ2T&YJW&vTj8<9}?Wv72G{r69{qNzZ_)l`rw)uqe-jsyp z#Zp*I`>}M}@U}vQW-Fe)sl))8E|4GkUh2-+>qhj=UOodvcO1(y=Qk(4 zV_R3%ZtViye!piUc>R1*P#vfXwGBUZL;|C!Bj}#3VlgsOzuXVaa{N-;U~)}AUfjGP zUGi90F^*m(>5f$&(+>rVqdM8xB;i+UqalDj{SylHpEv!}q-GiUBn%W1wxfoZN6PcKOq3ZOc`DQ1 ztoZ;86&zr}yr093K?5jy{GTU^$L{@lZQ=(WmXrnZF(`)G583>BPBPA=oO4;va38YJ z(!w683H8m#7M+s+!lLZ6f{qNjdEoPj;%a=-?UZbvG$xr@9JDV`R{YomYTG?K`uQ$M zz$^OV)sRAM#2hytXR4PuUCuEn13LlTQ9m3vESy+Jd&inmDd=0A0%Po#Ya5ZClA1HF zE4u|Q7SRk+uW5a6eJOVP`Mu?AgMD|}4#U<~N3U0J57Sh_b&O&3gjrMyw_hlxD3{f< z7-dtWWV4+nZAuls(mChbY@Lv}A0-gTM;7gxW_$p8h8y%7N_3etXq|SENI|SA_=gsl zwO(*xF7KGR%c{*h>?Qv5i6UtKkq|TSqk;+d?+R!>c(EZCrko-r7sr!R6M%{+`;sS+ zqU77|69VhV#(iC`624m^(R@(q9qmYQ_9Adn(BDl344(x7lE-T2yIg z1HI3xU&LXEcBEw16OO>rO<47s8C{nBCm=*IGK)7I`NVVCDZ*f5C z#AVUG)2JcDV&38zLpx*QN27|QPrR5o_*B4;p97M)C4EdYHBAO4e@2}@S(XK}<77n2 zi#`J-4B;C@Qgx@26|KG@)Y{b&)+r_c)?o{Y*T2MmBmJ~c?Falr_#x4dG;_|k`Sd_Z zT23LG9R2YUsBNLH!Tz&oEpot&Zy2fm@hN(X6b04hxZ!?q>S&b;8xNUE{p#-sNI(;E ziq|ym4w^jIk(`PVV81neo2M>~(yk2GG$~ymGmodenqPQs@L(58D*7HQm^8BndoLQE zk#!q?dRH0Ox((*^CwMEf$e82#e)=IdJw?eQ&QOw~)mZAUu#vWJky3i8`XBT#J?q7A zT`bWBSkR2t3Mc5FmcPT;YS*CaJBV5PFPkpH=+Z*JSc~y}N5#oXa2tDTg*gExwjwLe zrHp#g#*fAHFY38KHl5Kh%mp6}iy)KJbvKmWsyPng=){aluS%x`X4lSpM@vJa(wJ>L zzFMWH-DSOyPAda9|Hwe7?%ZTnyc3?xKCi$}Q8V?p9k=bwx}MFE9U*1zE!q-o$rOVt9G3Ur)R5LuEN`QLY&Ay{6k1f75$%eXO#ces{LZZ zmp-hU-_|NC6bOUCYAP@+fq%};!&1R0U6xtXTFc|qJqb0M!2D;}gkyi%tc{81XLvLu z8?tljO=P)EZLYVcI?=K6BmJ*q+w@27*)e(Sqlf`_IQ%ZV z(dAb2^DF1l+as5Y_{&^LUFv}8aY&Rd#@{D8THBx zr>v~f;Q&yvfLMP$gIk~o&BwbmO^Tvdz>}iHV*W|ci^3}W9KbzY5~ETeR9h4J7_Ihm zs~71UV3`)yo|J>lwg=a-+Yu*W6Obm0PpA2+UI37@jp-X|!X|Bw?6k05bngVbq&mGi zYef6Gyk0~=woNs_L>5VCtqZ@8J;ub@{pf$|F|Rn-*OU1Ht3_tm*;+U?-5m7EnZH-_ zDc}FCbFure?!2M^?AB3VJ}u(oQM-_a;pOD}io&4LCi*>z$M(@f4oUB^E`JU?rSgaN zQ*FU+_%SS*{*-b$^P43%j_3MOvfVS+Zhi`cwrkrBqP3;`{WYn01%g5kavyx(**ewU z#%nxcXp#MXH;J)RduYJ{J#-|U_^_n$;@NiF!K<^Gwug4NM^UqTugnWVf%Nn52v7Be z!8Ngp>o1$%HuEV*B;deNB5Mbm{1!ia*zKNJGhj*KUbnW)(CEO6OShLyqgQ-0TCQIu zx^8G;1x(rG8d-wHxD$u;eQJTGe$HKupXhwg>R}|OkC z@>vRWd8){=S>v5zu^bgWwvCi$EIZ6E6mH72xvyC@cCq)}ro=A8C6ovpwQAFC zD$n|OGrFtX_YhMQ7ZaqOuJH2Xo3vNK^3(F`xTno%FN08_f<=Q&=D^ZJ%Oh+DV(fqv zp%7w`rE2V;vY>8~wM~b}H1cqdOs7fy=Tmq03Ye0(gdp|WB0QoOud@oX3NL@RvQwhx z*4U>X7PKkWCfLJ2>we>ZgPEnpDuz{xtrf#?TZBC-Lm4|0E(Ps_)>-K(xQ2h0a}n`f z|!yg$GC^j<4wJ-15JAYy0iQPPm?z9t3>0xfxe_SliN{#= zLokOEAIi+V@0vR3>gSpwBh^^b9cOGH#;_uGl$dstz87$f`}X82&mRpUpo$qOeGEKQ zpXCZ^kUJ}sUT0Ox`Br9PTA-fOKGyZK(EQw)pC`>j7}mn~4X1EHDeTMTQj(9pVDDpA zU6B75^0;8~ZC%AFf-x+vo>&Fy0+chx7hmoN^kECFX>ZsF)#-j*)1rk6*`@0w-s{Rz z9d6?i&eM@yB-u!%GdDe@PoH;r~rki~lC>Mwn(j z)?bQ9i}>Z*32Hib)!oI3?uWjfc9^!TJH0!ULvdfSAE})eVCjBN6o}3a^ijRm1Y5_P+@d|)1-e}ng-LFEqY6S0WbsN#?{BW@udgEf#scL*xRuBRs!*;) zXuzAzYDCv@Q!Ck+&kf2qxv;u=>;SKvYW2T-vzBCu?!ent?!TUwTZI0&uHukAU#Q|4 zd-*xFtcz13{aWRr&+^q^OlJRZkTD)mEdr{~sXd<88-qstq>Tf1+haY5gRLi*a`1->Df-+2Uk5y1=|o5Zu=ngisK z!H(DR53O5^D#L4w-jIB(Jn!XWrX!H^FjMaeOdMacmtl6ugG0m!PA|~;vIdU&fRI;> zI5;@^A2lYdb}mZh5p8K0yKS#nnLsH#c{H!dSYP{M`Tm-nj~ zWo>U+PdeAbt$SGJ_}D4B-SyQ`amUTKhJ6?62Jg#>=82bsEmvJRbHD-42H9*ewd}Rx zhLZI7m=69z$IJdSV4)ZYwMt_rpC|#y!v%Sta{07&;xLQs{0`ENm&a9NY$?b}R>A`> znO2E5Go2hKASEot9{LlXMTK84#|HR)@&&h{${=OE0f0pMmW8`2f4#*`laMWffGIMe zdfu1cauU#4^Jv=T6Sbd>4H`EDLK$pC9Mp*tX;~vA3 zJN^-mCOX2)Q-UeRS&i1RjfxwC_ylmLk+vO2FWa*T>T#6LIBK?hwE@kP+4(+)=YO^I z2ucZzE>SD-2H(61dh9;}wHzv#!ay?ROEp!b57MGO0~GlPQ-3UyUVqv&9g zOL=)ZnANWmFy3-A6WU$wq1jS~!3lcf*WM*!f(ewg!zow_ITNfP^*cc@@q2PysZR1^ zo6{`so^A?O;dbKi7O*$0>mUoh8+%YAwX`d@E0ma?{d&;qkb6HE3H3W0u5Qo7Vc9qK z3D(p;4G}j6JfT1sP2{T5bhj2G4Ok?pzwJ(bh(ZuN#U65hN) zElo1cd`)?z{(WAN#T_DF`Yvip2{9#7VffuVvYZ+Ea0YA>I0W_b9O>Eo4?Xp~cN${XvBS*_dB4dqw26ul;k!Ok6Z z^BJF$6=S%9#ZUH&OVW)AiAZu2VopqT&rCAjY3u78p=uBxo$a(9@z*S=cO0nY?51N| zLjsGkwTkqtQQ7rt3xWyvVPd?m#l!Sv5P7$f?BRX75VrA@-HxJ9d4w&+Prvtdw5~(G znW%|`@#Q2)S>zNj~+-jXY)^#46n-i_WRbIt?+Hivis=1rp^gL#|qj zvxNFFc~Yjp;EsohSMVzEEzlp6c@APbIV7-1=r7b?SX9v5$l_^vn+w8)-#;g4hGXoF zVK4wl+Nz`yF$hV2w2szaE@}sy=2O7QtfA*!E{jyt5bu9l@2U(@^uW_)Drk)dg5sv`^-GdR z?yk0h-dCqBFbz6akdFf93}+K=++f>(2I4qQBJUQl~piH#lhzMJ~s z&~)|c_&#T@gY9q?8%BBZAq@R?7o|iiIDnSP)0D)n{J1$~qxKuK>R$4jQ&Pj-r#VbO zFIm?#PIrVcKp#no8a}7#v;=k*j6JTk`!$Y-b2T%;;2UBCdODLaFO&Qrf~xI(S=J1g zT)Ve|)4^_oGJ4mc*zoLPcdf{~!rFTVr#HZQgUPwOUe&SDX9qI7qQ;^+QIe0839}zA zoRU2f<#%IZEPrY>^2(5r8je*bZYHR#nNK(L-ZyvMc0U2ZF>TJ5e|o<+Rm+>QvEg2j zHhR)j8BG+Am?}A%sirrXQcN=7UbD}X4f0KB(ubwsJH^!K-3Lqh-nQw_7>ad0MH1x` zeoNhZO4%-zkzL%9;_&W=1{bF@AtLvdvbXS;uKobSjI9{&i#m`Vp;p7OxWOei9k*mb zBS3-ZxXrBl_q!eRIWpl>_VL>U$z7~$zjCs8pRa4s zW1n9-6(|T1vOW28-ctebaSi-@oIv_!|EV3mTKflH2B0nseJcio64h zZ1MU6-X~<)*}l}@gbwvTc&Xi&AxG`Ucxjt}ZIdse8R4j4ggre64@HnD)U1AZANbNkS?5e6PPE}7mM;8*qg*5-2^6ecKN(y}r=^BZJB}F8h4ll4ri`UtG3b zrziqI4SzHXk>@wu(xYEDPq;C0Ivt&zKgi;88+%$JDoRS!RxF#`%*UA3Oy8338~TBm zmn58de%yIh;L6D!<>hg=Tq)i|6}t-<66F=+?qrWwM8Z*dvkJ9v|mPg zrZFceyq;#9GjY`9$&~Y_Ql(a~emwZMWD6Imvxc9b=73A_{nMza%rPa2P);hXh^}fV zh2aa&hO`pt%DD5)#a;DRvSK%d`WB{~VWW|SEBMl4(>J=W5)b>l8uVT)2Mos6j9;b; z@$CCVNFB+haL9WsJi@@N(WLfVpsNnH2JOh>J$-~3a44>xFGHv;qilZdHmISNx7ViH zpPizJ_zZjan=l%@7_sreJ1^;F)F{~Cr((2YMR97RZ-)C9g_!q){aS`8v3K^z4m=2IsWU#j-MuB`$dd=Su;JLWw0;W47d!okNsc3RtQ)D~ zYKBLyrr7@*VF6#ausUFJd`oiY23Tu3Ny#p|P<2`})C=iQ&3u^BRoSs7mO)mDpT_fyEpTW5JiM>dRwC6Y>gkP5deUNy3s8JJxTfbUBasjIKn+Oc2iIdJF( zym)+dMb`f?Wo6jy?$o#gP&chmx9acbqA>Nv%~}055!(EW5yTZ%Hd+vB;}?!Sr7$r2 z^kVWDKO2z(cfqkeX?M;NkWVfu7+X5jaXQ&8hDo-DPPFy$i@JhO(X17cEF2cRm8Rb{ zME%j!z^r&ygNKYNlYVz4AFO$^WR|r{p~Tq;5`Af+jCk|v-wElgC)%T>`A;->HN7SK znfwAtXTc!9uT^dJT@0v~eZ{l(?*u1P&P^!Q$*!m;TH-z`)cu9~6fFHxrp3j+y#CZZphx}e zd6waulix*#VQg#V%v{%o85&(=1x>69@$_;pQZ6l*5}8KcCDi*oB)__2xDoUHkp!Q* zqhNjR%ho^NvN#h{1Ww}2d=Gf(Ejl)lJGv_8w;6&db<6Z!iJ3&jG1%Jdh@lF}3*Q&n z<(~c%jY~;#x1C}_PWK|tS9q#7hPFzXg0=D8ldhiH}L5yMBYm696m+Uo*6GmSXyu-EA>Q2tuNyt`#tue9CP9$+LE>_ zrCM!SHGTrWH-6Qwoa_})8V`72XYYxT?jNYOUY!kSzExnbQQQuXe_m1yc8!Dm>)1K} z_lT|NQKv%mGDM~E$_uMK*m{-m4fW}6611S8z#5L#0HRQA>7){h%@~}(>!w)S>Ac8n z%Pt}YUYfijCv=LqUAHqrwYs&Q87Eol7wFcvU?H{P+~}5)KF}40w?@R_=fh8v*}Bnj+#PqNzZDbH)_gg;P1fxng-yjC$U9afb0!_SJ&~{ z#sU3verf|Pz&BOy6DxvF5YDg@_8@0W+WSizVC}a`K+!NnYWvU$YR@(b` zNemC9PA9)qTvOgfR`F=JzKix|8BYORea(rvc^twM%=DUU0#~liq9GJ~rv$LzKw zN2viICS&nC;ECgDuX9g(cDz9!gW`h56{Fms+-Sd0&t>S%Dr@4wxQgfMeA#ID*DLSO zJ!GOB00kI(xMSh;^mL`Ajc;x#kD_u66;R9A?g7)khy5lnfaH+3m55g0(MHHQL4xoi z(uXL76qj7=RH29Pt*r8^O9h?6Y$5VHs-SVO&U;{B;ZON=DeoB}7zWo`Gg1ZO!9p42 zhz@VDL|xsy8ZgYXt3_B17RTf& zW{SH?i7u>$Aj)Ho>i$6<2GMQTIZTP$O@FV#+T<4F&?o=BF)6>U)Ko>=zK>IV=i%3U zVw`kvYp04ar&-54jEHkw67WdFYZZIPXF;m zs;T7s|Ir!ge~pk~j_pr7ldg-82UHvLt^Nh%%tJOXZuT(~z;HsN_$JM1RQWbtwef5Q zUszZe)lrD{T`}a2Ga{g)v2mthd0|04Q^LJ5wpE{s+4IpDN+V4m$p^^!tiy!Q8w0?B zDQ~=4H8(d$hzNN8d?2yI{>_`M_;RI9zT=K�`BQ2cdk*G8zE-ss)vk-Pp7UxV7Dz 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 From 65369fc88fd69230f16df974fead73aa4b90cadb Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:02:38 +1200 Subject: [PATCH 053/120] Automatic changelog for PR #83891 [ci skip] --- html/changelogs/AutoChangeLog-pr-83891.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83891.yml diff --git a/html/changelogs/AutoChangeLog-pr-83891.yml b/html/changelogs/AutoChangeLog-pr-83891.yml new file mode 100644 index 0000000000000..2319b76bc1369 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83891.yml @@ -0,0 +1,4 @@ +author: "MTandi" +delete-after: True +changes: + - image: "Updated slime sprites" \ No newline at end of file From 373cd851d8840b2012ff3348a870274e1edab7a6 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 00:45:58 -0500 Subject: [PATCH 054/120] Fix mousedrop handling on some atoms (#83971) ## About The Pull Request One should really err on the side of caution when preventing all humans from being mousedroppable entirely ## Changelog :cl: Melbert fix: Human mousedropping /:cl: --- code/datums/elements/drag_pickup.dm | 2 +- code/datums/elements/strippable.dm | 2 +- code/datums/storage/storage.dm | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm index 128ae79099644..d86c615c6389a 100644 --- a/code/datums/elements/drag_pickup.dm +++ b/code/datums/elements/drag_pickup.dm @@ -18,7 +18,6 @@ /datum/element/drag_pickup/proc/pick_up(atom/source, atom/over, mob/user) SIGNAL_HANDLER - . = COMPONENT_CANCEL_MOUSEDROP_ONTO var/mob/living/picker = user if(!istype(picker) || !user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) return @@ -28,3 +27,4 @@ else if(istype(over, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/Selected_hand = over picker.putItemFromInventoryInHandIfPossible(source, Selected_hand.held_index) + return COMPONENT_CANCEL_MOUSEDROP_ONTO diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 3816d16097d52..7c426e921e00c 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -36,7 +36,6 @@ /datum/element/strippable/proc/mouse_drop_onto(datum/source, atom/over, mob/user) SIGNAL_HANDLER - . = COMPONENT_CANCEL_MOUSEDROP_ONTO if (user == source) return if (over != user) @@ -60,6 +59,7 @@ LAZYSET(strip_menus, source, strip_menu) INVOKE_ASYNC(strip_menu, TYPE_PROC_REF(/datum/, ui_interact), user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO /// A representation of an item that can be stripped down /datum/strippable_item diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 28ecfcce8dc76..9bcc0f03b7a0e 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -714,7 +714,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_mousedrop_onto(datum/source, atom/over_object, mob/user) SIGNAL_HANDLER - . = COMPONENT_CANCEL_MOUSEDROP_ONTO if(ismecha(user.loc) || !user.canUseStorage()) return @@ -725,6 +724,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) var/atom/movable/screen/inventory/hand/hand = over_object user.putItemFromInventoryInHandIfPossible(parent, hand.held_index) parent.add_fingerprint(user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO else if(ismob(over_object)) if(over_object != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) @@ -732,6 +732,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(open_storage), user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO else if(!istype(over_object, /atom/movable/screen)) var/action_status @@ -744,6 +745,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO /** * Dumps all of our contents at a specific location. From 81b75f724bbc2262956907df8390ffb4ce31b8f3 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:46:18 +1200 Subject: [PATCH 055/120] Automatic changelog for PR #83971 [ci skip] --- html/changelogs/AutoChangeLog-pr-83971.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83971.yml diff --git a/html/changelogs/AutoChangeLog-pr-83971.yml b/html/changelogs/AutoChangeLog-pr-83971.yml new file mode 100644 index 0000000000000..156f71a95b72c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83971.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Human mousedropping" \ No newline at end of file From 6fea9d999d7094a9cf4f857b1bd1aaaedd63e38a Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 00:47:37 -0500 Subject: [PATCH 056/120] Small playsound audit, particularly involving portal sounds (#83893) ## About The Pull Request I was looking at sounds (as you do) and I noticed this ![image](https://github.com/tgstation/tgstation/assets/51863163/25b298ca-31ac-48a0-9f86-c65a8becd532) These sounds don't exist We have `portal_open_1`, not `portal_open1`. This wasn't caught on compile because they used `""` and not `''`. So I went through and audited a bunch of playsound uses that don't use `''`. Only one error, fortunately Likewise there was a ton of places running `get_sfx` pointlessly (because `playsound` does it for you) so I clened that up. However while auditing the portal stuff I noticed a few oddities, so I cleaned it up a bit. Also also I added the portal sounds to the wormholes event and gave it a free :tm: optimization because it was an in-world loop ## Changelog :cl: Melbert sound: Portals made by portal guns now make sounds as expected sound: Wormholes from the wormhole event now make sounds when formed /:cl: --- code/__DEFINES/sound.dm | 4 ++++ code/game/machinery/computer/camera.dm | 2 +- .../computer/prisoner/gulag_teleporter.dm | 2 +- .../machinery/computer/records/records.dm | 2 +- code/game/machinery/teleporter.dm | 2 +- code/game/objects/effects/portals.dm | 17 ++++++++------ code/game/objects/items/botpad_remote.dm | 4 ++-- code/game/objects/items/cards_ids.dm | 2 +- code/game/objects/items/cigs_lighters.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/stacks/bscrystal.dm | 4 ++-- code/game/objects/items/storage/toolbox.dm | 2 +- code/game/objects/items/teleportation.dm | 22 +++++++++---------- .../structures/water_structures/toilet.dm | 2 +- code/game/sound.dm | 20 +++++++++++++++++ code/modules/antagonists/cult/blood_magic.dm | 2 ++ code/modules/antagonists/cult/cult_comms.dm | 6 ++--- code/modules/antagonists/cult/cult_items.dm | 4 ++-- code/modules/antagonists/cult/runes.dm | 7 +++++- .../traitor/objectives/eyesnatching.dm | 2 +- .../components/avatar_connection.dm | 2 +- code/modules/bitrunning/objects/netpod.dm | 2 +- code/modules/clothing/head/hat.dm | 2 +- code/modules/economy/holopay.dm | 2 +- code/modules/events/wormholes.dm | 16 +++++++++----- .../mining/equipment/wormhole_jaunter.dm | 1 - .../carbon/human/species_types/monkeys.dm | 10 +-------- .../file_system/programs/secureye.dm | 2 +- code/modules/pai/pai.dm | 2 +- .../projectiles/guns/energy/special.dm | 1 + code/modules/projectiles/pins.dm | 2 +- .../projectile/special/wormhole.dm | 1 - .../chemistry/reagents/toxin_reagents.dm | 2 +- .../spell_types/self/sanguine_strike.dm | 2 +- code/modules/wiremod/shell/bot.dm | 2 +- code/modules/wiremod/shell/compact_remote.dm | 2 +- code/modules/wiremod/shell/controller.dm | 2 +- code/modules/wiremod/shell/gun.dm | 2 +- 38 files changed, 97 insertions(+), 68 deletions(-) diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 896f6ec5bf448..345ff07ea18a2 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -172,3 +172,7 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_SEAR "sear" #define SFX_REEL "reel" #define SFX_RATTLE "rattle" +#define SFX_PORTAL_ENTER "portal_enter" +#define SFX_PORTAL_CLOSE "portal_closed" +#define SFX_PORTAL_CREATED "portal_created" +#define SFX_SCREECH "screech" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 17bbe2299f7e4..670d8d33fd81c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -116,7 +116,7 @@ if(action == "switch_camera") var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras active_camera = selected_camera - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) if(isnull(active_camera)) return TRUE diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 9f5ec0b3d645f..4c2f4dacde3f2 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -149,7 +149,7 @@ prisoner.Paralyze(40) // small travel dizziness to_chat(prisoner, span_warning("The teleportation makes you a little dizzy.")) new /obj/effect/particle_effect/sparks(get_turf(prisoner)) - playsound(src, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(src, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(teleporter.locked) teleporter.locked = FALSE teleporter.toggle_open() diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index f0b360ff1c838..e8d8beef854dd 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -100,7 +100,7 @@ if(!target) return FALSE - playsound(src, "sound/machines/terminal_button0[rand(1, 8)].ogg", 50, TRUE) + playsound(src, SFX_TERMINAL_TYPE, 50, TRUE) update_preview(user, params["assigned_view"], target) return TRUE diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index d2b0629a2b933..2373334491772 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -50,7 +50,6 @@ to_chat(AM, span_warning("You can't use this here!")) return if(is_ready()) - playsound(loc, "sound/effects/portal_travel.ogg", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) teleport(AM) /obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, params) @@ -79,6 +78,7 @@ var/turf/start_turf = get_turf(M) if(!do_teleport(M, target, channel = TELEPORT_CHANNEL_BLUESPACE)) return + playsound(loc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) use_energy(active_power_usage) new /obj/effect/temp_visual/portal_animation(start_turf, src, M) if(!calibrated && ishuman(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index d3d12b28b5f5d..a7aabee6f4d2a 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -6,6 +6,8 @@ var/obj/effect/portal/P2 = new newtype(actual_destination, _lifespan, P1, TRUE, null) if(!istype(P1) || !istype(P2)) return + playsound(P1, SFX_PORTAL_CREATED, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(P2, SFX_PORTAL_CREATED, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) P1.link_portal(P2) P1.hardlinked = TRUE return list(P1, P2) @@ -69,7 +71,6 @@ /obj/effect/portal/attackby(obj/item/W, mob/user, params) if(user && Adjacent(user)) - playsound(loc, "sound/effects/portal_travel.ogg" , 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) teleport(user) return TRUE @@ -79,7 +80,6 @@ return TRUE /obj/effect/portal/Bumped(atom/movable/bumper) - playsound(loc, "sound/effects/portal_travel.ogg" , 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) teleport(bumper) /obj/effect/portal/attack_hand(mob/user, list/modifiers) @@ -87,13 +87,11 @@ if(.) return if(Adjacent(user)) - playsound(loc, "sound/effects/portal_travel.ogg" , 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) teleport(user) /obj/effect/portal/attack_robot(mob/living/user) if(Adjacent(user)) - playsound(loc, "sound/effects/portal_travel.ogg" , 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) teleport(user) /obj/effect/portal/Initialize(mapload, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override) @@ -103,7 +101,7 @@ . = INITIALIZE_HINT_QDEL CRASH("Somebody fucked up.") if(_lifespan > 0) - QDEL_IN(src, _lifespan) + addtimer(src, PROC_REF(expire), _lifespan, TIMER_DELETE_ME) link_portal(_linked) hardlinked = automatic_link if(isturf(hard_target_override)) @@ -111,6 +109,10 @@ if(wibbles) apply_wibbly_filters(src) +/obj/effect/portal/proc/expire() + playsound(loc, SFX_PORTAL_CLOSE, 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + qdel(src) + /obj/effect/portal/singularity_pull() return @@ -126,7 +128,6 @@ QDEL_NULL(linked) else linked = null - playsound(loc, "sound/effects/portal_close.ogg" , 50, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) return ..() /obj/effect/portal/attack_ghost(mob/dead/observer/O) @@ -152,6 +153,8 @@ var/obj/projectile/P = M P.ignore_source_check = TRUE new /obj/effect/temp_visual/portal_animation(start_turf, src, M) + playsound(start_turf, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(real_target, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE return FALSE @@ -213,7 +216,7 @@ /obj/effect/portal/permanent/one_way/one_use/teleport(atom/movable/M, force = FALSE) . = ..() if (. && !isdead(M)) - qdel(src) + expire() /** * Animation used for transitioning atoms which are teleporting somewhere via a portal diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index ff77b0880632c..d2f2db3e1ac5e 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -16,12 +16,12 @@ return ..() /obj/item/botpad_remote/attack_self(mob/living/user) - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) try_launch(user) return /obj/item/botpad_remote/attack_self_secondary(mob/living/user) - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) if(connected_botpad) connected_botpad.recall(user) return diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 6b7996c0423f4..c43f32daacbdf 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -477,7 +477,7 @@ var/obj/structure/holopay/new_store = new(projection) if(new_store?.assign_card(projection, src)) COOLDOWN_START(src, last_holopay_projection, HOLOPAY_PROJECTION_INTERVAL) - playsound(projection, "sound/effects/empulse.ogg", 40, TRUE) + playsound(projection, 'sound/effects/empulse.ogg', 40, TRUE) my_store = new_store /** diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 62742b98add10..174a8fde5f7c2 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -827,7 +827,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /// Destroy the lighter when it's shot by a bullet /obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) - playsound(victim, get_sfx(SFX_RICOCHET), 100, TRUE) + playsound(victim, SFX_RICOCHET, 100, TRUE) new /obj/effect/decal/cleanable/oil(get_turf(src)) do_sparks(1, TRUE, src) victim.dropItemToGround(src, force = TRUE, silent = TRUE) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index b87bbda2841a5..0dc69cb9c8117 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -389,7 +389,7 @@ effective or pretty fucking useless. COMBAT_MESSAGE_RANGE, ) - playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1) + playsound(src, 'sound/items/drill_use.ogg', 80, TRUE, -1) var/obj/machinery/porta_turret/syndicate/toolbox/turret = new(get_turf(loc)) set_faction(turret, user) turret.toolbox = src diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 641dce6cf4c7e..410724862f3b5 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -33,7 +33,7 @@ /obj/item/stack/ore/bluespace_crystal/attack_self(mob/user) user.visible_message(span_warning("[user] crushes [src]!"), span_danger("You crush [src]!")) new /obj/effect/particle_effect/sparks(loc) - playsound(loc, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(loc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) blink_mob(user) use(1) @@ -45,7 +45,7 @@ visible_message(span_notice("[src] fizzles and disappears upon impact!")) var/turf/T = get_turf(hit_atom) new /obj/effect/particle_effect/sparks(T) - playsound(loc, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(loc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(isliving(hit_atom)) blink_mob(hit_atom) use(1) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 6cd43c5719027..5420121945b92 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -480,7 +480,7 @@ playsound(src, 'sound/items/click.ogg', 25, TRUE) return TRUE to_chat(user, span_warning("You put your hand on the hand scanner, and it rejects it with an angry chimpanzee screech!")) - playsound(src, "sound/creatures/monkey/monkey_screech_[rand(1,7)].ogg", 75, TRUE) + playsound(src, SFX_SCREECH, 75, TRUE) return FALSE /obj/item/storage/toolbox/guncase/monkeycase/PopulateContents() diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index ba77c260ff7dc..04f5a0688db82 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -136,9 +136,9 @@ /obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user) if(is_parent_of_portal(target)) - qdel(target) - to_chat(user, span_notice("You dispel [target] with \the [src]!")) - playsound(loc, "sound/effects/portal_close.ogg", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + to_chat(user, span_notice("You dispel [target] with [src]!")) + var/obj/effect/portal/portal = target + portal.expire() return TRUE return FALSE @@ -254,7 +254,7 @@ var/list/obj/effect/portal/created = create_portal_pair(get_turf(user), get_teleport_turf(get_turf(teleport_target)), 300, 1, null) if(LAZYLEN(created) != 2) return - playsound(loc, pick("sound/effects/portal_open_1.ogg", "sound/effects/portal_open_2.ogg", "sound/effects/portal_open_3.ogg" ), 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + var/obj/effect/portal/portal1 = created[1] var/obj/effect/portal/portal2 = created[2] @@ -428,9 +428,9 @@ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(current_location) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) make_bloods(current_location, destination, user) - playsound(current_location, 'sound/effects/portal_travel.ogg', 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(current_location, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(destination, 'sound/effects/portal_travel.ogg', 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(destination, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) /obj/item/syndicate_teleporter/proc/malfunctioning(mob/guy_teleporting, turf/current_location) var/area/current_area = get_area(current_location) @@ -465,9 +465,9 @@ balloon_alert(user, "emergency teleport triggered!") if (!HAS_TRAIT(user, TRAIT_NOBLOOD)) make_bloods(mobloc, emergency_destination, user) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(emergency_destination, 'sound/effects/portal_travel.ogg', 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(emergency_destination, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) else //We tried to save. We failed. Death time. get_fragged(user, destination) @@ -477,9 +477,9 @@ victim.forceMove(destination) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(destination, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(destination, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(destination, 'sound/magic/disintegrate.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(!not_holding_tele) to_chat(victim, span_userdanger("You teleport into [destination], [src] tries to save you, but...")) else diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index ab6ebc38fad4a..7a64404a238a9 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -162,7 +162,7 @@ if(flushing) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN flushing = TRUE - playsound(src, "sound/machines/toilet_flush.ogg", cover_open ? 40 : 20, TRUE) + playsound(src, 'sound/machines/toilet_flush.ogg', cover_open ? 40 : 20, TRUE) if(cover_open && (dir & SOUTH)) update_appearance(UPDATE_OVERLAYS) flick_overlay_view(mutable_appearance(icon, "[base_icon_state]-water-flick"), 3 SECONDS) diff --git a/code/game/sound.dm b/code/game/sound.dm index 6b32eb46e85c9..7c9784bcc7f61 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -452,4 +452,24 @@ 'sound/items/rattle2.ogg', 'sound/items/rattle3.ogg', ) + if(SFX_PORTAL_CLOSE) + soundin = 'sound/effects/portal_close.ogg' + if(SFX_PORTAL_ENTER) + soundin = 'sound/effects/portal_travel.ogg' + if(SFX_PORTAL_CREATED) + soundin = pick( + 'sound/effects/portal_open_1.ogg', + 'sound/effects/portal_open_2.ogg', + 'sound/effects/portal_open_3.ogg', + ) + if(SFX_SCREECH) + soundin = pick( + 'sound/creatures/monkey/monkey_screech_1.ogg', + 'sound/creatures/monkey/monkey_screech_2.ogg', + 'sound/creatures/monkey/monkey_screech_3.ogg', + 'sound/creatures/monkey/monkey_screech_4.ogg', + 'sound/creatures/monkey/monkey_screech_5.ogg', + 'sound/creatures/monkey/monkey_screech_6.ogg', + 'sound/creatures/monkey/monkey_screech_7.ogg', + ) return soundin diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 997cd476aa2f3..03a05f6c39779 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -506,6 +506,8 @@ null, span_hear("You hear a boom."), ) + playsound(origin, SFX_PORTAL_ENTER, 50, TRUE, SILENCED_SOUND_EXTRARANGE) + playsound(dest, SFX_PORTAL_ENTER, 50, TRUE, SILENCED_SOUND_EXTRARANGE) return ..() //Shackles diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 586cb44172e29..a4f3b291f74da 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -236,13 +236,13 @@ switch(i) if(1) new /obj/effect/temp_visual/cult/sparks(mobloc, B.current.dir) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(2) new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, B.current.dir) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_PORTAL_ENTER, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(3) new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_PORTAL_ENTER, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(4) playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, TRUE) if(B.current != owner) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 8ff2a8b1d3235..c0051aec87cd1 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -620,9 +620,9 @@ Striking a noncultist, however, will tear their flesh."} new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, user_cultist.dir) new /obj/effect/temp_visual/dir_setting/cult/phase(destination, user_cultist.dir) - playsound(mobloc, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(mobloc, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, 'sound/effects/phasein.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - playsound(destination, 'sound/effects/portal_travel.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(destination, SFX_PORTAL_ENTER, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /obj/item/flashlight/flare/culttorch name = "void torch" diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 656db40922eeb..926981bb096bb 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -526,6 +526,8 @@ structure_check() searches for nearby cultist structures required for the invoca movesuccess = TRUE if(movedsomething) ..() + playsound(src, SFX_PORTAL_ENTER, 50, TRUE) + playsound(target, SFX_PORTAL_ENTER, 50, TRUE) if(moveuserlater) if(do_teleport(user, target, channel = TELEPORT_CHANNEL_CULT)) movesuccess = TRUE @@ -548,7 +550,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/teleport/proc/handle_portal(portal_type, turf/origin) var/turf/T = get_turf(src) close_portal() // To avoid stacking descriptions/animations - playsound(T, 'sound/effects/portal_travel.ogg', 100, TRUE, 14) + playsound(T, SFX_PORTAL_CREATED, 100, TRUE, 14) inner_portal = new /obj/effect/temp_visual/cult/portal(T) if(portal_type == "space") set_light_color(color) @@ -862,12 +864,15 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) "Overwhelming vertigo consumes you as you are hurled through the air!") ..() visible_message(span_warning("A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!")) + var/turf/old_turf = get_turf(cultist_to_summon) if(!do_teleport(cultist_to_summon, get_turf(src))) to_chat(user, span_warning("The summoning has completely failed for [cultist_to_summon]!")) fail_logmsg += "target failed criteria to teleport." //catch-all term, just means they failed do_teleport somehow. The most common reasons why someone should fail to be summoned already have verbose messages. log_game(fail_logmsg) fail_invoke() return + playsound(src, SFX_PORTAL_ENTER, 100, TRUE, SILENCED_SOUND_EXTRARANGE) + playsound(old_turf, SFX_PORTAL_ENTER, 100, TRUE, SILENCED_SOUND_EXTRARANGE) qdel(src) //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index 5773c4e90e05d..31dec4e812a6b 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -190,7 +190,7 @@ ) eyeballies.apply_organ_damage(eyeballies.maxHealth) target.emote("scream") - playsound(target, "sound/effects/wounds/crackandbleed.ogg", 100) + playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100) log_combat(user, target, "cracked the skull of (eye snatching)", src) if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 275332cfc12ef..b533e2b5661d6 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -60,7 +60,7 @@ var/datum/action/avatar_domain_info/action = new(help_datum) action.Grant(avatar) - avatar.playsound_local(avatar, "sound/magic/blink.ogg", 25, TRUE) + avatar.playsound_local(avatar, 'sound/magic/blink.ogg', 25, TRUE) avatar.set_static_vision(2 SECONDS) avatar.set_temp_blindness(1 SECONDS) diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm index cf8be61f62f3d..98bc96231b30e 100644 --- a/code/modules/bitrunning/objects/netpod.dm +++ b/code/modules/bitrunning/objects/netpod.dm @@ -263,7 +263,7 @@ open_machine() return - mob_occupant.playsound_local(src, "sound/magic/blink.ogg", 25, TRUE) + mob_occupant.playsound_local(src, 'sound/magic/blink.ogg', 25, TRUE) mob_occupant.set_static_vision(2 SECONDS) mob_occupant.set_temp_blindness(1 SECONDS) mob_occupant.Paralyze(2 SECONDS) diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 3316eb8c52c5d..0fc2de1375a48 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -118,7 +118,7 @@ victim.visible_message(span_warning("\The [bullet] sends [victim]'s hat flying!")) victim.dropItemToGround(src, force = TRUE, silent = TRUE) throw_at(get_edge_target_turf(loc, pick(GLOB.alldirs)), range = 3, speed = 3) - playsound(victim, get_sfx(SFX_RICOCHET), 100, TRUE) + playsound(victim, SFX_RICOCHET, 100, TRUE) /datum/armor/head_cowboy melee = 5 diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm index 15247d19d572f..54f6be3666a22 100644 --- a/code/modules/economy/holopay.dm +++ b/code/modules/economy/holopay.dm @@ -238,7 +238,7 @@ * Deletes the holopay thereafter. */ /obj/structure/holopay/proc/dissipate() - playsound(loc, "sound/effects/empulse.ogg", 40, TRUE) + playsound(loc, 'sound/effects/empulse.ogg', 40, TRUE) visible_message(span_notice("The pay stand vanishes.")) qdel(src) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 7dcaf0861c3ff..83028d129c4a8 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -25,23 +25,24 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to end_when = rand(40, 80) /datum/round_event/wormholes/start() - for(var/turf/open/floor/T in world) - if(is_station_level(T.z)) - pick_turfs += T + for(var/turf/open/floor/valid in GLOB.station_turfs) + pick_turfs += valid for(var/i in 1 to number_of_wormholes) var/turf/T = pick(pick_turfs) wormholes += new /obj/effect/portal/wormhole(T, 0, null, FALSE) + playsound(T, SFX_PORTAL_CREATED, 20, TRUE, SILENCED_SOUND_EXTRARANGE) // much much quieter /datum/round_event/wormholes/announce(fake) priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", ANNOUNCER_SPANOMALIES) /datum/round_event/wormholes/tick() if(activeFor % shift_frequency == 0) - for(var/obj/effect/portal/wormhole/O in wormholes) + for(var/obj/effect/portal/wormhole/O as anything in wormholes) var/turf/T = pick(pick_turfs) - if(T) + if(isopenturf(T)) O.forceMove(T) + playsound(T, SFX_PORTAL_CREATED, 20, TRUE, SILENCED_SOUND_EXTRARANGE) /datum/round_event/wormholes/end() QDEL_LIST(wormholes) @@ -78,4 +79,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to hard_target = P.loc if(!hard_target) return - do_teleport(M, hard_target, 1, null, null, channel = TELEPORT_CHANNEL_WORMHOLE) ///You will appear adjacent to the beacon + var/turf/start_turf = get_turf(M) + if(do_teleport(M, hard_target, 1, null, null, channel = TELEPORT_CHANNEL_WORMHOLE)) ///You will appear adjacent to the beacon + playsound(start_turf, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) + playsound(hard_target, SFX_PORTAL_ENTER, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index d5b7bb7b529bc..eb94f68a1f9a7 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -61,7 +61,6 @@ else if(adjacent) try_move_adjacent(tunnel) - playsound(src, "sound/effects/portal_travel.ogg",50,TRUE) qdel(src) return FALSE // used for chasm code diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index ddf0963bb5d24..e1163f1387d5c 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -62,15 +62,7 @@ return ..() /datum/species/monkey/get_scream_sound(mob/living/carbon/human/monkey) - return pick( - 'sound/creatures/monkey/monkey_screech_1.ogg', - 'sound/creatures/monkey/monkey_screech_2.ogg', - 'sound/creatures/monkey/monkey_screech_3.ogg', - 'sound/creatures/monkey/monkey_screech_4.ogg', - 'sound/creatures/monkey/monkey_screech_5.ogg', - 'sound/creatures/monkey/monkey_screech_6.ogg', - 'sound/creatures/monkey/monkey_screech_7.ogg', - ) + return get_sfx(SFX_SCREECH) /datum/species/monkey/get_physical_attributes() return "Monkeys are slippery, can crawl into vents, and are more dextrous than humans.. but only when stealing things. \ diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index aa3ed0e5828ce..a754c37d811e9 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -150,7 +150,7 @@ else camera_ref = null if(!spying) - playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(computer, SFX_TERMINAL_TYPE, 25, FALSE) if(isnull(camera_ref)) return TRUE if(internal_tracker) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 2f050f11a5fb0..0ea51f19d37e2 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -460,7 +460,7 @@ to_chat(src, span_userdanger("Your mental faculties leave you.")) to_chat(src, span_rose("oblivion... ")) balloon_alert(user, "personality wiped") - playsound(src, "sound/machines/buzz-two.ogg", 30, TRUE) + playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) qdel(src) return TRUE diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d184fd746acc9..a342b0e85f405 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -282,6 +282,7 @@ qdel(p_blue) p_blue = new_portal crosslink() + playsound(new_portal, SFX_PORTAL_CREATED, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /obj/item/gun/energy/wormhole_projector/core_inserted firing_core = TRUE diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 0c4dc094159c6..7ee44a10e7d83 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -381,7 +381,7 @@ /obj/item/firing_pin/monkey/pin_auth(mob/living/user) if(!is_simian(user)) - playsound(get_turf(src), "sound/creatures/monkey/monkey_screech_[rand(1,7)].ogg", 75, TRUE) + playsound(src, SFX_SCREECH, 75, TRUE) return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index c3a5159f8aa78..dbcb6f4cf8b30 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -29,5 +29,4 @@ return BULLET_ACT_BLOCK . = ..() - playsound(loc, pick("sound/effects/portal_open1.ogg" , "sound/effects/portal_open2.ogg" , "sound/effects/portal_open3.ogg"), 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) projector.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 15508aa98eecd..6695b0b9db15d 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -1201,7 +1201,7 @@ var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. var/obj/item/bodypart/BP = affected_mob.get_bodypart(selected_part) if(BP) - playsound(affected_mob, get_sfx(SFX_DESECRATION), 50, TRUE, -1) + playsound(affected_mob, SFX_DESECRATION, 50, TRUE, -1) affected_mob.visible_message(span_warning("[affected_mob]'s bones hurt too much!!"), span_danger("Your bones hurt too much!!")) affected_mob.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) if(BP.receive_damage(brute = 20 * REM * seconds_per_tick, burn = 0, blocked = 200, updating_health = FALSE, wound_bonus = rand(30, 130))) diff --git a/code/modules/spells/spell_types/self/sanguine_strike.dm b/code/modules/spells/spell_types/self/sanguine_strike.dm index 7afa3deb8d943..4c819a69690ab 100644 --- a/code/modules/spells/spell_types/self/sanguine_strike.dm +++ b/code/modules/spells/spell_types/self/sanguine_strike.dm @@ -66,7 +66,7 @@ var/mob/living/living_target = target if(living_target.blood_volume < BLOOD_VOLUME_SURVIVE) return - playsound(target, "sound/effects/wounds/crackandbleed.ogg", 100) + playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100) playsound(target, 'sound/magic/charge.ogg', 100) var/attack_direction = get_dir(user, living_target) if(iscarbon(living_target)) diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index 533c654e787fa..3117f13b9f89a 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -43,6 +43,6 @@ /obj/item/circuit_component/bot/proc/on_attack_hand(atom/source, mob/user) SIGNAL_HANDLER source.balloon_alert(user, "pushed button") - playsound(source, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(source, SFX_TERMINAL_TYPE, 25, FALSE) entity.set_output(user) signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index 3336be06ddbf8..0697a449dbeba 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -45,6 +45,6 @@ /obj/item/circuit_component/compact_remote/proc/send_trigger(atom/source, mob/user) SIGNAL_HANDLER source.balloon_alert(user, "clicked primary button") - playsound(source, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(source, SFX_TERMINAL_TYPE, 25, FALSE) entity.set_output(user) signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index b46dad3673f58..9afe0303be85e 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -53,7 +53,7 @@ /obj/item/circuit_component/controller/proc/handle_trigger(atom/source, user, port_name, datum/port/output/port_signal) source.balloon_alert(user, "clicked [port_name] button") - playsound(source, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(source, SFX_TERMINAL_TYPE, 25, FALSE) entity.set_output(user) port_signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index 283815fb3346b..8e9a3d987fd6d 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -68,7 +68,7 @@ /obj/item/circuit_component/wiremod_gun/proc/handle_shot(atom/source, mob/firer, atom/target, angle) SIGNAL_HANDLER - playsound(source, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + playsound(source, SFX_TERMINAL_TYPE, 25, FALSE) shooter.set_output(firer) shot.set_output(target) signal.set_output(COMPONENT_SIGNAL) From 6f6ec555fb1b2362da5111da2aae09166eaac27b Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:47:51 -0400 Subject: [PATCH 057/120] Small adjustment to the new stamcrit unit test (#83931) ## About The Pull Request Not all downstreams have 100 hp as `maxHealth`, so this makes the test work in those cases by no longer having it be hardcoded. ## Why It's Good For The Game More universal unit tests. ## Changelog Nothing player facing. --- code/modules/unit_tests/combat_stamina.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/unit_tests/combat_stamina.dm b/code/modules/unit_tests/combat_stamina.dm index fa0b6b4219b46..7c84f8281aea5 100644 --- a/code/modules/unit_tests/combat_stamina.dm +++ b/code/modules/unit_tests/combat_stamina.dm @@ -5,10 +5,11 @@ /datum/unit_test/stamcrit/Run() var/mob/living/carbon/human/consistent/tider = allocate(__IMPLIED_TYPE__) tider.stamina_regen_time = 0.2 SECONDS - tider.adjustStaminaLoss(99) - TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should not be applied at 99 stamina damage") + var/stamloss_to_reach_crit_threshold = tider.maxHealth + tider.adjustStaminaLoss(stamloss_to_reach_crit_threshold - 1) + TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should not be applied at [stamloss_to_reach_crit_threshold - 1] stamina damage") tider.adjustStaminaLoss(1) - TEST_ASSERT(tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be applied at 100 stamina damage") + TEST_ASSERT(tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be applied at [stamloss_to_reach_crit_threshold] stamina damage") sleep(tider.stamina_regen_time * 2) TEST_ASSERT(!tider.has_status_effect(/datum/status_effect/incapacitating/stamcrit), "Stamcrit should be removed after regen time") From 8ce9d3e141f9cd32bc60f56132a57a993857521c Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:47:55 +1200 Subject: [PATCH 058/120] Automatic changelog for PR #83893 [ci skip] --- html/changelogs/AutoChangeLog-pr-83893.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83893.yml diff --git a/html/changelogs/AutoChangeLog-pr-83893.yml b/html/changelogs/AutoChangeLog-pr-83893.yml new file mode 100644 index 0000000000000..76e757c9e1254 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83893.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - sound: "Portals made by portal guns now make sounds as expected" + - sound: "Wormholes from the wormhole event now make sounds when formed" \ No newline at end of file From f4dc0ebc81a485df2c916e5797acc2987c70045e Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 00:48:02 -0500 Subject: [PATCH 059/120] Cleans up some sound emote related stuff (#83894) ## About The Pull Request 1. We don't have a reason to make a separate emote for livings and humans, `get_sound` can filter humans out for us 2. All sounds abide by physique, rather than only half the sounds abiding by physique and the other half abiding by gender. If this is problematic let me know. 3. Removes a copied `/datum/emote/living/carbon/human/glasses/run_emote` 4. Gasp now makes the same sound as gaspshock 5. I let any mob with hands clap, this is notably xenos but anyone who gets adminbussed hands will also be able to. I think. ## Changelog :cl: Melbert fix: Humans can't cough on menthol again fix: Moth and lizard emotes decide what sound to play based on body type, not gender. sound: *gasp now makes a sound, it's the same as *gaspshock. sound: Xenos (or anything with hands) can clap /:cl: --- code/modules/mob/living/carbon/emote.dm | 39 +++++++++--- code/modules/mob/living/carbon/human/emote.dm | 53 ---------------- .../carbon/human/species_types/humans.dm | 2 - .../human/species_types/lizardpeople.dm | 10 ++- .../carbon/human/species_types/mothmen.dm | 12 ++-- code/modules/mob/living/emote.dm | 63 +++++++++---------- 6 files changed, 70 insertions(+), 109 deletions(-) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index e01315094a11b..856622203927a 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -27,20 +27,21 @@ vary = TRUE /datum/emote/living/carbon/clap/get_sound(mob/living/user) - if(ishuman(user)) - if(!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) - return - else - return pick('sound/misc/clap1.ogg', - 'sound/misc/clap2.ogg', - 'sound/misc/clap3.ogg', - 'sound/misc/clap4.ogg') + if(!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) + return + return pick( + 'sound/misc/clap1.ogg', + 'sound/misc/clap2.ogg', + 'sound/misc/clap3.ogg', + 'sound/misc/clap4.ogg', + ) /datum/emote/living/carbon/crack key = "crack" key_third_person = "cracks" message = "cracks their knuckles." sound = 'sound/misc/knuckles.ogg' + hands_use_check = TRUE cooldown = 6 SECONDS /datum/emote/living/carbon/crack/can_run_emote(mob/living/carbon/user, status_check = TRUE , intentional) @@ -48,6 +49,28 @@ return FALSE return ..() +/datum/emote/living/carbon/cry + key = "cry" + key_third_person = "cries" + message = "cries." + message_mime = "sobs silently." + audio_cooldown = 5 SECONDS + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + vary = TRUE + stat_allowed = SOFT_CRIT + +/datum/emote/living/carbon/cry/run_emote(mob/user, params, type_override, intentional) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_user = user + QDEL_IN(human_user.give_emote_overlay(/datum/bodypart_overlay/simple/emote/cry), 12.8 SECONDS) + +/datum/emote/living/carbon/cry/get_sound(mob/living/carbon/human/user) + if(!istype(user)) + return + return user.dna.species.get_cry_sound(user) + /datum/emote/living/carbon/circle key = "circle" key_third_person = "circles" diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c9f0ffe504618..f5c3ae6b49903 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,29 +1,6 @@ /datum/emote/living/carbon/human mob_type_allowed_typecache = list(/mob/living/carbon/human) - -/datum/emote/living/carbon/human/cry - key = "cry" - key_third_person = "cries" - message = "cries." - message_mime = "sobs silently." - audio_cooldown = 5 SECONDS - emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - vary = TRUE - stat_allowed = SOFT_CRIT - -/datum/emote/living/carbon/human/cry/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(!ishuman(user)) - return - var/mob/living/carbon/human/human_user = user - QDEL_IN(human_user.give_emote_overlay(/datum/bodypart_overlay/simple/emote/cry), 12.8 SECONDS) - -/datum/emote/living/carbon/human/cry/get_sound(mob/living/carbon/human/user) - if(!istype(user)) - return - return user.dna.species.get_cry_sound(user) - /datum/emote/living/carbon/human/dap key = "dap" key_third_person = "daps" @@ -47,36 +24,6 @@ return ..() return FALSE -/datum/emote/living/carbon/human/cough - key = "cough" - key_third_person = "coughs" - message = "coughs!" - message_mime = "acts out an exaggerated cough!" - vary = TRUE - audio_cooldown = 5 SECONDS - emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE | EMOTE_RUNECHAT - -/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional) - return !HAS_TRAIT(user, TRAIT_SOOTHED_THROAT) && ..() - -/datum/emote/living/carbon/human/cough/get_sound(mob/living/carbon/human/user) - if(!istype(user)) - return - return user.dna.species.get_cough_sound(user) -/datum/emote/living/carbon/human/sneeze - key = "sneeze" - key_third_person = "sneezes" - message = "sneezes." - audio_cooldown = 5 SECONDS - message_mime = "acts out an exaggerated silent sneeze." - vary = TRUE - emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - -/datum/emote/living/carbon/human/sneeze/get_sound(mob/living/carbon/human/user) - if(!istype(user)) - return - return user.dna.species.get_sneeze_sound(user) - /datum/emote/living/carbon/human/glasses/run_emote(mob/user, params, type_override, intentional) . = ..() var/image/emote_animation = image('icons/mob/human/emote_visuals.dmi', user, "glasses") diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 4c575f8e48c05..98a4518c4fa2e 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -72,8 +72,6 @@ return 'sound/voice/human/male_sneeze1.ogg' /datum/species/human/get_laugh_sound(mob/living/carbon/human/human) - if(!ishuman(human)) - return if(human.physique == FEMALE) return 'sound/voice/human/womanlaugh.ogg' return pick( diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 488d76cbd2136..b2a036a9d6d71 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -60,7 +60,7 @@ ) /datum/species/lizard/get_cough_sound(mob/living/carbon/human/lizard) - if(lizard.gender == FEMALE) + if(lizard.physique == FEMALE) return pick( 'sound/voice/human/female_cough1.ogg', 'sound/voice/human/female_cough2.ogg', @@ -80,7 +80,7 @@ /datum/species/lizard/get_cry_sound(mob/living/carbon/human/lizard) - if(lizard.gender == FEMALE) + if(lizard.physique == FEMALE) return pick( 'sound/voice/human/female_cry1.ogg', 'sound/voice/human/female_cry2.ogg', @@ -93,13 +93,11 @@ /datum/species/lizard/get_sneeze_sound(mob/living/carbon/human/lizard) - if(lizard.gender == FEMALE) + if(lizard.physique == FEMALE) return 'sound/voice/human/female_sneeze1.ogg' return 'sound/voice/human/male_sneeze1.ogg' -/datum/species/lizard/get_laugh_sound(mob/living/carbon/human) - if(!istype(human)) - return +/datum/species/lizard/get_laugh_sound(mob/living/carbon/human/lizard) return 'sound/voice/lizard/lizard_laugh1.ogg' /datum/species/lizard/get_physical_attributes() diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 54d6fe027e32f..e2458563b038c 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -53,11 +53,11 @@ features["moth_markings"] = pick(SSaccessories.moth_markings_list) return features -/datum/species/moth/get_scream_sound(mob/living/carbon/human) +/datum/species/moth/get_scream_sound(mob/living/carbon/human/moth) return 'sound/voice/moth/scream_moth.ogg' /datum/species/moth/get_cough_sound(mob/living/carbon/human/moth) - if(moth.gender == FEMALE) + if(moth.physique == FEMALE) return pick( 'sound/voice/human/female_cough1.ogg', 'sound/voice/human/female_cough2.ogg', @@ -77,7 +77,7 @@ /datum/species/moth/get_cry_sound(mob/living/carbon/human/moth) - if(moth.gender == FEMALE) + if(moth.physique == FEMALE) return pick( 'sound/voice/human/female_cry1.ogg', 'sound/voice/human/female_cry2.ogg', @@ -90,14 +90,12 @@ /datum/species/moth/get_sneeze_sound(mob/living/carbon/human/moth) - if(moth.gender == FEMALE) + if(moth.physique == FEMALE) return 'sound/voice/human/female_sneeze1.ogg' return 'sound/voice/human/male_sneeze1.ogg' -/datum/species/moth/get_laugh_sound(mob/living/carbon/human) - if(!istype(human)) - return +/datum/species/moth/get_laugh_sound(mob/living/carbon/human/moth) return 'sound/voice/moth/moth_laugh1.ogg' /datum/species/moth/get_physical_attributes() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 395c4f343dc3d..117dc5583eae5 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -175,7 +175,18 @@ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE stat_allowed = HARD_CRIT -/datum/emote/living/gasp_shock +/datum/emote/living/gasp/get_sound(mob/living/user) + if(!HAS_MIND_TRAIT(user, TRAIT_MIMING)) + return + if(!ishuman(user)) + return + + var/mob/living/carbon/human/human_user = user + if(human_user.physique == FEMALE) + return pick('sound/voice/human/gasp_female1.ogg', 'sound/voice/human/gasp_female2.ogg', 'sound/voice/human/gasp_female3.ogg') + return pick('sound/voice/human/gasp_male1.ogg', 'sound/voice/human/gasp_male2.ogg') + +/datum/emote/living/gasp/shock key = "gaspshock" key_third_person = "gaspsshock" name = "gasp (Shock)" @@ -184,16 +195,6 @@ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE stat_allowed = SOFT_CRIT -/datum/emote/living/gasp_shock/get_sound(mob/living/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/human_user = user - if(ishumanbasic(human_user) || isfelinid(human_user) && !HAS_MIND_TRAIT(human_user, TRAIT_MIMING)) - if(human_user.physique == FEMALE) - return pick('sound/voice/human/gasp_female1.ogg', 'sound/voice/human/gasp_female2.ogg', 'sound/voice/human/gasp_female3.ogg') - else - return pick('sound/voice/human/gasp_male1.ogg', 'sound/voice/human/gasp_male2.ogg') - /datum/emote/living/giggle key = "giggle" key_third_person = "giggles" @@ -273,11 +274,10 @@ /datum/emote/living/laugh/can_run_emote(mob/living/user, status_check = TRUE , intentional) return ..() && user.can_speak(allow_mimes = TRUE) -/datum/emote/living/laugh/get_sound(mob/living/carbon/user) - if(!ishuman(user)) +/datum/emote/living/laugh/get_sound(mob/living/carbon/human/user) + if(!istype(user)) return - var/mob/living/carbon/human/human_user = user - return human_user.dna.species.get_laugh_sound(user) + return user.dna.species.get_laugh_sound(user) /datum/emote/living/look key = "look" @@ -311,37 +311,37 @@ H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) return ..() -/datum/emote/living/carbon/cry - key = "cry" - key_third_person = "cries" - message = "cries." - emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - stat_allowed = SOFT_CRIT - mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized cry emote with sound and animation. - /datum/emote/living/sneeze key = "sneeze" key_third_person = "sneezes" message = "sneezes." + message_mime = "acts out an exaggerated silent sneeze." emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized sneeze emote with sound. + audio_cooldown = 5 SECONDS + vary = TRUE -/datum/emote/living/carbon/human/glasses/run_emote(mob/user, params, type_override, intentional) - . = ..() - var/image/emote_animation = image('icons/mob/human/emote_visuals.dmi', user, "glasses") - flick_overlay_global(emote_animation, GLOB.clients, 1.6 SECONDS) +/datum/emote/living/sneeze/get_sound(mob/living/carbon/human/user) + if(!istype(user)) + return + return user.dna.species.get_sneeze_sound(user) -/datum/emote/living/carbon/cough +/datum/emote/living/cough key = "cough" key_third_person = "coughs" message = "coughs!" message_mime = "acts out an exaggerated cough!" + vary = TRUE + audio_cooldown = 5 SECONDS emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE | EMOTE_RUNECHAT - mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized cough emote with sound. /datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional) return !HAS_TRAIT(user, TRAIT_SOOTHED_THROAT) && ..() +/datum/emote/living/cough/get_sound(mob/living/carbon/human/user) + if(!istype(user)) + return + return user.dna.species.get_cough_sound(user) + /datum/emote/living/pout key = "pout" @@ -355,7 +355,6 @@ message = "screams!" message_mime = "acts out a scream!" emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized scream. /datum/emote/living/scream/run_emote(mob/user, params, type_override, intentional = FALSE) if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) @@ -753,6 +752,4 @@ emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE /datum/emote/living/carbon/whistle/get_sound(mob/living/user) - if(!istype(user)) - return return 'sound/voice/human/whistle1.ogg' From 3b5c9ec030424d13e1ff9433c8ff6112c6841e11 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 14 Jun 2024 17:48:21 +1200 Subject: [PATCH 060/120] Automatic changelog for PR #83894 [ci skip] --- html/changelogs/AutoChangeLog-pr-83894.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83894.yml diff --git a/html/changelogs/AutoChangeLog-pr-83894.yml b/html/changelogs/AutoChangeLog-pr-83894.yml new file mode 100644 index 0000000000000..5bee69ea3fdee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83894.yml @@ -0,0 +1,7 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Humans can't cough on menthol again" + - bugfix: "Moth and lizard emotes decide what sound to play based on body type, not gender." + - sound: "*gasp now makes a sound, it's the same as *gaspshock." + - sound: "Xenos (or anything with hands) can clap" \ No newline at end of file From 9912961f9b7a2e1cd55fc799b5baed896fbcfc39 Mon Sep 17 00:00:00 2001 From: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Date: Fri, 14 Jun 2024 05:54:47 +0000 Subject: [PATCH 061/120] Adds a config to change the interval profiler information gets saved (#83849) ## About The Pull Request As title says ## Why It's Good For The Game Important for server operation --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com> --- code/controllers/configuration/entries/general.dm | 3 +++ code/controllers/subsystem/profiler.dm | 1 + config/config.txt | 3 +++ 3 files changed, 7 insertions(+) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 69b3bbcad64f6..964459aea68d4 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -650,6 +650,9 @@ /datum/config_entry/flag/auto_profile +/datum/config_entry/number/profiler_interval + default = 300 SECONDS + /datum/config_entry/number/drift_dump_threshold default = 4 SECONDS diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm index 46d5b0fd57ba5..d149bc5e77c93 100644 --- a/code/controllers/subsystem/profiler.dm +++ b/code/controllers/subsystem/profiler.dm @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(profiler) StartProfiling() else StopProfiling() //Stop the early start profiler + wait = CONFIG_GET(number/profiler_interval) return SS_INIT_SUCCESS /datum/controller/subsystem/profiler/OnConfigLoad() diff --git a/config/config.txt b/config/config.txt index 09824fed555e8..6252c3bae659e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -482,6 +482,9 @@ DEFAULT_VIEW_SQUARE 15x15 ## Enable automatic profiling - Byond 513.1506 and newer only. #AUTO_PROFILE +## Determines the interval between each saved profiler snapshot (in deciseconds). +#PROFILER_INTERVAL 3000 + ## Threshold (in deciseconds) for real time between ticks before we start dumping profiles DRIFT_DUMP_THRESHOLD 40 From e42767a1ff02aecdda9d051dc8655df60cafd4a5 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Fri, 14 Jun 2024 02:02:10 -0400 Subject: [PATCH 062/120] Adds logging for bounties being started and completed. (#83935) ## About The Pull Request As it says on the tin, adds some tally logging to civilian bounties. We're tallying in two ways: 1. For what bounties are being picked by players on the civilian bounty computer. This will capture the full list of bounties that players are selecting to at least attempt, regardless of success. 2. What bounties are being successfully completed. ## Why It's Good For The Game Additional logging lets me know which bounties are actually getting completed, what bounties within each job category are feasible enough to complete within a round, and which bounties categorically suck too much to actually complete when comparing tallying of numbers 1 and 2. On top of that, this'll also give some rough numbers about how many bounties are actually getting completed on average across any number of rounds in aggregate. ## Changelog No player facing changes. --------- Co-authored-by: Jacquerel --- code/game/machinery/civilian_bounties.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 792c1ba22eb31..e5cd81cc965a1 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -95,7 +95,7 @@ playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) /** - * This fully rewrites base behavior in order to only check for bounty objects, and nothing else. + * This fully rewrites base behavior in order to only check for bounty objects, and no other types of objects like pirate-pads do. */ /obj/machinery/computer/piratepad_control/civilian/send() playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) @@ -125,6 +125,7 @@ if(curr_bounty.can_claim()) //Pay for the bounty with the ID's department funds. status_report += "Bounty completed! Please give your bounty cube to cargo for your automated payout shortly." + SSblackbox.record_feedback("tally", "bounties_completed", 1, curr_bounty.type) inserted_scan_id.registered_account.reset_bounty() SSeconomy.civ_bounty_tracker++ @@ -155,12 +156,19 @@ COOLDOWN_START(pot_acc, bounty_timer, (5 MINUTES) - cooldown_reduction) pot_acc.bounties = crumbs -/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) +/** + * Proc that assigned a civilian bounty to an ID card, from the list of potential bounties that that bank account currently has available. + * Available choices are assigned during add_bounties, and one is locked in here. + * + * @param choice The index of the bounty in the list of bounties that the player can choose from. + */ +/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(datum/bounty/choice) if(!inserted_scan_id || !inserted_scan_id.registered_account || !inserted_scan_id.registered_account.bounties || !inserted_scan_id.registered_account.bounties[choice]) playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) return inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] inserted_scan_id.registered_account.bounties = null + SSblackbox.record_feedback("tally", "bounties_assigned", 1, choice.type) return inserted_scan_id.registered_account.civilian_bounty /obj/machinery/computer/piratepad_control/civilian/click_alt(mob/user) From cebfb28b53b9f45234b35e6262ab48652d252151 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Thu, 13 Jun 2024 23:13:24 -0700 Subject: [PATCH 063/120] tgui: Excludes corejs from transpilation (#83856) ## About The Pull Request 1. We're not actually supposed to bundle core-js https://github.com/zloirock/core-js/issues/916#issuecomment-790602732 2. Prevents eslint from searching the public folder, there's no reason it should work there ## Why It's Good For The Game Minor fixes for tgui ## Changelog n/a --- tgui/.eslintignore | 1 + tgui/webpack.config.js | 1 + 2 files changed, 2 insertions(+) diff --git a/tgui/.eslintignore b/tgui/.eslintignore index d3c0ac79cd882..4f735f3c518c5 100644 --- a/tgui/.eslintignore +++ b/tgui/.eslintignore @@ -14,3 +14,4 @@ **.woff2 **.eot **.ttf +/public diff --git a/tgui/webpack.config.js b/tgui/webpack.config.js index a738f6b1732d1..fa1782eb073b2 100644 --- a/tgui/webpack.config.js +++ b/tgui/webpack.config.js @@ -52,6 +52,7 @@ module.exports = (env = {}, argv) => { rules: [ { test: /\.([tj]s(x)?|cjs)$/, + exclude: /node_modules[\\/]core-js/, use: [ { loader: require.resolve('swc-loader'), From 4c536fa5e2742c7979f9ba2496467c0e83e5c50d Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:25:05 -0500 Subject: [PATCH 064/120] After Attack Fixes (#83910) --- code/game/objects/items/rcd/RCD.dm | 12 +- code/game/objects/items/rcd/RHD.dm | 26 ++-- code/game/objects/items/rcd/RLD.dm | 9 +- code/game/objects/items/rcd/RPLD.dm | 4 + code/game/objects/items/rcd/RTD.dm | 10 +- code/game/objects/structures/tables_racks.dm | 134 ++++++++++-------- .../mining/equipment/kinetic_crusher.dm | 4 + .../modules/mining/lavaland/megafauna_loot.dm | 6 + code/modules/unit_tests/serving_tray.dm | 11 +- 9 files changed, 132 insertions(+), 84 deletions(-) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 10a2a8c60a0fd..2a7611235310c 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -391,6 +391,10 @@ ui_interact(user) /obj/item/construction/rcd/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + mode = construction_mode rcd_create(interacting_with, user) return ITEM_INTERACT_SUCCESS @@ -399,7 +403,9 @@ if(!ranged || !range_check(interacting_with, user)) return ITEM_INTERACT_BLOCKING - return interact_with_atom(interacting_with, user, modifiers) + mode = construction_mode + rcd_create(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/construction/rcd/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) mode = RCD_DECONSTRUCT @@ -410,7 +416,9 @@ if(!ranged || !range_check(interacting_with, user)) return ITEM_INTERACT_BLOCKING - return interact_with_atom_secondary(interacting_with, user, modifiers) + mode = RCD_DECONSTRUCT + rcd_create(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/construction/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 9c70bbef28b73..64179a81b5fb4 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -89,20 +89,22 @@ silo_mats = null return ..() -/obj/item/construction/pre_attack(atom/target, mob/user, params) - if(istype(target, /obj/item/rcd_upgrade)) - install_upgrade(target, user) - return TRUE - if(insert_matter(target, user)) - return TRUE +/obj/item/construction/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + if(istype(interacting_with, /obj/item/rcd_upgrade)) + install_upgrade(interacting_with, user) + return ITEM_INTERACT_SUCCESS + if(insert_matter(interacting_with, user)) + return ITEM_INTERACT_SUCCESS return ..() -/obj/item/construction/attackby(obj/item/item, mob/user, params) - if(istype(item, /obj/item/rcd_upgrade)) - install_upgrade(item, user) - return TRUE - if(insert_matter(item, user)) - return TRUE +/obj/item/construction/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + if(istype(tool, /obj/item/rcd_upgrade)) + install_upgrade(tool, user) + return ITEM_INTERACT_SUCCESS + if(insert_matter(tool, user)) + return ITEM_INTERACT_SUCCESS return ..() /// Installs an upgrade into the RCD checking if it is already installed, or if it is a banned upgrade diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm index 80d98382e6452..2a99f535f42b5 100644 --- a/code/game/objects/items/rcd/RLD.dm +++ b/code/game/objects/items/rcd/RLD.dm @@ -91,9 +91,16 @@ /obj/item/construction/rld/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!range_check(interacting_with, user)) return NONE - return interact_with_atom(interacting_with, user, modifiers) + return try_lighting(interacting_with, user) /obj/item/construction/rld/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + return try_lighting(interacting_with, user) + +/obj/item/construction/rld/proc/try_lighting(atom/interacting_with, mob/user) + var/turf/start = get_turf(src) switch(mode) if(REMOVE_MODE) diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index d55a1ad7bef41..8fc2da9520599 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -242,6 +242,10 @@ return FALSE /obj/item/construction/plumbing/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + for(var/category_name in plumbing_design_types) var/list/designs = plumbing_design_types[category_name] diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 783cb1914d44d..45b9c9e3687dd 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -231,10 +231,16 @@ /obj/item/construction/rtd/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!range_check(interacting_with, user)) return NONE - return interact_with_atom(interacting_with, user, modifiers) - + return try_tiling(interacting_with, user) /obj/item/construction/rtd/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return . + + return try_tiling(interacting_with, user) + +/obj/item/construction/rtd/proc/try_tiling(atom/interacting_with, mob/living/user) var/turf/open/floor/floor = interacting_with if(!istype(floor)) return NONE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a44364a3b4c09..04be4f9d72331 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -208,7 +208,7 @@ /obj/structure/table/screwdriver_act_secondary(mob/living/user, obj/item/tool) if(!deconstruction_ready) - return FALSE + return NONE to_chat(user, span_notice("You start disassembling [src]...")) if(tool.use_tool(src, user, 2 SECONDS, volume=50)) deconstruct(TRUE) @@ -216,7 +216,7 @@ /obj/structure/table/wrench_act_secondary(mob/living/user, obj/item/tool) if(!deconstruction_ready) - return FALSE + return NONE to_chat(user, span_notice("You start deconstructing [src]...")) if(tool.use_tool(src, user, 4 SECONDS, volume=50)) playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) @@ -224,33 +224,50 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/table/attackby(obj/item/I, mob/living/user, params) - var/list/modifiers = params2list(params) - - if(istype(I, /obj/item/storage/bag/tray)) - var/obj/item/storage/bag/tray/T = I - if(T.contents.len > 0) // If the tray isn't empty - for(var/x in T.contents) - var/obj/item/item = x - AfterPutItemOnTable(item, user) - I.atom_storage.remove_all(drop_location()) - user.visible_message(span_notice("[user] empties [I] on [src].")) - return +/obj/structure/table/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + if(tool.tool_behaviour == TOOL_SCREWDRIVER || tool.tool_behaviour == TOOL_WRENCH) + // continue to tool act + // ...we need a better way to do this natively. + // maybe flag to call tool acts before item interaction specifically? + return NONE + if(istype(tool, /obj/item/construction/rcd)) + return NONE + + if(istype(tool, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = tool + if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // deal a card faceup on the table + var/obj/item/toy/singlecard/card = dealer_deck.draw(user) + if(card) + card.Flip() + attackby(card, user, list2params(modifiers)) + return ITEM_INTERACT_SUCCESS + + return item_interaction(user, tool, modifiers) + +/obj/structure/table/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/storage/bag/tray)) + var/obj/item/storage/bag/tray/tray = tool + if(tray.contents.len > 0) // If the tray isn't empty + for(var/obj/item/thing in tray.contents) + AfterPutItemOnTable(thing, user) + tool.atom_storage.remove_all(drop_location()) + user.visible_message(span_notice("[user] empties [tool] on [src].")) + return ITEM_INTERACT_SUCCESS // If the tray IS empty, continue on (tray will be placed on the table like other items) - if(istype(I, /obj/item/toy/cards/deck)) - var/obj/item/toy/cards/deck/dealer_deck = I + if(istype(tool, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = tool if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // deal a card facedown on the table var/obj/item/toy/singlecard/card = dealer_deck.draw(user) if(card) - attackby(card, user, params) - return + attackby(card, user, list2params(modifiers)) + return ITEM_INTERACT_SUCCESS - if(istype(I, /obj/item/riding_offhand)) - var/obj/item/riding_offhand/riding_item = I + if(istype(tool, /obj/item/riding_offhand)) + var/obj/item/riding_offhand/riding_item = tool var/mob/living/carried_mob = riding_item.rider if(carried_mob == user) //Piggyback user. - return + return NONE if(user.combat_mode) user.unbuckle_mob(carried_mob) tablelimbsmash(user, carried_mob) @@ -268,32 +285,17 @@ if(do_after(user, tableplace_delay, target = carried_mob)) user.unbuckle_mob(carried_mob) tableplace(user, carried_mob) - return TRUE + return ITEM_INTERACT_SUCCESS - if(!user.combat_mode && !(I.item_flags & ABSTRACT)) - if(user.transferItemToLoc(I, drop_location(), silent = FALSE)) - //Center the icon where the user clicked. - if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) - return - //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) - AfterPutItemOnTable(I, user) - return TRUE - else - return ..() + // Where putting things on tables is handled. + if(!user.combat_mode && !(tool.item_flags & ABSTRACT) && user.transferItemToLoc(tool, drop_location(), silent = FALSE)) + //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) + tool.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + tool.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + AfterPutItemOnTable(tool, user) + return ITEM_INTERACT_SUCCESS -/obj/structure/table/attackby_secondary(obj/item/weapon, mob/user, params) - if(istype(weapon, /obj/item/toy/cards/deck)) - var/obj/item/toy/cards/deck/dealer_deck = weapon - if(HAS_TRAIT(dealer_deck, TRAIT_WIELDED)) // deal a card faceup on the table - var/obj/item/toy/singlecard/card = dealer_deck.draw(user) - if(card) - card.Flip() - attackby(card, user, params) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - ..() - return SECONDARY_ATTACK_CONTINUE_CHAIN + return NONE /obj/structure/table/proc/AfterPutItemOnTable(obj/item/thing, mob/living/user) return @@ -642,23 +644,27 @@ else return span_notice("The top cover is firmly welded on.") -/obj/structure/table/reinforced/attackby_secondary(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_WELDER) - if(weapon.tool_start_check(user, amount = 0)) - if(deconstruction_ready) - to_chat(user, span_notice("You start strengthening the reinforced table...")) - if (weapon.use_tool(src, user, 50, volume = 50)) - to_chat(user, span_notice("You strengthen the table.")) - deconstruction_ready = FALSE - else - to_chat(user, span_notice("You start weakening the reinforced table...")) - if (weapon.use_tool(src, user, 50, volume = 50)) - to_chat(user, span_notice("You weaken the table.")) - deconstruction_ready = TRUE - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN +/obj/structure/table/reinforced/welder_act_secondary(mob/living/user, obj/item/tool) + if(tool.tool_start_check(user, amount = 0)) + if(deconstruction_ready) + to_chat(user, span_notice("You start strengthening the reinforced table...")) + if (tool.use_tool(src, user, 50, volume = 50)) + to_chat(user, span_notice("You strengthen the table.")) + deconstruction_ready = FALSE + return ITEM_INTERACT_SUCCESS + else + to_chat(user, span_notice("You start weakening the reinforced table...")) + if (tool.use_tool(src, user, 50, volume = 50)) + to_chat(user, span_notice("You weaken the table.")) + deconstruction_ready = TRUE + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING - else - . = ..() +/obj/structure/table/reinforced/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + if(tool.tool_behaviour == TOOL_WELDER) + return NONE + + return ..() /obj/structure/table/bronze name = "bronze table" @@ -858,6 +864,12 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS +/obj/structure/rack/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers) + if(tool.tool_behaviour == TOOL_WRENCH) + return NONE + + return item_interaction(user, tool, modifiers) + /obj/structure/rack/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if((tool.item_flags & ABSTRACT) || user.combat_mode) return NONE diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index fd0983a5d2fd8..0a4a6ce6572b1 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -93,6 +93,10 @@ return TRUE return . +/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) + target.apply_status_effect(/datum/status_effect/crusher_damage) + return ..() + /obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, clickparams) if(!isliving(target)) return diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index dd3c2c243a02c..f4ae3548fa659 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -108,6 +108,12 @@ return ITEM_INTERACT_SUCCESS return NONE +/obj/item/hierophant_club/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(blink_activated) + blink.teleport(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE + /obj/item/hierophant_club/update_icon_state() icon_state = inhand_icon_state = "hierophant_club[blink?.current_charges > 0 ? "_ready":""][(!QDELETED(beacon)) ? "":"_beacon"]" return ..() diff --git a/code/modules/unit_tests/serving_tray.dm b/code/modules/unit_tests/serving_tray.dm index d12648dca9965..e1997cc7bdcf3 100644 --- a/code/modules/unit_tests/serving_tray.dm +++ b/code/modules/unit_tests/serving_tray.dm @@ -16,19 +16,19 @@ var/datum/storage/tray_storage = test_tray.atom_storage tray_storage.collection_mode = COLLECT_ONE - test_tray.pre_attack(the_bread, human) + test_tray.melee_attack_chain(human, the_bread) TEST_ASSERT_EQUAL((the_bread in test_tray.contents), TRUE, "The bread did not get picked up by the serving tray") - test_tray.pre_attack(banana, human) + test_tray.melee_attack_chain(human, banana) TEST_ASSERT_EQUAL((banana in test_tray.contents), TRUE, "The banana did not get picked up by the serving tray") - the_table.attackby(test_tray, human) + test_tray.melee_attack_chain(human, the_table) TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting the table") - test_tray.pre_attack(sugarcookie, human) + test_tray.melee_attack_chain(human, sugarcookie) TEST_ASSERT_EQUAL((sugarcookie in test_tray.contents), TRUE, "The sugarcookie did not get picked up by the serving tray") @@ -41,7 +41,6 @@ human.equip_to_slot(test_tray, ITEM_SLOT_RPOCKET) TEST_ASSERT(human.get_item_by_slot(ITEM_SLOT_RPOCKET), "Serving tray failed to fit in the Right Pocket") - test_tray.attack(human, human) + test_tray.melee_attack_chain(human, human) TEST_ASSERT_EQUAL(test_tray.contents.len, 0, "The serving tray did not drop all items on hitting a human") - From 2a40a75a75181a169f848f8ba6547c976c591044 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 05:25:24 +1200 Subject: [PATCH 065/120] Automatic changelog for PR #83910 [ci skip] --- html/changelogs/AutoChangeLog-pr-83910.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83910.yml diff --git a/html/changelogs/AutoChangeLog-pr-83910.yml b/html/changelogs/AutoChangeLog-pr-83910.yml new file mode 100644 index 0000000000000..5724696806ab9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83910.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Heirophant Club Blink at range" + - bugfix: "Crusher Loot" + - bugfix: "RCD material reclamation" \ No newline at end of file From 54d07c767cedd49e3bbbdc491d8b5c5bf157510b Mon Sep 17 00:00:00 2001 From: Lucy Grindler <110352801+LucyGrind@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:16:46 -0700 Subject: [PATCH 066/120] Fixes crayon not fitting in pda by replacing attackby w/ item_interaction (#83951) ## About The Pull Request Fixes a bug, what else do you need fixes #83948 ## Why It's Good For The Game Bugs are bad for game health and crayons fitting in pdas aren't really a major change. ## Changelog :cl: fix: Crayons now fit in pdas /:cl: --- .../modular_computers/computers/item/pda.dm | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index ec0d4a94e2bb6..c2327eac4b3b0 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -140,22 +140,22 @@ return . || NONE -/obj/item/modular_computer/pda/attackby(obj/item/attacking_item, mob/user, params) - . = ..() +/obj/item/modular_computer/pda/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(!is_type_in_list(attacking_item, contained_item)) - return - if(attacking_item.w_class >= WEIGHT_CLASS_SMALL) // Anything equal to or larger than small won't work + if(!is_type_in_list(tool, contained_item)) + return NONE + if(tool.w_class >= WEIGHT_CLASS_SMALL) // Anything equal to or larger than small won't work user.balloon_alert(user, "too big!") - return + return ITEM_INTERACT_BLOCKING if(inserted_item) balloon_alert(user, "no room!") - return - if(!user.transferItemToLoc(attacking_item, src)) - return - balloon_alert(user, "inserted [attacking_item]") - inserted_item = attacking_item + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "inserted [tool]") + inserted_item = tool playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) + return ITEM_INTERACT_SUCCESS /obj/item/modular_computer/pda/item_ctrl_click(mob/user) From 46447b0a615a2f2f8ada50cf904819b5e178dc21 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 06:17:05 +1200 Subject: [PATCH 067/120] Automatic changelog for PR #83951 [ci skip] --- html/changelogs/AutoChangeLog-pr-83951.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83951.yml diff --git a/html/changelogs/AutoChangeLog-pr-83951.yml b/html/changelogs/AutoChangeLog-pr-83951.yml new file mode 100644 index 0000000000000..f70eff32c4ff5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83951.yml @@ -0,0 +1,4 @@ +author: "LucyGrind" +delete-after: True +changes: + - bugfix: "Crayons now fit in pdas" \ No newline at end of file From cd2f107eefb2ba0bf8368ab0efd7f75adf977fec Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:24:32 -0500 Subject: [PATCH 068/120] Moves cult spells off attack_atom (#83961) ## About The Pull Request `attack_atom`, while sensibly sounding, isn't called for most items, because they can't be attacked. ## Changelog :cl: Melbert qol: Attack animations for cult spells on attackable objects (people, airlocks) fix: Fix cult spells on non-attackable objects (metal sheets, blood decals) /:cl: --- code/modules/antagonists/cult/blood_magic.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 03a05f6c39779..192d9c4e66d5a 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -379,24 +379,27 @@ cast_spell(user, user) /obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user) - if(!iscarbon(user) || !IS_CULTIST(user)) - uses = 0 - qdel(src) - return log_combat(user, M, "used a cult spell on", source.name, "") SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") M.lastattacker = user.real_name M.lastattackerckey = user.ckey + user.do_attack_animation(M) cast_spell(M, user) -/obj/item/melee/blood_magic/attack_atom(atom/attacked_atom, mob/living/user, params) +/obj/item/melee/blood_magic/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!iscarbon(user) || !IS_CULTIST(user)) uses = 0 qdel(src) - return - log_combat(user, attacked_atom, "used a cult spell on", source.name, "") + return ITEM_INTERACT_BLOCKING + + if(isliving(interacting_with)) + return ITEM_INTERACT_SKIP_TO_ATTACK + + user.do_attack_animation(interacting_with) + log_combat(user, interacting_with, "used a cult spell on", source.name, "") SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]") - cast_spell(attacked_atom, user) + cast_spell(interacting_with, user) + return ITEM_INTERACT_SUCCESS /obj/item/melee/blood_magic/proc/cast_spell(atom/target, mob/living/carbon/user) if(invocation) From d5944df1232cd265efdb92901745637360efdcf8 Mon Sep 17 00:00:00 2001 From: GoblinBackwards <22856555+GoblinBackwards@users.noreply.github.com> Date: Fri, 14 Jun 2024 19:24:52 +0100 Subject: [PATCH 069/120] Fixes thermal holster trait issues (#83962) ## About The Pull Request Uses ADD_CLOTHING_TRAIT to store a ref to the individual holster item that's providing the gunflip trait. This fixes an issue that was happening where having one holster equipped and dropping or unequipping another would remove the trait from you, even though you were still wearing one. ## Why It's Good For The Game Fixes #83762 ## Changelog :cl: fix: Fixed thermal pistols sometimes not recognising an equipped holster when trying to spin them to recharge. /:cl: --- code/game/objects/items/storage/holsters.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index 400c949a99320..afb7b0f750b26 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -11,11 +11,11 @@ /obj/item/storage/belt/holster/equipped(mob/user, slot) . = ..() if(slot & (ITEM_SLOT_BELT|ITEM_SLOT_SUITSTORE)) - ADD_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + ADD_CLOTHING_TRAIT(user, TRAIT_GUNFLIP) /obj/item/storage/belt/holster/dropped(mob/user) . = ..() - REMOVE_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + REMOVE_CLOTHING_TRAIT(user, TRAIT_GUNFLIP) /obj/item/storage/belt/holster/Initialize(mapload) . = ..() From 0ebe7d5f31ae100c5cc10b6b3c297c170f90dc14 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 06:25:10 +1200 Subject: [PATCH 070/120] Automatic changelog for PR #83961 [ci skip] --- html/changelogs/AutoChangeLog-pr-83961.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83961.yml diff --git a/html/changelogs/AutoChangeLog-pr-83961.yml b/html/changelogs/AutoChangeLog-pr-83961.yml new file mode 100644 index 0000000000000..6aaaca8b128fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83961.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - qol: "Attack animations for cult spells on attackable objects (people, airlocks)" + - bugfix: "Fix cult spells on non-attackable objects (metal sheets, blood decals)" \ No newline at end of file From f14baad40c795402f0adb816d7f4f58be1e0eeb0 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 06:25:13 +1200 Subject: [PATCH 071/120] Automatic changelog for PR #83962 [ci skip] --- html/changelogs/AutoChangeLog-pr-83962.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83962.yml diff --git a/html/changelogs/AutoChangeLog-pr-83962.yml b/html/changelogs/AutoChangeLog-pr-83962.yml new file mode 100644 index 0000000000000..ca1eb7ec588fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83962.yml @@ -0,0 +1,4 @@ +author: "GoblinBackwards" +delete-after: True +changes: + - bugfix: "Fixed thermal pistols sometimes not recognising an equipped holster when trying to spin them to recharge." \ No newline at end of file From 996e94d49c1a01a67f23f06b00f5f95293c9da26 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Fri, 14 Jun 2024 21:26:12 +0300 Subject: [PATCH 072/120] Fix captain landmark icon (#83950) ## About The Pull Request He used to wear shoes roundstart but now wears laceup shoes. ## Changelog no player facing changes --- icons/mob/landmarks.dmi | Bin 30768 -> 30768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi index 4f2402389df9fd749b41a21f55074345ac4cdf2b..7d1253b14934461000117b99dc801eb94dfc5c9d 100644 GIT binary patch delta 30378 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%0A3_5)>L%ARBU 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 AjQ{`u From af23a63c37bbcc05e498eaa80e5a83e5ff31c830 Mon Sep 17 00:00:00 2001 From: Profakos Date: Fri, 14 Jun 2024 20:27:02 +0200 Subject: [PATCH 073/120] Logs bitrunning domain loading and completion (#83955) ## About The Pull Request This PR tallies the following: - Each time a domain is loaded, by key - Each time a domain's primary reward is loaded (completed the domain) - Each time a domain's secondary reward is found - Each time a BEPIS disk is rewarded ## Why It's Good For The Game Its nice to know which are the meta domains, which ones are easy to compete, and how often do people earn a BEPIS disk per round. ## Changelog Nothing player facing --- code/modules/bitrunning/server/loot.dm | 3 +++ code/modules/bitrunning/server/map_handling.dm | 2 ++ 2 files changed, 5 insertions(+) diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index aa7b99d6e922a..83d26daa6075a 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -22,6 +22,7 @@ /// Handles spawning the (new) crate and deleting the former /obj/machinery/quantum_server/proc/generate_loot(obj/cache, obj/machinery/byteforge/chosen_forge) + SSblackbox.record_feedback("tally", "bitrunning_domain_primary_completed", 1, generated_domain.key) for(var/mob/person in cache.contents) SEND_SIGNAL(person, COMSIG_BITRUNNER_CACHE_SEVER) @@ -47,6 +48,7 @@ reward_cache.update_appearance() if(can_generate_tech_disk(grade)) + SSblackbox.record_feedback("tally", "bitrunning_bepis_rewarded", 1, generated_domain.key) new /obj/item/disk/design_disk/bepis/remove_tech(reward_cache) generated_domain.disk_reward_spawned = TRUE @@ -54,6 +56,7 @@ return TRUE /obj/machinery/quantum_server/proc/generate_secondary_loot(obj/curiosity, obj/machinery/byteforge/chosen_forge) + SSblackbox.record_feedback("tally", "bitrunning_domain_secondary_completed", 1, generated_domain.key) spark_at_location(curiosity) // abracadabra! qdel(curiosity) // and it's gone! diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index ed3adc3467ee1..a55de5dbf9ded 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -51,6 +51,8 @@ is_ready = TRUE return FALSE + SSblackbox.record_feedback("tally", "bitrunning_domain_loaded", 1, map_key) + is_ready = TRUE if(prob(clamp((threat * glitch_chance), 1, 10))) From bea0930a188b67cc77acfdae3c05b51bb6039c83 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:49:31 -0500 Subject: [PATCH 074/120] Re-adds bagulo (remastered), 3 max bluespace cores, singulos may collapse if a third BoH is added (#83892) ## About The Pull Request - BoH + BoH = Singulo - This time it has a unique animation associated with it spawning, it starts off as a tear and then becomes a singulo after a short time. - Max number of bluespace cores available to the crew reduced from 8 to 3 - Chucking a BoH into a singulo causes it to collapse in on itself. (Supermatter charged singulos are immune.) ## Why It's Good For The Game BoH is generally harder to acquire now which means we can bring back soul The max core number was reduced just to make sure it doesn't get spammed too much. Four's a crowd. It also might be the first time we actually hit a core limit I thought it would be fun to make it so you can do something to stop it, so if you're a bad enough dude and can make a third BoH, you can chuck it into the bagulo to cause it to collapse. Singuloose generally ends the round regardless so I thought letting people have hero moments would be fun. ## Changelog :cl: Melbert balance: Re-adds Bagulo balance: The max number of bluespace cores available to the crew has been reduced to 3 (was: 8) balance: Chucking a BoH into an uncharged singulo may save the station. /:cl: --- code/__DEFINES/research/anomalies.dm | 2 +- .../datums/storage/subtypes/bag_of_holding.dm | 4 +-- code/modules/power/singularity/boh_tear.dm | 33 ++++++++++--------- code/modules/power/singularity/singularity.dm | 25 ++++++++++++++ 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 3b2687b5fcf55..db605431c610c 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -1,5 +1,5 @@ // Max amounts of cores you can make -#define MAX_CORES_BLUESPACE 8 +#define MAX_CORES_BLUESPACE 3 #define MAX_CORES_GRAVITATIONAL 8 #define MAX_CORES_FLUX 8 #define MAX_CORES_VORTEX 8 diff --git a/code/datums/storage/subtypes/bag_of_holding.dm b/code/datums/storage/subtypes/bag_of_holding.dm index 8a812d7064d51..a4ea699e42e21 100644 --- a/code/datums/storage/subtypes/bag_of_holding.dm +++ b/code/datums/storage/subtypes/bag_of_holding.dm @@ -32,13 +32,13 @@ span_userdanger("The Bluespace interfaces of the two devices catastrophically malfunction!"), span_danger("The Bluespace interfaces of the two devices catastrophically malfunction!"), ) - playsound(rift_loc, 'sound/effects/supermatter.ogg', 200, TRUE) message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(rift_loc)].") user.log_message("detonated a bag of holding at [loc_name(rift_loc)].", LOG_ATTACK, color = "red") user.investigate_log("has been gibbed by a bag of holding recursive insertion.", INVESTIGATE_DEATHS) user.gib() - new /obj/boh_tear(rift_loc) + var/obj/boh_tear/tear = new(rift_loc) + tear.start_disaster() qdel(to_insert) qdel(parent) diff --git a/code/modules/power/singularity/boh_tear.dm b/code/modules/power/singularity/boh_tear.dm index 4397e31ff7629..a0089a7c94b35 100644 --- a/code/modules/power/singularity/boh_tear.dm +++ b/code/modules/power/singularity/boh_tear.dm @@ -1,12 +1,6 @@ -/// BoH tear -/// The BoH tear is a stationary singularity with a really high gravitational pull, which collapses briefly after being created -/// The BoH isn't deleted for 10 minutes (only moved to nullspace) so that admins may retrieve the things back in case of a grief -#define BOH_TEAR_CONSUME_RANGE 1 -#define BOH_TEAR_GRAV_PULL 25 - /obj/boh_tear name = "tear in the fabric of reality" - desc = "Your own comprehension of reality starts bending as you stare this." + desc = "As you gaze into the abyss, the only thing you can think is... \"Should I really be this close to it?\"" anchored = TRUE appearance_flags = LONG_GLIDE density = TRUE @@ -22,17 +16,27 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF flags_1 = SUPERMATTER_IGNORES_1 -/obj/boh_tear/Initialize(mapload) - . = ..() - QDEL_IN(src, 5 SECONDS) // vanishes after 5 seconds - +/obj/boh_tear/proc/start_disaster() + apply_wibbly_filters(src) + playsound(loc, 'sound/effects/clockcult_gateway_disrupted.ogg', vary = 200, extrarange = 3, falloff_exponent = 1, frequency = 0.33, pressure_affected = FALSE, ignore_walls = TRUE, falloff_distance = 7) AddComponent( /datum/component/singularity, \ - consume_range = BOH_TEAR_CONSUME_RANGE, \ - grav_pull = BOH_TEAR_GRAV_PULL, \ + consume_range = 1, \ + grav_pull = 21, \ roaming = FALSE, \ singularity_size = STAGE_SIX, \ ) + addtimer(CALLBACK(src, PROC_REF(bagulo_time)), 9 SECONDS, TIMER_DELETE_ME) + animate(src, time = 7.5 SECONDS, transform = transform.Scale(2), flags = ANIMATION_PARALLEL) + animate(time = 2 SECONDS, transform = transform.Scale(0.25), easing = ELASTIC_EASING) + animate(time = 0.5 SECONDS, alpha = 0) + +/obj/boh_tear/proc/bagulo_time() + playsound(loc, 'sound/effects/supermatter.ogg', 200, vary = TRUE, extrarange = 3, falloff_exponent = 1, frequency = 0.5, pressure_affected = FALSE, ignore_walls = TRUE, falloff_distance = 7) + var/obj/singularity/bagulo = new(loc) + bagulo.expand(STAGE_TWO) + bagulo.energy = 400 + qdel(src) /obj/boh_tear/attack_tk(mob/user) if(!isliving(user)) @@ -43,6 +47,3 @@ jedi.spawn_dust() addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, attack_hand), jedi), 0.5 SECONDS) return COMPONENT_CANCEL_ATTACK_CHAIN - -#undef BOH_TEAR_CONSUME_RANGE -#undef BOH_TEAR_GRAV_PULL diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 74b7bfdbcdcb4..0475736f6a502 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -43,6 +43,8 @@ var/move_self = TRUE ///If the singularity has eaten a supermatter shard and can go to stage six var/consumed_supermatter = FALSE + /// Is the black hole collapsing into nothing + var/collapsing = FALSE /// How long it's been since the singulo last acted, in seconds var/time_since_act = 0 /// What the game tells ghosts when you make one @@ -309,6 +311,10 @@ return TRUE /obj/singularity/proc/consume(atom/thing) + if(istype(thing, /obj/item/storage/backpack/holding) && !consumed_supermatter && !collapsing) + consume_boh(thing) + return + var/gain = thing.singularity_act(current_size, src) energy += gain if(istype(thing, /obj/machinery/power/supermatter_crystal) && !consumed_supermatter) @@ -320,6 +326,25 @@ consumed_supermatter = TRUE set_light(10) +/obj/singularity/proc/consume_boh(obj/boh) + collapsing = TRUE + name = "unstable [initial(name)]" + desc = "[initial(desc)] It seems to be collapsing in on itself." + visible_message( + message = span_danger("As [src] consumes [boh], it begins to collapse in on itself!"), + blind_message = span_hear("You hear aggressive crackling!"), + vision_distance = 15, + ) + playsound(loc, 'sound/effects/clockcult_gateway_disrupted.ogg', 200, vary = TRUE, extrarange = 3, falloff_exponent = 1, frequency = -1, pressure_affected = FALSE, ignore_walls = TRUE, falloff_distance = 7) + addtimer(CALLBACK(src, PROC_REF(consume_boh_sfx)), 4 SECONDS) + animate(src, time = 4 SECONDS, transform = transform.Scale(0.25), flags = ANIMATION_PARALLEL, easing = ELASTIC_EASING) + animate(time = 0.5 SECONDS, alpha = 0) + QDEL_IN(src, 4.1 SECONDS) + qdel(boh) + +/obj/singularity/proc/consume_boh_sfx() + playsound(loc, 'sound/effects/supermatter.ogg', 200, vary = TRUE, extrarange = 3, falloff_exponent = 1, frequency = 0.5, pressure_affected = FALSE, ignore_walls = TRUE, falloff_distance = 7) + /obj/singularity/proc/check_cardinals_range(steps, retry_with_move = FALSE) . = length(GLOB.cardinals) //Should be 4. for(var/i in GLOB.cardinals) From 8fbf9328e8c8e7801cf49c7a91572ffce28e92a7 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:49:50 +1200 Subject: [PATCH 075/120] Automatic changelog for PR #83892 [ci skip] --- html/changelogs/AutoChangeLog-pr-83892.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83892.yml diff --git a/html/changelogs/AutoChangeLog-pr-83892.yml b/html/changelogs/AutoChangeLog-pr-83892.yml new file mode 100644 index 0000000000000..2f2d67eb8dc8c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83892.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - balance: "Re-adds Bagulo" + - balance: "The max number of bluespace cores available to the crew has been reduced to 3 (was: 8)" + - balance: "Chucking a BoH into an uncharged singulo may save the station." \ No newline at end of file From bc0e2587cd291df7654688b017ea8882d77c0cb2 Mon Sep 17 00:00:00 2001 From: StaringGasMask <62149527+Exester509@users.noreply.github.com> Date: Fri, 14 Jun 2024 21:56:29 +0200 Subject: [PATCH 076/120] Phazons now use ectoplasm cores (#83939) ## About The Pull Request Phazons now use ectoplasm anomaly cores instead of bluespace ones. Text implying otherwise has been changed as well. Allows ectoplasm cores to be bought via the science supply console. ## Why It's Good For The Game Bluespace cores are some of the most overused ones in anomalock technology, and often the most desirable ones. Ectoplasm cores, however, have a single gimmicky and mediocre use. This PR aims to make them more appealing to the crew while reducing machines that rely on bluespace anomalies, so their available number can be more freely tweaked. ## Changelog :cl: balance: Phazon mechs use ectoplasm cores now balance: You can now acquire ectoplasm cores from the science supply interface /:cl: --------- Co-authored-by: Jacquerel --- code/modules/cargo/bounties/science.dm | 2 +- code/modules/cargo/packs/science.dm | 10 ++++++++++ code/modules/vehicles/mecha/combat/phazon.dm | 2 +- .../modules/vehicles/mecha/mecha_construction_paths.dm | 6 +++--- code/modules/vehicles/mecha/mecha_parts.dm | 6 +++--- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 91d0d71bfc311..67da7ad6b2984 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -97,7 +97,7 @@ //******Anomaly Cores****** /datum/bounty/item/science/ref_anomaly name = "Refined Bluespace Core" - description = "We need a bluespace core to fit in a Phazon. Ship us one, please." + description = "We need a bluespace core to assemble a bag of holding. Ship us one, please." reward = CARGO_CRATE_VALUE * 20 wanted_types = list(/obj/item/assembly/signaler/anomaly/bluespace = TRUE) diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 425137cd9ed77..4059b330e2f66 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -59,6 +59,16 @@ crate_name = "raw vortex anomaly" crate_type = /obj/structure/closet/crate/secure/science +/datum/supply_pack/science/raw_ectoplasm_anomaly + name = "Raw Ectoplasm Anomaly" + desc = "Contains the raw core of a ectoplasm anomaly, ready to be implosion-compressed into a powerful artifact." + cost = CARGO_CRATE_VALUE * 10 + access = ACCESS_ORDNANCE + access_view = ACCESS_ORDNANCE + contains = list(/obj/item/raw_anomaly_core/ectoplasm) + crate_name = "raw ectoplasm anomaly" + crate_type = /obj/structure/closet/crate/secure/science + /datum/supply_pack/science/raw_bluespace_anomaly name = "Raw Bluespace Anomaly" desc = "Contains the raw core of a bluespace anomaly, ready to be implosion-compressed into a powerful artifact." diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index 9c80339bde4af..cacfa7743dfbb 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -1,5 +1,5 @@ /obj/vehicle/sealed/mecha/phazon - desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." + desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge anomalous technology and expensive materials." name = "\improper Phazon" icon_state = "phazon" base_icon_state = "phazon" diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 28f5a7e9fb3fb..e77b1eebacfab 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -759,12 +759,12 @@ "backward_message" = "unfastened external armor layer" ), list( - "key" = /obj/item/assembly/signaler/anomaly/bluespace, + "key" = /obj/item/assembly/signaler/anomaly/ectoplasm, "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, - "desc" = "The external armor is welded, and the bluespace anomaly core socket is open.", + "desc" = "The external armor is welded, and the ectoplasm anomaly core socket is open.", "icon_state" = "phazon26", - "forward_message" = "inserted bluespace anomaly core", + "forward_message" = "inserted ectoplasm anomaly core", "backward_message" = "cut off external armor" ) ) diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index 2a08f62bfac38..7fcee2092590c 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -253,12 +253,12 @@ /obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, params) . = ..() - if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/bluespace)) - to_chat(user, "The anomaly core socket only accepts bluespace anomaly cores!") + if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/ectoplasm)) + to_chat(user, "The anomaly core socket only accepts ectoplasm anomaly cores!") /obj/item/mecha_parts/part/phazon_torso name="\improper Phazon torso" - desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." + desc="A Phazon torso part. The socket for the ectoplasmic core that powers the exosuit's unique phase drives is located in the middle." icon_state = "phazon_harness" /obj/item/mecha_parts/part/phazon_head From 7345ca4c4ba23a52fd1ac2f904861406b55e7d16 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:56:47 +1200 Subject: [PATCH 077/120] Automatic changelog for PR #83939 [ci skip] --- html/changelogs/AutoChangeLog-pr-83939.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83939.yml diff --git a/html/changelogs/AutoChangeLog-pr-83939.yml b/html/changelogs/AutoChangeLog-pr-83939.yml new file mode 100644 index 0000000000000..c57b991c6a116 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83939.yml @@ -0,0 +1,5 @@ +author: "Exester509" +delete-after: True +changes: + - balance: "Phazon mechs use ectoplasm cores now" + - balance: "You can now acquire ectoplasm cores from the science supply interface" \ No newline at end of file From 2589b63e35036c053c4dd71ef969a712455cf1c6 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:39:29 +0200 Subject: [PATCH 078/120] Flatpacker (#83836) ## About The Pull Request adds the flatpacker, it flatpacks machines ![2024-02-08 19_47_34-Window](https://github.com/tgstation/tgstation/assets/70376633/331c85e2-cdac-4ebe-9aac-d83c514bcd23) it is unlocked at industrial engineering the default print time is 4.5 seconds, reduced by the servo tier divided by 2 matter bins increase material capacity better servos decrease material cost, and the flatpacker cannot print a machine if it contains parts that are of a tier larger than the servos tier explained in this vid https://github.com/tgstation/tgstation/assets/70376633/c26e4379-f49b-4b1d-a70c-61f1ba96a9e0 ## Why It's Good For The Game machine construction sucks, this should be more convenient, this does not replace machine construction at all compared to machine frames while this is faster and more convenient, it is significantly more costly in materials, and a better servo is needed to use higher tier parts, and the printed machines are always the lowest required tier ## Changelog :cl: add: the flatpacker, a machine unlocked at industrial engineering /:cl: --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/_globalvars/lists/objects.dm | 3 +- code/controllers/subsystem/research.dm | 7 + code/datums/components/crafting/furniture.dm | 12 + code/game/machinery/flatpacker.dm | 340 ++++++++++++++++++ .../machines/machine_circuitboards.dm | 11 + .../research/designs/machine_designs.dm | 10 + code/modules/research/techweb/all_nodes.dm | 1 + icons/obj/devices/circuitry_n_data.dmi | Bin 23758 -> 23033 bytes icons/obj/machines/lathes.dmi | Bin 11731 -> 11891 bytes icons/obj/structures.dmi | Bin 82169 -> 73712 bytes tgstation.dme | 1 + tgui/packages/tgui/interfaces/Flatpacker.tsx | 195 ++++++++++ 12 files changed, 578 insertions(+), 2 deletions(-) create mode 100644 code/game/machinery/flatpacker.dm create mode 100644 tgui/packages/tgui/interfaces/Flatpacker.tsx diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 1d53a499322d3..0e5f7feb75247 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -31,8 +31,7 @@ GLOBAL_LIST_EMPTY(deliverybeacontags) /// List of all singularity components that exist GLOBAL_LIST_EMPTY_TYPED(singularities, /datum/component/singularity) -/// list of all /datum/tech datums indexed by id. -GLOBAL_LIST_EMPTY(tech_list) +GLOBAL_LIST_EMPTY(item_to_design_list) /// list of all surgeries by name, associated with their path. GLOBAL_LIST_INIT(surgeries_list, init_surgeries()) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 612c599c0f62c..5b00915307185 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(research) //TECHWEB STATIC var/list/techweb_nodes = list() //associative id = node datum var/list/techweb_designs = list() //associative id = node datum + var/list/datum/design/item_to_design = list() //typepath = list of design datums ///List of all techwebs, generating points or not. ///Autolathes, Mechfabs, and others all have shared techwebs, for example. @@ -162,6 +163,7 @@ SUBSYSTEM_DEF(research) /datum/controller/subsystem/research/proc/initialize_all_techweb_designs(clearall = FALSE) if(islist(techweb_designs) && clearall) + item_to_design = null QDEL_LIST(techweb_designs) var/list/returned = list() for(var/path in subtypesof(/datum/design)) @@ -176,6 +178,11 @@ SUBSYSTEM_DEF(research) stack_trace("WARNING: Design ID clash with ID [initial(DN.id)] detected! Path: [path]") errored_datums[DN] = initial(DN.id) continue + var/build_path = initial(DN.build_path) + if(!isnull(build_path)) + if(!(build_path in item_to_design)) + item_to_design[build_path] = list() + item_to_design[build_path] += DN DN.InitializeMaterials() //Initialize the materials in the design returned[initial(DN.id)] = DN techweb_designs = returned diff --git a/code/datums/components/crafting/furniture.dm b/code/datums/components/crafting/furniture.dm index dfa43ad87c28d..39f5a25a19f8f 100644 --- a/code/datums/components/crafting/furniture.dm +++ b/code/datums/components/crafting/furniture.dm @@ -59,3 +59,15 @@ tool_behaviors = list(TOOL_SCREWDRIVER) category = CAT_FURNITURE time = 7 SECONDS + +/datum/crafting_recipe/flatpack_cart + name = "Flatpack Cart" + reqs = list( + /obj/item/stack/sheet/iron = 4, + /obj/item/stack/sheet/plasteel = 1, + /obj/item/stack/rods = 8 + ) + result = /obj/structure/flatpack_cart + tool_behaviors = list(TOOL_SCREWDRIVER) + category = CAT_FURNITURE + time = 10 SECONDS diff --git a/code/game/machinery/flatpacker.dm b/code/game/machinery/flatpacker.dm new file mode 100644 index 0000000000000..1eb8f6e2cc5cb --- /dev/null +++ b/code/game/machinery/flatpacker.dm @@ -0,0 +1,340 @@ +#define CREATE_AND_INCREMENT(L, I, increment) if(!(I in L)) { L[I] = 0; } L[I] += increment; +/obj/machinery/flatpacker + name = "flatpacker" + desc = "It produces items using iron, glass, plastic and maybe some more." + icon = 'icons/obj/machines/lathes.dmi' + base_icon_state = "flatpacker" + icon_state = "flatpacker" + density = TRUE + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION + circuit = /obj/item/circuitboard/machine/flatpacker + + /// Are we busy printing? + var/busy = FALSE + /// Coefficient applied to consumed materials. Lower values result in lower material consumption. + var/creation_efficiency = 2 + ///The container to hold materials + var/datum/component/material_container/materials + /// The inserted board + var/obj/item/circuitboard/machine/inserted_board + /// Materials needed to print this board + var/list/needed_mats = list() + /// The highest tier of this board + var/print_tier = 1 + /// Our max print tier + var/max_part_tier = 1 + /// time needed to produce a flatpacked machine + var/flatpack_time = 4.5 SECONDS + +/obj/machinery/flatpacker/Initialize(mapload) + materials = AddComponent( \ + /datum/component/material_container, \ + SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \ + 0, \ + MATCONTAINER_EXAMINE, \ + container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/flatpacker, AfterMaterialInsert)) \ + ) + return ..() + +/obj/machinery/flatpacker/RefreshParts() + . = ..() + var/mat_capacity = 0 + for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts) + mat_capacity += new_matter_bin.tier * 25 * SHEET_MATERIAL_AMOUNT + materials.max_amount = mat_capacity + + var/datum/stock_part/servo/servo = locate() in component_parts + max_part_tier = servo.tier + flatpack_time = initial(flatpack_time) - servo.tier / 2 // T4 = 2 seconds off + var/efficiency = initial(creation_efficiency) + for(var/datum/stock_part/micro_laser/laser in component_parts) + efficiency -= laser.tier * 0.2 + creation_efficiency = max(1.2, efficiency) + +/obj/machinery/flatpacker/examine(mob/user) + . += ..() + if(in_range(user, src) || isobserver(user)) + . += span_notice("The status display reads:") + . += span_notice("Capable of packing up to Tier [max_part_tier].") + . += span_notice("Storing up to [materials.max_amount] material units.") + . += span_notice("Material consumption at [creation_efficiency*100]%") + +/obj/machinery/flatpacker/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER + + flick_overlay_view("[base_icon_state]_[item_inserted.has_material_type(/datum/material/glass) ? "glass" : "metal"]", 1.4 SECONDS) + + directly_use_energy(min(active_power_usage * 0.25, amount_inserted / 100)) + +/obj/machinery/flatpacker/update_overlays() + . = ..() + + if(!isnull(inserted_board)) + . += mutable_appearance(icon, "[base_icon_state]_c") + +/obj/machinery/flatpacker/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Flatpacker") + ui.open() + +/obj/machinery/flatpacker/ui_static_data(mob/user) + return materials.ui_static_data() + +/obj/machinery/flatpacker/ui_data(mob/user) + var/list/data = list() + + var/atom/build = initial(inserted_board.build_path) + data["materials"] = materials.ui_data() + data["boardInserted"] = !isnull(inserted_board) + data["busy"] = busy + var/list/cost_mats = list() + for(var/datum/material/mat_type as anything in needed_mats) + var/list/new_entry = list() + new_entry["name"] = initial(mat_type.name) + new_entry["amount"] = needed_mats[mat_type] + cost_mats += list(new_entry) + + var/list/design + if(data["boardInserted"]) + var/disableReason = "" + var/has_materials = materials.has_materials(needed_mats, creation_efficiency) + if(!has_materials) + disableReason += "Not enough materials. " + if(print_tier > max_part_tier) + disableReason += "This design is too advanced for this machine. " + design = list( + "name" = initial(build.name), + "requiredMaterials" = cost_mats, + "icon" = icon2base64(icon(initial(build.icon), initial(build.icon_state), frame = 1)), + "canPrint" = has_materials && print_tier <= max_part_tier, + "disableReason" = disableReason + ) + data["design"] = design + return data + +/obj/machinery/flatpacker/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/sheetmaterials), + get_asset_datum(/datum/asset/spritesheet/research_designs), + ) + +/obj/machinery/flatpacker/item_interaction(mob/living/user, obj/item/attacking_item, params) + if(istype(attacking_item, /obj/item/circuitboard/machine)) + if(busy) + balloon_alert(user, "busy!") + return ITEM_INTERACT_BLOCKING + if (!user.transferItemToLoc(attacking_item, src)) + return ITEM_INTERACT_BLOCKING + // If insertion was successful and there's already a diskette in the console, eject the old one. + if(inserted_board) + inserted_board.forceMove(drop_location()) + + inserted_board = attacking_item + // 5 sheets of iron and 5 of cable coil + needed_mats = list() + for(var/type as anything in inserted_board.req_components) + needed_mats = analyze_cost(type, needed_mats) + + CREATE_AND_INCREMENT(needed_mats, /datum/material/iron, (SHEET_MATERIAL_AMOUNT * 5 + (SHEET_MATERIAL_AMOUNT / 20))) + CREATE_AND_INCREMENT(needed_mats, /datum/material/glass, (SHEET_MATERIAL_AMOUNT / 20)) + + update_appearance() + return ITEM_INTERACT_SUCCESS + + return NONE + +/** + * Attempts to find the total material cost of a typepath (including our creation efficiency), modifying a list + * The list is modified as an assoc list: Material datum typepath = Cost + * If the type is found on a techweb, uses material costs from there + * Otherwise, the typepath is created in nullspace and fetches materials from the initialized one, then deleted. + * + * Args: + * type - Typepath of the item we are trying to find the costs of + * costs - Assoc list we modify and return + */ +/obj/machinery/flatpacker/proc/analyze_cost(type, costs) + var/comp_type = type + if(ispath(type, /datum/stock_part)) + var/datum/stock_part/as_part = type + comp_type = initial(as_part.physical_object_type) + if(as_part.tier > print_tier) + print_tier = as_part.tier + + var/by_techweb = !isnull(SSresearch.item_to_design[comp_type]) + var/obj/item/null_comp = by_techweb ? null : new comp_type + var/list/mat_list = by_techweb ? SSresearch.item_to_design[comp_type][1].materials : null_comp.custom_materials + for(var/atom/mat as anything in mat_list) + var/mat_type = mat.type + + CREATE_AND_INCREMENT(costs, mat_type, mat_list[mat] * inserted_board.req_components[type]) + + qdel(null_comp) + return costs + +/// Start building the currently inserted board, if possible +/obj/machinery/flatpacker/proc/start_build() + . = FALSE + if(!inserted_board) + return + if(!materials.has_materials(needed_mats, creation_efficiency)) + say("Not enough materials to begin production.") + return + if(print_tier > max_part_tier) + say("Design too complex.") + return + materials.use_materials(needed_mats, creation_efficiency) + playsound(src, 'sound/items/rped.ogg', 50, TRUE) + busy = TRUE + + addtimer(CALLBACK(src, PROC_REF(finish_build), inserted_board), flatpack_time) + return TRUE + +/// turns the supplied board into a flatpack, and sets the machine as not busy +/obj/machinery/flatpacker/proc/finish_build(board) + busy = FALSE + new /obj/item/flatpack(drop_location(), board) + +/obj/machinery/flatpacker/Exited(atom/movable/gone, direction) + . = ..() + if(gone == inserted_board) + inserted_board = null + needed_mats = null + print_tier = 1 + update_appearance() + +/obj/machinery/flatpacker/ui_act(action, list/params) + . = ..() + + if(.) + return + + + switch(action) + if("build") + if(busy) + return FALSE + start_build() + return TRUE + + if("ejectBoard") + inserted_board.forceMove(drop_location()) + return TRUE + + if("eject") + var/datum/material/ejecting = locate(params["ref"]) + var/amount = text2num(params["amount"]) + if(!isnum(amount) || !istype(ejecting)) + return FALSE + + materials.retrieve_sheets(amount, ejecting, drop_location()) + return TRUE + + +/obj/machinery/flatpacker/Destroy() + QDEL_NULL(inserted_board) + . = ..() + +/obj/item/flatpack + name = "flatpack" + desc = "A box containing a compacted packed machine. Use multitool to deploy." + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "flatpack" + w_class = WEIGHT_CLASS_HUGE //cart time + throw_range = 2 + item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW + slowdown = 2.5 + drag_slowdown = 3.5 //use the cart stupid + /// The board we deploy + var/obj/item/circuitboard/machine/board + +/obj/item/flatpack/Initialize(mapload, obj/item/circuitboard/machine/board) + . = ..() + if(!isnull(board)) + src.board = board // i got board + board.forceMove(src) + var/obj/machinery/build = initial(board.build_path) + name += " ([initial(build.name)])" + +/obj/item/flatpack/Destroy() + QDEL_NULL(board) + . = ..() + +/obj/item/flatpack/multitool_act(mob/living/user, obj/item/tool) + . = NONE + if(isnull(board)) + return ITEM_INTERACT_BLOCKING + if(!isopenturf(loc)) + user.balloon_alert(user, "cant deploy here!") + return ITEM_INTERACT_BLOCKING + balloon_alert_to_viewers("deploying!") + if(!do_after(user, 1 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + new /obj/effect/temp_visual/mook_dust(loc) + var/obj/machinery/new_machine = new board.build_path(loc) + loc.visible_message(span_warning("[src] deploys!")) + playsound(src, 'sound/machines/terminal_eject.ogg', 70, TRUE) + new_machine.RefreshParts() + new_machine.on_construction(user) + + for(var/mob/living/victim in loc) + step(victim, pick(GLOB.cardinals)) + + qdel(src) + return ITEM_INTERACT_SUCCESS + +/obj/structure/flatpack_cart + name = "flatpack cart" + desc = "A cart specifically made to hold flatpacks from a flatpacker, evenly distributing weight. Convenient!" + icon = 'icons/obj/structures.dmi' + icon_state = "flatcart" + density = TRUE + opacity = FALSE + /// max flatpacks + var/max_flatpacks = 3 + +/obj/structure/flatpack_cart/Initialize(mapload) + . = ..() + AddElement(/datum/element/noisy_movement, volume = 45) // i hate noise + +/obj/structure/flatpack_cart/atom_destruction(damage_flag) + for(var/atom/movable/content as anything in contents) + content.forceMove(drop_location()) + return ..() + +/obj/structure/flatpack_cart/examine(mob/user) + . = ..() + . += "From bottom to top, this cart contains:" + for(var/obj/item/flatpack as anything in contents) + . += flatpack.name + +/obj/structure/flatpack_cart/update_overlays() + . = ..() + + var/offset = 0 + for(var/item in contents) + var/mutable_appearance/flatpack_overlay = mutable_appearance(icon, "flatcart_flat", layer = layer + (offset * 0.01)) + flatpack_overlay.pixel_y = offset + offset += 4 + . += flatpack_overlay + +/obj/structure/flatpack_cart/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + user.put_in_hands(contents[length(contents)]) //topmost box + update_appearance(UPDATE_OVERLAYS) + +/obj/structure/flatpack_cart/item_interaction(mob/living/user, obj/item/attacking_item, params) + if(!istype(attacking_item, /obj/item/flatpack)) + return NONE + if (length(contents) >= max_flatpacks) + balloon_alert(user, "full!") + return ITEM_INTERACT_BLOCKING + if (!user.transferItemToLoc(attacking_item, src)) + return ITEM_INTERACT_BLOCKING + update_appearance(UPDATE_OVERLAYS) + return ITEM_INTERACT_SUCCESS + +#undef CREATE_AND_INCREMENT diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 61b17cd25d67b..6666a87f09cce 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -1610,3 +1610,14 @@ /datum/stock_part/micro_laser/tier2 = 2, /obj/item/stack/sheet/plasteel = 2, ) + +/obj/item/circuitboard/machine/flatpacker + name = "Flatpacker" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/flatpacker + req_components = list( + /datum/stock_part/matter_bin = 2, + /datum/stock_part/micro_laser = 2, + /datum/stock_part/servo = 1, + /obj/item/stack/sheet/plasteel = 5, + ) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 65dd75142a287..7d4f613f05478 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -1168,3 +1168,13 @@ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELEPORT, ) departmental_flags = DEPARTMENT_BITFLAG_CARGO + +/datum/design/board/flatpacker + name = "Flatpacker Machine Board" + desc = "The circuit board for a Flatpacker." + id = "flatpacker" + build_path = /obj/item/circuitboard/machine/flatpacker + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index a8ce5f274eb14..1c6e6f2b9f7ee 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -659,6 +659,7 @@ "thermomachine", "w-recycler", "welding_goggles", + "flatpacker", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500) discount_experiments = list(/datum/experiment/scanning/random/material/easy = 7500) diff --git a/icons/obj/devices/circuitry_n_data.dmi b/icons/obj/devices/circuitry_n_data.dmi index 6a12910283efac42292ec9181c20dfbb3e5d0331..cacf3cf13b73647728dce63a3aaeaa989a8a51b1 100644 GIT binary patch literal 23033 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 V^AIEtL7s9z<*B-2$rIyG{{sfidDQ>_ diff --git a/icons/obj/machines/lathes.dmi b/icons/obj/machines/lathes.dmi index f4bb2116b42f1a1aaa64db9f1ee97a598e2093d9..0e7d91484216c4bf73540f1c24c820fe11497ef6 100644 GIT binary patch literal 11891 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 literal 11731 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
+ + {design ? toTitleCase(design.name) : 'No Board!'} + +
+ + + + + + + + {design ? ( + + + act('build')} /> + + + + + + ) : ( + No circuit present! + )} + + +
+ + act('eject', { ref: material.ref, amount }) + } + /> +
+
+ + + + ); +}; + +type BoardPreviewProps = { + design: Design; + onPrint: () => void; +}; + +const BoardPreview = (props: BoardPreviewProps) => { + const { design, onPrint } = props; + + return ( +
+ + + + + + + + + + + + +
+ ); +}; + +type CostPreviewProps = { + SHEET_MATERIAL_AMOUNT: number; + materials?: Material[]; +}; + +const CostPreview = (props: CostPreviewProps) => { + const { materials, SHEET_MATERIAL_AMOUNT } = props; + + return ( +
+ {materials ? ( + + {materials.map((material) => ( + + + + + + {toTitleCase(material.name)} + + + ×{(material.amount / SHEET_MATERIAL_AMOUNT).toFixed(2)} + + + ))} +
+ ) : ( + No materials required! + )} +
+ ); +}; From c2b5bc27df25ba17b662e87674d79208729bebe6 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 08:39:48 +1200 Subject: [PATCH 079/120] Automatic changelog for PR #83836 [ci skip] --- html/changelogs/AutoChangeLog-pr-83836.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83836.yml diff --git a/html/changelogs/AutoChangeLog-pr-83836.yml b/html/changelogs/AutoChangeLog-pr-83836.yml new file mode 100644 index 0000000000000..83cae7b204bb7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83836.yml @@ -0,0 +1,4 @@ +author: "mc-oofert" +delete-after: True +changes: + - rscadd: "the flatpacker, a machine unlocked at industrial engineering" \ No newline at end of file From e87045b3771ec213cec749e5013ff959ee0c7163 Mon Sep 17 00:00:00 2001 From: BurgerLUA <8602857+BurgerLUA@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:57:33 -0700 Subject: [PATCH 080/120] Tweaks some instances of get_safe_turf so things like the nuclear disk doesn't accidentally teleport to the Icebox Syndicate Base (#83012) Yes, I know preventing the nuke disk teleporting to the icebox syndicate base (or possibly the wendigo arena) is removing soul. Please don't kill me :( ## About The Pull Request Adds some missing variables to instances of get_safe_turf() so they will only teleport to the given z-level. Replaces some instances of get_safe_turf() with get_safe_random_station_turf(). ## Why It's Good For The Game First, the differences between get_safe_turf() and get_safe_random_station_turf(): ### get_safe_turf() - gets a random safe turf on a z-level (usually any of the staiton z-levels), not accounting for the /area/ - should be used if you don't care if it spawns on the station or not, or if you need to specifically teleport to a z-level - not very expensive performance wise ### get_safe_random_station_turf() - gets a random safe turf that will always be a station area, ignoring z-level. - should be used if you NEED the turf to be on a station's area - slightly more expensive performance wise than get_safe_turf, but still very cheap Some code was using get_safe_turf() when it should've been using get_safe_random_station_turf(), and some code that should be using get_safe_turf() were incorrectly using the zlevels arg instead of zlevel arg (Yes, there is a difference), or didn't include it at all. All the changes were made to my best judgement. If you're curious about a change, please ask and I will explain why I did it. ## Changelog :cl: BurgerBB fix: Tweaks some instances of get_safe_turf so things like the nuclear disk doesn't accidentally teleport to the Icebox Syndicate Base /:cl: --------- Co-authored-by: Jacquerel --- code/datums/components/stationloving.dm | 3 ++- code/modules/admin/fun_balloon.dm | 2 +- code/modules/antagonists/blob/overmind.dm | 2 +- code/modules/antagonists/heretic/items/heretic_blades.dm | 2 +- code/modules/antagonists/wizard/equipment/artefact.dm | 2 +- code/modules/awaymissions/signpost.dm | 2 +- code/modules/events/electrical_storm.dm | 2 +- .../simple_animal/hostile/megafauna/demonic_frost_miner.dm | 2 +- code/modules/projectiles/guns/magic/wand.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 2 +- .../research/xenobiology/crossbreeding/_status_effects.dm | 2 +- 11 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 72481bed279b5..35f67d9cd0295 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -51,7 +51,8 @@ /// Teleports parent to a safe turf on the station z-level. /datum/component/stationloving/proc/relocate() - var/target_turf = find_safe_turf() + + var/target_turf = length(GLOB.the_station_areas) ? get_safe_random_station_turf(GLOB.the_station_areas) : find_safe_turf() //Fallback. Mostly for debug maps. if(!target_turf) if(GLOB.blobstart.len > 0) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index c95fce43dc943..7a56d63da2309 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -136,7 +136,7 @@ /obj/effect/fun_balloon/scatter/effect() for(var/mob/living/M in range(effect_range, get_turf(src))) - var/turf/T = find_safe_turf() + var/turf/T = find_safe_turf(zlevel = src.z) new /obj/effect/temp_visual/gravpush(get_turf(M)) M.forceMove(T) to_chat(M, span_notice("Pop!"), confidential = TRUE) diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index e4bba05242354..ea6706f96e999 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -87,7 +87,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) break else // no blob starts so look for an alternate for(var/i in 1 to 16) - var/turf/picked_safe = find_safe_turf() + var/turf/picked_safe = get_safe_random_station_turf() if(is_valid_turf(picked_safe)) T = picked_safe break diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index e8982c4c87c2e..675f5f87b0abf 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -39,7 +39,7 @@ SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) /obj/item/melee/sickly_blade/attack_self(mob/user) - var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) + var/turf/safe_turf = find_safe_turf(zlevel = z, extended_safety_checks = TRUE) if(IS_HERETIC_OR_MONSTER(user)) if(do_teleport(user, safe_turf, channel = TELEPORT_CHANNEL_MAGIC)) to_chat(user, span_warning("As you shatter [src], you feel a gust of energy flow through your body. [after_use_message]")) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 2e4a438354d09..9176558c7a166 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -378,7 +378,7 @@ addtimer(CALLBACK(src, PROC_REF(send_away)), 2 SECONDS) /obj/effect/temp_visual/teleporting_tornado/proc/send_away() - var/turf/ending_turfs = find_safe_turf() + var/turf/ending_turfs = get_safe_random_station_turf() for(var/mob/stored_mobs as anything in pickedup_mobs) do_teleport(stored_mobs, ending_turfs, channel = TELEPORT_CHANNEL_MAGIC) animate(stored_mobs, pixel_y = null, time = 1 SECONDS) diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 864b4fa03f869..3c0fba8783656 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -17,7 +17,7 @@ if(.) return if(tgui_alert(usr,question,name,list("Yes","No")) == "Yes" && Adjacent(user)) - var/turf/T = find_safe_turf(zlevels=zlevels) + var/turf/T = zlevels ? find_safe_turf(zlevels=zlevels) : get_safe_random_station_turf() if(T) var/atom/movable/AM = user.pulling diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 2b6aeac7eb219..d204e97227d82 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -22,7 +22,7 @@ var/list/epicentreList = list() for(var/i in 1 to lightsoutAmount) - var/turf/T = find_safe_turf() + var/turf/T = get_safe_random_station_turf() if(istype(T)) epicentreList += T diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 3415c45d12bea..2af3018bed306 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -261,7 +261,7 @@ Difficulty: Extremely Hard clone.real_name = user.real_name INVOKE_ASYNC(user.dna, TYPE_PROC_REF(/datum/dna, transfer_identity), clone) clone.updateappearance(mutcolor_update=1) - var/turf/T = find_safe_turf() + var/turf/T = find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE) || find_safe_turf() user.forceMove(T) user.revive(ADMIN_HEAL_ALL) INVOKE_ASYNC(user, TYPE_PROC_REF(/mob/living/carbon, set_species), /datum/species/shadow) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index db51944729fe4..e8f41ef0b48ec 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -191,7 +191,7 @@ /obj/item/gun/magic/wand/safety/zap_self(mob/living/user) var/turf/origin = get_turf(user) - var/turf/destination = find_safe_turf() + var/turf/destination = find_safe_turf(extended_safety_checks = TRUE) if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin, destination)) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 1a25f8e23703a..23930f3cca7d0 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -110,7 +110,7 @@ return BULLET_ACT_HIT var/turf/origin_turf = get_turf(target) - var/turf/destination_turf = find_safe_turf() + var/turf/destination_turf = find_safe_turf(extended_safety_checks = TRUE) if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin_turf, destination_turf)) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 4b4e6ce105cee..658d0734f4e27 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -706,7 +706,7 @@ if(healthcheck && (healthcheck - owner.health) > 5) owner.visible_message(span_warning("[linked_extract] notices the sudden change in [owner]'s physical health, and activates!")) do_sparks(5,FALSE,owner) - var/F = find_safe_turf(zlevels = owner.z, extended_safety_checks = TRUE) + var/F = find_safe_turf(zlevel = owner.z, extended_safety_checks = TRUE) var/range = 0 if(!F) F = get_turf(owner) From f80dfb52c11a00071d4090ebd42ac8b7bae6ed82 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 08:57:52 +1200 Subject: [PATCH 081/120] Automatic changelog for PR #83012 [ci skip] --- html/changelogs/AutoChangeLog-pr-83012.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83012.yml diff --git a/html/changelogs/AutoChangeLog-pr-83012.yml b/html/changelogs/AutoChangeLog-pr-83012.yml new file mode 100644 index 0000000000000..cf5050bc31294 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83012.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - bugfix: "Tweaks some instances of get_safe_turf so things like the nuclear disk doesn't accidentally teleport to the Icebox Syndicate Base" \ No newline at end of file From 920cd7459d9dd0a08891296ae1371b77eec50cb1 Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Sat, 15 Jun 2024 00:37:04 +0100 Subject: [PATCH 082/120] Neutralised anomalies respect the core limit (#83964) ## About The Pull Request This PR changes it so that if you refine an anomaly by neutralising it, it respects the same limit on number of anomaly cores as refining one you bought from Cargo. If it would produce an illegal core, it will create a mostly useless inert core which you can sell at cargo for 80% of the price of buying a raw core. ## Why It's Good For The Game https://hackmd.io/@tgstation/r1tzxpwPL This was a requirement in the original design doc which just never made it into the game. We want to be able to control how many cores of each type can possibly exist in a round, as this is what allows them to have the "these items can be really busted" allowance. ## Changelog :cl: fix: Neutralising an anomaly cannot produce more anomaly cores than are supposed to exist in a single round /:cl: --- code/controllers/subsystem/research.dm | 13 +++++++ .../objects/effects/anomalies/_anomalies.dm | 33 +++++++++++------- .../anomalies/anomalies_bioscrambler.dm | 2 +- .../effects/anomalies/anomalies_bluespace.dm | 4 +-- .../anomalies/anomalies_dimensional.dm | 2 +- .../effects/anomalies/anomalies_ectoplasm.dm | 2 +- .../effects/anomalies/anomalies_flux.dm | 4 +-- .../effects/anomalies/anomalies_gravity.dm | 4 +-- .../anomalies/anomalies_hallucination.dm | 2 +- .../anomalies/anomalies_pyroclastic.dm | 4 +-- .../effects/anomalies/anomalies_vortex.dm | 2 +- .../objects/items/stacks/sheets/mineral.dm | 3 ++ code/modules/cargo/exports/anomaly.dm | 4 +++ code/modules/mining/ores_coins.dm | 3 ++ .../research/anomaly/anomaly_refinery.dm | 6 ++-- code/modules/research/anomaly/raw_anomaly.dm | 10 ++++-- icons/obj/devices/new_assemblies.dmi | Bin 28783 -> 28829 bytes tgstation.dme | 1 + 18 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 code/modules/cargo/exports/anomaly.dm diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 5b00915307185..b51e686c6a644 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -332,3 +332,16 @@ SUBSYSTEM_DEF(research) continue valid_servers += server return valid_servers + +/// Returns true if you can make an anomaly core of the provided type +/datum/controller/subsystem/research/proc/is_core_available(core_type) + if (!ispath(core_type, /obj/item/assembly/signaler/anomaly)) + return FALSE // The fuck are you checking this random object for? + var/already_made = created_anomaly_types[core_type] || 0 + var/hard_limit = anomaly_hard_limit_by_type[core_type] + return already_made < hard_limit + +/// Increase our tracked number of cores of this type +/datum/controller/subsystem/research/proc/increment_existing_anomaly_cores(core_type) + var/existing = created_anomaly_types[core_type] || 0 + created_anomaly_types[core_type] = existing + 1 diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index a3f0b79044b41..ee02cab9e036b 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -8,7 +8,7 @@ anchored = TRUE light_range = 3 - var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly + var/obj/item/assembly/signaler/anomaly/anomaly_core = /obj/item/assembly/signaler/anomaly var/area/impact_area var/lifespan = ANOMALY_COUNTDOWN_TIMER @@ -37,12 +37,12 @@ return INITIALIZE_HINT_QDEL src.drops_core = drops_core - if(aSignal) - aSignal = new aSignal(src) - aSignal.code = rand(1,100) - aSignal.anomaly_type = type + if(anomaly_core) + anomaly_core = new anomaly_core(src) + anomaly_core.code = rand(1,100) + anomaly_core.anomaly_type = type - aSignal.set_frequency(sanitize_frequency(rand(MIN_FREE_FREQ, MAX_FREE_FREQ), free = TRUE)) + anomaly_core.set_frequency(sanitize_frequency(rand(MIN_FREE_FREQ, MAX_FREE_FREQ), free = TRUE)) if(new_lifespan) lifespan = new_lifespan @@ -72,7 +72,7 @@ /obj/effect/anomaly/Destroy() STOP_PROCESSING(SSobj, src) QDEL_NULL(countdown) - QDEL_NULL(aSignal) + QDEL_NULL(anomaly_core) return ..() /obj/effect/anomaly/proc/anomalyEffect(seconds_per_tick) @@ -97,18 +97,25 @@ new /obj/effect/particle_effect/fluid/smoke/bad(loc) if(drops_core) - if(isnull(aSignal)) + if(isnull(anomaly_core)) stack_trace("An anomaly ([src]) exists that drops a core, yet has no core!") else - aSignal.forceMove(drop_location()) - aSignal = null + var/anomaly_type = anomaly_core.type + if (SSresearch.is_core_available(anomaly_type)) + SSresearch.increment_existing_anomaly_cores(anomaly_type) + anomaly_core.forceMove(drop_location()) + anomaly_core = null + else // You exceeded the cap sorry + visible_message(span_warning("[anomaly_core] loses its lustre as it falls to the ground, there is too little ambient energy to support another core of this type.")) + new /obj/item/inert_anomaly(drop_location()) + // else, anomaly core gets deleted by qdel(src). qdel(src) /obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal) - to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + if(weapon.tool_behaviour == TOOL_ANALYZER && anomaly_core) + to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(anomaly_core.frequency)], code [anomaly_core.code].")) return TRUE return ..() @@ -119,6 +126,6 @@ name = (has_core ? "stable " : "hollow ") + name if(!has_core) drops_core = FALSE - QDEL_NULL(aSignal) + QDEL_NULL(anomaly_core) if (anchor) move_chance = 0 diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm index 3b7a0d17cc771..c57a629d85c2b 100644 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -2,7 +2,7 @@ /obj/effect/anomaly/bioscrambler name = "bioscrambler anomaly" icon_state = "bioscrambler" - aSignal = /obj/item/assembly/signaler/anomaly/bioscrambler + anomaly_core = /obj/item/assembly/signaler/anomaly/bioscrambler immortal = TRUE pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS layer = ABOVE_MOB_LAYER diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index fa88e7d268d61..2ed19adb4f2c8 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/weapons/guns/projectiles.dmi' icon_state = "bluespace" density = TRUE - aSignal = /obj/item/assembly/signaler/anomaly/bluespace + anomaly_core = /obj/item/assembly/signaler/anomaly/bluespace ///range from which we can teleport someone var/teleport_range = 1 ///Distance we can teleport someone passively @@ -85,7 +85,7 @@ immortal = TRUE teleport_range = 2 teleport_distance = 12 - aSignal = null + anomaly_core = null /obj/effect/anomaly/bluespace/big/Initialize(mapload, new_lifespan, drops_core) . = ..() diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index 026c5974d5f35..53129c0e9ce3f 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -2,7 +2,7 @@ /obj/effect/anomaly/dimensional name = "dimensional anomaly" icon_state = "dimensional" - aSignal = /obj/item/assembly/signaler/anomaly/dimensional + anomaly_core = /obj/item/assembly/signaler/anomaly/dimensional immortal = TRUE move_chance = 0 /// Range of effect, if left alone anomaly will convert a 2(range)+1 squared area. diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index 51a033f515f9c..e6c3e855386b7 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -2,7 +2,7 @@ name = "ectoplasm anomaly" desc = "It looks like the souls of the damned are trying to break into the realm of the living again. How upsetting." icon_state = "ectoplasm" - aSignal = /obj/item/assembly/signaler/anomaly/ectoplasm + anomaly_core = /obj/item/assembly/signaler/anomaly/ectoplasm lifespan = ANOMALY_COUNTDOWN_TIMER + 2 SECONDS //This one takes slightly longer, because it can run away. move_chance = 0 //prevents it from moving around so ghosts can actually move it with decent accuracy diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index 91f09095d6f6f..6a4d1e7cf8a3f 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -2,7 +2,7 @@ name = "flux wave anomaly" icon_state = "flux" density = TRUE - aSignal = /obj/item/assembly/signaler/anomaly/flux + anomaly_core = /obj/item/assembly/signaler/anomaly/flux var/canshock = FALSE var/shockdamage = 20 var/explosive = FLUX_EXPLOSIVE @@ -61,7 +61,7 @@ ///Bigger, meaner, immortal flux anomaly /obj/effect/anomaly/flux/big immortal = TRUE - aSignal = null + anomaly_core = null shockdamage = 30 ///range in whuich we zap diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index fa7c4f48a36f3..08becc48c7531 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -12,7 +12,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "shield2" density = FALSE - aSignal = /obj/item/assembly/signaler/anomaly/grav + anomaly_core = /obj/item/assembly/signaler/anomaly/grav var/boing = 0 ///Warp effect holder for displacement filter to "pulse" the anomaly var/atom/movable/warp_effect/warp @@ -104,7 +104,7 @@ ///Bigger, meaner, immortal gravity anomaly. although this is just the super grav anomaly but bigger and shattering move force /obj/effect/anomaly/grav/high/big immortal = TRUE - aSignal = null + anomaly_core = null move_force = MOVE_FORCE_OVERPOWERING /obj/effect/anomaly/grav/high/big/Initialize(mapload, new_lifespan, drops_core) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index a6696070df1c7..4065d8c04a45e 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -2,7 +2,7 @@ /obj/effect/anomaly/hallucination name = "hallucination anomaly" icon_state = "hallucination" - aSignal = /obj/item/assembly/signaler/anomaly/hallucination + anomaly_core = /obj/item/assembly/signaler/anomaly/hallucination /// Time passed since the last effect, increased by seconds_per_tick of the SSobj var/ticks = 0 /// How many seconds between each small hallucination pulses diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index 9cb92a6961de9..6d65990b563dc 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -5,7 +5,7 @@ var/ticks = 0 /// How many seconds between each gas release var/releasedelay = 10 - aSignal = /obj/item/assembly/signaler/anomaly/pyro + anomaly_core = /obj/item/assembly/signaler/anomaly/pyro /obj/effect/anomaly/pyro/Initialize(mapload, new_lifespan, drops_core) . = ..() @@ -46,7 +46,7 @@ ///Bigger, meaner, immortal pyro anomaly /obj/effect/anomaly/pyro/big immortal = TRUE - aSignal = null + anomaly_core = null releasedelay = 2 move_force = MOVE_FORCE_OVERPOWERING diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm index 935522fe90143..0313f63146b52 100644 --- a/code/game/objects/effects/anomalies/anomalies_vortex.dm +++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm @@ -3,7 +3,7 @@ name = "vortex anomaly" icon_state = "vortex" desc = "That's a nice station you have there. It'd be a shame if something happened to it." - aSignal = /obj/item/assembly/signaler/anomaly/vortex + anomaly_core = /obj/item/assembly/signaler/anomaly/vortex /obj/effect/anomaly/bhole/anomalyEffect() ..() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 4e4e1db1f9a1e..c969b1dbe50cc 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -113,6 +113,9 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ . = ..() . += GLOB.diamond_recipes +/obj/item/stack/sheet/mineral/diamond/five + amount = 5 + /* * Uranium */ diff --git a/code/modules/cargo/exports/anomaly.dm b/code/modules/cargo/exports/anomaly.dm new file mode 100644 index 0000000000000..be197e9181cfd --- /dev/null +++ b/code/modules/cargo/exports/anomaly.dm @@ -0,0 +1,4 @@ +/datum/export/inert_anomaly + cost = CARGO_CRATE_VALUE * 8 // Worth a bit less than a normal anomaly core + unit_name = "inert anomaly core" + export_types = list(/obj/item/inert_anomaly) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index e9c226731e747..d2a9af576ce42 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -198,6 +198,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ scan_state = "rock_Diamond" merge_type = /obj/item/stack/ore/diamond +/obj/item/stack/ore/diamond/five + amount = 5 + /obj/item/stack/ore/bananium name = "bananium ore" icon_state = "bananium" diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm index 1805a25231833..bae2b4f116261 100644 --- a/code/modules/research/anomaly/anomaly_refinery.dm +++ b/code/modules/research/anomaly/anomaly_refinery.dm @@ -60,10 +60,12 @@ * * anomaly_type - anomaly type define */ /obj/machinery/research/anomaly_refinery/proc/get_required_radius(anomaly_type) + if(!SSresearch.is_core_available(anomaly_type)) + return //return null + var/already_made = SSresearch.created_anomaly_types[anomaly_type] var/hard_limit = SSresearch.anomaly_hard_limit_by_type[anomaly_type] - if(already_made >= hard_limit) - return //return null + // my crappy autoscale formula // linear scaling. var/radius_span = MAX_RADIUS_REQUIRED - MIN_RADIUS_REQUIRED diff --git a/code/modules/research/anomaly/raw_anomaly.dm b/code/modules/research/anomaly/raw_anomaly.dm index 2df844e4bb808..d86ed1f1d9d45 100644 --- a/code/modules/research/anomaly/raw_anomaly.dm +++ b/code/modules/research/anomaly/raw_anomaly.dm @@ -91,7 +91,13 @@ /obj/item/raw_anomaly_core/proc/create_core(newloc, del_self = FALSE, count_towards_limit = FALSE) . = new anomaly_type(newloc) if(count_towards_limit) - var/existing = SSresearch.created_anomaly_types[anomaly_type] || 0 - SSresearch.created_anomaly_types[anomaly_type] = existing + 1 + SSresearch.increment_existing_anomaly_cores(anomaly_type) if(del_self) qdel(src) + +/// Doesn't do anything, consolation prize if you neu +/obj/item/inert_anomaly + name = "inert anomaly core" + desc = "A chunk of fused exotic materials. Useless to you, but some other lab might purchase it." + icon = 'icons/obj/devices/new_assemblies.dmi' + icon_state = "rawcore_inert" diff --git a/icons/obj/devices/new_assemblies.dmi b/icons/obj/devices/new_assemblies.dmi index 411ad8b61df64e1100c33d60d12775a6b39472e0..1de208a7736ce88ac3c398fc8d17909bcea24dc8 100644 GIT binary patch delta 9111 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 delta 9062 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 diff --git a/tgstation.dme b/tgstation.dme index 315e5cef3fd47..dd55b451101ef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3604,6 +3604,7 @@ #include "code\modules\cargo\bounties\slime.dm" #include "code\modules\cargo\bounties\special.dm" #include "code\modules\cargo\bounties\virus.dm" +#include "code\modules\cargo\exports\anomaly.dm" #include "code\modules\cargo\exports\antiques.dm" #include "code\modules\cargo\exports\civilain_bounty.dm" #include "code\modules\cargo\exports\food_and_drink.dm" From 1de64af36631c888901042791db53a633222b773 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 11:44:28 +1200 Subject: [PATCH 083/120] Automatic changelog for PR #83964 [ci skip] --- html/changelogs/AutoChangeLog-pr-83964.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83964.yml diff --git a/html/changelogs/AutoChangeLog-pr-83964.yml b/html/changelogs/AutoChangeLog-pr-83964.yml new file mode 100644 index 0000000000000..b9509eb03f0e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83964.yml @@ -0,0 +1,4 @@ +author: "Jacquerel" +delete-after: True +changes: + - bugfix: "Neutralising an anomaly cannot produce more anomaly cores than are supposed to exist in a single round" \ No newline at end of file From 6709908d34bc7d8495c12d8f2959769547a1b9b6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 15 Jun 2024 00:21:39 +0000 Subject: [PATCH 084/120] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-83012.yml | 4 --- html/changelogs/AutoChangeLog-pr-83836.yml | 4 --- html/changelogs/AutoChangeLog-pr-83891.yml | 4 --- html/changelogs/AutoChangeLog-pr-83892.yml | 6 ---- html/changelogs/AutoChangeLog-pr-83893.yml | 5 --- html/changelogs/AutoChangeLog-pr-83894.yml | 7 ---- html/changelogs/AutoChangeLog-pr-83910.yml | 6 ---- html/changelogs/AutoChangeLog-pr-83923.yml | 4 --- html/changelogs/AutoChangeLog-pr-83930.yml | 4 --- html/changelogs/AutoChangeLog-pr-83939.yml | 5 --- html/changelogs/AutoChangeLog-pr-83951.yml | 4 --- html/changelogs/AutoChangeLog-pr-83961.yml | 5 --- html/changelogs/AutoChangeLog-pr-83962.yml | 4 --- html/changelogs/AutoChangeLog-pr-83964.yml | 4 --- html/changelogs/AutoChangeLog-pr-83971.yml | 4 --- html/changelogs/archive/2024-06.yml | 41 ++++++++++++++++++++++ 16 files changed, 41 insertions(+), 70 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-83012.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83836.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83891.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83892.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83893.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83894.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83910.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83923.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83930.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83939.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83951.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83961.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83962.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83964.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83971.yml diff --git a/html/changelogs/AutoChangeLog-pr-83012.yml b/html/changelogs/AutoChangeLog-pr-83012.yml deleted file mode 100644 index cf5050bc31294..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83012.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Tweaks some instances of get_safe_turf so things like the nuclear disk doesn't accidentally teleport to the Icebox Syndicate Base" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83836.yml b/html/changelogs/AutoChangeLog-pr-83836.yml deleted file mode 100644 index 83cae7b204bb7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83836.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mc-oofert" -delete-after: True -changes: - - rscadd: "the flatpacker, a machine unlocked at industrial engineering" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83891.yml b/html/changelogs/AutoChangeLog-pr-83891.yml deleted file mode 100644 index 2319b76bc1369..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83891.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MTandi" -delete-after: True -changes: - - image: "Updated slime sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83892.yml b/html/changelogs/AutoChangeLog-pr-83892.yml deleted file mode 100644 index 2f2d67eb8dc8c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83892.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - balance: "Re-adds Bagulo" - - balance: "The max number of bluespace cores available to the crew has been reduced to 3 (was: 8)" - - balance: "Chucking a BoH into an uncharged singulo may save the station." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83893.yml b/html/changelogs/AutoChangeLog-pr-83893.yml deleted file mode 100644 index 76e757c9e1254..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83893.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - sound: "Portals made by portal guns now make sounds as expected" - - sound: "Wormholes from the wormhole event now make sounds when formed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83894.yml b/html/changelogs/AutoChangeLog-pr-83894.yml deleted file mode 100644 index 5bee69ea3fdee..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83894.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Humans can't cough on menthol again" - - bugfix: "Moth and lizard emotes decide what sound to play based on body type, not gender." - - sound: "*gasp now makes a sound, it's the same as *gaspshock." - - sound: "Xenos (or anything with hands) can clap" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83910.yml b/html/changelogs/AutoChangeLog-pr-83910.yml deleted file mode 100644 index 5724696806ab9..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83910.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Heirophant Club Blink at range" - - bugfix: "Crusher Loot" - - bugfix: "RCD material reclamation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83923.yml b/html/changelogs/AutoChangeLog-pr-83923.yml deleted file mode 100644 index 8463ac2cda24b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83923.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Goat-Real" -delete-after: True -changes: - - bugfix: "Icebox's service hall now now has a regular hand labeler." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83930.yml b/html/changelogs/AutoChangeLog-pr-83930.yml deleted file mode 100644 index bdc7a577125a0..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83930.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EnterTheJake" -delete-after: True -changes: - - image: "Rust Heretic's blade now has a new, slicker sprite." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83939.yml b/html/changelogs/AutoChangeLog-pr-83939.yml deleted file mode 100644 index c57b991c6a116..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83939.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Exester509" -delete-after: True -changes: - - balance: "Phazon mechs use ectoplasm cores now" - - balance: "You can now acquire ectoplasm cores from the science supply interface" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83951.yml b/html/changelogs/AutoChangeLog-pr-83951.yml deleted file mode 100644 index f70eff32c4ff5..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83951.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LucyGrind" -delete-after: True -changes: - - bugfix: "Crayons now fit in pdas" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83961.yml b/html/changelogs/AutoChangeLog-pr-83961.yml deleted file mode 100644 index 6aaaca8b128fc..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83961.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - qol: "Attack animations for cult spells on attackable objects (people, airlocks)" - - bugfix: "Fix cult spells on non-attackable objects (metal sheets, blood decals)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83962.yml b/html/changelogs/AutoChangeLog-pr-83962.yml deleted file mode 100644 index ca1eb7ec588fc..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83962.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GoblinBackwards" -delete-after: True -changes: - - bugfix: "Fixed thermal pistols sometimes not recognising an equipped holster when trying to spin them to recharge." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83964.yml b/html/changelogs/AutoChangeLog-pr-83964.yml deleted file mode 100644 index b9509eb03f0e6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83964.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - bugfix: "Neutralising an anomaly cannot produce more anomaly cores than are supposed to exist in a single round" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83971.yml b/html/changelogs/AutoChangeLog-pr-83971.yml deleted file mode 100644 index 156f71a95b72c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83971.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Human mousedropping" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index abab7965e9b21..7af6b140a5fb1 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -667,3 +667,44 @@ thegrb93: - bugfix: Fix bug where you can't interact with a shocked door without shock protection even if it is depowered. +2024-06-15: + BurgerBB: + - bugfix: Tweaks some instances of get_safe_turf so things like the nuclear disk + doesn't accidentally teleport to the Icebox Syndicate Base + EnterTheJake: + - image: Rust Heretic's blade now has a new, slicker sprite. + Exester509: + - balance: Phazon mechs use ectoplasm cores now + - balance: You can now acquire ectoplasm cores from the science supply interface + Goat-Real: + - bugfix: Icebox's service hall now now has a regular hand labeler. + GoblinBackwards: + - bugfix: Fixed thermal pistols sometimes not recognising an equipped holster when + trying to spin them to recharge. + Jacquerel: + - bugfix: Neutralising an anomaly cannot produce more anomaly cores than are supposed + to exist in a single round + LucyGrind: + - bugfix: Crayons now fit in pdas + MTandi: + - image: Updated slime sprites + Melbert: + - bugfix: Human mousedropping + - qol: Attack animations for cult spells on attackable objects (people, airlocks) + - bugfix: Fix cult spells on non-attackable objects (metal sheets, blood decals) + - bugfix: Humans can't cough on menthol again + - bugfix: Moth and lizard emotes decide what sound to play based on body type, not + gender. + - sound: '*gasp now makes a sound, it''s the same as *gaspshock.' + - sound: Xenos (or anything with hands) can clap + - balance: Re-adds Bagulo + - balance: 'The max number of bluespace cores available to the crew has been reduced + to 3 (was: 8)' + - balance: Chucking a BoH into an uncharged singulo may save the station. + - sound: Portals made by portal guns now make sounds as expected + - sound: Wormholes from the wormhole event now make sounds when formed + - bugfix: Heirophant Club Blink at range + - bugfix: Crusher Loot + - bugfix: RCD material reclamation + mc-oofert: + - rscadd: the flatpacker, a machine unlocked at industrial engineering From 909256caa409f5421f66ca3b122b1522324dd95a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 15 Jun 2024 02:38:10 +0200 Subject: [PATCH 085/120] Takes the ABDUTOR_PROOF flag out back (#83958) ## About The Pull Request Basically the title, Abductors can no longer teleport into NOTELEPORT areas except for the abductor ship. This now also removes the ABDUCTOR_PROOF bitflag and replaces it with a check for ai monitored areas fixes https://github.com/tgstation/tgstation/issues/83844 ## Why It's Good For The Game Abductors shouldnt kidnap people in centcom ## Changelog :cl: fix: Abductors can no longer teleport into Centcom remove: Brutally murders the ABDUCTOR_PROOF flag /:cl: --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> --- code/__DEFINES/_flags.dm | 14 ++++++-------- code/_globalvars/bitfields.dm | 1 - code/game/area/areas/ai_monitored.dm | 1 - .../antagonists/abductor/machinery/camera.dm | 12 ++++++++++-- code/modules/bitrunning/areas.dm | 12 ++++++------ code/modules/deathmatch/deathmatch_mapping.dm | 4 ++-- 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index d6b388cf7d45d..a9b42840fdb71 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -120,20 +120,18 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define BLOCK_SUICIDE (1<<9) /// If set, this area will be innately traversable by Xenobiology camera consoles. #define XENOBIOLOGY_COMPATIBLE (1<<10) -/// If Abductors are unable to teleport in with their observation console -#define ABDUCTOR_PROOF (1<<11) /// If blood cultists can draw runes or build structures on this AREA. -#define CULT_PERMITTED (1<<12) +#define CULT_PERMITTED (1<<11) /// If engravings are persistent in this area -#define PERSISTENT_ENGRAVINGS (1<<13) +#define PERSISTENT_ENGRAVINGS (1<<12) /// Mobs that die in this area don't produce a dead chat message -#define NO_DEATH_MESSAGE (1<<14) +#define NO_DEATH_MESSAGE (1<<13) /// This area should have extra shielding from certain event effects -#define EVENT_PROTECTED (1<<15) +#define EVENT_PROTECTED (1<<14) /// This Area Doesn't have Flood or Bomb Admin Messages, but will still log -#define QUIET_LOGS (1<<16) +#define QUIET_LOGS (1<<15) /// This area does not allow virtual entities to enter. -#define VIRTUAL_SAFE_AREA (1<<17) +#define VIRTUAL_SAFE_AREA (1<<16) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 2a46efce1fcde..67f33d0460e47 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -50,7 +50,6 @@ DEFINE_BITFIELD(appearance_flags, list( )) DEFINE_BITFIELD(area_flags, list( - "ABDUCTOR_PROOF" = ABDUCTOR_PROOF, "BLOBS_ALLOWED" = BLOBS_ALLOWED, "BLOCK_SUICIDE" = BLOCK_SUICIDE, "CAVES_ALLOWED" = CAVES_ALLOWED, diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm index 70c95cc43d0e6..a6964d70f6ae0 100644 --- a/code/game/area/areas/ai_monitored.dm +++ b/code/game/area/areas/ai_monitored.dm @@ -47,7 +47,6 @@ name = "\improper AI Chamber" icon_state = "ai_chamber" ai_will_not_hear_this = null - area_flags = parent_type::area_flags | ABDUCTOR_PROOF /area/station/ai_monitored/turret_protected/aisat name = "\improper AI Satellite" diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index bbf6ea2db3978..09a8fdefa315f 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -61,7 +61,11 @@ var/obj/machinery/abductor/pad/P = target var/area/target_area = get_area(remote_eye) - if(target_area.area_flags & ABDUCTOR_PROOF) + if((target_area.area_flags & NOTELEPORT) && !istype(target_area, /area/centcom/abductor_ship)) + to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) + return + + if(istype(target_area, /area/station/ai_monitored)) to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return @@ -101,7 +105,11 @@ var/obj/machinery/abductor/pad/P = target var/area/target_area = get_area(remote_eye) - if(target_area.area_flags & ABDUCTOR_PROOF) + if((target_area.area_flags & NOTELEPORT) && !istype(target_area, /area/centcom/abductor_ship)) + to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) + return + + if(istype(target_area, /area/station/ai_monitored)) to_chat(owner, span_warning("This area is too heavily shielded to safely transport to.")) return diff --git a/code/modules/bitrunning/areas.dm b/code/modules/bitrunning/areas.dm index 31a2fef9f3ca1..720bf0f1e5d2c 100644 --- a/code/modules/bitrunning/areas.dm +++ b/code/modules/bitrunning/areas.dm @@ -14,7 +14,7 @@ name = "Virtual Domain Ruins" icon_state = "bit_ruin" icon = 'icons/area/areas_station.dmi' - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA has_gravity = STANDARD_GRAVITY requires_power = FALSE @@ -26,7 +26,7 @@ /area/virtual_domain/safehouse name = "Virtual Domain Safehouse" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | VIRTUAL_SAFE_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA icon_state = "bit_safe" requires_power = FALSE sound_environment = SOUND_ENVIRONMENT_ROOM @@ -36,24 +36,24 @@ /area/lavaland/surface/outdoors/virtual_domain name = "Virtual Domain Lava Ruins" icon_state = "bit_ruin" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA /area/icemoon/underground/explored/virtual_domain name = "Virtual Domain Ice Ruins" icon_state = "bit_ice" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA /area/ruin/space/has_grav/powered/virtual_domain name = "Virtual Domain Space Ruins" icon = 'icons/area/areas_station.dmi' icon_state = "bit_space" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA ///Areas that virtual entities should not be in /area/virtual_domain/protected_space name = "Virtual Domain Safe Zone" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | VIRTUAL_SAFE_AREA + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA icon_state = "bit_safe" /area/virtual_domain/protected_space/fullbright diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 5fa04d6c5fb22..320b87d2fd15d 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -2,7 +2,7 @@ name = "Deathmatch Arena" requires_power = FALSE has_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | QUIET_LOGS + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | QUIET_LOGS /area/deathmatch/fullbright static_lighting = FALSE @@ -12,7 +12,7 @@ name = "Deathmatch Player Spawner" /area/deathmatch/teleport //Prevent access to cross-z teleportation in the map itself (no wands of safety/teleportation scrolls). Cordons should prevent same-z teleportations outside of the arena. - area_flags = UNIQUE_AREA | ABDUCTOR_PROOF | EVENT_PROTECTED | QUIET_LOGS + area_flags = UNIQUE_AREA | EVENT_PROTECTED | QUIET_LOGS // for the illusion of a moving train /turf/open/chasm/true/no_smooth/fake_motion_sand From c9986346e476664ed7ab95a8072a958b484f7e72 Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Sat, 15 Jun 2024 02:27:15 +0100 Subject: [PATCH 086/120] Ian and Runtime can lick your wounds (#83746) ## About The Pull Request As I turned this into a trait the other day I thought I might as well go all the way. This PR allows basic mobs to perform wound handling steps if not in combat mode. This chiefly means that: - cats and dogs can lick your wounds clean (they have the "wound licker" trait) - gorillas can set a dislocated limb (they have hands) - dextrous holoparasites can pluck the eyeballs out of someone's crushed head (they also have hands) Wolves have the wound licker trait but can't lick your wounds because for some reason they can't drag humans and I couldn't be bothered to figure out why that was set up that way. Also it would look stupid because it would still do the attack forecast animation. In order to facilitate being able to set bones, gorillas need to be able to aggressively grab you. While I was there I set it to allow them to strangle people to death because... well they're gorillas. It's probably slower than they could punch you to death, so I don't see the harm. ## Why It's Good For The Game If felinids can lick your wounds to heal them why can't an ordinary cat? An ordinary cat won't _often_ do this and I have not placed any such behaviour into their AI tree, but a sapient Ian or Runtime might provide extremely minor assistance in medbay. Also Cargorilla setting your dislocated limbs seems very funny and like something it should be allowed to do. ## Changelog :cl: add: Cats and Dogs can lick slashing wounds clean. add: Basic Mobs with hands can relocate dislocated bones, and pluck eyeballs out of pulped skulls. balance: Gorillas can strangle people. /:cl: --- code/_globalvars/traits/admin_tooling.dm | 1 + .../datums/elements/attack_zone_randomiser.dm | 2 ++ code/datums/wounds/_wounds.dm | 4 ++-- code/datums/wounds/bones.dm | 6 ++++-- code/datums/wounds/cranial_fissure.dm | 7 +++++-- code/datums/wounds/slash.dm | 21 ++++++++++++------- .../basic/farm_animals/gorilla/gorilla.dm | 1 + .../mob/living/carbon/carbon_defense.dm | 7 +++++++ 8 files changed, 35 insertions(+), 14 deletions(-) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 7a0d78a9f7c09..d9f6350a07480 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -233,6 +233,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, + "TRAIT_WOUND_LICKER" = TRAIT_WOUND_LICKER, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, diff --git a/code/datums/elements/attack_zone_randomiser.dm b/code/datums/elements/attack_zone_randomiser.dm index 35275e11a9bb2..1e364265bab0a 100644 --- a/code/datums/elements/attack_zone_randomiser.dm +++ b/code/datums/elements/attack_zone_randomiser.dm @@ -21,6 +21,8 @@ SIGNAL_HANDLER if (!iscarbon(target)) return + if (!isnull(source.mind) && !isnull(source.hud_used?.zone_select)) + return var/mob/living/living_target = target var/list/blacklist_zones = GLOB.all_body_zones - valid_attack_zones var/new_zone = living_target.get_random_valid_zone(blacklisted_parts = blacklist_zones, bypass_warning = TRUE) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index a48c0ccf59431..f713819c81786 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -512,8 +512,8 @@ /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) return FALSE -/// Like try_treating() but for unhanded interactions from humans, used by joint dislocations for manual bodypart chiropractice for example. Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures -/datum/wound/proc/try_handling(mob/living/carbon/human/user) +/// Like try_treating() but for unhanded interactions, used by joint dislocations for manual bodypart chiropractice for example. Ignores thick material checks since you can pop an arm into place through a thick suit unlike using sutures +/datum/wound/proc/try_handling(mob/living/user) return FALSE /// Someone is using something that might be used for treating the wound on this limb diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 9495d88cdc5a8..43385b47180ae 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -233,8 +233,10 @@ victim.visible_message(span_danger("[victim]'s dislocated [limb.plaintext_zone] pops back into place!"), span_userdanger("Your dislocated [limb.plaintext_zone] pops back into place! Ow!")) remove_wound() -/datum/wound/blunt/bone/moderate/try_handling(mob/living/carbon/human/user) - if(user.pulling != victim || user.zone_selected != limb.body_zone) +/datum/wound/blunt/bone/moderate/try_handling(mob/living/user) + if(user.usable_hands <= 0 || user.pulling != victim) + return FALSE + if(!isnull(user.hud_used?.zone_select) && user.zone_selected != limb.body_zone) return FALSE if(user.grab_state == GRAB_PASSIVE) diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index f73f263ff50ab..9bd9969f428cd 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -74,8 +74,11 @@ span_userdanger("Your brain spills right out of your head!"), ) -/datum/wound/cranial_fissure/try_handling(mob/living/carbon/human/user) - if (user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES) +/datum/wound/cranial_fissure/try_handling(mob/living/user) + if (user.usable_hands <= 0) + return FALSE + + if(!isnull(user.hud_used?.zone_select) && (user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES)) return FALSE if (victim.body_position != LYING_DOWN) diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 0e370c2ffcacf..e8f77e603be99 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -188,18 +188,23 @@ else if(istype(I, /obj/item/stack/medical/suture)) return suture(I, user) -/datum/wound/slash/flesh/try_handling(mob/living/carbon/human/user) - if(user.pulling != victim || user.zone_selected != limb.body_zone || !HAS_TRAIT(user, TRAIT_WOUND_LICKER) || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) +/datum/wound/slash/flesh/try_handling(mob/living/user) + if(user.pulling != victim || !HAS_TRAIT(user, TRAIT_WOUND_LICKER) || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) return FALSE + if(!isnull(user.hud_used?.zone_select) && user.zone_selected != limb.body_zone) + return FALSE + if(DOING_INTERACTION_WITH_TARGET(user, victim)) to_chat(user, span_warning("You're already interacting with [victim]!")) return - if(user.is_mouth_covered()) - to_chat(user, span_warning("Your mouth is covered, you can't lick [victim]'s wounds!")) - return - if(!user.get_organ_slot(ORGAN_SLOT_TONGUE)) - to_chat(user, span_warning("You can't lick wounds without a tongue!")) // f in chat - return + if(iscarbon(user)) + var/mob/living/carbon/carbon_user = user + if(carbon_user.is_mouth_covered()) + to_chat(user, span_warning("Your mouth is covered, you can't lick [victim]'s wounds!")) + return + if(!carbon_user.get_organ_slot(ORGAN_SLOT_TONGUE)) + to_chat(user, span_warning("You can't lick wounds without a tongue!")) // f in chat + return lick_wounds(user) return TRUE diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm index 423f3b8c3975f..b2aff7371a426 100644 --- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm @@ -36,6 +36,7 @@ ai_controller = /datum/ai_controller/basic_controller/gorilla faction = list(FACTION_MONKEY, FACTION_JUNGLE) butcher_results = list(/obj/item/food/meat/slab/gorilla = 4, /obj/effect/gibspawner/generic/animal = 1) + max_grab = GRAB_KILL /// How likely our meaty fist is to stun someone var/paralyze_chance = 20 /// A counter for when we can scream again diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 9f78c62e741ab..20164d27b425a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -164,6 +164,13 @@ return FALSE +/mob/living/carbon/attack_animal(mob/living/simple_animal/user, list/modifiers) + if (!user.combat_mode) + for (var/datum/wound/wounds as anything in all_wounds) + if (wounds.try_handling(user)) + return TRUE + + return ..() /mob/living/carbon/attack_paw(mob/living/carbon/human/user, list/modifiers) From f1af7d9b1b53b391ff16de0dde88ba0185359462 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 13:44:34 +1200 Subject: [PATCH 087/120] Automatic changelog for PR #83746 [ci skip] --- html/changelogs/AutoChangeLog-pr-83746.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83746.yml diff --git a/html/changelogs/AutoChangeLog-pr-83746.yml b/html/changelogs/AutoChangeLog-pr-83746.yml new file mode 100644 index 0000000000000..3491301711793 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83746.yml @@ -0,0 +1,6 @@ +author: "Jacquerel" +delete-after: True +changes: + - rscadd: "Cats and Dogs can lick slashing wounds clean." + - rscadd: "Basic Mobs with hands can relocate dislocated bones, and pluck eyeballs out of pulped skulls." + - balance: "Gorillas can strangle people." \ No newline at end of file From aaaf761adc328359bc859edbecb67341b89b241f Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:14:02 -0500 Subject: [PATCH 088/120] Openspace Item Handler doesn't think stuff in bags are valid (#83973) ## About The Pull Request Fixes #83972 Clicking on stuff in your bag with stuff that has `openspace_item_click_handler` makes it think you're on a different z level (which is technically true) so it overrides the click and does its own thing. So we check that z is not 0. Also move the return to be safe. ## Changelog :cl: Melbert fix: Fix inability to make r-glass by hand inside your backpack /:cl: --------- Co-authored-by: san7890 --- code/datums/elements/openspace_item_click_handler.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index 67a3dbefbde35..f34bd0f0bda1f 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -17,13 +17,13 @@ //Invokes the proctype with a turf above as target. /datum/element/openspace_item_click_handler/proc/divert_interaction(obj/item/source, mob/user, atom/target, click_parameters) SIGNAL_HANDLER - if(target.z == user.z) + if((target.z == 0) || (user.z == 0) || target.z == user.z) return NONE var/turf/checked_turf = get_turf(target) while(!isnull(checked_turf)) checked_turf = GET_TURF_ABOVE(checked_turf) if(checked_turf?.z == user.z && user.CanReach(checked_turf, source)) INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, click_parameters) - break + return ITEM_INTERACT_BLOCKING - return ITEM_INTERACT_BLOCKING + return NONE From b6908956d23779211323a57e48944e51529eae54 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:14:21 +1200 Subject: [PATCH 089/120] Automatic changelog for PR #83973 [ci skip] --- html/changelogs/AutoChangeLog-pr-83973.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83973.yml diff --git a/html/changelogs/AutoChangeLog-pr-83973.yml b/html/changelogs/AutoChangeLog-pr-83973.yml new file mode 100644 index 0000000000000..b25fd561747d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83973.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Fix inability to make r-glass by hand inside your backpack" \ No newline at end of file From 5dd87f3ec16b6e35ec44a206225360c63d54bd44 Mon Sep 17 00:00:00 2001 From: FlufflesTheDog Date: Fri, 14 Jun 2024 20:15:16 -0700 Subject: [PATCH 090/120] Fix button frame hard delete (#83969) ## About The Pull Request Re-adds the destroy proc removed in #83774. Deconstructing/destroying buttons would appropriately clean up their components, but deleting them otherwise would not. ## Why It's Good For The Game I like my deletes like I like my drinks ## Changelog Not player facing --- code/game/machinery/buttons.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 6570d022a49a9..7b66872f52bb1 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -64,6 +64,11 @@ find_and_hang_on_wall() register_context() +/obj/machinery/button/Destroy() + QDEL_NULL(device) + QDEL_NULL(board) + return ..() + /obj/machinery/button/proc/setup_device() if(id && istype(device, /obj/item/assembly/control)) var/obj/item/assembly/control/control_device = device From 4e08eb644cc04697899138c80922cc5d3cc9c011 Mon Sep 17 00:00:00 2001 From: Afevis Date: Sat, 15 Jun 2024 01:41:03 -0400 Subject: [PATCH 091/120] Fixes LateSpawn runtime when someone latejoins as the only command member (#83974) the mob's key was already transferred from this mob to the new one before this. guess we've been lucky to never see this runtime on live. ``` [2024-06-14 05:40:50.631] RUNTIME: runtime error: Called is_banned_from without specifying a ckey. - proc name: stack trace (/proc/_stack_trace) - source file: code/__HELPERS/stack_trace.dm,4 - usr: ShizCalev (/mob/dead/new_player) - src: null - usr.loc: null - call stack: - stack trace("Called is_banned_from without ...", "code/modules/admin/sql_ban_sys...", 19) - is banned from(null, /list (/list)) - ShizCalev (/mob/dead/new_player): AttemptLateSpawn("Chief Medical Officer") - /datum/latejoin_menu (/datum/latejoin_menu): ui act("select_job", /list (/list), /datum/tgui (/datum/tgui), /datum/ui_state/new_player_sta... (/datum/ui_state/new_player_state)) - /datum/tgui (/datum/tgui): on act message("select_job", /list (/list), /datum/ui_state/new_player_sta... (/datum/ui_state/new_player_state)) - /datum/callback/verb_callback (/datum/callback/verb_callback): InvokeAsync() - /datum/callback/verb_callback (/datum/callback/verb_callback): InvokeAsync() - /datum/tgui (/datum/tgui): on message("act/select_job", /list (/list), /list (/list)) - /datum/tgui_window (/datum/tgui_window): on message("act/select_job", /list (/list), /list (/list)) - tgui Topic(/list (/list)) - ShizCalev (/client): Topic("type=act%2Fselect_job&payload=...", /list (/list), null, null) - ``` --- code/modules/mob/dead/new_player/new_player.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 7555924753735..4db5ae888496c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -200,7 +200,7 @@ is_captain = IS_FULL_CAPTAIN captain_sound = 'sound/misc/announce.ogg' // If we don't have an assigned cap yet, check if this person qualifies for some from of captaincy. - else if(!SSjob.assigned_captain && ishuman(character) && SSjob.chain_of_command[rank] && !is_banned_from(ckey, list(JOB_CAPTAIN))) + else if(!SSjob.assigned_captain && ishuman(character) && SSjob.chain_of_command[rank] && !is_banned_from(character.ckey, list(JOB_CAPTAIN))) is_captain = IS_ACTING_CAPTAIN if(is_captain != IS_NOT_CAPTAIN) minor_announce(job.get_captaincy_announcement(character), sound_override = captain_sound) From 0af1724b8fee07cdc72940470cbb389c30cf5124 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Sat, 15 Jun 2024 02:43:53 -0300 Subject: [PATCH 092/120] Baby plushies are now smaller than their parents (#83937) ## About The Pull Request Baby plushies are now smaller than their parents 25% by transform 0.75 ## Why It's Good For The Game Easier to distinguish, so its qol, which means i get gbp ![image](https://github.com/tgstation/tgstation/assets/53100513/2e63d813-8982-4ead-9949-0ea0fe37605e) Stupid and cute and funny ## Changelog :cl: qol: Baby plushies are now smaller than their parents /:cl: --- code/game/objects/items/plushes.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 052fc983c8306..c56e1eb7cdc15 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -312,6 +312,7 @@ young = TRUE name = "[Mama] Jr" //Icelandic naming convention pending normal_desc = "[src] is a little baby of [maternal_parent] and [paternal_parent]!" //original desc won't be used so the child can have moods + transform *= 0.75 update_desc() Mama.mood_message = pick(Mama.parent_message) From 932b4dd34829d0d17fc72c49ca4fcae7d92489a9 Mon Sep 17 00:00:00 2001 From: Wayland-Smithy <64715958+Wayland-Smithy@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:44:06 -0700 Subject: [PATCH 093/120] Fix revenant spawning next to brains and other unharvestable mobs (#83975) ## About The Pull Request What it says on the tin. Currently we are adding all dead `mob/living/` to the list of potential revenant spawns whether or not they are valid harvest targets. Decreases the odds of getting a spawn that is not immediately useful as revenant. ## Why It's Good For The Game Fix good. Harvesting only works with `mob/living/carbon/human/` so naturally we should avoid adding other mobs to the list of potential spawn points. ## Changelog :cl: fix: Fixed revenant spawning next to brains and other unharvestable dead mobs. /:cl: --- code/modules/events/ghost_role/revenant_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/ghost_role/revenant_event.dm b/code/modules/events/ghost_role/revenant_event.dm index 7af53b847c86d..6f615f729c2f5 100644 --- a/code/modules/events/ghost_role/revenant_event.dm +++ b/code/modules/events/ghost_role/revenant_event.dm @@ -34,7 +34,7 @@ if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS var/list/spawn_locs = list() - for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies + for(var/mob/living/carbon/human/L in GLOB.dead_mob_list) //look for any harvestable bodies var/turf/T = get_turf(L) if(T && is_station_level(T.z)) spawn_locs += T From 3c439ff7ee87d41f25a7335d47a3f9f2cdd9645a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:44:11 +1200 Subject: [PATCH 094/120] Automatic changelog for PR #83937 [ci skip] --- html/changelogs/AutoChangeLog-pr-83937.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83937.yml diff --git a/html/changelogs/AutoChangeLog-pr-83937.yml b/html/changelogs/AutoChangeLog-pr-83937.yml new file mode 100644 index 0000000000000..4900a88e8b735 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83937.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "Baby plushies are now smaller than their parents" \ No newline at end of file From 3a33a2acb67c420a161506ac55b273c89bb19e25 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:44:24 +1200 Subject: [PATCH 095/120] Automatic changelog for PR #83975 [ci skip] --- html/changelogs/AutoChangeLog-pr-83975.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83975.yml diff --git a/html/changelogs/AutoChangeLog-pr-83975.yml b/html/changelogs/AutoChangeLog-pr-83975.yml new file mode 100644 index 0000000000000..31ae781571281 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83975.yml @@ -0,0 +1,4 @@ +author: "Wayland-Smithy" +delete-after: True +changes: + - bugfix: "Fixed revenant spawning next to brains and other unharvestable dead mobs." \ No newline at end of file From 9950f38125198a2c56392ecc3b22f7f79acba6c5 Mon Sep 17 00:00:00 2001 From: GoblinBackwards <22856555+GoblinBackwards@users.noreply.github.com> Date: Sat, 15 Jun 2024 06:44:52 +0100 Subject: [PATCH 096/120] Fixes mech sleeper not displaying patient information without a mech syringe gun attached (#83957) ## About The Pull Request Fixes a runtime that was occurring with the mech sleeper module that would prevent the patient information from being displayed in the sleeper interface if the mech didn't also have a syringe gun attached. ## Why It's Good For The Game Fixes #83938 ## Changelog :cl: fix: Fixed the patient information for the mech sleeper module not displaying when the mech didn't also have a syringe gun. /:cl: --- .../mecha/equipment/tools/medical_tools.dm | 14 ++++--- .../tgui/interfaces/Mecha/ModulesPane.tsx | 40 ++++++++++--------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index b1e0d84f14ebe..e1c37a3d13a7f 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -72,7 +72,8 @@ data["contained_reagents"] = get_reagent_data(patient.reagents.reagent_list) var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/shooter = locate(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun) in chassis - data["injectible_reagents"] = get_reagent_data(shooter.reagents.reagent_list) + if(shooter) + data["injectible_reagents"] = get_reagent_data(shooter.reagents.reagent_list) return data /obj/item/mecha_parts/mecha_equipment/medical/sleeper/handle_ui_act(action, list/params) @@ -81,11 +82,12 @@ go_out() return TRUE var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/shooter = locate() in chassis - for(var/datum/reagent/medication in shooter.reagents.reagent_list) - if(action == ("inject_reagent_" + medication.name)) - inject_reagent(medication, shooter) - break // or maybe return TRUE? i'm not certain - + if(shooter) + for(var/datum/reagent/medication in shooter.reagents.reagent_list) + if(action == ("inject_reagent_" + medication.name)) + inject_reagent(medication, shooter) + break // or maybe return TRUE? i'm not certain + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, atom/atomtarget, list/modifiers) diff --git a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx index e1ea1b81ef5b2..00d918b174978 100644 --- a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx +++ b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx @@ -474,26 +474,28 @@ const SnowflakeSleeper = (props) => { ))} - {injectible_reagents.map((reagent) => ( - - - - - - ))} + + + + + )) + : 'Unavailable'} ); From 9696db3dc155be44bb9f83b05b823170599ee311 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:45:18 +1200 Subject: [PATCH 097/120] Automatic changelog for PR #83957 [ci skip] --- html/changelogs/AutoChangeLog-pr-83957.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83957.yml diff --git a/html/changelogs/AutoChangeLog-pr-83957.yml b/html/changelogs/AutoChangeLog-pr-83957.yml new file mode 100644 index 0000000000000..07476dddacdfc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83957.yml @@ -0,0 +1,4 @@ +author: "GoblinBackwards" +delete-after: True +changes: + - bugfix: "Fixed the patient information for the mech sleeper module not displaying when the mech didn't also have a syringe gun." \ No newline at end of file From 8b2b867fa903f699fc2e75460dd817d6b43f4143 Mon Sep 17 00:00:00 2001 From: Goat <126099705+Goat-Real@users.noreply.github.com> Date: Fri, 14 Jun 2024 23:46:17 -0600 Subject: [PATCH 098/120] Adds lavaland versions for all mineral tiles and fixes a ruin using the wrong version (#83921) ## About The Pull Request Added a `volcanic` version of all mineral tiles that did not have one that have a `baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface` and a `initial_gas_mix = LAVALAND_DEFAULT_ATMOS`. Also fixes a prefab using the incorrect tiles and changes them to their `volcanic` varients. ## Why It's Good For The Game If mapper want to place specific minerals in their prefabs in lavaland, we should have a turf type for that. Fixes a prefab causing damage space related due to using the incorrect turf. ## Changelog :cl: Goat fix: A wrecked shuttle on lavaland no longer has asteroid tiles containing the danger of space. code: Added volcanic versions of all mineral turfs for those that did not have it. /:cl: --- .../lavaland_surface_shuttle_wreckage.dmm | 8 ++-- code/game/turfs/closed/minerals.dm | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm index 3fb9b8725272c..36950aaa0eedc 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_shuttle_wreckage.dmm @@ -50,7 +50,7 @@ }, /area/ruin/unpowered) "gP" = ( -/turf/closed/mineral/titanium, +/turf/closed/mineral/titanium/volcanic, /area/ruin/unpowered) "hT" = ( /turf/closed/wall/mineral/titanium{ @@ -132,7 +132,7 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered) "sZ" = ( -/turf/closed/mineral/random, +/turf/closed/mineral/random/volcanic, /area/ruin/unpowered) "tp" = ( /obj/item/stack/sheet/iron, @@ -153,7 +153,7 @@ }, /area/ruin/unpowered) "uh" = ( -/turf/closed/mineral/random, +/turf/closed/mineral/random/volcanic, /area/lavaland/surface) "uH" = ( /obj/effect/spawner/random/structure/crate, @@ -272,7 +272,7 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/ruin/unpowered) "GZ" = ( -/turf/closed/mineral/titanium, +/turf/closed/mineral/titanium/volcanic, /area/lavaland/surface) "Hy" = ( /obj/machinery/computer/communications{ diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 73bbae135a885..3ec5ee06e581f 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -547,6 +547,12 @@ mineralType = /obj/item/stack/ore/iron scan_state = "rock_Iron" +/turf/closed/mineral/iron/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/iron/ice icon_state = "icerock_iron" icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') @@ -561,10 +567,22 @@ mineralType = /obj/item/stack/ore/uranium scan_state = "rock_Uranium" +/turf/closed/mineral/uranium/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond scan_state = "rock_Diamond" +/turf/closed/mineral/diamond/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/diamond/ice icon_state = "icerock_iron" icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') @@ -589,6 +607,12 @@ mineralType = /obj/item/stack/ore/silver scan_state = "rock_Silver" +/turf/closed/mineral/silver/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/silver/ice/icemoon turf_type = /turf/open/misc/asteroid/snow/ice/icemoon baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon @@ -598,10 +622,22 @@ mineralType = /obj/item/stack/ore/titanium scan_state = "rock_Titanium" +/turf/closed/mineral/titanium/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma scan_state = "rock_Plasma" +/turf/closed/mineral/plasma/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/plasma/ice icon_state = "icerock_plasma" icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') @@ -617,6 +653,12 @@ mineralAmt = 3 scan_state = "rock_Bananium" +/turf/closed/mineral/bananium/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 From 181705e81173bc1b3763100d31f0ad7f222a45c4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:46:52 +1200 Subject: [PATCH 099/120] Automatic changelog for PR #83921 [ci skip] --- html/changelogs/AutoChangeLog-pr-83921.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83921.yml diff --git a/html/changelogs/AutoChangeLog-pr-83921.yml b/html/changelogs/AutoChangeLog-pr-83921.yml new file mode 100644 index 0000000000000..65d5619c722c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83921.yml @@ -0,0 +1,5 @@ +author: "Goat" +delete-after: True +changes: + - bugfix: "A wrecked shuttle on lavaland no longer has asteroid tiles containing the danger of space." + - code_imp: "Added volcanic versions of all mineral turfs for those that did not have it." \ No newline at end of file From 9fbabd686b8cd617dcfc3689530de5d097d74ea4 Mon Sep 17 00:00:00 2001 From: EnterTheJake <102721711+EnterTheJake@users.noreply.github.com> Date: Sat, 15 Jun 2024 07:48:36 +0200 Subject: [PATCH 100/120] Makes Portable scrubbers and atmos pumps repairable. (#83869) ## About The Pull Request Atmos scrubbers and atmos pumps are now repairable. ## Why It's Good For The Game Quality of life for atmos techs, You can repair your scrubbers and portable pumps now. ## Changelog :cl: qol: You can now repair portable scrubbers and pumps. /:cl: --- .../machinery/portable/canister.dm | 17 ------------- .../portable/portable_atmospherics.dm | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c5acadcd45291..5d2d5f6f1f9c7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -71,7 +71,6 @@ AddElement(/datum/element/atmos_sensitive, mapload) AddElement(/datum/element/volatile_gas_storage) AddComponent(/datum/component/gas_leaker, leak_rate=0.01) - register_context() /obj/machinery/portable_atmospherics/canister/interact(mob/user) . = ..() @@ -413,22 +412,6 @@ return ITEM_INTERACT_SUCCESS -/obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/tool) - if(user.combat_mode) - return - if(atom_integrity >= max_integrity || (machine_stat & BROKEN) || !tool.tool_start_check(user, amount = 1)) - return ITEM_INTERACT_SUCCESS - - to_chat(user, span_notice("You begin repairing cracks in [src]...")) - while(tool.use_tool(src, user, 2.5 SECONDS, volume=40)) - atom_integrity = min(atom_integrity + 25, max_integrity) - if(atom_integrity >= max_integrity) - to_chat(user, span_notice("You've finished repairing [src].")) - return ITEM_INTERACT_SUCCESS - to_chat(user, span_notice("You repair some of the cracks in [src]...")) - - return ITEM_INTERACT_BLOCKING - /obj/machinery/portable_atmospherics/canister/Exited(atom/movable/gone, direction) . = ..() if(gone == internal_cell) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 3713958fbaa26..14bd3281af2df 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -46,6 +46,7 @@ SSair.start_processing_machine(src) AddElement(/datum/element/climbable, climb_time = 3 SECONDS, climb_stun = 3 SECONDS) AddElement(/datum/element/elevation, pixel_shift = 8) + register_context() /obj/machinery/portable_atmospherics/on_deconstruction(disassembled) if(nob_crystal_inserted) @@ -84,6 +85,29 @@ return PROCESS_KILL excited = FALSE +/obj/machinery/portable_atmospherics/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + if(atom_integrity >= max_integrity || (machine_stat & BROKEN) || !tool.tool_start_check(user, amount = 1)) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "repairing...") + while(tool.use_tool(src, user, 2.5 SECONDS, volume=40)) + atom_integrity = min(atom_integrity + 25, max_integrity) + if(atom_integrity >= max_integrity) + balloon_alert(user, "repaired") + return ITEM_INTERACT_SUCCESS + balloon_alert(user, "partially repaired...") + + return ITEM_INTERACT_SUCCESS + +/obj/machinery/portable_atmospherics/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(!isliving(user) || !Adjacent(user)) + return . + if(held_item?.tool_behaviour == TOOL_WELDER) + context[SCREENTIP_CONTEXT_LMB] = "Repair" + return CONTEXTUAL_SCREENTIP_SET + /// Take damage if a variable is exceeded. Damage is equal to temp/limit * heat/limit. /// The damage multiplier is treated as 1 if something is being ignored while the other one is exceeded. /// On most cases only one will be exceeded, so the other one is scaled down. From a8c388381cd14f6447584d4e0000a348426c0e16 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:49:01 +1200 Subject: [PATCH 101/120] Automatic changelog for PR #83869 [ci skip] --- html/changelogs/AutoChangeLog-pr-83869.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83869.yml diff --git a/html/changelogs/AutoChangeLog-pr-83869.yml b/html/changelogs/AutoChangeLog-pr-83869.yml new file mode 100644 index 0000000000000..9a0c51025837f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83869.yml @@ -0,0 +1,4 @@ +author: "EnterTheJake" +delete-after: True +changes: + - qol: "You can now repair portable scrubbers and pumps." \ No newline at end of file From 95b7b8d0675eaea8700c0907c65fb8aa063af359 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Sat, 15 Jun 2024 02:52:24 -0300 Subject: [PATCH 102/120] Cosmos spells will no longer star mark your steed (#83936) ## About The Pull Request I was wondering wh yi was stuck in place after casting a spell and then eralized my poor cow got a star mark making it unable to pass thru my cosmos. This fixes it so u can be a cowboy heretic ## Why It's Good For The Game Presumably heretic on horse is cooler than heretic on not-horse ## Changelog :cl: fix: Cosmos spells will no longer star mark your steed /:cl: --- code/modules/antagonists/heretic/magic/cosmic_expansion.dm | 2 +- code/modules/antagonists/heretic/magic/star_blast.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index ad9ac0989b7e3..3fb197d392cb0 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -28,7 +28,7 @@ /datum/action/cooldown/spell/conjure/cosmic_expansion/cast(mob/living/cast_on) new expansion_effect(get_turf(cast_on)) for(var/mob/living/nearby_mob in range(star_mark_range, cast_on)) - if(cast_on == nearby_mob) + if(cast_on == nearby_mob || cast_on.buckled == nearby_mob) continue nearby_mob.apply_status_effect(/datum/status_effect/star_mark, cast_on) if (ascended) diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 48fdf2f26934b..3eb62b7ada814 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -41,7 +41,7 @@ . = ..() var/mob/living/cast_on = firer for(var/mob/living/nearby_mob in range(star_mark_range, target)) - if(cast_on == nearby_mob) + if(cast_on == nearby_mob || cast_on.buckled == nearby_mob) continue nearby_mob.apply_status_effect(/datum/status_effect/star_mark, cast_on) From 9e91828576518ef36155fad708f35d4b1737f2a5 Mon Sep 17 00:00:00 2001 From: Archie700 Date: Sat, 15 Jun 2024 13:52:43 +0800 Subject: [PATCH 103/120] Changes old refs in code from "reflector trenchcoat" to "ablative trenchcoat" (#83944) ## About The Pull Request Changes references to "reflector trenchcoat" in objective_items.dm to match the name of the actual item "ablative trenchcoat" ## Why It's Good For The Game Quality of life to prevent confusion from using the old name. ## Changelog :cl: qol: Changes description of steal objective to match the name /:cl: --- code/game/gamemodes/objective_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 4bd635b7ebee5..396cf4db3eac7 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -414,8 +414,8 @@ /datum/objective_item/steal/nukedisc/check_special_completion(obj/item/disk/nuclear/N) return !N.fake -/datum/objective_item/steal/reflector - name = "a reflector trenchcoat" +/datum/objective_item/steal/ablative + name = "an ablative trenchcoat" targetitem = /obj/item/clothing/suit/hooded/ablative excludefromjob = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN) item_owner = list(JOB_HEAD_OF_SECURITY) From 4df8a6586b0f3c25564a803b7a3c19bbad402c82 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:52:48 +1200 Subject: [PATCH 104/120] Automatic changelog for PR #83936 [ci skip] --- html/changelogs/AutoChangeLog-pr-83936.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83936.yml diff --git a/html/changelogs/AutoChangeLog-pr-83936.yml b/html/changelogs/AutoChangeLog-pr-83936.yml new file mode 100644 index 0000000000000..ffcfbeb688332 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83936.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "Cosmos spells will no longer star mark your steed" \ No newline at end of file From 6dce1765e7fc5aa7b5078e1103bb74cc9b47b057 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:53:02 +1200 Subject: [PATCH 105/120] Automatic changelog for PR #83944 [ci skip] --- html/changelogs/AutoChangeLog-pr-83944.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83944.yml diff --git a/html/changelogs/AutoChangeLog-pr-83944.yml b/html/changelogs/AutoChangeLog-pr-83944.yml new file mode 100644 index 0000000000000..5b17967d9d87b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83944.yml @@ -0,0 +1,4 @@ +author: "Archie700" +delete-after: True +changes: + - qol: "Changes description of steal objective to match the name" \ No newline at end of file From eba7298ce09217125c33e67988b02dd5c38bd43a Mon Sep 17 00:00:00 2001 From: Afevis Date: Sat, 15 Jun 2024 01:54:46 -0400 Subject: [PATCH 106/120] Fixes certain surgery failure states not properly updating surgery moods (#83976) Closes #83956 (which doesn't actually fix the issue that a few possible ways to fail surgery were missed.) Fixes #83932 :cl: ShizCalev fix: Fixed some surgery failure states not properly setting the correct mood event. refactor: Minor refactor to how surgery events work, there is now better support for per-surgery mood events! /:cl: --- .../mood_events/generic_negative_events.dm | 5 ++ code/modules/surgery/advanced/lobotomy.dm | 7 ++- code/modules/surgery/amputation.dm | 9 +-- code/modules/surgery/burn_dressing.dm | 5 +- code/modules/surgery/coronary_bypass.dm | 5 +- code/modules/surgery/gastrectomy.dm | 7 ++- code/modules/surgery/hepatectomy.dm | 7 ++- code/modules/surgery/lipoplasty.dm | 9 +-- code/modules/surgery/lobectomy.dm | 7 ++- code/modules/surgery/organic_steps.dm | 19 ++---- code/modules/surgery/plastic_surgery.dm | 7 ++- code/modules/surgery/repair_puncture.dm | 5 +- code/modules/surgery/surgery_step.dm | 58 +++++++++++++++++-- 13 files changed, 97 insertions(+), 53 deletions(-) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index fb877d1c1df56..6ad0580e5557c 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -305,12 +305,17 @@ /datum/mood_event/surgery description = "THEY'RE CUTTING ME OPEN!!" mood_change = -8 + var/surgery_completed = FALSE /datum/mood_event/surgery/success + description = "That surgery really hurt... Glad it worked, I guess..." timeout = 3 MINUTES + surgery_completed = TRUE /datum/mood_event/surgery/failure + description = "AHHHHHGH! THEY FILLETED ME ALIVE!" timeout = 10 MINUTES + surgery_completed = TRUE /datum/mood_event/bald description = "I need something to cover my head..." diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index 22cba90753826..b36bcee140a5d 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -34,6 +34,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/scalpel2.ogg' failure_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) @@ -48,7 +49,7 @@ span_notice("[user] begins to perform a lobotomy on [target]'s brain."), span_notice("[user] begins to perform surgery on [target]'s brain."), ) - display_pain(target, "Your head pounds with unimaginable pain!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "Your head pounds with unimaginable pain!") /datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results( @@ -58,7 +59,7 @@ span_notice("[user] successfully lobotomizes [target]!"), span_notice("[user] completes the surgery on [target]'s brain."), ) - display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) @@ -86,7 +87,7 @@ span_notice("[user] successfully lobotomizes [target]!"), span_notice("[user] completes the surgery on [target]'s brain."), ) - display_pain(target, "The pain in your head only seems to get worse!", mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "The pain in your head only seems to get worse!") target_brain.apply_organ_damage(80) switch(rand(1,3)) if(1) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 4b4f9aede8347..cd2910f4d1127 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -38,6 +38,7 @@ time = 64 preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -47,7 +48,7 @@ span_notice("[user] begins to sever [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), span_notice("[user] begins to sever [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, "You feel a gruesome pain in your [parse_zone(target_zone)]'s joint!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a gruesome pain in your [parse_zone(target_zone)]'s joint!") /datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) @@ -58,7 +59,7 @@ span_notice("[user] severs [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), span_notice("[user] severs [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, "You can no longer feel your severed [target.parse_zone_with_bodypart(target_zone)]!", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "You can no longer feel your severed [target.parse_zone_with_bodypart(target_zone)]!") if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user @@ -68,7 +69,3 @@ var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() return ..() - -/datum/surgery_step/sever_limb/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) - return ..() diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index 2ad5bf368d3cb..5f2bdb8048327 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -44,6 +44,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/retractor2.ogg' failure_sound = 'sound/surgery/organ1.ogg' + surgery_effects_mood = TRUE /// How much sanitization is added per step var/sanitization_added = 0.5 /// How much infestation is removed per step (positive number) @@ -83,7 +84,7 @@ span_notice("[user] begins to excise infected flesh from [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), span_notice("[user] begins to excise infected flesh from [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), ) - display_pain(target, "The infection in your [target.parse_zone_with_bodypart(user.zone_selected)] stings like hell! It feels like you're being stabbed!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "The infection in your [target.parse_zone_with_bodypart(user.zone_selected)] stings like hell! It feels like you're being stabbed!") else user.visible_message(span_notice("[user] looks for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), span_notice("You look for [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]...")) @@ -98,7 +99,6 @@ span_notice("[user] successfully excises some of the infected flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), span_notice("[user] successfully excises some of the infected flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/success) log_combat(user, target, "excised infected flesh in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") surgery.operated_bodypart.receive_damage(brute=3, wound_bonus=CANT_WOUND) burn_wound.infestation -= infestation_removed @@ -118,7 +118,6 @@ span_notice("[user] carves away some of the healthy flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), span_notice("[user] carves away some of the healthy flesh from [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) surgery.operated_bodypart.receive_damage(brute=rand(4,8), sharpness=TRUE) /datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 19528fe6b5c81..bf79df82ad36b 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -31,6 +31,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/scalpel2.ogg' failure_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -40,7 +41,7 @@ span_notice("[user] begins to make an incision in [target]'s heart."), span_notice("[user] begins to make an incision in [target]'s heart."), ) - display_pain(target, "You feel a horrendous pain in your heart, it's almost enough to make you pass out!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a horrendous pain in your heart, it's almost enough to make you pass out!") /datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) @@ -53,7 +54,6 @@ span_notice("Blood pools around the incision in [target_human]'s heart."), span_notice("Blood pools around the incision in [target_human]'s heart."), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/success) var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) target_bodypart.adjustBleedStacks(10) target_human.adjustBruteLoss(10) @@ -69,7 +69,6 @@ span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest!"), span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest!"), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) target_bodypart.adjustBleedStacks(10) target_human.adjustOrganLoss(ORGAN_SLOT_HEART, 10) diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm index 80396b04ab7e5..7ed006a50795a 100644 --- a/code/modules/surgery/gastrectomy.dm +++ b/code/modules/surgery/gastrectomy.dm @@ -33,6 +33,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/organ1.ogg' failure_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/gastrectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -42,7 +43,7 @@ span_notice("[user] begins to make an incision in [target]."), span_notice("[user] begins to make an incision in [target]."), ) - display_pain(target, "You feel a horrible stab in your gut!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a horrible stab in your gut!") /datum/surgery_step/gastrectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/mob/living/carbon/human/target_human = target @@ -57,7 +58,7 @@ span_notice("[user] successfully removes the damaged part of [target]'s stomach."), span_notice("[user] successfully removes the damaged part of [target]'s stomach."), ) - display_pain(target, "The pain in your gut ebbs and fades somewhat.", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "The pain in your gut ebbs and fades somewhat.") return ..() /datum/surgery_step/gastrectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) @@ -70,4 +71,4 @@ span_warning("[user] cuts the wrong part of [target]'s stomach!"), span_warning("[user] cuts the wrong part of [target]'s stomach!"), ) - display_pain(target, "Your stomach throbs with pain; it's not getting any better!", mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "Your stomach throbs with pain; it's not getting any better!") diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index a79499627c506..27e74512c1fad 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -32,6 +32,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/organ1.ogg' failure_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -41,7 +42,7 @@ span_notice("[user] begins to make an incision in [target]."), span_notice("[user] begins to make an incision in [target]."), ) - display_pain(target, "Your abdomen burns in horrific stabbing pain!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "Your abdomen burns in horrific stabbing pain!") /datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/mob/living/carbon/human/human_target = target @@ -56,7 +57,7 @@ span_notice("[user] successfully removes the damaged part of [target]'s liver."), span_notice("[user] successfully removes the damaged part of [target]'s liver."), ) - display_pain(target, "The pain receeds slightly.", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "The pain receeds slightly.") return ..() /datum/surgery_step/hepatectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) @@ -69,4 +70,4 @@ span_warning("[user] cuts the wrong part of [target]'s liver!"), span_warning("[user] cuts the wrong part of [target]'s liver!"), ) - display_pain(target, "You feel a sharp stab inside your abdomen!", mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "You feel a sharp stab inside your abdomen!") diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 870c53aeed7ac..71ad77b237005 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -24,6 +24,7 @@ /obj/item/hatchet = 35, /obj/item/knife/butcher = 25) time = 64 + surgery_effects_mood = TRUE preop_sound = list( /obj/item/circular_saw = 'sound/surgery/saw.ogg', /obj/item = 'sound/surgery/scalpel1.ogg', @@ -38,7 +39,7 @@ span_notice("[user] begins to cut away [target]'s excess fat."), span_notice("[user] begins to cut [target]'s [target_zone] with [tool]."), ) - display_pain(target, "You feel a stabbing in your [target_zone]!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a stabbing in your [target_zone]!") /datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) display_results( @@ -48,13 +49,9 @@ span_notice("[user] cuts [target]'s excess fat loose!"), span_notice("[user] finishes the cut on [target]'s [target_zone]."), ) - display_pain(target, "The fat in your [target_zone] comes loose, dangling and hurting like hell!", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "The fat in your [target_zone] comes loose, dangling and hurting like hell!") return TRUE -/datum/surgery_step/cut_fat/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) - return ..() - //remove fat /datum/surgery_step/remove_fat name = "remove loose fat (retractor)" diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 07c96e7125a6b..4ed1bad1c0bef 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -30,6 +30,7 @@ preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/organ1.ogg' failure_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -39,7 +40,7 @@ span_notice("[user] begins to make an incision in [target]."), span_notice("[user] begins to make an incision in [target]."), ) - display_pain(target, "You feel a stabbing pain in your chest!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a stabbing pain in your chest!") /datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) @@ -54,7 +55,7 @@ span_notice("Successfully removes a piece of [human_target]'s lungs."), "", ) - display_pain(target, "Your chest hurts like hell, but breathing becomes slightly easier.", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "Your chest hurts like hell, but breathing becomes slightly easier.") return ..() /datum/surgery_step/lobectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -67,7 +68,7 @@ span_warning("[user] screws up!"), span_warning("[user] screws up!"), ) - display_pain(target, "You feel a sharp stab in your chest; the wind is knocked out of you and it hurts to catch your breath!", mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "You feel a sharp stab in your chest; the wind is knocked out of you and it hurts to catch your breath!") human_target.losebreath += 4 human_target.adjustOrganLoss(ORGAN_SLOT_LUNGS, 10) return FALSE diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 299bedfc5b331..ce9dec4543846 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -11,6 +11,7 @@ time = 16 preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/scalpel2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -20,7 +21,7 @@ span_notice("[user] begins to make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), span_notice("[user] begins to make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), ) - display_pain(target, "You feel a stabbing in your [target.parse_zone_with_bodypart(target_zone)].", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a stabbing in your [target.parse_zone_with_bodypart(target_zone)].") /datum/surgery_step/incise/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) @@ -39,16 +40,11 @@ span_notice("Blood pools around the incision in [human_target]'s [target.parse_zone_with_bodypart(target_zone)]."), span_notice("Blood pools around the incision in [human_target]'s [target.parse_zone_with_bodypart(target_zone)]."), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/success) var/obj/item/bodypart/target_bodypart = target.get_bodypart(target_zone) if(target_bodypart) target_bodypart.adjustBleedStacks(10) return ..() -/datum/surgery_step/incise/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) - return ..() - /datum/surgery_step/incise/nobleed/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( user, @@ -57,7 +53,7 @@ span_notice("[user] begins to carefully make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), span_notice("[user] begins to carefully make an incision in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), ) - display_pain(target, "You feel a careful stabbing in your [target.parse_zone_with_bodypart(target_zone)].", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a careful stabbing in your [target.parse_zone_with_bodypart(target_zone)].") //clamp bleeders /datum/surgery_step/clamp_bleeders @@ -173,6 +169,7 @@ /obj/item = 'sound/surgery/scalpel1.ogg', ) success_sound = 'sound/surgery/organ2.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( @@ -182,7 +179,7 @@ span_notice("[user] begins to saw through the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), span_notice("[user] begins to saw through the bone in [target]'s [target.parse_zone_with_bodypart(target_zone)]."), ) - display_pain(target, "You feel a horrid ache spread through the inside of your [target.parse_zone_with_bodypart(target_zone)]!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a horrid ache spread through the inside of your [target.parse_zone_with_bodypart(target_zone)]!") /datum/surgery_step/saw/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !(tool.get_sharpness() && (tool.force >= 10))) @@ -198,11 +195,7 @@ span_notice("[user] saws [target]'s [target.parse_zone_with_bodypart(target_zone)] open!"), span_notice("[user] saws [target]'s [target.parse_zone_with_bodypart(target_zone)] open!"), ) - display_pain(target, "It feels like something just broke in your [target.parse_zone_with_bodypart(target_zone)]!", mood_event_type = /datum/mood_event/surgery/success) - return ..() - -/datum/surgery_step/saw/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "It feels like something just broke in your [target.parse_zone_with_bodypart(target_zone)]!") return ..() //drill bone diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index ab0d502039d53..0d452d851f266 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -60,6 +60,7 @@ /obj/item/knife = 50, TOOL_WIRECUTTER = 35) time = 64 + surgery_effects_mood = TRUE /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message(span_notice("[user] begins to alter [target]'s appearance."), span_notice("You begin to alter [target]'s appearance...")) @@ -70,7 +71,7 @@ span_notice("[user] begins to alter [target]'s appearance."), span_notice("[user] begins to make an incision in [target]'s face."), ) - display_pain(target, "You feel slicing pain across your face!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel slicing pain across your face!") /datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC)) @@ -82,7 +83,7 @@ span_notice("[user] successfully restores [target]'s appearance!"), span_notice("[user] finishes the operation on [target]'s face."), ) - display_pain(target, "The pain fades, your face feels normal again!", mood_event_type = /datum/mood_event/surgery/success) + display_pain(target, "The pain fades, your face feels normal again!") else var/list/names = list() if(!isabductor(user)) @@ -112,7 +113,7 @@ span_notice("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!"), span_notice("[user] finishes the operation on [target]'s face."), ) - display_pain(target, "The pain fades, your face feels new and unfamiliar!", mood_event_type = /datum/mood_event/surgery/failure) + display_pain(target, "The pain fades, your face feels new and unfamiliar!") if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.sec_hud_set_ID() diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index 601d27269eded..0d2e2d3123ca4 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -46,6 +46,7 @@ TOOL_WIRECUTTER = 40) time = 3 SECONDS preop_sound = 'sound/surgery/hemostat1.ogg' + surgery_effects_mood = TRUE /datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound @@ -65,7 +66,7 @@ span_notice("[user] begins to realign the torn blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)] with [tool]."), span_notice("[user] begins to realign the torn blood vessels in [target]'s [target.parse_zone_with_bodypart(user.zone_selected)]."), ) - display_pain(target, "You feel a horrible stabbing pain in your [target.parse_zone_with_bodypart(user.zone_selected)]!", mood_event_type = /datum/mood_event/surgery) + display_pain(target, "You feel a horrible stabbing pain in your [target.parse_zone_with_bodypart(user.zone_selected)]!") /datum/surgery_step/repair_innards/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound @@ -80,7 +81,6 @@ span_notice("[user] successfully realigns some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), span_notice("[user] successfully realigns some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/success) log_combat(user, target, "excised infected flesh in", addition="COMBAT MODE: [uppertext(user.combat_mode)]") surgery.operated_bodypart.receive_damage(brute=3, wound_bonus=CANT_WOUND) pierce_wound.adjust_blood_flow(-0.25) @@ -95,7 +95,6 @@ span_notice("[user] jerks apart some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)] with [tool]!"), span_notice("[user] jerk apart some of the blood vessels in [target]'s [target.parse_zone_with_bodypart(target_zone)]!"), ) - display_pain(target, mood_event_type = /datum/mood_event/surgery/failure) surgery.operated_bodypart.receive_damage(brute=rand(4,8), sharpness=SHARP_EDGED, wound_bonus = 10) ///// Sealing the vessels back together diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 87bc8625c7455..c739745969e8e 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -1,3 +1,8 @@ +#define SURGERY_STATE_STARTED "surgery_started" +#define SURGERY_STATE_FAILURE "surgery_failed" +#define SURGERY_STATE_SUCCESS "surgery_success" +#define SURGERY_MOOD_CATEGORY "surgery" + /datum/surgery_step var/name var/list/implements = list() //format is path = probability of success. alternatively @@ -12,6 +17,15 @@ var/preop_sound //Sound played when the step is started var/success_sound //Sound played if the step succeeded var/failure_sound //Sound played if the step fails + ///If the surgery causes mood changes if the patient is conscious. + var/surgery_effects_mood = FALSE + ///Which mood event to give the patient when surgery is starting while they're conscious. This should be permanent/not have a timer until the surgery either succeeds or fails, as those states will immediately replace it. Mostly just flavor text. + var/datum/mood_event/surgery/surgery_started_mood_event = /datum/mood_event/surgery + ///Which mood event to give the conscious patient when surgery succeeds. Lasts far shorter than if it failed. + var/datum/mood_event/surgery/surgery_success_mood_event = /datum/mood_event/surgery/success + ///Which mood event to give the consious patient when surgery fails. Lasts muuuuuch longer. + var/datum/mood_event/surgery/surgery_failure_mood_event = /datum/mood_event/surgery/failure + /datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) var/success = FALSE @@ -83,9 +97,11 @@ var/advance = FALSE if(preop(user, target, target_zone, tool, surgery) == SURGERY_STEP_FAIL) + update_surgery_mood(target, SURGERY_STATE_FAILURE) surgery.step_in_progress = FALSE return FALSE + update_surgery_mood(target, SURGERY_STATE_STARTED) play_preop_sound(user, target, target_zone, tool, surgery) // Here because most steps overwrite preop if(tool) @@ -122,11 +138,13 @@ if((prob(100-fail_prob) || (iscyborg(user) && !silicons_obey_prob)) && chem_check_result && !try_to_fail) if(success(user, target, target_zone, tool, surgery)) + update_surgery_mood(target, SURGERY_STATE_SUCCESS) play_success_sound(user, target, target_zone, tool, surgery) advance = TRUE else if(failure(user, target, target_zone, tool, surgery, fail_prob)) play_failure_sound(user, target, target_zone, tool, surgery) + update_surgery_mood(target, SURGERY_STATE_FAILURE) advance = TRUE if(chem_check_result) return .(user, target, target_zone, tool, surgery, try_to_fail) //automatically re-attempt if failed for reason other than lack of required chemical @@ -135,12 +153,43 @@ if(surgery.status > surgery.steps.len) surgery.complete(user) + else if(!QDELETED(target)) + update_surgery_mood(target, SURGERY_STATE_FAILURE) + if(target.stat == DEAD && was_sleeping && user.client) user.client.give_award(/datum/award/achievement/jobs/sandman, user) surgery.step_in_progress = FALSE return advance +/** + * Handles updating the mob's mood depending on the surgery states. + * * surgery_state = SURGERY_STATE_STARTED, SURGERY_STATE_FAILURE, SURGERY_STATE_SUCCESS + * * To prevent typos, the event category is defined as SURGERY_MOOD_CATEGORY ("surgery") +*/ +/datum/surgery_step/proc/update_surgery_mood(mob/living/target, surgery_state) + if(!target) + CRASH("Not passed a target, how did we get here?") + if(!surgery_effects_mood) + return + if(HAS_TRAIT(target, TRAIT_ANALGESIA)) + target.clear_mood_event(SURGERY_MOOD_CATEGORY) //incase they gained the trait mid-surgery. has the added side effect that if someone has a bad surgical memory/mood and gets drunk & goes back to surgery, they'll forget they hated it, which is kinda funny imo. + return + if(target.stat >= UNCONSCIOUS) + var/datum/mood_event/surgery/target_mood_event = target.mob_mood.mood_events[SURGERY_MOOD_CATEGORY] + if(target_mood_event?.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. + return + switch(surgery_state) + if(SURGERY_STATE_STARTED) + target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_started_mood_event) + if(SURGERY_STATE_SUCCESS) + target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_success_mood_event) + if(SURGERY_STATE_FAILURE) + target.add_mood_event(SURGERY_MOOD_CATEGORY, surgery_failure_mood_event) + else + CRASH("passed invalid surgery_state, \"[surgery_state]\".") + + /datum/surgery_step/proc/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results( user, @@ -262,17 +311,14 @@ * * target - Who the message will be sent to * * pain_message - The message to be displayed * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) - * * mood_event_type - What type of mood event the step applies if they're still conscious (ie "THEY'RE CUTTING ME OPEN!!" when being sliced open with a scalpel/saw/ect) */ -/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE, datum/mood_event/mood_event_type) +/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) if(target.stat < UNCONSCIOUS) if(HAS_TRAIT(target, TRAIT_ANALGESIA)) if(!pain_message) return to_chat(target, span_notice("You feel a dull, numb sensation as your body is surgically operated on.")) else - if(mood_event_type) - target.add_mood_event("surgery", mood_event_type) if(!pain_message) return to_chat(target, span_userdanger(pain_message)) @@ -283,3 +329,7 @@ #undef SURGERY_SPEED_DISSECTION_MODIFIER #undef SURGERY_SPEED_MORBID_CURIOSITY #undef SURGERY_SLOWDOWN_CAP_MULTIPLIER +#undef SURGERY_STATE_STARTED +#undef SURGERY_STATE_FAILURE +#undef SURGERY_STATE_SUCCESS +#undef SURGERY_MOOD_CATEGORY From e3b3de9dc4435a298fa82372d63f6d07ffa5c7dd Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:55:06 +1200 Subject: [PATCH 107/120] Automatic changelog for PR #83976 [ci skip] --- html/changelogs/AutoChangeLog-pr-83976.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83976.yml diff --git a/html/changelogs/AutoChangeLog-pr-83976.yml b/html/changelogs/AutoChangeLog-pr-83976.yml new file mode 100644 index 0000000000000..13d4b7ffa04cd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83976.yml @@ -0,0 +1,5 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Fixed some surgery failure states not properly setting the correct mood event." + - refactor: "Minor refactor to how surgery events work, there is now better support for per-surgery mood events!" \ No newline at end of file From fb6d1984f8f0a7d678adc0254be7c631c5b4900c Mon Sep 17 00:00:00 2001 From: GPeckman <21979502+GPeckman@users.noreply.github.com> Date: Sat, 15 Jun 2024 02:02:36 -0400 Subject: [PATCH 108/120] Fixes bluespace launchpad reset button (#83954) ## About The Pull Request The reset button for the bluespace launchpad was broken. Based on the code, it looks like someone rewrote the code at some point and forgot to properly account for it, so the button just didn't do anything for a while. Now it works again. Fixes #83780 ## Changelog :cl: fix: The reset button in the bluespace launchpad UI should work again. /:cl: --- code/game/machinery/computer/launchpad_control.dm | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 13f54f2798091..54ff5e0f31369 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -137,10 +137,16 @@ if("move_pos") var/plus_x = text2num(params["x"]) var/plus_y = text2num(params["y"]) - current_pad.set_offset( - x = current_pad.x_offset + plus_x, - y = current_pad.y_offset + plus_y - ) + if(plus_x || plus_y) + current_pad.set_offset( + x = current_pad.x_offset + plus_x, + y = current_pad.y_offset + plus_y, + ) + else + current_pad.set_offset( + x = 0, + y = 0, + ) . = TRUE if("rename") . = TRUE From bce2c0f181a2dba71c681a6292992a7cda6c5a2c Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:02:55 +1200 Subject: [PATCH 109/120] Automatic changelog for PR #83954 [ci skip] --- html/changelogs/AutoChangeLog-pr-83954.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83954.yml diff --git a/html/changelogs/AutoChangeLog-pr-83954.yml b/html/changelogs/AutoChangeLog-pr-83954.yml new file mode 100644 index 0000000000000..65f84f58472c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83954.yml @@ -0,0 +1,4 @@ +author: "GPeckman" +delete-after: True +changes: + - bugfix: "The reset button in the bluespace launchpad UI should work again." \ No newline at end of file From 8511a3aa5feac17033c0344244d6fa9dc8e6e4d2 Mon Sep 17 00:00:00 2001 From: KingkumaArt <69398298+KingkumaArt@users.noreply.github.com> Date: Sat, 15 Jun 2024 13:08:37 -0400 Subject: [PATCH 110/120] Fixes crossbow healium bolt sleeping silicons! Oops! (#83966) ## Why It's Good For The Game I thought I had this in the pr itself, with the check_bodytype code in the healium bolt, but I was wrong. Turns out the check statement only effected the healing but the sleep portion was left out of it by mistake. During testing I never thought to spawn in a borg. --- code/modules/projectiles/projectile/bullets/rifle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index e38d7f67496ee..3cbb894b8fb9e 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -124,7 +124,7 @@ /obj/projectile/bullet/rebar/healium/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - if(!isliving(target)) + if(!iscarbon(target)) return BULLET_ACT_HIT var/mob/living/breather = target breather.SetSleeping(3 SECONDS) From 8618351b692959fdf476e3d5efc251f66853bcaa Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sun, 16 Jun 2024 05:08:59 +1200 Subject: [PATCH 111/120] Automatic changelog for PR #83966 [ci skip] --- html/changelogs/AutoChangeLog-pr-83966.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83966.yml diff --git a/html/changelogs/AutoChangeLog-pr-83966.yml b/html/changelogs/AutoChangeLog-pr-83966.yml new file mode 100644 index 0000000000000..fc0dea5b16ef0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83966.yml @@ -0,0 +1,4 @@ +author: "WebcomicArtist" +delete-after: True +changes: + - bugfix: "Healium bolt now no longer affects silicons." \ No newline at end of file From fbbd80aab658b8996b45cd1afffa872e67d7c100 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 16 Jun 2024 00:45:51 +0000 Subject: [PATCH 112/120] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-83746.yml | 6 ---- html/changelogs/AutoChangeLog-pr-83869.yml | 4 --- html/changelogs/AutoChangeLog-pr-83921.yml | 5 ---- html/changelogs/AutoChangeLog-pr-83936.yml | 4 --- html/changelogs/AutoChangeLog-pr-83937.yml | 4 --- html/changelogs/AutoChangeLog-pr-83944.yml | 4 --- html/changelogs/AutoChangeLog-pr-83954.yml | 4 --- html/changelogs/AutoChangeLog-pr-83957.yml | 4 --- html/changelogs/AutoChangeLog-pr-83966.yml | 4 --- html/changelogs/AutoChangeLog-pr-83973.yml | 4 --- html/changelogs/AutoChangeLog-pr-83975.yml | 4 --- html/changelogs/AutoChangeLog-pr-83976.yml | 5 ---- html/changelogs/archive/2024-06.yml | 34 ++++++++++++++++++++++ 13 files changed, 34 insertions(+), 52 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-83746.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83869.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83921.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83936.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83937.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83944.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83954.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83957.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83966.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83973.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83975.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-83976.yml diff --git a/html/changelogs/AutoChangeLog-pr-83746.yml b/html/changelogs/AutoChangeLog-pr-83746.yml deleted file mode 100644 index 3491301711793..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83746.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - rscadd: "Cats and Dogs can lick slashing wounds clean." - - rscadd: "Basic Mobs with hands can relocate dislocated bones, and pluck eyeballs out of pulped skulls." - - balance: "Gorillas can strangle people." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83869.yml b/html/changelogs/AutoChangeLog-pr-83869.yml deleted file mode 100644 index 9a0c51025837f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83869.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EnterTheJake" -delete-after: True -changes: - - qol: "You can now repair portable scrubbers and pumps." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83921.yml b/html/changelogs/AutoChangeLog-pr-83921.yml deleted file mode 100644 index 65d5619c722c4..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83921.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Goat" -delete-after: True -changes: - - bugfix: "A wrecked shuttle on lavaland no longer has asteroid tiles containing the danger of space." - - code_imp: "Added volcanic versions of all mineral turfs for those that did not have it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83936.yml b/html/changelogs/AutoChangeLog-pr-83936.yml deleted file mode 100644 index ffcfbeb688332..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83936.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - bugfix: "Cosmos spells will no longer star mark your steed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83937.yml b/html/changelogs/AutoChangeLog-pr-83937.yml deleted file mode 100644 index 4900a88e8b735..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83937.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - qol: "Baby plushies are now smaller than their parents" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83944.yml b/html/changelogs/AutoChangeLog-pr-83944.yml deleted file mode 100644 index 5b17967d9d87b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83944.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Archie700" -delete-after: True -changes: - - qol: "Changes description of steal objective to match the name" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83954.yml b/html/changelogs/AutoChangeLog-pr-83954.yml deleted file mode 100644 index 65f84f58472c1..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83954.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GPeckman" -delete-after: True -changes: - - bugfix: "The reset button in the bluespace launchpad UI should work again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83957.yml b/html/changelogs/AutoChangeLog-pr-83957.yml deleted file mode 100644 index 07476dddacdfc..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83957.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GoblinBackwards" -delete-after: True -changes: - - bugfix: "Fixed the patient information for the mech sleeper module not displaying when the mech didn't also have a syringe gun." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83966.yml b/html/changelogs/AutoChangeLog-pr-83966.yml deleted file mode 100644 index fc0dea5b16ef0..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83966.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WebcomicArtist" -delete-after: True -changes: - - bugfix: "Healium bolt now no longer affects silicons." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83973.yml b/html/changelogs/AutoChangeLog-pr-83973.yml deleted file mode 100644 index b25fd561747d5..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83973.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Fix inability to make r-glass by hand inside your backpack" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83975.yml b/html/changelogs/AutoChangeLog-pr-83975.yml deleted file mode 100644 index 31ae781571281..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83975.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Wayland-Smithy" -delete-after: True -changes: - - bugfix: "Fixed revenant spawning next to brains and other unharvestable dead mobs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83976.yml b/html/changelogs/AutoChangeLog-pr-83976.yml deleted file mode 100644 index 13d4b7ffa04cd..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83976.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Fixed some surgery failure states not properly setting the correct mood event." - - refactor: "Minor refactor to how surgery events work, there is now better support for per-surgery mood events!" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index 7af6b140a5fb1..c0da4690e635b 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -708,3 +708,37 @@ - bugfix: RCD material reclamation mc-oofert: - rscadd: the flatpacker, a machine unlocked at industrial engineering +2024-06-16: + Archie700: + - qol: Changes description of steal objective to match the name + EnterTheJake: + - qol: You can now repair portable scrubbers and pumps. + GPeckman: + - bugfix: The reset button in the bluespace launchpad UI should work again. + Goat: + - bugfix: A wrecked shuttle on lavaland no longer has asteroid tiles containing + the danger of space. + - code_imp: Added volcanic versions of all mineral turfs for those that did not + have it. + GoblinBackwards: + - bugfix: Fixed the patient information for the mech sleeper module not displaying + when the mech didn't also have a syringe gun. + Jacquerel: + - rscadd: Cats and Dogs can lick slashing wounds clean. + - rscadd: Basic Mobs with hands can relocate dislocated bones, and pluck eyeballs + out of pulped skulls. + - balance: Gorillas can strangle people. + Melbert: + - bugfix: Fix inability to make r-glass by hand inside your backpack + ShizCalev: + - bugfix: Fixed some surgery failure states not properly setting the correct mood + event. + - refactor: Minor refactor to how surgery events work, there is now better support + for per-surgery mood events! + Wayland-Smithy: + - bugfix: Fixed revenant spawning next to brains and other unharvestable dead mobs. + WebcomicArtist: + - bugfix: Healium bolt now no longer affects silicons. + carlarctg: + - bugfix: Cosmos spells will no longer star mark your steed + - qol: Baby plushies are now smaller than their parents From 9502f891461fe42b650d5e0a18e8fadc9d228761 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Sun, 16 Jun 2024 04:18:13 +0300 Subject: [PATCH 113/120] Misha - the bear (#83949) ## About The Pull Request ![image](https://github.com/tgstation/tgstation/assets/96586172/beeee166-f838-4bce-ab52-667ed566e25c) Adds Misha the bear to icebox HoS office, a snow bear with the same health stats as Sgt. Araneus. ## Why It's Good For The Game With how easy it is to break into the HoS office on icebox (you don't need any space protection) it never made sense to keep a slow pet in the office. The bear is fast and deals 15 damage, while also resistant to cold. I think it adds more depth that the HoS tamed a bear on icebox and trained it. Also the bear fits the map. ## Changelog :cl: grungussuss add: Added Misha the bear to the HoS office on icebox. /:cl: --- _maps/map_files/IceBoxStation/IceBoxStation.dmm | 4 ++-- code/game/objects/structures/beds_chairs/bed.dm | 5 +++++ code/modules/antagonists/traitor/objectives/kill_pet.dm | 1 + code/modules/events/ghost_role/sentience.dm | 1 + code/modules/mob/living/basic/space_fauna/bear/_bear.dm | 9 +++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 1e2662c209e36..984cf0ca1298e 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -27555,9 +27555,9 @@ }, /area/station/hallway/secondary/entry) "ioi" = ( -/obj/structure/bed/dogbed/lia, /obj/structure/cable, -/mob/living/basic/carp/pet/lia, +/mob/living/basic/bear/snow/misha, +/obj/structure/bed/dogbed/misha, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/hos) "iol" = ( diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index e037043cc91a5..4cfd6355eb0b2 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -272,6 +272,11 @@ name = "Cayenne's bed" anchored = TRUE +/obj/structure/bed/dogbed/misha + desc = "There is fur all over it, and some blood..." + name = "Misha's bed" + anchored = TRUE + /obj/structure/bed/dogbed/lia desc = "Seems kind of... fishy." name = "Lia's bed" diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 21bf06eb38681..ddaf6ee47ce2a 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -55,6 +55,7 @@ JOB_HEAD_OF_SECURITY = list( /mob/living/basic/carp/pet/lia, /mob/living/basic/spider/giant/sgt_araneus, + /mob/living/basic/bear/snow/misha, ), JOB_WARDEN = list( /mob/living/basic/pet/dog/pug/mcgriff diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 002c161f66c81..4017361dba51a 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/bot/secbot/beepsky, /mob/living/simple_animal/hostile/retaliate/goose/vomit, + /mob/living/basic/bear/snow/misha, ))) /datum/round_event_control/sentience 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 c528819b5bb4a..f4a1267e9db70 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -82,6 +82,15 @@ icon_dead = "snowbear_dead" desc = "It's a polar bear, in space, but not actually in space." +/mob/living/basic/bear/snow/misha + name = "Misha" + real_name = "Misha" + desc = "Tamed and trained by the Head of Security. Only beasts are above deceit." + gold_core_spawnable = NO_SPAWN + maxHealth = 250 + health = 250 + faction = list(FACTION_NEUTRAL) + /mob/living/basic/bear/snow/ancient name = "ancient polar bear" desc = "A grizzled old polar bear, its hide thick enough to make it impervious to almost all weapons." From afc4bc3588d059e27c54ad356aa8301539bdd55d Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:51:53 +1200 Subject: [PATCH 114/120] Automatic changelog for PR #83949 [ci skip] --- html/changelogs/AutoChangeLog-pr-83949.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83949.yml diff --git a/html/changelogs/AutoChangeLog-pr-83949.yml b/html/changelogs/AutoChangeLog-pr-83949.yml new file mode 100644 index 0000000000000..62584dcc7c0fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83949.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - rscadd: "Added Misha the bear to the HoS office on icebox." \ No newline at end of file From 0bfbc2db3c4564a0b1b27a96432e00e5591d6538 Mon Sep 17 00:00:00 2001 From: FinancialGoose <92416224+TheBoondock@users.noreply.github.com> Date: Sun, 16 Jun 2024 01:00:20 -0400 Subject: [PATCH 115/120] Add sounds to inserting tanks (#83840) ## About The Pull Request Adds sound to when tanks are inserted into an air pump, canister, scrubbers. There are 2 sound files, there may be an argument for using the stronger one as the insert sound while the weaker effect for removing, idk give me feedback. ## Why It's Good For The Game I think there should definitely be sound cues for when our inserting tanks instead of just a few pixel changes on the atmos machinery https://github.com/tgstation/tgstation/assets/92416224/a70743ed-9461-4357-84c1-e339aa25da1b ## Changelog :cl: sound: added compressed air sound for when air tanks are inserted into machinery /:cl: --- .../machinery/portable/portable_atmospherics.dm | 15 +++++++++++++-- sound/attributions.txt | 10 ++++++++++ sound/effects/compressed_air1.ogg | Bin 0 -> 9731 bytes sound/effects/compressed_air2.ogg | Bin 0 -> 6906 bytes sound/effects/tank_insert_clunky.ogg | Bin 0 -> 14863 bytes sound/effects/tank_remove_thunk.ogg | Bin 0 -> 36044 bytes 6 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 sound/effects/compressed_air1.ogg create mode 100644 sound/effects/compressed_air2.ogg create mode 100644 sound/effects/tank_insert_clunky.ogg create mode 100644 sound/effects/tank_remove_thunk.ogg diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 14bd3281af2df..17f3a6fb439f7 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -32,6 +32,9 @@ var/suppress_reactions = FALSE /// Is there a hypernoblium crystal inserted into this var/nob_crystal_inserted = FALSE + var/insert_sound = 'sound/effects/tank_insert_clunky.ogg' + var/remove_sound = 'sound/effects/tank_remove_thunk.ogg' + var/sound_vol = 50 /datum/armor/machinery_portable_atmospherics energy = 100 @@ -211,15 +214,23 @@ /obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) if(!user) return FALSE - if(holding) + if(holding && new_tank)//for when we are actually switching tanks + user.put_in_hands(holding) + UnregisterSignal(holding, COMSIG_QDELETING) + holding = new_tank + RegisterSignal(holding, COMSIG_QDELETING, PROC_REF(unregister_holding)) + playsound(src, list(insert_sound,remove_sound), sound_vol) + else if(holding)//we remove a tank if(Adjacent(user)) user.put_in_hands(holding) else holding.forceMove(get_turf(src)) + playsound(src, remove_sound, sound_vol) UnregisterSignal(holding, COMSIG_QDELETING) holding = null - if(new_tank) + else if(new_tank)//we insert the tank holding = new_tank + playsound(src, insert_sound, sound_vol) RegisterSignal(holding, COMSIG_QDELETING, PROC_REF(unregister_holding)) SSair.start_processing_machine(src) diff --git a/sound/attributions.txt b/sound/attributions.txt index a9e2c69753189..bcd6f41edf278 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -178,3 +178,13 @@ https://freesound.org/people/shw489/sounds/234389/ soup_boil1.ogg through soup_boil5.ogg and soup_boil_end.ogg are taken from Boiling Soup from Freesoung.org (CC4) and converted to OGG / split apart (but is otherwise unchanged): https://freesound.org/people/jorickhoofd/sounds/632783/ + +compressed_air1.ogg is taken from Freesound and converted to ogg: +https://freesound.org/people/Geoff-Bremner-Audio/sounds/682952/ +compressed_air2.ogg is taken from Freesound and converted to ogg: +https://freesound.org/people/Geoff-Bremner-Audio/sounds/682816/ +tank_insert_clunky.ogg was created by mixing compressed_air1 and clunk sound from Freesound: +https://freesound.org/people/BinaryMonkFlint/sounds/333296/ +tank_remove_thunk.ogg was made by mixing two sound tracks from Freesound: +https://freesound.org/people/lowdjinn/sounds/533885/ and; +https://freesound.org/people/BMacZero/sounds/96137/ diff --git a/sound/effects/compressed_air1.ogg b/sound/effects/compressed_air1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5fb1ff067201537290c740abdd34df40a0ef8384 GIT binary patch literal 9731 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 literal 0 HcmV?d00001 diff --git a/sound/effects/compressed_air2.ogg b/sound/effects/compressed_air2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d26816f28e183a1b26e7dd6b4945dd5e3e491ade GIT binary patch literal 6906 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 R*Q|YF;P_cLOgl^i{4Xr(G_3#t literal 0 HcmV?d00001 diff --git a/sound/effects/tank_remove_thunk.ogg b/sound/effects/tank_remove_thunk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..db32055ce432c1c5a0117128896aa98bd2bf0ca3 GIT binary patch literal 36044 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�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 h-evsvEFYQx4loA*00000!0q&ZZt}9O&9$LL0s! Date: Sun, 16 Jun 2024 17:17:23 +1200 Subject: [PATCH 116/120] Automatic changelog for PR #83840 [ci skip] --- html/changelogs/AutoChangeLog-pr-83840.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83840.yml diff --git a/html/changelogs/AutoChangeLog-pr-83840.yml b/html/changelogs/AutoChangeLog-pr-83840.yml new file mode 100644 index 0000000000000..5d879aece5df2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83840.yml @@ -0,0 +1,4 @@ +author: "TheBoondock" +delete-after: True +changes: + - sound: "added compressed air sound for when air tanks are inserted into machinery" \ No newline at end of file From 2fdc2313cb2a1bb6d370d43824986c493481aba9 Mon Sep 17 00:00:00 2001 From: JackEnoff <166665535+JackEnoff@users.noreply.github.com> Date: Sun, 16 Jun 2024 10:18:30 -0400 Subject: [PATCH 117/120] Changelings are (once again) weak to fire (#83953) ## About The Pull Request Being on fire will make the ling unable to use any ability that isn't for getting out of danger or reviving themselves (Adrenals, Fakedeath, Strained Muscles, Last Resort, Shriek, Defib Grasp and Biodegrade). And no, there is no armblade nerf, it is fine as it is. ## Why It's Good For The Game Changelings are really busted, as they are effectively immortal until completely removed (which means finding a cremator/gibber/shuttle, and by the time you get there most of the time they are already ready to revive) which really limits counterplay. Goof and Jac's approach to nerfing lings was a bit too much since it nerfed the armblade massively as well, but I found that their approach about lings being weak to fire was really good counterplay for lings (besides BZ (who even uses it?)). We shouldnt just leave the guys that are almost immortal and spawn multiple in a round with one single counterplay that relies on a knowledge check. ## Changelog :cl: balance: Certain changeling abilities won't work while on fire. /:cl: --- code/modules/antagonists/changeling/changeling_power.dm | 5 +++++ code/modules/antagonists/changeling/powers/adrenaline.dm | 1 + code/modules/antagonists/changeling/powers/biodegrade.dm | 1 + code/modules/antagonists/changeling/powers/defib_grasp.dm | 1 + code/modules/antagonists/changeling/powers/fakedeath.dm | 1 + code/modules/antagonists/changeling/powers/headcrab.dm | 1 + code/modules/antagonists/changeling/powers/shriek.dm | 2 ++ .../antagonists/changeling/powers/strained_muscles.dm | 1 + 8 files changed, 13 insertions(+) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 23b4f9548c424..d06d8fe91735a 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -32,6 +32,8 @@ var/ignores_fakedeath = FALSE /// used by a few powers that toggle var/active = FALSE + /// Does this ability stop working if you are burning? + var/disabled_by_fire = TRUE /* changeling code now relies on on_purchase to grant powers. @@ -61,6 +63,9 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/try_to_sting(mob/living/user, mob/living/target) if(!can_sting(user, target)) return FALSE + if(disabled_by_fire && user.fire_stacks && user.on_fire) + user.balloon_alert(user, "on fire!") + return FALSE var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(sting_action(user, target)) sting_feedback(user, target) diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 9d2abfe623314..10c06656b2978 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -7,6 +7,7 @@ dna_cost = 2 req_human = FALSE req_stat = CONSCIOUS + disabled_by_fire = FALSE /datum/action/changeling/adrenaline/can_sting(mob/living/user, mob/living/target) . = ..() diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 2b1753c27273a..8a5fae3bd8aed 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -6,6 +6,7 @@ chemical_cost = 30 //High cost to prevent spam dna_cost = 2 req_human = TRUE + disabled_by_fire = FALSE /datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) if(user.handcuffed) diff --git a/code/modules/antagonists/changeling/powers/defib_grasp.dm b/code/modules/antagonists/changeling/powers/defib_grasp.dm index 135b9b243f721..867a595e17dcd 100644 --- a/code/modules/antagonists/changeling/powers/defib_grasp.dm +++ b/code/modules/antagonists/changeling/powers/defib_grasp.dm @@ -6,6 +6,7 @@ while we are dead or in stasis. Will also stun cyborgs momentarily." owner_has_control = FALSE dna_cost = 0 + disabled_by_fire = FALSE /// Flags to pass to fully heal when we get zapped var/heal_flags = HEAL_DAMAGE|HEAL_BODY|HEAL_STATUS|HEAL_CC_STATUS diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 75d4996b8b2d7..1dff58377fd4a 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -7,6 +7,7 @@ req_dna = 1 req_stat = DEAD ignores_fakedeath = TRUE + disabled_by_fire = FALSE /// How long it takes for revival to ready upon entering stasis. /// The changeling can opt to stay in fakedeath for longer, though. diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 30970832df0a4..0b7668260d769 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -8,6 +8,7 @@ req_human = TRUE req_stat = DEAD ignores_fakedeath = TRUE + disabled_by_fire = FALSE /datum/action/changeling/headcrab/sting_action(mob/living/user) set waitfor = FALSE diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index aa204d89a166e..cfbcc7b64ec27 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -6,6 +6,7 @@ chemical_cost = 20 dna_cost = 1 req_human = TRUE + disabled_by_fire = FALSE //A flashy ability, good for crowd control and sowing chaos. /datum/action/changeling/resonant_shriek/sting_action(mob/user) @@ -41,6 +42,7 @@ button_icon_state = "dissonant_shriek" chemical_cost = 20 dna_cost = 1 + disabled_by_fire = FALSE /datum/action/changeling/dissonant_shriek/sting_action(mob/user) ..() diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 19c4458a388bc..3ea59f5df089b 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -11,6 +11,7 @@ req_human = TRUE var/stacks = 0 //Increments every 5 seconds; damage increases over time active = FALSE //Whether or not you are a hedgehog + disabled_by_fire = FALSE /datum/action/changeling/strained_muscles/sting_action(mob/living/carbon/user) ..() From 0a9e4d0cf0afa0ccbfdcbebf2a89ad3ce22083e7 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Mon, 17 Jun 2024 02:18:51 +1200 Subject: [PATCH 118/120] Automatic changelog for PR #83953 [ci skip] --- html/changelogs/AutoChangeLog-pr-83953.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83953.yml diff --git a/html/changelogs/AutoChangeLog-pr-83953.yml b/html/changelogs/AutoChangeLog-pr-83953.yml new file mode 100644 index 0000000000000..fe5f444909fe3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83953.yml @@ -0,0 +1,4 @@ +author: "JackEnoff" +delete-after: True +changes: + - balance: "Certain changeling abilities won't work while on fire." \ No newline at end of file From 3fb84d5429715c7e4049932fbfe7ee53bffe4849 Mon Sep 17 00:00:00 2001 From: Lucy Grindler <110352801+LucyGrind@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:37:13 -0700 Subject: [PATCH 119/120] Crit Dental Pills! (#83895) ## About The Pull Request What it says on the tin: Allows dental pills to be used in crit, simply gets rid of hands_free and adds a NONE flag ## Why It's Good For The Game Dental implants are among the lowest used surgeries in the game, and I think have a lot of potential for funny shenanigans, such as using ghoul powder to fake your own death, or just blowing yourself up when in crit. Requires another person to do the surgery, so its harder to powergame with and also reviver implants alongside other things set the precedent that this sorta change is okay. ## Changelog :cl: Hacks-The-Doors balance: dental pills can now be used in crit. balance: dental pills now give off a message when you start using them balance: dental pills have a 2.5 second delay when in soft crit /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/game/objects/items/devices/flashlight.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/surgery/bodyparts/dismemberment.dm | 4 ++-- code/modules/surgery/dental_implant.dm | 15 ++++++++++++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 99e7c43235ab9..67ec498a1fbc6 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -170,7 +170,7 @@ organ_list += (O.gender == "plural" ? O.name : "\an [O.name]") var/pill_count = 0 - for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) + for(var/datum/action/item_action/activate_pill/AP in M.actions) pill_count++ if(M == user)//if we're looking on our own mouth diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index cd1f6a2798ba2..5ea7d62313bd4 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -701,7 +701,7 @@ else var/obj/item/organ/internal/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE) var/pill_count = 0 - for(var/datum/action/item_action/hands_free/activate_pill/pill in human_examined.actions) + for(var/datum/action/item_action/activate_pill/pill in human_examined.actions) pill_count++ if(pill_count >= 1 && has_tongue) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index e942a1b2e3aca..1fa6db17e5a54 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -234,7 +234,7 @@ qdel(owner.GetComponent(/datum/component/creamed)) //clean creampie overlay flushed emoji //Handle dental implants - for(var/datum/action/item_action/hands_free/activate_pill/pill_action in owner.actions) + for(var/datum/action/item_action/activate_pill/pill_action in owner.actions) pill_action.Remove(owner) var/obj/pill = pill_action.target if(pill) @@ -342,7 +342,7 @@ //Handle dental implants for(var/obj/item/reagent_containers/pill/pill in src) - for(var/datum/action/item_action/hands_free/activate_pill/pill_action in pill.actions) + for(var/datum/action/item_action/activate_pill/pill_action in pill.actions) pill.forceMove(new_head_owner) pill_action.Grant(new_head_owner) break diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 0d583d09a11b0..d720039d56b7e 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -27,7 +27,7 @@ user.transferItemToLoc(tool, target, TRUE) - var/datum/action/item_action/hands_free/activate_pill/pill_action = new(tool) + var/datum/action/item_action/activate_pill/pill_action = new(tool) pill_action.name = "Activate [tool.name]" pill_action.build_all_button_icons() pill_action.target = tool @@ -42,12 +42,21 @@ ) return ..() -/datum/action/item_action/hands_free/activate_pill +/datum/action/item_action/activate_pill name = "Activate Pill" + check_flags = NONE -/datum/action/item_action/hands_free/activate_pill/Trigger(trigger_flags) +/datum/action/item_action/activate_pill/IsAvailable(feedback) + if(owner.stat > SOFT_CRIT) + return FALSE + return ..() + +/datum/action/item_action/activate_pill/Trigger(trigger_flags) if(!..()) return FALSE + owner.balloon_alert_to_viewers("[owner] grinds their teeth!", "You grit your teeth.") + if(!do_after(owner, owner.stat * (2.5 SECONDS), owner, IGNORE_USER_LOC_CHANGE | IGNORE_INCAPACITATED)) + return FALSE var/obj/item/item_target = target to_chat(owner, span_notice("You grit your teeth and burst the implanted [item_target.name]!")) owner.log_message("swallowed an implanted pill, [target]", LOG_ATTACK) From 8ffe8f915bd0d1cdee2fa36e414de5f7c15182c4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Mon, 17 Jun 2024 07:38:44 +1200 Subject: [PATCH 120/120] Automatic changelog for PR #83895 [ci skip] --- html/changelogs/AutoChangeLog-pr-83895.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83895.yml diff --git a/html/changelogs/AutoChangeLog-pr-83895.yml b/html/changelogs/AutoChangeLog-pr-83895.yml new file mode 100644 index 0000000000000..6b66da81feef3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83895.yml @@ -0,0 +1,6 @@ +author: "Hacks-The-Doors" +delete-after: True +changes: + - balance: "dental pills can now be used in crit." + - balance: "dental pills now give off a message when you start using them" + - balance: "dental pills have a 2.5 second delay when in soft crit" \ No newline at end of file

$8gUEwR+Y1@0%my4XMkPG%NUqoto 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 diff --git a/tgstation.dme b/tgstation.dme index c1edbfe6146b5..315e5cef3fd47 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1989,6 +1989,7 @@ #include "code\game\machinery\fat_sucker.dm" #include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" +#include "code\game\machinery\flatpacker.dm" #include "code\game\machinery\gigabeacon.dm" #include "code\game\machinery\gulag_item_reclaimer.dm" #include "code\game\machinery\gulag_teleporter.dm" diff --git a/tgui/packages/tgui/interfaces/Flatpacker.tsx b/tgui/packages/tgui/interfaces/Flatpacker.tsx new file mode 100644 index 0000000000000..43fed9e49e4b9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Flatpacker.tsx @@ -0,0 +1,195 @@ +import { BooleanLike } from 'common/react'; +import { toTitleCase } from 'common/string'; + +import { useBackend } from '../backend'; +import { + Box, + Button, + Dimmer, + Icon, + Image, + NoticeBox, + Section, + Stack, + Table, +} from '../components'; +import { TableCell } from '../components/Table'; +import { Window } from '../layouts'; +import { MaterialAccessBar } from './Fabrication/MaterialAccessBar'; +import { MaterialIcon } from './Fabrication/MaterialIcon'; +import { Material } from './Fabrication/Types'; + +type Data = { + SHEET_MATERIAL_AMOUNT: number; + materials: Material[]; + design?: Design; + busy: BooleanLike; +}; + +type Design = { + name: string; + icon: string; + requiredMaterials: Material[]; + canPrint: BooleanLike; + disableReason?: string; +}; + +export const Flatpacker = (props: any) => { + const { act, data } = useBackend(); + const { SHEET_MATERIAL_AMOUNT, materials, design, busy } = data; + + return ( + + + {!!busy && ( + + + {' Flatpacking...'} + + )} + + + + +