From a9b3300383798bed677ccfb63640d9ae9a00dbba Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 00:28:20 +0000 Subject: [PATCH 01/64] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-87072.yml | 4 --- html/changelogs/AutoChangeLog-pr-87336.yml | 4 --- html/changelogs/AutoChangeLog-pr-87367.yml | 5 ---- html/changelogs/AutoChangeLog-pr-87380.yml | 4 --- html/changelogs/AutoChangeLog-pr-87437.yml | 4 --- html/changelogs/AutoChangeLog-pr-87445.yml | 4 --- html/changelogs/AutoChangeLog-pr-87451.yml | 4 --- html/changelogs/AutoChangeLog-pr-87453.yml | 4 --- html/changelogs/AutoChangeLog-pr-87454.yml | 4 --- html/changelogs/AutoChangeLog-pr-87455.yml | 4 --- html/changelogs/AutoChangeLog-pr-87459.yml | 4 --- html/changelogs/AutoChangeLog-pr-87460.yml | 4 --- html/changelogs/AutoChangeLog-pr-87463.yml | 4 --- html/changelogs/archive/2024-10.yml | 34 ++++++++++++++++++++++ 14 files changed, 34 insertions(+), 53 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-87072.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87336.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87367.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87380.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87437.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87451.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87453.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87454.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87455.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87459.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87460.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87463.yml diff --git a/html/changelogs/AutoChangeLog-pr-87072.yml b/html/changelogs/AutoChangeLog-pr-87072.yml deleted file mode 100644 index b2ea32f4cfb52..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Time-Green, 00-Steven" -delete-after: True -changes: - - rscadd: "Adds Lost Crew as an orderable cargo package by medical! Fix and revive them to bring new players back into the game and make some money for medical!\nadmin:" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87336.yml b/html/changelogs/AutoChangeLog-pr-87336.yml deleted file mode 100644 index ea4d3603489c7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tontyGH" -delete-after: True -changes: - - bugfix: "pointing at stuff on-top of plates, griddles, stoves and ovens will point at the plate and no longer just do nothing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87367.yml b/html/changelogs/AutoChangeLog-pr-87367.yml deleted file mode 100644 index 41c7012fb830b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87367.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - rscadd: "Modernizes polymorph types by adding mob types that never entered the wabbajack list." - - balance: "Updated a few species' changesource flags" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87380.yml b/html/changelogs/AutoChangeLog-pr-87380.yml deleted file mode 100644 index 587af71687217..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87380.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CliffracerX" -delete-after: True -changes: - - config: "altered coded defaults for human authority, no impact on TG" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87437.yml b/html/changelogs/AutoChangeLog-pr-87437.yml deleted file mode 100644 index aa9a39839d579..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87437.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - rscadd: "GPSes now show the general direction of cross-linked z-levels." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87445.yml b/html/changelogs/AutoChangeLog-pr-87445.yml deleted file mode 100644 index f2c1e70f33c5d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - qol: "you can now turn off the volume on an entertainment monitor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87451.yml b/html/changelogs/AutoChangeLog-pr-87451.yml deleted file mode 100644 index bae544d2ca2ae..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87451.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KazooBard" -delete-after: True -changes: - - balance: "Knock path's grasp now stuns the previous mech occupant when ejecting them and unlocks BOTH the ID and DNA lock, allowing the heretic to freely board the vehicle." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87453.yml b/html/changelogs/AutoChangeLog-pr-87453.yml deleted file mode 100644 index 168f3d4aa01fd..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - sound: "fan loop sounds have been improved" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87454.yml b/html/changelogs/AutoChangeLog-pr-87454.yml deleted file mode 100644 index 0671a6f469083..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87454.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - bugfix: "spray-on insulated gloves are chunky once more. does not affect regular ones" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87455.yml b/html/changelogs/AutoChangeLog-pr-87455.yml deleted file mode 100644 index 9bcfc19df979f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87455.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed hat stabilizer component not cancelling the attack chain" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87459.yml b/html/changelogs/AutoChangeLog-pr-87459.yml deleted file mode 100644 index 21f9a244f0986..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87459.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Vekter" -delete-after: True -changes: - - bugfix: "Changed the color of entertainment radio to be darker" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87460.yml b/html/changelogs/AutoChangeLog-pr-87460.yml deleted file mode 100644 index 3ffaec24b72b5..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87460.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss and redemptionarc" -delete-after: True -changes: - - sound: "sigh sounds have been improved" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87463.yml b/html/changelogs/AutoChangeLog-pr-87463.yml deleted file mode 100644 index 2d37cf440a329..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87463.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jewelry-x" -delete-after: True -changes: - - admin: "make sparks optional when sending a supply pod" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 763d05d056da8..9a585445641e9 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -807,3 +807,37 @@ damage at the cost of lethal damage. Lower cooldown. Power chromosome makes it force a stagger rather than cause a chain lightning effect (this used to do like only 5 damage so...) +2024-10-27: + Absolucy: + - rscadd: GPSes now show the general direction of cross-linked z-levels. + CliffracerX: + - config: altered coded defaults for human authority, no impact on TG + Jewelry-x: + - admin: make sparks optional when sending a supply pod + KazooBard: + - balance: Knock path's grasp now stuns the previous mech occupant when ejecting + them and unlocks BOTH the ID and DNA lock, allowing the heretic to freely board + the vehicle. + SmArtKar: + - bugfix: Fixed hat stabilizer component not cancelling the attack chain + Time-Green, 00-Steven: + - rscadd: 'Adds Lost Crew as an orderable cargo package by medical! Fix and revive + them to bring new players back into the game and make some money for medical! + + admin:' + Vekter: + - bugfix: Changed the color of entertainment radio to be darker + carlarctg: + - bugfix: spray-on insulated gloves are chunky once more. does not affect regular + ones + - rscadd: Modernizes polymorph types by adding mob types that never entered the + wabbajack list. + - balance: Updated a few species' changesource flags + grungussuss: + - qol: you can now turn off the volume on an entertainment monitor + - sound: fan loop sounds have been improved + grungussuss and redemptionarc: + - sound: sigh sounds have been improved + tontyGH: + - bugfix: pointing at stuff on-top of plates, griddles, stoves and ovens will point + at the plate and no longer just do nothing From a8f5ea13678d2ed1c07c8c3c3bbb3a417ad0da9d Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:54:38 +0200 Subject: [PATCH 02/64] Changelings no longer have a soul when examined if their brain is missing (#87450) ## About The Pull Request Added a new trait that changeling bodies have that prevents them from showing up as having a soul when examined when you pull out their brain. ## Why It's Good For The Game This is an extremely cheesy and easy way to antag check a suspected changeling, either via surgery, guillotine or amputation shears. Admins rule this as metainfo/an exploit, so players essentially have to forgo using information that they have acquired unintentionally in-game. ## Changelog :cl: fix: Changelings no longer have a soul when examined if their brain is missing /:cl: --- code/__DEFINES/traits/declarations.dm | 3 +++ code/_globalvars/traits/_traits.dm | 1 + code/modules/antagonists/changeling/changeling.dm | 2 ++ code/modules/mob/living/carbon/examine.dm | 8 +++++--- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index e6ad1e551e1fa..e648b1e1d99a3 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -977,6 +977,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to a mob with a ckey currently in a temporary body, allowing people to know someone will re-enter the round later. #define TRAIT_MIND_TEMPORARILY_GONE "temporarily_gone" +/// Mobs with this trait will show up as soulless if their brain is missing even if their ghost can reenter the corpse +#define TRAIT_FAKE_SOULLESS "fake_soulless" + /// Similar trait given to temporary bodies inhabited by players #define TRAIT_TEMPORARY_BODY "temporary_body" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index e4e4d07f5b4a6..f08f2efde853e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -334,6 +334,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MIND_READER" = TRAIT_MIND_READER, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, + "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS, "TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER, "TRAIT_MOB_CAN_DIG" = TRAIT_MOB_CAN_DIG, "TRAIT_MOB_EATER" = TRAIT_MOB_EATER, diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a7cecf1f134e2..a999b13cff6a4 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -143,6 +143,7 @@ RegisterSignal(living_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_fullhealed)) RegisterSignal(living_mob, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) RegisterSignals(living_mob, list(COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON), PROC_REF(on_click_sting)) + ADD_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT) if(living_mob.hud_used) var/datum/hud/hud_used = living_mob.hud_used @@ -201,6 +202,7 @@ var/mob/living/living_mob = mob_override || owner.current handle_clown_mutation(living_mob, removing = FALSE) UnregisterSignal(living_mob, list(COMSIG_MOB_LOGIN, COMSIG_LIVING_LIFE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON)) + REMOVE_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT) if(living_mob.hud_used) var/datum/hud/hud_used = living_mob.hud_used diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index e4d4114655d60..ef57e0aaa90e2 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -323,10 +323,12 @@ var/obj/item/organ/brain = get_organ_by_type(/obj/item/organ/internal/brain) if(brain && HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE)) return span_deadsay("[t_He] [t_is] limp and unresponsive; but [t_his] soul might yet come back...") - if(brain && (client || HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) || (ghost?.can_reenter_corpse && ghost?.client))) + var/client_like = client || HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) + var/valid_ghost = ghost?.can_reenter_corpse && ghost?.client + var/valid_soul = brain || !HAS_TRAIT(src, TRAIT_FAKE_SOULLESS) + if((brain && client_like) || (valid_ghost && valid_soul)) return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life...") - else - return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...") + return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...") /// Returns a list of "damtype" => damage description based off of which bodypart description is most common /mob/living/carbon/proc/get_majority_bodypart_damage_desc() From b6847a64dd2a27cc58212c5b3fd2dfaf18c05e39 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 08:54:57 +0000 Subject: [PATCH 03/64] Automatic changelog for PR #87450 [ci skip] --- html/changelogs/AutoChangeLog-pr-87450.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87450.yml diff --git a/html/changelogs/AutoChangeLog-pr-87450.yml b/html/changelogs/AutoChangeLog-pr-87450.yml new file mode 100644 index 0000000000000..e993748e7e393 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87450.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Changelings no longer have a soul when examined if their brain is missing" \ No newline at end of file From 93bb49479f34033a93475de66ff4e821e66e2d3d Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:05:22 +0300 Subject: [PATCH 04/64] you can now die (#87490) ## About The Pull Request closes https://github.com/tgstation/tgstation/issues/87479 ## Changelog :cl: grungussuss fix: it is now possible to succumb without speaking /:cl: --- code/_onclick/hud/alert.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index fe09d95c9c60a..749e630d1e74f 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -486,7 +486,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince", encode = FALSE) // saycode already handles sanitization if(isnull(last_whisper)) - if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) + if(HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) return if(!CAN_SUCCUMB(living_owner) && !HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) return From 696a1b3e7e9a47c6412c9b5004a743db2c778d85 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:05:42 +0000 Subject: [PATCH 05/64] Automatic changelog for PR #87490 [ci skip] --- html/changelogs/AutoChangeLog-pr-87490.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87490.yml diff --git a/html/changelogs/AutoChangeLog-pr-87490.yml b/html/changelogs/AutoChangeLog-pr-87490.yml new file mode 100644 index 0000000000000..8dfb4fb51bba6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87490.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - bugfix: "it is now possible to succumb without speaking" \ No newline at end of file From a158e03f0f132c0db43e8fca04d43dcda715c171 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:05:55 +0300 Subject: [PATCH 06/64] signers can sign past muzzles (#87488) ## About The Pull Request closes https://github.com/tgstation/tgstation/issues/87472 ## Changelog :cl: grungussuss fix: signers can sign past muzzles /:cl: --- code/datums/elements/muffles_speech.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/elements/muffles_speech.dm b/code/datums/elements/muffles_speech.dm index bbf41e3c4deef..0512d62e33f23 100644 --- a/code/datums/elements/muffles_speech.dm +++ b/code/datums/elements/muffles_speech.dm @@ -32,6 +32,8 @@ /datum/element/muffles_speech/proc/muzzle_talk(datum/source, list/speech_args) SIGNAL_HANDLER + if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) + return var/spoken_message = speech_args[SPEECH_MESSAGE] if(spoken_message) var/list/words = splittext(spoken_message, " ") From d092677a7689c4ff4bae83d2cbba42686fe113a5 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:06:14 +0000 Subject: [PATCH 07/64] Automatic changelog for PR #87488 [ci skip] --- html/changelogs/AutoChangeLog-pr-87488.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87488.yml diff --git a/html/changelogs/AutoChangeLog-pr-87488.yml b/html/changelogs/AutoChangeLog-pr-87488.yml new file mode 100644 index 0000000000000..b329970b77133 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87488.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - bugfix: "signers can sign past muzzles" \ No newline at end of file From ef6ea6734862c9cbd38718bc2d1997a879be5470 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:07:08 -0300 Subject: [PATCH 08/64] [NO GBP] adds big pointer to chipped quirk (#87486) ## About The Pull Request adds the big pointer chip that lets you recolor your large pointer to the chipped quirk ## Why It's Good For The Game i forgot to add this, whoops if you are worried about spam. the 2 cost chip that literally makes every message you say be spoken like a musical has really shocked me in how little it has been used so far. so that is not a concern ## Changelog :cl: add: adds big pointer to chipped quirk /:cl: --- code/_globalvars/lists/quirks.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index c052f761b03bf..296f1d79f8eb6 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -120,5 +120,6 @@ GLOBAL_LIST_INIT(quirk_chipped_choice, list( "Integrated Intuitive Thinking and Judging" = /obj/item/skillchip/intj, "F0RC3 4DD1CT10N" = /obj/item/skillchip/drunken_brawler, "\"Space Station 13: The Musical\"" = /obj/item/skillchip/musical, - "Mast-Angl-Er skillchip" = /obj/item/skillchip/master_angler, + "Mast-Angl-Er" = /obj/item/skillchip/master_angler, + "Kommand" = /obj/item/skillchip/big_pointer, )) From 49046d1e922b05681560981f2b83b4e5378eec2e Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:07:27 +0000 Subject: [PATCH 09/64] Automatic changelog for PR #87486 [ci skip] --- html/changelogs/AutoChangeLog-pr-87486.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87486.yml diff --git a/html/changelogs/AutoChangeLog-pr-87486.yml b/html/changelogs/AutoChangeLog-pr-87486.yml new file mode 100644 index 0000000000000..7c770edce590b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87486.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - rscadd: "adds big pointer to chipped quirk" \ No newline at end of file From e297fba5bb536d95c9738ef45aa78f0cd07d4827 Mon Sep 17 00:00:00 2001 From: Time-Green <7501474+Time-Green@users.noreply.github.com> Date: Sun, 27 Oct 2024 15:07:32 +0100 Subject: [PATCH 10/64] Fixes random bodies not having correct gender names (#87477) Anyone not male would be given a male or female name? Looks like a weird bugsie poopsie :cl: fix: Randomly generated female bodies/humans no longer have a 50% to get a male name /:cl: --- code/modules/language/_language.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/language/_language.dm b/code/modules/language/_language.dm index 6a00610c0adf2..595b591a0dd90 100644 --- a/code/modules/language/_language.dm +++ b/code/modules/language/_language.dm @@ -85,7 +85,7 @@ syllable_max = default_name_syllable_max, force_use_syllables = FALSE, ) - if(gender != MALE) + if(gender != MALE && gender != FEMALE) gender = pick(MALE, FEMALE) if(!length(syllables) || always_use_default_namelist) return default_name(gender) From 3ee2d4d619a1fe8a01439b3cbcbabd3bfc0b7951 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:07:51 +0000 Subject: [PATCH 11/64] Automatic changelog for PR #87477 [ci skip] --- html/changelogs/AutoChangeLog-pr-87477.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87477.yml diff --git a/html/changelogs/AutoChangeLog-pr-87477.yml b/html/changelogs/AutoChangeLog-pr-87477.yml new file mode 100644 index 0000000000000..5569ec0a49cde --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87477.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "Randomly generated female bodies/humans no longer have a 50% to get a male name" \ No newline at end of file From 8583e7d2cccab689a10a0f15009d96b03ad1e31c Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:08:50 +0300 Subject: [PATCH 12/64] Bag handling and equip sounds (#87480) ## About The Pull Request completes https://github.com/orgs/tgstation/projects/19?pane=issue&itemId=84412218 https://github.com/user-attachments/assets/a4f432f2-39d5-4401-9e73-3cb1c44435a0 ## Why It's Good For The Game I think it sounds good ## Changelog :cl: grungussuss sound: bags now have handling and equip sounds /:cl: --- code/game/objects/items/storage/backpack.dm | 6 ++++++ .../living/carbon/human/species_types/snail.dm | 3 +++ sound/items/equip/backpack_equip.ogg | Bin 0 -> 11451 bytes sound/items/handling/backpack/attribution.txt | 2 ++ .../items/handling/backpack/backpack_drop1.ogg | Bin 0 -> 11561 bytes .../handling/backpack/backpack_pickup1.ogg | Bin 0 -> 8792 bytes 6 files changed, 11 insertions(+) create mode 100644 sound/items/equip/backpack_equip.ogg create mode 100644 sound/items/handling/backpack/attribution.txt create mode 100644 sound/items/handling/backpack/backpack_drop1.ogg create mode 100644 sound/items/handling/backpack/backpack_pickup1.ogg diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 52c4d13def241..1de9b7731ff55 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -23,6 +23,10 @@ resistance_flags = NONE max_integrity = 300 storage_type = /datum/storage/backpack + pickup_sound = 'sound/items/handling/backpack/backpack_pickup1.ogg' + drop_sound = 'sound/items/handling/backpack/backpack_drop1.ogg' + equip_sound = 'sound/items/equip/backpack_equip.ogg' + sound_vary = TRUE /obj/item/storage/backpack/Initialize(mapload) . = ..() @@ -59,6 +63,8 @@ item_flags = NO_MAT_REDEMPTION armor_type = /datum/armor/backpack_holding storage_type = /datum/storage/bag_of_holding + pickup_sound = null + drop_sound = null /datum/armor/backpack_holding fire = 60 diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 741e40bed6b33..a1142923ddc6b 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -113,6 +113,9 @@ armor_type = /datum/armor/backpack_snail max_integrity = 200 resistance_flags = FIRE_PROOF | ACID_PROOF + drop_sound = null + pickup_sound = null + equip_sound = null /datum/armor/backpack_snail melee = 40 diff --git a/sound/items/equip/backpack_equip.ogg b/sound/items/equip/backpack_equip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d04dfca2af272da4e0f8996d7c41e1d1b8ae2919 GIT binary patch literal 11451 zcmaia1z40%*Y~}2yQH+Fu#_|`iV{*w$AW-JcPS|;NGK_>goNbM-QC?GEubPLsidO# z-QfRupXYnO?|R?4X6KrF&dfP;&iS3W&+M+cwY4^Y0sK=`sQz{c;yT_z7$F|cE@rl_ zS3{78CI3wEgj{zTAnI2u|EpZByrM8B`q4ul{`tSkAm(32!XW*T?Nb{*br)+U2U|1U zYxYb^OoIG^{QP44!c3f6mKN^jwocYea!ww$F3wJlmQHT4DthpacLcAb=A; zI%h-4ZVYZs%@OUA3Aa@f&u797*Zc^_?>f0{?vz)PXYVuyW5*-b#|A(HNhvaiP-tB> zX0Mq;slnzIy~_Y|ewqsbS3%}W0>J^MAQi#w+;}yK?Shb2@j5FnEkp120fW}(gg49~_44lTg|EUrw#gdfKOi_1~Uv$89*O|7#ju5%o&;u)?Y zx}E|$7wc*_K&EX<-v3jr^b;-r_bO#Gzy(Nww(NgK-~WtFPK&MIg$MWA!UF*4QzM_xg7wc1n7I8(GP;w(BhqT5z%v%oO4y315I&d zk^i{_UgHH+ggMMT52qQ8>B39qxhFr`eS9F4+BQr0sIDN?69 z!*o(P8Vi$CuRZ86MzaR`5;pXZKKX#e*eIt@JZTOC;St*B5X0$z7gLD?ESDv+aJZh z8vF0?kplf@I#1n~{*uWr8pn)+IgdG>(d`XMe5SwvESE7VS{_jtq@hK_fp&X&tvM3_ z1VgV;{IBL3%70Ou8yC(s#92KeILvd^lyr|t>{N6^Wr+kp6!VCHD2}S#c;{LMSF}gh z&Khu|QCbKX`fo&mPGz!)k;b994wBGhmmyd_7#08NxI?yaQijR@sN>)0HObh)Iw{Dj zEhLH5LF#!p>Lq;#LAveXtenijE~Mq18zST59A z8rJ*i*ZmVPf5T>V&iy|k=PE>4;L&S}aajM3oJ`K>&*IUnN^xxZaksq^t;13Z-@e-} z%qIA6kz*5{pB$e5I(+kWG-p_%ZCFZCW46Ok*-q2{TK_9@6kOQA3Pz5c3)_E0PKN-! zEEr8yJgP^3b(EY04eBO$^FJK`039(z%Gc+JrWWsvmdK12FH%SHe~uWCIwPz)Eeskq z0RU(KfE9FdFf`mHM#f3<5uU&X8+H~PC##1#I3FrR1Se*3i;?D#Y>0z*6CHij;-q}2 z5){QQ7R^N5mG@X_T^tWQ_OJj=00Rf{GsIZ8p4sw_rIirJIqEbcHv8$4+svheg$>org$mv8?WUb@4 zu;qdda+wM_Q)jtE<*%3MzAB`u4?fOy$O{DuW%4kgw)Wgx(^PS;YNR{K= z_R@Mv?K}=(yK}d{mci>@W<_!`kq}#tev{& zloR3izX7oUxxxndkW>~kH%5Rs1i)e5q|kImR4yQ(32=}{U8J7&~- zu0AH6Xr+O)crt_y3^k>Nn}yau*k_?;wd^bN-ka?)6P%pUMjkQ9AoxD+(l-JGRcG_#FI8b2B^MzFD)< zE8$#~32~tCjYWeWGI7g2-i1_ zC%WLN6MzXw1>jp|UL7GM{c7!j~C=a}>I$$iQI85otX3+A%l`);kNw zV@FddbMf}-+QVR=7QA5IaUHfes$snl0%Co9;2{{reN5oFgF}O+4w|6Or7(xGps7K> zpef8j+fuud$Z*k^k4baFf;A9aun;Ihi5(4Qx&-uKKIbrjdPEOy=tb*Vu3JCBy-8*7nS6VYKg;yFfE2zv4LcyxEC)t1-0CvF*?OvZF>_7}I zAVr-6%7t4)%|_r`^uplDNFPkX)t44TB7;W>ZUcN*jljVMDgzS0d@m~qY|yBwD}okc zn+Y6)q1~NAi#TKKO#W__}B*$;G6VU zO`2=;zY~*x_wfHeN)&>57O5`yw(g^*!~2_+%adI{nmhcHq$mG<{EwXd-`V^B)HAd% z1tIsJ4ItG{fD8P=rPEaqhtU%9TLg1s*Qy@UG z;#p`yZgtn>$7^3RgUPncwY9G<23nvmGOy6W{15@6>Ix&w!Jr%djs?g3*BDe{^DneO zKyCh=htiO_h8A8HI0jsT>OA{C5mR2Fkcj?@(G-hy+b@ zMYx9Qbq}BU%3Rlzng6c6$^}7)VqTrXtXph3Lo5!$pSmzLYz7cO01*H@o44D6%?>d2 zrUfS|2gkTT&G<;Q!r=;)mWnjJ)H5gnG=;X7{Z^V;q^5ehIYOYj1f`4MjD0!fQc~+N z0$wed@Bn@&vrwQEgo1hi6cmgF12QW*CIlX1VSOPJBp@Q_4|bih#RQNQaAyi;!eV~i3!#V!2qJfS{+U?4p%Y(14o&j+ zCJX@>0U(Z;iG?Kv9!>J*MhrBTG>$Bu90kG`06szjZU6yn*sou|wu;W_Uc+R2Xc3&- z^976jntavZ;r+d;U|skB-jq9J|B|n6%2#6iSCV7s#l%GSzU^&%*jPK>(RDX;RUM#}0?;aeJ;xO%b1V>A8Mlr_fmlD-s}r911S$}0AQ zYR?C-XM1zUUT{vJhtfTUTDF)x**^o|>b5r1HkY8Yp8eh){Z-J?2a@4~67+A!!4$Vx z6Pxoe3P;}RI%k&XZ2@X%P9AxG6&=N@Q^y>b@;D$r>iL#DJ}i-)A+%4svErGR@pi8p zqcN0m$#UFbl;@}Sh_+ohKuh%@z-z#05}xAs+^dN7!rpZ>8`Gqu$5~e8XKYBxllLY1 zPpKrFrq!i!w3mzva*uKO_KAmXr@~U%ruP+vpYQ^oRj5}86<^OEZs&utbm*>CHW zsEPThH!=o8nyHgc5=k$*W@6kN1J|<3e{M<25h-6pG4Vw`BG#qRF;{FrAXEt}%_b7KN9e)Y6xiFu6mGG%9 zqiQK1>(J#(f17OKh#5ZLVwaRDnrK~rGr6p_zexXN*=jFFW5uNk%`>qe zy+OZ#u+840$Rk(r4Q{6X!H%`Ej)7;~HT3=KD{bKNJYEh%5Fl=7wtlf2C<3t!;m&_2itLoJ|H+?|;TaG2l{4+{&dRFY6VUoN9!vVm5v~4A zop}d=Z|{PtlJq9AOXYqB5pt}fw5LVQq5bZ%rLt8!Psibb+EJ@*ugM;|R`P9!==9{7 zs(0ptVW*sw7`&`}uOp7V082U;mfy27zJoJ+RPVs}LSl@ZNMkQT_$QYZS ztz~(*{KO=T@v*2hX|jhYZMmOQB=oWSVozeHHp~5zj8#Z3?eqq=E;7&}%%dU~c-_peO2Vk2 z!+o^~t7^F%d+hu2i@`_xVUig!2E;Z)+<3klb?QT>``gM&Kofx_+U3doPTQnZ=xrf)ba|2?*Mk-b zjvbn2nY0VF3?fAV2J{`7U6aZiXLoOtAOyK?4XwZAaVR;;vBHR6is0VoRK26q6qKG& zvVNBEBdp*s99E9>4kn7Mk6d7|oCvL{jW8vW${!G7Z5{ul@n^Pd>BeXBjneekgUgi6 z+fjo=Ba{2FGji)?m7BGg=QBcBJF=&r6+>Ozz6BBf@yaIMH()3lw)I;Nw!^%Sf2@Vk z0d$mV2)Bx4I&wS4$HbIs$(_d+d%bDgCe(i0cxUq~`>G%8KpQS#&&A%{W)oRGb~HZ< zIc#AwsMu)k-xbcO%1LyLoyud4+L@|-i&&KWhJE)n?76(I+zlrF_OTboo)}#TAeWVJ`G(|c`p3gNw89ViN*r7hvE0lvD1P-d!?2$(Z4WNfInafM z2`*?-6i}{54ZR7rq;%ha`MR*G4Hex+&aRvR3bHV~JAJ)=qmd;~lc-abbQgEgvO@Yr z`Z?`G&1Ov`^j&$}U$YWtL_jTH2Ie>bQ%hN|Yyt#SC5+_+dxr40=~nZdjM$G1FBdM? z1!u|`FDjhJTzT(b`e>fMDy$OJURLWq?j;l2P{EJgKP>;O)c<0`PK`@tHC~aXa^&lw z1lMTbqnOj1{G+c%lTVtPo)0N|iNRhwnFvbY@B7xDaB;7nb$Zfi^_H2}95*)Niv-ne zA|#2^-nD+5_2@cpab+~@dhM@wvrAm}^v`Pa;LJoT2o;qnjfF7(lFDB zb>zuOeGHv#%DYuC)0uAhLiTp5cndAt)&kU02qsSNMAmr0lr-D8kQvK%Xierr^p-MUA0S46kG9C z+;)DDVf=G*^Un0I%^5_?yvuJMR|Q&mA$oth!M9GUm4~zBv#`*aF4l;nRNKA0-M(Z< zE?-r39t%;8E}x3$c!_UF9!Un9*A1irC*{NtQJ8V>u)G>`=#V?Qvb6HeB|tQc^j592 z>o2WZOU&KsP4E>HYFNKZKANe4#iFBb!Ei{{u=V^VOF5Cd+ULkb>{b2-L1y&XvN52| z$`GMuu;RAED!-`XY){M08NT9&#Na2;?SQu8)zje(8z@tAn9FdEBTuAEHS!AO{$;VoVHi#E4Izn=jon|k%m+e;xigG3B!3nO-& z4%)H@7{n5yduicb91;)%(x!@u3pnA_+ubVfK*ig?MCW!eaCo*J+d=L1Ufo7*x#$qTLJbaPZ8V8) zU?uIXY@5-Gk~s20CF^EO0c=JhiSF$(-j}CPK|nvW$D|)mL)VZA_xXrC2eEF6+3$D> zoYH_+Na-K`N;q^^$|8=|^pXuig?Gt`lE(yYcYL#&B28BLg^;9**0Il z?He?*723^e^n$?We%2lzSwh z`*~KT@j-8Jk^w=(*5+8rjO`M>vP}P-&$_o=t#yrLiOu%*rYl`9*E9;5g(0H#YXLZd z9X0`a?L#l#8{W9%D#hFRMsf~Wvxvt{)^+4OYbDm^dgDx;+ksN$4N0?6eNS8X$h#*| zKL?i{xetagcn=~`s^Qf2G2QYX{Cj#`2XHW_NnMwq#75PJMRBVSpUB>Gtjc5BZ}%O1 zj`FIOv{N{VY5TQr^da)n#m%p+@3>IIs5SLO(nyOZ+JIrU!p$bRt7o8WqbP;Zr~G7D zYvsYbK6*}Fi6VHrEG%fsVpQaeF5=D!?;^2uM@DxD-srg41g0HtHJ&w5u|?{$yd1~Th_OBLvW zNa6rw6{`9eIQed#-Lt|P==E{IQm^#=QgaKq$hU*)7uJ~sQFygDhDT|Vhdc2XKfa?l3JB^4PHhCuKg>+wu1#%Y2}L7nN~N@%|ORaX-OMn<6j*!6won90>j$hQ;T;;2jy0Pp(;Q=eacM)GD}W zkJD$Wm>P^Oc}V@9l;k#0^V>~jMIYmkJ<=;RfNt4pp5w z#Zin`lAGBQu1U~)M_AtZ)d8XU_#ZO)TTk7+mo_bFox2PIo|W8R5bBC>C7bYHE%x~R zZO_Am^(JMw{e7Tq^uU`orIIAFVv5REN!Rm3B1Usf8;Q>>uQFm!`FB|42cqD3 zvb-w9@7jkClgZ_GJ!3;}|F~HouUH~q@5zed!x}M+I}DCtz;c^v`!n=NRJLs3FoCGW z-?=R(VeC&$t7lgKB(t+?XH?iIu@?@NjOWBJ-v9-tH_A1iu;fyCgsfEf44un^ttq~@ zBAe?{>CNVwtJJyph1)lse824Do3ih_TE4bd4XazdZ!A!_LqykTL3UuxSCq~a=+Rxj zhweI1m&OGA`(;&L0yuz^Qw^MF4q}ef;|mWzDhd!1g-dS9XdI=x+uk_%{rmTPeX8V{ z!6WNDx{b17w`G4@d~6L0%~iWWq1q^y_=M1%-X;C<2)>>?THOYT>V8cMHOX;=9O7`I`L&IK>(pZc#{&0zyVOUl?ml&^Si%N%;R+eslOc|XV4?y6_>6wX zYz4Ey3KekuwFj29&%eL+zy!OReX`4J+q)Y-U|jrn#l-LMfj|A<5r<3sAwK7U@k)wG zh>Puhfq=yyH&-nnCsWa?!RbaVt%*Z%3+F@hJG1T3@;l>N&RR##qbrpys}KD5hB;Cn zyw39J^!8t!Z88WM+E?^1zBqw)RBV~z#CuqGt_0?j7H>9vR{QzmJjQZuk|8h7-P1q8 zD8Z+ve9K{FweJ7(duX*(BQ+;RgkK!APx1MjEhrZg}G%cu`RJZi36K%Oc7YlW{or#VA ze0Oy#Hno?sT4eI)?OE=NuWcc0bBN_xZf#@_6YU?8HS)zBF7`8RY9M_I`|)*)6W^5b9_XM zzNa0>ly$2rMiRq5WKC>ZtijK^H68K}-%2OZ+iSSvPZUjlLcQ_&EQ}!ep?R##alq7C!K>F$db)%kg8!-a zVTG$}O5tH?v7d4TmDnh$lGOa;{-kNoM|vswcRw0dN=tjweRQrlq09aCj*eB5E@}$^Ul4%#6d^Ev_Jl!JD!UyeiyB3q$H(00+~!MVVjv3bH)(%+&Cv zwY2>pZ95~n?XoA25^;EoEJy-94OqeicS+p|3Zy;(R%!T;!|$uXg|dTZtM7|9d)wA6 zyafXfUEad& z(0IaG78u#)a(3S&M4h?Mh}Utdr9A*o?_jnzFUe zSzi4>jM2gO99eGcey0FKX9Yk+D_6KzVn{W>kUlb<4v)Mcwo$`>u>DLNVO(LEN z0m|48*kzVmlMcX2yLAI9&80NwGi>`BLr<%WhKxz|G(P#x(g)$+Y(m1kb%LEps0Y2j z7a?fqh?i{5wNXzYqg~9g1bCIh$USN6h9P9ptn_l-lPm1$~M%?Fb_c7Ta~DLc4-O*DmE z^#`h#RuY5*CU_Z~*(YRWZE)f``X-B)DNZe~viL~S`guq+HkM&M01+Z97U%eO-~~sZ zTP`EczM;Z>t%ZnH<58}VX0j8%jh*{@g*l%V_eQg$ZX+{NT&%X?MU4?30eX*0n;W4< zpIRr%W$mh<#~GqdSTX~R{VOxz?Yi!$_qEt~_5?Lw)An}Vk9KW^v~a(wy`^8K0KlWG zIY^`spD49?T#q5V!7XC;MzuS|=CmpSe#tj_dA`Y9yGix=S#i&YHI@Pc@1H*J7!Ix7 zU#wsNi)XA595XE9n6|W*g#0$`;S$GLoWN&Or-*0^q$1X6pwe{y+grxZ1;Z~J!?C9g@C zG|>9QNzgqg;5JO4rO7C@_FcdnnLH+je#jlEsdW?v|8Ukn9%%LX4W}q|Eb-^}CkmY23v)lYbDS1t*-c0ME|lswQiRj*i5%fR6h zlHIy_y8+iPv2DCpXJ`*f#kAG05_1o8B>2|1!#AfL8*Wc490`uzGtwJ0e0r0#rGLBV z_<7P%a5mkCn>D_rF#;Y8xOTB@by2EH?eYW-M7>>p*s0__HAAdQ{7WQ{RR@y@@;PLv z3Va0NdE_KVTeuWFx24!waNV5SBHul$p49?9wfNkyqrJRPvkXir%x*^ zN@X>V{pI&PEOGvrd-Z;7AGP$)`|2v>;v(^^Ba}2F@4A~mHEqPI5q?YLB6six1E?Ww z?ZE+_zH`BO9L{eG?K6G*hv%c?zK#2hGF&}IRw+;H1N?!8rpGwHh~@B0=<(f-I0BUY zN}skylC*4UGCVnGnVu+lP;A@~635+2>SXerQO^$(I7Zs$-1Ag*JbY>C_XIGbfIu6Z zl|*|~sE%ewdG&s`maAMAN~wQ&_oTg`)pqHJ>k4CgSP$kHRpFm@0)Xf~3>y_08==lF z-FL4unRuG*V?-g372&nWtTp&@g9hWGNJS?y;d87NwX0CLA||l= z8z|b<$%0%GbJ7LvERPTjM!r5#g*@k`tUJnH-Yb4!L%!43vc5B57((ZsGrbyo+c9d5 z>;&`pM-5g}j}U#{i5W0Z)fvA|A5OFsVYNXjM8fA$I{T+L6(@;yy=y_2Flg_BRQrel zUgY`VF5rC@BojbtLOD_NNpkLKbAnT?cQl+Sv-tZ`!9yAOHN5u0)OLpz{!-*ig4gF*L2XurP87m@>mJsTMPBQ&02k&&*Z5=z9 z|NU}YLx3l_w#g3_gD#FVUruyr8HRhe6a~DFJTDqFtU_Qh)^`U7%womoJ^CnrPJ5#u zMHinpyINk^(|MvZX!eC@tKbK^ye$R8;ZHu8Kf4Ne#`B_Q{q5*YE|@oiKUc%I6xa{- zC{^{(3s}xS8}@2^SHKVt4bPa8fz&Fx4_z@ z0IBtTSNPKbRWw)U4U(tXwfq$5Ec8b07vz^LmF0Lr_Mm{z{qMbR*B9!#vyMtuB%kZA zj{hVG_@pYXe@v9Dzn5!PM*4x4NjUv2Ga;7ZE3AOHzC zBd!H&!Su%%0RRmE+~t8&#oKAXao9|OM@iV5=c5*}&?IbV3$t~Ec?+(w><=$|D2ms3V&PBM#G_N0K(}@mag&mghRV^}=~cC`||f&_D_|xq_hR z^Uf-SE0`JVUb1<#bLFLZkO}5zydaZkhXrU!tmee)$gSpQN6D=Tl=mxXZMJ}iP(~(~20RzvXM8sl4qeODfJ_Medn!s}>BvfNBEju~3co(60Av zJp(+t+rs+vQUj8z28P;3;N@*`+sAgy$9v4j&m<|xtlH0{I>>B1$l@UA9&_+N?YH0D z!Fjt-9R>k1xRD79@T|+MS>KRZ_<_O2c!15hNnoULm*H{Q8o72(rH-kU4n>u&U1h>u zWfT`nK<5&ip9aWqOv(L!nw?34?f>2s9NGl|1<;ml?rd%DJgR7(HV+inMC{u`oC>E9iQ5;#Z^xCr&dD9tJ zF={G=!=h1e+~0@-oeHywQ6yry2$J9=k4|_V7#08NxSu?IwCn@_(fWR|>C^FoZ9qcA zK=PWAq0wz0SCd5Vsj480aqqb?zqzqUOQzue4y^x*8~_ZOz>Ao~T1AMrr3L6Hk^Xh? zzaqyS+7`>!5zC`l#-lwb+_R0)-9Ze{tLh`P4Hzs27`%rVZ4IO?hNNtVjBH1IY$qyh z&8qxND*p+XzhN^s=KUX$a~>j>kx>gb;|Ts8IT->`-(;h>HR5e1SmlT#461E%?B@mk67@AU8ljYJ`x?cOgw*QJ8bq^k}fsv!?!Sf%H(;&{K z3`SF#u=dVh9j^_52K7>9`cDS{Ktl|L=0zUSM~jT0rAE*qMuyk^=ZFERBM9vw1Zdb- z0KftO+@O;KX~H~Wl-#ZvlZY?z5N0BYGMkwL^JpX~kd&9bViftWRmUN}Q0&a31sGJc z0wQ^3qF|Iwx#k*+vLs;IBLMUP03+Tm-puULtI?66(ko7yj%`Qs_Lr=94xbDSb7efb!Z8=2_Oc42d)bT51<2Hh#X$c9EC z^U@4@ktFPao#I640W@$Nn?WzUjV-WSaWO5RUr_)6U=0xPrzC)|Q3YuDf%ykKeenoQ zD6b~HY9G{gj9z=}6`}_rrEh4|MQ=1>Xf(yBZB)stO|PxJYiLBTYQ$hPl%Q=?;o66= zoiH?-VKf@4w4Gw~zn$PcC#h`$-j0G)@390w%TZU0q<>gxLoZlK8;w;;>3bRJ8`+u| z8kzXmnj9G29`(}%sRr5;3`RzkMiYCkMhSjjy^Jhw+fE!9nK1gBjRk$(_xs9x&UtLa z8>HSFwY^v6JtyFp;^>r>Uzj3LSXfY4=~`G?VwSa1m{r(WW?xuZ+*$UvsMKX0q?YCv zmI)UY3Kx|X9~TO*SLPSimUNcAOD!#0ulzy&MR>jTL1AfWQQ5{hwYFrv)qTBI>}f8% zE4OH^wxG7wZN1jLyV8{{yKt>uu&e1^XW5VSTG4WEE`1~K8LY*^ZBP$aOW)UK2SH`7 zS3j2=cY+KCe1=UR7!ZrqcN!r7;QCoL>VEi76ua})Yfyso5g~dY|p17@NhEG)PDV`Lua5-Pyw>S$SMxyBGPJVrd8ohV@iH;s*;LZ&Q2w*pm1IsvnJ|&1*5Z@ z_!2A1vE*EMK?|c<6e!%lSt@tb>6~EZdTlht6IC)gjE)2e)~tOH!1q`We#(4@k4_n0$bgzaZjYl_9kW{G~$zR~1r38l?bt{taR`ep_@Rm^| z2``ROQ&6PkmNOg5{R5^_)vT)|d@E(BC|Am%@rdJQ(I> zC?QB2sD&%go0g3bCRhL0BnE<+PKIgyg&>w zpun6B%0=4KSal;;*brc5WDBGcY)uQGQX*jhj{!cbx{+W~Pq@a{?N* z3IpfhIInX87EJ~Kf)Buo=$*ce=Zn}3FlXWckIr)@3Q3%aRfD&}uyJTm9H>%(2L))m zmRsiptmy^}gocZh4-E*bR#RnENsF;_DHm?ks#t0a1aZYuiZco%IQP^5z%(H-@DBfy zsx&_{sUX7ULJ15EG-HH#Fw`ncd^t^-1m2Pa);PJ$=cNbukUg(IB0vIo+X@np%WUUe znrGC%3zL73NdG@d6o7RW?Je+W-O7B4oDZmS&1P%w` z14cB~6qW3WMho)d63$b{uqjFeP#~(#F~SuHy5a9!V9bBb(a0_Tg%${? z<-hB&dP*12BFO~j;OrpC1TIFr;E42Z0e1n$KsvCL!-Aau&SB|585iXp7JZIL&@|_S z3#eX#3xpAHg|tARF_-{)w};;-b*mdms}m-;~eAjQzyc$_hzKNeW9}Mas%7{1Co^l$H_|5xXug zC3i*iiVRX7c}5~AD|hvbd-Y#ckQ2ZCqC|#Gif{0{xdY#NWNOL#!|+&ZPBBC&LXq;w@U& zD(~|J>A4KAosOC>6ntofc^yadvn#*YI~H(u_>5@x+jH44N+6B&S}Q$zqpOwuAr1)gk}uC&nHeEiC6XKVvu1)O zUWY)PExOt>l~~ec>y-X{Y%es};S^8QIgSI<`w0nQ;3R<3F`F94M9{u)t?_;<%f`w3 z-gIo&YHnuAS+IJV?=UQnIB+QH*_Ep#r!?IXYsX+QvO&m8SuE*A8dbhOMr5uX$LBD6 zi{iy-&`{#Qutddf)S~X_!|CI(N1@~g)^RLbbIeB?SSPMT2!)(2FgVQ?Qv4pE!M}8R z(%{-lP-ehML=o2k^(QWS@+v>BmY&VAiP|N`=afB}&o577QH}**O&n6d2LSo|k6(99 zvhCb$RfEZEIC+_pAkD-?s1V&8C#t@^+Gl5CvQ~(m#do&VuDv*?qMoiM%@h4;dhyje z*+(IC&8y>5cuS_YEhri`dSA;tBX*T1Of;<#Aknu_Eo#}djylxiAB=HMnLUgk8ncge zdvrzmooV*h7VPm+v5S3}y4?QT!EEL9tocG&$CN-bNrBZtg2QQk)syd+I?Bkm_H1P) zCFgxzq`cj#H&rjJHfTXdkAREMy615&V?kpqpn%W4ARYd39rYQRqWo zmh6n6vjVB~C|?dL2tte@IFpX9QlG7{FMnAo(tvpNMZ_d$1j)Brnk#X3$2GNg$mFs6 z^v|-B8Sw?*J4q;$<-ukfTA1hVC<3GT=7Z$71|)L#&PCiw5?10;9I5eJHbNp zNddys)B3aIr+(pA*N7CPX z(x!njpV$(Wv!XOw7^0cX=K>#!{#uL0oDIJFqk;d?f@t?d#oorsVLnMlJwT;@q!#C>jSp}x+!W;|*hrICq*^a!nc zKO5^io}4@u5~sja_6-fN=h+=^&7l<*nFe!i40KHb!>jKEDq<6xagDWmxsY}px=4d2 zjBV0Sn;c3zGh1#K4fy6Q2j+Q}x(ty6=9lVWS0KS4W%;NYOolTeGAcJsr z>!$FR7ndAqzrGdrd~oLZCcIpKFPUp5K{eY>3JG~c8LfiHbGe29&8Y_SJJtmFa>{*b z8uy~!v4}OAp%V%F6R`D4iI3nS~x8vzea5chHVuOaCZ(m{X?n z(s&}#W5s99n8LO6)lX>EHFW|<{QYf!fCzlZj^wciP{LT1-T+m)Rq_m|tTcaHtrr%X zQ7-CH%ksd+8)6n>QS;%X@O!{8gLkrv(X14wqJB6!eFyQ& zpGjxLZQQz={kGY}z^~B8x@FEJ5wE{gFu6t403eXQHj&WuY-BAB`D8O-0AWA zBR;flg~APJNcK>e2)FIjs3$1O`^Jb~9^QIjw#b$>yYCj{4e;=t=&%Zp*b%1%ZvQAXChoB+xZb=!_+*IIf*KHJgbUr%(xUiX0(|>r z%GVV%|LoE28aHptvKk8qnJH-EZH1E)LeiH6_3S0kw%<}UeXp4G?z}kuNJ=56O3owI z>1^EmxVx&SU35m+RG)hVp693Iz^q_@a_lc(KoD()ym7{6ZN*Abou_#EY;DXLj~by zGGK#ikBvZ}Aw7&_-s!G$-HEpuyg$SmYa#CTXz*;jF=BL@ZJ0Yf^xHOMgGIk1qE}Ce zk9-|R1iR|6_;Os-NisQ7M$$2vqafvzjCIGJ%XiHz-PMs3&qTxiD-_&%97sFDKS-(d z=iwHaF?f55hQ0($60Te0fqA1&y^^H&;KSopA34nR(_^OCBTq{tPeS|NQ|XQJP%@bN zhyZ`sSKA|0XDV&qZ4oNGS+VP9NMp*YyNoYxU%a#_xwVxU@zHb1Saiyv{hsz)U%qpKKyv}gp9q9E#XoJlZ&6Xl-=JLB99m}zbeDkgsNIe!99fcoXxNDq zKe%GDgzNvq_`@F%p*Rte@3D8`vNz{zZxU7<>GN!T=yXZ>!5boaGmo>HIqH~D3}2;9 z92H97^YVvAzlbTZPNhS4$8r4csr?EI=Y76PhDel_u6vil?`nbOs1eDHWl=5*IkV&3PhZE z8HUZRmuEj|d-#n0*2e=z)p;3QHhtc|Ea< znC~HyOVhGz<3SV$!r#R%;^jDPRUcTyk#-OtFJGdEE<<{3h$?GZ9>9_rv?OPB*PMNd%gq$AP;m zO7rOOn0!~cD=!PLMD(SHcQ8}h$#?E!>(a(~NYn43JDj4#D)K2)+gWgF1g=H(kPxVK z;K2Y-3Ahic6LRYp@^-9qHyT^5U}8Fp*C5RYN(yiAGcf%C=5Q8VOP-YUp@)^GewS%v zo90>l=jhI8xq)5t*xf_>g^BlC7IanoA6LcsN6~Onv8DSsZF0`VwYH9NVS`5XHbrv# ztO@=i6(dprgZC*CLAa2cN!`VyZY|Lof@kUwLB-%RwxoOT@n&Se?6Z0aQM^c^_QDU6 z^ZtYtOzrPQ^ozO;VaD7a9=Q#96PXS87#i7b8960)<6^qhZf8d%W}A?uBVJx-e;NJE z5*cf4P$h2?&7CmiZcuDz;9+`mUjUeBeIYDN2y~(i%539BEsF>dSs&DWugsuluGd6X zytN*k9>m@I-+*6_tUq6a* z;RDz0&F>YrcLvh>f4AN_Ik0>6<7D@Vi|*Z;vNz8(Py2|Eh4QqlCwbIhYUymp+rn=Y zX-O5Vaupf<_iQ}1Q?+vQ;@ywdrUFJOB`tT_j;{6*B3kEj$X0L8k-o#%Q6}F|n5yt7 zzy8%WQr=t&Yf!gwtQ5c3bO)2XZL0Ote-e|DpC_~p=c=6Iw6LgVe|#UtWGTnn5^G+? zqPv96-;;N%G9CnS3wL9DS$DGUW&N~e_`LF>p~;y?IHkRBkhoafJfi8@ld~rW5l!hr zd>Jur`?7rZdrJ7Ux4k&9MIL<;$((Xn6O1^%N-AB**KE)tV! zDDv{v&0JUlyD(uvkfmEMFL!W`5?G| z=igsGz}Hk@eXlS<@QRqw6;Ux+`Cq3Za`M;3C1kE6e_s(67Dh-d!vztt^NT|K{360v zuE@yB6TOQ2NE=-jx;AJSO)v`_jg4guJPa1_7ZQ1}8y)!OkMoZN7-8^w{bG%i1HCX2 zKG3jXR;yr6L)|a-S%y-Dus)WiUFuZ`w=Z=`nkRVc?h^#KIYBe9O= z1;x&OtuzIm&eu1e)_R2Iu=ROH&plOm(3%S6ue4;LxM~T70nno)ywapt-O1iM%4R8A z>hS~iB73^UrwMHw=ozHvRfUnw8!DSN<~r`ZnCHYBo3NLBZqj)0r&Cuk8?ZvH#`5cz z>3;X3isy6Kgj4xF(K3y{fO(Uo6TW=bbM zWP$Ebwn<|1I(S6J(U0&Qw}w7nb6}X3aDlYrE=lvlR{&W-M%&u0R&ztY8H)8=>M}kYh8@?}3E# zbWV9vMzXK+=g%_~j_b+G2fNNTAS8J`1d;{9Ka4QV&OWJaOtnER$;0R-#_a=`raNu( zgH-nK8JiQ*MOhdRMbJJt`Rsxbx^Migit3YOEdLIEn$}A)0vPuV+=KM-5eywFyN@4+%9&E=Q_ESA(v+Iw=- zvK>!Ehpj&liJ=-?)i3X#ZmV?uNx^eh@bDxPkt?g?a9W~y79(1TMOLL z*z>e#vOk`Zu&dSA_Y;Wp?iX^jxo%5+x=qaRq{FvAPD1!y7cZ)UAVM$jlQYs^kudN1 zteskrGmu5Y5{bUn$c*~j-Z=#4H+TvJ8$B@8J$vk`K$s+*Pg0-xB+1uZI#{f5yZBwv zxOoHJNB@}~9LnVdUfSla8rKK(cE3wN+b@#nxuf4YrY@Fqe4J-3Ss$qT507H4C`03y zu74>mCIg1|c=$97b7%yVe>;8=&Uk(=Qck0SQ0-ji0u8TbvO8DCDLo7LeQEA21}1330UxPe;|~T z5s}YyYw&5>n!P1lc`1Kb1^=iaZHT@e`eNX%5HNg5mUD~XGhOCGC5KLy5CSTfZ?bi? z$&ZQOFCIYy(4O@akNWRPIXQ-|ATiw$b!G&B*Q!tZyqy<{#$$#YBKXBV<>(2T0Qtei z>7Hk}>%-R;JdSFoU6K-e0U7f-dUup|2>lpm61VV#Sy{@}p9gUp-zLH^=WCGdzp{4u z-sQf(`+FX@I{kJvW6!QCYIc7#dWzLQf9)IRVF|v-wh>>o`OsB<04Nvt6J!=DEDK#2 zGS(B1_UE4RRcaPpPN}X5Dn}NFaw`9L{x)!#Q=ljD4z~lp#xkyIyX@n45h9?hmAhPx zxKFV~_|6-5tosvK`<+cevDjjZ4rJ3d+S3OT;yMRkZm1MaMS4v(TbA(W?fAQ%C3o}W z-G<-X8+ki6`KxGxj|xb8#o;DDofsERW-wGv=efr3uobcCZ6>UB%X}evwcQx+rtdB^ zbLGDBQ2nwG$-<>2-yXAq=+yC3Ric!4-QbGd;p+w5{C2B=b{gC%q7q9u+593 zcQ$dFK^r+vQAuQ~(9fF2Jr&sNQDLQJ6W!4Rx;F&~Ur2r{>k+`K=Kj9FJgUhXPAFA- zHEIxE1Nn1FNikeEm-b3!8R2>g;I;RMIfE>qcQL&RPaOqJZmScJo;4R}a`zYt8uCMj)9cqU7W`(qRotIfN zqkb;eAlOv_E9FSdpG4Q$F=UQIH*(N1;RVN&nPbwB zP~I>$YR+E|DsHS(8Z2Syk&KGW-P2Sbozo)2 zTdzEndYm#%>;2>T15q)JT7o~#1xKq|45cSq1%$i{Hu=jIpBGLx@DXnCf!0yk!3KRDap=(!<%Z%SSYjVm`I!<`(kU>XPcCBR5^c zZxO}T=%z3~RmskrWJ4cfIko1j`AY`I=AllH`{b$5Zc%SCiX`hdAlQm3LRB0%Xt*+g zttX1UPZBPjws0)zBOiW!J>B{G66>}!t(PrcM!$Yd$|c0x8%(R5KoV&u!mUXTb&bB% z;{7zG+yoyJ^b#NY^tNXg!LO8#Mlz|7G85E%x1ZEJD?SZZzS8N#a8~x2uWwXiiseq* z$CeS!!YrZWif(z)Y>F9?QfUv8&Bu3zQP!EgZuY93&WT~SB&io)jDky$HdV#~ zn|Iv^fBEkh*RwRqb0&>sDyh29y-&YeFtD!-uigG){5ElJz!PS?w#KwfsTpto)OX|U zz%7h|p4ZM!yUv@_NOFfD)u!X?J$?qmtiN{OGp)3wz7%S^YqUBv3on8SZp$;{JzlZc z_Gp=%gKYe=s+IaKp`$T8M+u{po4u}YP6n^Mqfc7pXg=PqZD;={avVNxzgOCnG5x9mswBxBrSwg?f!(Ifh4k7$Rm;r2^c(V>AV z-`wYf93I>N2&4Z_2ahEYXGE4Cr z0g&QFF~Rrli3%lJ22z)rm4j)j2m7v~;vUM3EbIclOa&sf!w;#S^ON!C9cZls&4&Vx z_$HMk6gN;A#l3$Xwur@AO*2$^A3b*QjC46!Yt?Eqzy%lRNy|S=&hOgoGn$#0?0SPI zf9Q}-%xIwm(b>FeNa1y3&SG3bN3=}D&{07M9R#EZDhNoV zNtNDv6A)=4BHszT_ulur-}n6g=h^HtXJ>b2XXZD1W}|0sZvc=2e?Pelr-ZoL&C}a?XBCL`$V55n%H+W*BK4oF1(_c^Mv5Liw3NRN}4hU~Tc0oCICjmHg~j*;T>H9wlm#%09F< za=^&C^aI4=k!KfbDdX>s^281}xECb|n+;3}N)#WC$W8G8MV*=j2LeDd0rh80n&nI# z<(yx7`SgAW>oZFAN~jtb>R`dg+rrq#cF4zj$j8q#CDi<_pXu9B^Wjj7{m?tCVSl%u zepCCzc49i51jxLAN}5Bw;$?p|i+V*C5>`wK*brR;r;O)C#Aj>f+BuavrdK-@Rl9an z2zOM_oJ;|OOHSMkkm;C~`~NgM(`{iW z>HUonhUo&e1u5w#5p?Ndn*(EsXisg)OzlbY?9!x3!=F;V4Cxdl1%2Qc+foJ{f$a`B z&#^C!qF}@XTx;5swwPbb1X2;Wbb+c`!&7;G!=k`4qpJ}$1Fnb|O?R%Pv;e6Cn~aSw zl*F!hEgy%tUzgUPB6HhKr0=L&wx`a$*DCO3@Y3vP7%U(k|bd%9_@%cFf0BUxbJ-3^jy9FXx&?!`V9PF>lGI< zkdVU~VvT)VO_ROHYCWh_v zS5*I%IS!F|DUo^MkxSvRf)PoM5ov|BuUy(o*XsV)_V3J5_uvB?m^rE*eE-Otk4R2s zFqZN+_p8)`Xk8w0wC+CPhMq~gZHGmPp8p{3883S?$Bz5{FLB}Qn z02=^Y0D~L?i}Z+7a+5QGA{Y72WT7BgpIAfkU=lPaT3)X>MFF|D@u+5+?P-i4vx;_b z4F8o_IBiqzP0a-vD0u9V1Ns0EfNVv6V)f|KY|B*XLQ+1*wW0*@34NLfkt9|L1b;4r z^;|}FpJrPQj#Vr2c@BehLN*l>8zorEiGsV8jj>V#io?u+{uJj5<0yhFC^bEHk!0Ne5fy+AV22 zVu+n!!46d0jrX>ohS>!MPZHIQ4HUsxer zSSVanQG8e^yjGoGSXa_sQI=j>v{t=I-7LITcdxLtw5Z}6ky}@?MsQ!N6MK}4=*TTv ztt+Ujb6cx(@2qy^%r0E57wTv#Yp>W`tGit3&7+U?p1@hm8H0AX-n#$7d_T0p^=d=O zVLK?G?x4S$K}E=M!d=dHVw@IZ(jen`MG3W^b?ZK5xAPdm{ZMvp&pZ1y z4dv&jAT~&d*kEi|$l|#~8X!XgKzNpz3}8Yna4#5U6`o^=gz$LkqFXp|H_%QzxUWJ4 zxM8ejYeoVC+5v&+l>Fw4(^F&&;WS@YO7u-Wn#plw;GS zNr|r{GC)yFnK^VyXnYQn7Fxup69jU0pQ1)V4ugSaK@}(ppTnYsMpiSKyCDZT!4)|S z=9&lslYy%UA?*SI4vK0cDnHS&kb(n6r3S~N(ItuTn9hs@qNw0lv?iiD9<2@T3XLug z#hAGu2Qx4(QsAyYQSoRO5rUbyc9l2GjQV6(B~?bwP9+3TIX|9N3te8t;_QZ8WJf!e z5S16Su$ae!$_<>QatED=40Bhx!8A{F$>3K^49Ku{{VM-H7pc9kX2nDuTHqJL^J(p_5qRnZ zkO2w-l(w0~BZQc?is6_pO-GnVCrXG?sS_no;GwOAKwvu+q5M@{CL08uTrz zC!LZIn{}6>AR^=jS_lyeLu>Nm!Ah5k6RhW4dT=J3;D%1mk=ry@G{`Wxm!Y^2eTX(% zpdb+RXo)un1$;}VnNvySumZFsbWmK2AB2Kk$)^;vO91c<+|aj^bA%s=qW~0Gvq8Nm zdze)xYME0KJQ+Dd=!6Iv!E{PcW^fzex2h8bb}%K70oHq2!C;5S^${5u^a>mtL*TuL z3>=0E0EF&=6;YYKjc3raOz_Mk1$>ETCK^SNg;PTi;JA1Us17u#z=H<#U5gQsfiwFC z2ch92Z+i3cxyx-U$3!6IeN*r&YNc!^x|)%il$M%IWJrYWDwB@Bb5J?py*w?w=i?&_G22 z98+)@smmbPsfCF)!sx(4uQ>(WF@!5546&RO0){6`8I2O;2T_7Rfban`8fS)1^~7L= z`0+`^qvNX?S_G6$!H*xrIDuMZq4>(LL{-Cz8VLNLS(FHva%k|?Dq1QG15Rlfwkk&E z^kKmKWVJ2^6UfXN+`6*}qH548x(f6^ctQ+XMM({sQ3KO%_kaM6GWW2=oHtFq(egB0ay0e1q%5C*W6!-0}d$8Zdwj+62Zhan;obPbVl0@V|Wl85N7lgT`% zYl*cW2vIWPDSTm>FT0)BMRKNz?1n=t8VH~P0QX_1HN;>myd@(fNh>7I17;;kkBLO7 zm)mNvwXhE0ka#8ojPr7aRkXg|b89rRxfo}J7JL@e=TThc(+OTJ;ZQ&f#v>7^K*Ge@ z3MvXAM*x{+AA68D$;sy##HnbgK8JYrIg$aekXD*!;U+W;jD>-(tYiU`o3~pj0%&4l zDx;{E#Xp|0825&Uz{z>STS%DV0)iRc9?a6}y=|nFRmIbt-h@d2ZUBgJpfWH==E#Il;75W35i}7MO?ZhCA}&nDso9k zSXz8__WQ!{&d*E*b>~sdoW_o5vheA~y)NA+-`%6WHS{d!q^dpk(906_Zlie@(OHMp zF3N%&M;k*l-`h{cu4Vh%ja2258uCj?MXKsjqXo7X-}|C!mgyF?^XI8(y z8KD*BLDGpswbL2=#0jca-8>t}9O)y>TcxzW#QKvQ2m+VLGBv-!)j19?{ zF88>-Q@*Dl%D_Atubl5DR%RqDbw8EA>-A5YdP>{@pX=w_8>FI{cjd*as1IM8Gj?7YpMKXM80! z{QX^mRGgj+*F|bFJ12KX zd*=D&IRMsCzWt^lfF@8_afQ!8^gdj0X$qF;BJT%ESIj z?PP+<1`W0Vz{Eg1uf$p^r z0!}6=%0W@$(HUN?B2`7Ez+;<6`qqFX;dPg_j@I3j1-&W~mjWjXuCd|PS$cDg%UQUL zTA{Nf2YB9#bv@hSfF!p_mJ*)g{I8E?8zc%8IWG4}ERM~Zz4$F7j(!UijV5nhM!Ju} z$J<-kK1xGMDlU->yF>J8xF()U0%p)0OC<>o0M_v0+Fke5wt_OIo+}Wew@S{ucf3Es zNIES@n>24_PUbFelK957Nmx?SzSj#@@^F5A`>PYYhIO_vsy-<4uC~I)J(A8IEUG3(KE3EhmnU+DwWu&sbwQbs zT%T@Q1F^NUxrV#{r)8sGqT}__*2gek!Tr%khi^@TrKGD%k|sE0Q8u17iKg_L$VkzZ z*G@+L=8xq@KY#RA)Q1XvWj7vjl&D-*j21A|6nsp|RHOS~wX;iLddnRer7%pkvAvVDPat!hEpNaqULJkE~s0HQbx1X4%}$Yx=m6IYH}Ic6ZZSeE7X{jFT|+~AVY^l@Tz@w!TooEU-Wi>4M>9k8HnsDh z9dr(|k7`t`EV2ugl;EUxljq&NIw2;kmhnN74d~MSR&V}dA#&;b{?HK13*Uj+JnqTV zDOn6#9EqX1e|3~iQ4F2^GyBUvn}>TtxA<4qr(ST<@cnto_W33>HK*8La$vGXk1T`# zn(wE*z8wD@Nw?T*&b8wOlO|^7MQzLyjQ&Y3UCZUFK{?AS`xEJ;8$m$+O$PW9aUme#hv@hxJ!qvbBgn==uOoUanQr9);%*ImFaHHCQt)VNf-) z$#3#}LTeuOJBgohQy&$M>iP~n$Mu^hanT^Ej6cqO5(Qkb@@BpnHZai}DgNp?+hM88ZJ=XfI)g4p1K#VlmCL-=8i9=%I^Nyej%ieV_qEGRTUJ0 zZ$Cf0nSMjekCqmg=ZbL96lfk)8vKF_ZYSlnEVEL``M>E-y&ffpzigu-rmmpi79 z_dVRE0+^(ko3IYgoNm`MiecvczePb6Oq0X+iiWaL&JFE!wYwj@DXtQ(SdefkWp{}? z;k=T{4wfL%^bw^gRuJ)mRgCnxqoHD0B6G9!Q!WNUecey$q{8AN-z5rH2H84?Nbezb z>hjsN(06aa#@`wgz7rB4i}=|#4=a)w`*S=?@*9PG6~CTf+xqi9W0~5!t0?ZoG#XEB z>Rpx3EBk+rBPORQ%@PKU7w1spB2$M?6MqWr$pU<8^rSdLDTTgHJxoCUnnAX&cHiws z@-^OmJ^eP54{9UQ%a}%L=ZoI2-AVuWu-)d+aCMyuh|k9*1}Tt=e}C`Wmd9&#e{Gmt z%;+G3lUEBWkFMEL@mM?8RpLf7VI$3w^jPc1ne|d%gOTwgGWYgBZ*6ngxJF_j zf5QJ#otduwa^L;4?Lzu-d-eC0xtZ)U&Jt*%b z*y6~?RNpuC>R#=H=Pkzg9JrRyd9O-=Lk1!DU6={f{`mD`*0iGX6}=H#;~W<{e_ zb&D_Sgfp9ZfpL0AXpV-E|8>P6-IBQ&}Y zA{c_aPj;`M(!7DexH!ct;g5FBSCfXaXYH;cWXbO;6SU$i2G{|ni~6MuoMgWa&M2tN zhU}s+EfJlOObyj%TI@qu)-zHze<-%#D*JDVHFVupVPpOni3d@M*vP<*SSEF*7V$MoAarjRVr=Qn5a?kt6p^fWTI zR04J_y5IJ^DtU)V##Lj^e3iX9!0*9i+_rF}yR*SzeAD*$!+Psj z%*{V~QUkBjn)eEf_sZxvg-FOOkYS><*CQb94&_k@fqZtQqw*&CvZ*H-So;euNr{b- z{b%1$Ki)SeS^ROujO*7BqbguUUas_Ujna0jb35$~3p>@QT|CamCBsAim$ctxW$wq1 zuI!>>vg<=<_ouoik4G5N|E$+`j%_<@F%0M}luF#9HMy4>+_bl|Q;b4b->A>$s_VTq z5OYvoHfzpTPE+FG<(-eRedL@iHQu!nYN@O_0c(8M#aw8y{+u*^RSSP@BBtzf;*4TJ zY&6?UkD!dOfl2U7tI?EP4VP(4`(Y$=h#&G;}me-hQN+<^vxBlE5@4u`nKY7&vFDZb%dmZ(& zf=rJuZOp5UIXHkdxn;erieNFXFL$?Rr01bJ!$4CJ_CD2<{ChahT|-l6p<5DECacGH zi*=QtpSY>4q%Qmw`jLWhK-*9ettHagirSo=u#ny9-s@5GUcy(Bzf1U}q{c488d~M^ z&^TxF(#sTz=QP(>w3GsL&cTBW|Ehk#6;N($CaOb7=~t7TeNx%*l=jiENA=?&(J#|O zOV`WFeN$xO>?ox>Fva!4!8Pr@s!g>>Vc%=AyMs*#y3N?PgB%5Jsq?${oR+C;ydF;uCgQ z=NFzFu4lBxB${Fo(Gb0{2K|89{9QaBd8|85uc-=2TeMwp+ zn^VAxS~WzSU;T5@cI{P_MN|*9%~z#^BD?BESR)=6M4u<3ho4(_6{zV3>JPSigR6{b zNX5p_niE2FZfjq;kgo&QR zs$eFSE>GfZUTJ7X`m3E4+ju$g@3?D83)7s`--W6_nD#NZoX<=p0rJoG4wM$h>wArn z3xw6n@Epx~uM*NTxcy1%ml-dT{MB~56{c$++WaD#B<9h7yVr1C1ccG6$(B*@Urs8MpfFPm(sDi%TMi4v?7L42Zz<)OGpZAvw zs7b)wNP4Y3cmKk}dMNu()g2l?try&peCJR84I#g-{GWeA$UxG+)6S7}W%~N^B|~M6 zjukIfyO;VAh-zWtkB#cLm)hp#pWec|Cflr5HQLX4>9V}% zUte1duCmIT59`W){X*#s)VOAz@u$z*Jd3n96Av3xoHpYiLxtAf%3IcR52nOOlD$Vw zcULMaMi-t&<=v)uFJ5&gWbx{{{Z?9OJbT8&{c-*sDW#A|b4z0z->s_7Z&PY-FTJ<` zpFyw*0%X3NkHsdLnwWl4Xa&ZbH9nMzxCQ7Qrbu0r%M0NBfOz-)(^HIxP`(A5rSP-7 zi_vXBZCV=p*%y!92s!pgTpmT7%mBBV;b^q>VeeFE_|ePf-poa0(fk6;RV*GF5+eRw zlhOx2svg_rCM5i6pIkfUJo>%c>uB-e=Ms8Qpr6OMG5M^q%znzW_ljr*f9`8t$-{5I z{&>7hn|i0@76UXzuo Date: Sun, 27 Oct 2024 14:09:14 +0000 Subject: [PATCH 13/64] Automatic changelog for PR #87480 [ci skip] --- html/changelogs/AutoChangeLog-pr-87480.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87480.yml diff --git a/html/changelogs/AutoChangeLog-pr-87480.yml b/html/changelogs/AutoChangeLog-pr-87480.yml new file mode 100644 index 0000000000000..1ad7c1c67f4f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87480.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "bags now have handling and equip sounds" \ No newline at end of file From a0fbeaf4697a1c960cf7a309ee95e170feb24e1e Mon Sep 17 00:00:00 2001 From: DATA <44149906+DATA-xPUNGED@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:14:48 -0300 Subject: [PATCH 14/64] Gives the parrot in the bitrunning domain the pirate faction (#87492) ## About The Pull Request While I was testing #87481 i noticed that the pirates next to the bird were killing it before the domain even had a chance to load, this stops that from happening ## Why It's Good For The Game bird murder is bad ## Changelog :cl: fix: The parrot from the Corsair Cove will no longer be immediatelly shanked by the pirates upon loading of the domain. /:cl: --- _maps/virtual_domains/pirates.dmm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index 31b4c359ba6ae..6d429572c7b47 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -610,7 +610,8 @@ "HO" = ( /obj/structure/table/wood, /mob/living/basic/parrot{ - name = "pepper" + name = "pepper"; + faction = list("pirate") }, /turf/open/floor/carpet/blue, /area/virtual_domain) From c8a6fc88f80e419ffc15c42f2d620b3f3f2938fc Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Mon, 28 Oct 2024 01:15:11 +1100 Subject: [PATCH 15/64] Fixes a runtime on eye removal (#87475) ## About The Pull Request Fixes https://github.com/tgstation/tgstation/issues/87474 ## Why It's Good For The Game Being unable to remove eyes if there is scarring is bad. ## Changelog :cl: fix: Fixes a runtime when trying to remove someones scarred eyes. Now you can remove them! /:cl: --- code/modules/surgery/organs/internal/eyes/_eyes.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index eba862bca8a18..99647f4b40548 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -285,9 +285,9 @@ /obj/item/organ/internal/eyes/on_mob_remove(mob/living/carbon/eye_owner) . = ..() if (scarring) - owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR) - owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR) - owner.cure_blind(EYE_SCARRING_TRAIT) + eye_owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR) + eye_owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR) + eye_owner.cure_blind(EYE_SCARRING_TRAIT) #undef OFFSET_X #undef OFFSET_Y From 0bc7d7d5e8b0d9f8d3d68b563e9447047d18f23d Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:15:27 +0000 Subject: [PATCH 16/64] Automatic changelog for PR #87492 [ci skip] --- html/changelogs/AutoChangeLog-pr-87492.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87492.yml diff --git a/html/changelogs/AutoChangeLog-pr-87492.yml b/html/changelogs/AutoChangeLog-pr-87492.yml new file mode 100644 index 0000000000000..2e0a5664cd320 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87492.yml @@ -0,0 +1,4 @@ +author: "DATA-xPUNGED" +delete-after: True +changes: + - bugfix: "The parrot from the Corsair Cove will no longer be immediatelly shanked by the pirates upon loading of the domain." \ No newline at end of file From 1da153e0aeac86d7430d74c2ca0301d37d0d83c6 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:15:31 +0000 Subject: [PATCH 17/64] Automatic changelog for PR #87475 [ci skip] --- html/changelogs/AutoChangeLog-pr-87475.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87475.yml diff --git a/html/changelogs/AutoChangeLog-pr-87475.yml b/html/changelogs/AutoChangeLog-pr-87475.yml new file mode 100644 index 0000000000000..d94efdd28d97f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87475.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Fixes a runtime when trying to remove someones scarred eyes. Now you can remove them!" \ No newline at end of file From 0a2a13658ffea5113436801f5827d25623b2c7c0 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:20:58 +0300 Subject: [PATCH 18/64] shoes handling and equip sounds (#87483) ## About The Pull Request completes https://github.com/orgs/tgstation/projects/19/views/1?filterQuery=shoes&pane=issue&itemId=84410941 https://github.com/user-attachments/assets/1fb3fc62-06ce-4930-a709-830d00c79eb7 ## Why It's Good For The Game sounds are good I think ## Changelog :cl: grungussuss sound: shoes have handling and equip sounds /:cl: --- code/modules/clothing/shoes/_shoes.dm | 4 ++++ code/modules/mod/mod_clothes.dm | 1 + sound/items/equip/attribution.txt | 2 ++ sound/items/equip/sneakers_equip1.ogg | Bin 0 -> 9268 bytes sound/items/handling/shoes/attribution.txt | 2 ++ sound/items/handling/shoes/sneakers_drop1.ogg | Bin 0 -> 9639 bytes sound/items/handling/shoes/sneakers_pickup1.ogg | Bin 0 -> 8636 bytes 7 files changed, 9 insertions(+) create mode 100644 sound/items/equip/attribution.txt create mode 100644 sound/items/equip/sneakers_equip1.ogg create mode 100644 sound/items/handling/shoes/attribution.txt create mode 100644 sound/items/handling/shoes/sneakers_drop1.ogg create mode 100644 sound/items/handling/shoes/sneakers_pickup1.ogg diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 53ab86b07718e..3ecec813a95ce 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -4,6 +4,10 @@ lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' desc = "Comfortable-looking shoes." + pickup_sound = 'sound/items/handling/shoes/sneakers_pickup1.ogg' + drop_sound = 'sound/items/handling/shoes/sneakers_drop1.ogg' + equip_sound = 'sound/items/equip/sneakers_equip1.ogg' + sound_vary = TRUE gender = PLURAL //Carn: for grammarically correct text-parsing body_parts_covered = FEET diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 2eac9105c0a46..29377c66c6da4 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -59,3 +59,4 @@ cold_protection = FEET|LEGS item_flags = IGNORE_DIGITIGRADE | IMMUTABLE_SLOW can_be_tied = FALSE + equip_sound = null diff --git a/sound/items/equip/attribution.txt b/sound/items/equip/attribution.txt new file mode 100644 index 0000000000000..d0380ef39345b --- /dev/null +++ b/sound/items/equip/attribution.txt @@ -0,0 +1,2 @@ +sneakers equip1 made by sadboysuss +license: CC-BY-SA 3.0 diff --git a/sound/items/equip/sneakers_equip1.ogg b/sound/items/equip/sneakers_equip1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a9ca5bed9a8caba1494ad902be565f99c9da5c15 GIT binary patch literal 9268 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 Q;O^%uc7y!MH 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 literal 0 HcmV?d00001 From 5bed47cb25e391d2989d9a86dde579062063c39b Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:21:23 +0000 Subject: [PATCH 19/64] Automatic changelog for PR #87483 [ci skip] --- html/changelogs/AutoChangeLog-pr-87483.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87483.yml diff --git a/html/changelogs/AutoChangeLog-pr-87483.yml b/html/changelogs/AutoChangeLog-pr-87483.yml new file mode 100644 index 0000000000000..2f40bef080a61 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87483.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "shoes have handling and equip sounds" \ No newline at end of file From a633cde1ef13c689ca9932abc1a0a60c081e3846 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sun, 27 Oct 2024 19:36:04 +0200 Subject: [PATCH 20/64] [NO GBP] Fixes deathsquad commandos not getting their berets (#87494) ## About The Pull Request Outfit was directly assigning the attached hat and i forgor to remove the var which is how it compiled in the first place ## Changelog :cl: fix: Fixed deathsquad commandos not getting their berets /:cl: --- code/datums/components/hat_stabilizer.dm | 10 +++++++++- code/modules/clothing/outfits/ert.dm | 9 +++++---- code/modules/mod/modules/modules_general.dm | 2 -- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/code/datums/components/hat_stabilizer.dm b/code/datums/components/hat_stabilizer.dm index 5bc875fc1be32..7a4033c3b2baf 100644 --- a/code/datums/components/hat_stabilizer.dm +++ b/code/datums/components/hat_stabilizer.dm @@ -77,9 +77,16 @@ if(!user.transferItemToLoc(hat, parent, force = FALSE, silent = TRUE)) return + + attach_hat(hat, user) + +/datum/component/hat_stabilizer/proc/attach_hat(obj/item/clothing/hat, mob/user) + var/atom/movable/movable_parent = parent attached_hat = hat RegisterSignal(hat, COMSIG_MOVABLE_MOVED, PROC_REF(remove_hat)) - movable_parent.balloon_alert(user, "hat attached, right-click to remove") + + if (!isnull(user)) + movable_parent.balloon_alert(user, "hat attached, right-click to remove") if (!istype(parent, /obj/item/clothing)) movable_parent.update_appearance() @@ -92,6 +99,7 @@ apparel.flags_cover |= attached_hat.flags_cover apparel.visor_flags_cover |= attached_hat.visor_flags_cover apparel.update_appearance() + if (ismob(apparel.loc)) var/mob/wearer = apparel.loc wearer.update_clothing(wearer.get_slot_by_item(apparel)) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 62893c78344df..39f0ec16178a1 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -477,10 +477,11 @@ var/obj/item/mod/control/mod = squaddie.back if(!istype(mod)) return - var/obj/item/mod/module/hat_stabilizer/hat_holder = locate() in mod.modules - var/obj/item/clothing/head/helmet/space/beret/beret = new(hat_holder) - hat_holder.attached_hat = beret - squaddie.update_clothing(mod.slot_flags) + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + var/obj/item/clothing/head/helmet/space/beret/beret = new(helmet) + var/datum/component/hat_stabilizer/component = helmet.GetComponent(/datum/component/hat_stabilizer) + component.attach_hat(beret) + squaddie.update_clothing(helmet.slot_flags) /datum/outfit/centcom/ert/marine name = "Marine Commander" diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 4ebd0c177acaf..72de7a22b49bb 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -694,8 +694,6 @@ required_slots = list(ITEM_SLOT_HEAD) /*Intentionally left inheriting 0 complexity and removable = TRUE; even though it comes inbuilt into the Magnate/Corporate MODS and spawns in maints, I like the idea of stealing them*/ - /// Currently "stored" hat. No armor or function will be inherited, only the icon and cover flags. - var/obj/item/clothing/head/attached_hat /// Original cover flags for the MOD helmet, before a hat is placed var/former_flags var/former_visor_flags From cd3fc8a67fade3d4b02f277d3aa2a38644cb97c1 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:36:27 +0000 Subject: [PATCH 21/64] Automatic changelog for PR #87494 [ci skip] --- html/changelogs/AutoChangeLog-pr-87494.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87494.yml diff --git a/html/changelogs/AutoChangeLog-pr-87494.yml b/html/changelogs/AutoChangeLog-pr-87494.yml new file mode 100644 index 0000000000000..3c8e4c2e52120 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87494.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed deathsquad commandos not getting their berets" \ No newline at end of file From 7247928ec4d39aadae2bf26386ff2fe00602d9b3 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Mon, 28 Oct 2024 00:01:45 +0200 Subject: [PATCH 22/64] MODules don't create visual overlays when their required part isn't deployed (#87452) ## About The Pull Request #86825 allowed MODsuits to only have a few of their parts deployed but didn't change MODule overlay code, resulting in modules like welding visor showing up even if you only have your gloves active. ## Why It's Good For The Game Glitchy visuals begone. ## Changelog :cl: fix: MODules don't create visual overlays when their required part isn't deployed /:cl: --------- Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com> Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- code/__DEFINES/mod.dm | 4 ++ code/modules/mod/mod_activation.dm | 6 ++- code/modules/mod/mod_control.dm | 24 ++++++++++ code/modules/mod/modules/_module.dm | 46 +++++++++++++++----- code/modules/mod/modules/modules_antag.dm | 9 ++-- code/modules/mod/modules/modules_maint.dm | 5 ++- icons/mob/clothing/modsuit/mod_clothing.dmi | Bin 117020 -> 136036 bytes icons/mob/clothing/modsuit/mod_modules.dmi | Bin 14447 -> 15622 bytes 8 files changed, 74 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 1a4bed1ca9922..dcfcf028d080d 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -57,5 +57,9 @@ /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) +/// Global cache of mod skins to masks per different configuration of pulled out parts. +GLOBAL_LIST_EMPTY(mod_masks) +/// Global cache of mod skins to deployed parts to module icon states +GLOBAL_LIST_EMPTY(mod_module_overlays) /// Global list of all ids associated to a /datum/mod_link instance GLOBAL_LIST_EMPTY(mod_link_ids) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index a9a793d8a2fd5..a8ac247414246 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -226,7 +226,8 @@ part.heat_protection = NONE part.cold_protection = NONE part.alternate_worn_layer = part_datum.unsealed_layer - wearer.update_clothing(part.slot_flags) + generate_suit_mask() + wearer.update_clothing(part.slot_flags | slot_flags) wearer.update_obscured_slots(part.visor_flags_inv) if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals()) wearer.cutoff_internals() @@ -263,8 +264,9 @@ continue module.on_suit_deactivation() update_speed() - update_appearance(UPDATE_ICON_STATE) update_charge_alert() + update_appearance(UPDATE_ICON_STATE) + generate_suit_mask() wearer.update_clothing(slot_flags) /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 21bf8509d6b99..18ecd44c3e7ab 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -475,6 +475,30 @@ wearer.update_spacesuit_hud_icon("0") wearer = null +/obj/item/mod/control/proc/get_sealed_slots(list/parts) + var/covered_slots = NONE + for(var/obj/item/part as anything in parts) + if(!get_part_datum(part).sealed) + parts -= part + continue + covered_slots |= part.slot_flags + return covered_slots + +/obj/item/mod/control/proc/generate_suit_mask() + var/list/parts = get_parts(all = TRUE) + var/covered_slots = get_sealed_slots(parts) + if(GLOB.mod_masks[skin]) + if(GLOB.mod_masks[skin]["[covered_slots]"]) + return GLOB.mod_masks[skin]["[covered_slots]"] + else + GLOB.mod_masks[skin] = list() + var/icon/slot_mask = icon('icons/blanks/32x32.dmi', "nothing") + for(var/obj/item/part as anything in parts) + slot_mask.Blend(icon(part.worn_icon, part.icon_state), ICON_OVERLAY) + slot_mask.Blend("#fff", ICON_ADD) + GLOB.mod_masks[skin]["[covered_slots]"] = slot_mask + return GLOB.mod_masks[skin]["[covered_slots]"] + /obj/item/mod/control/proc/clean_up() if(QDELING(src)) unset_wearer() diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 3055d0616f983..ad0ca106bd1e4 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -45,6 +45,8 @@ var/allow_flags = NONE /// A list of slots required in the suit to work. Formatted like list(x|y, z, ...) where either x or y are required and z is required. var/list/required_slots = list() + /// If TRUE worn overlay will be masked with the suit, preventing any bits from poking out of its controur + var/mask_worn_overlay = FALSE /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) @@ -335,23 +337,47 @@ /// Generates an icon to be used for the suit's worn overlays /obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) . = list() - if(!mod.active) + if(!mod.active || !has_required_parts(mod.mod_parts, need_extended = TRUE)) return - var/used_overlay - if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) - used_overlay = overlay_state_use - else if(overlay_state_active && active) - used_overlay = overlay_state_active - else if(overlay_state_inactive) - used_overlay = overlay_state_inactive - else + var/used_overlay = get_current_overlay_state() + if (!used_overlay) return - var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1) + var/mutable_appearance/module_icon + if(mask_worn_overlay) + module_icon = mutable_appearance(get_module_icon_cache(used_overlay), layer = standing.layer + 0.1) + else + module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1) if(!use_mod_colors) module_icon.appearance_flags |= RESET_COLOR + . += module_icon SEND_SIGNAL(src, COMSIG_MODULE_GENERATE_WORN_OVERLAY, ., standing) +/obj/item/mod/module/proc/get_current_overlay_state() + if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) + return overlay_state_use + if(overlay_state_active && active) + return overlay_state_active + if(overlay_state_inactive) + return overlay_state_inactive + return null + +/obj/item/mod/module/proc/get_module_icon_cache(used_overlay) + var/covered_slots = mod.get_sealed_slots(mod.get_parts(all = TRUE)) + if (GLOB.mod_module_overlays[mod.skin]) + if (GLOB.mod_module_overlays[mod.skin]["[covered_slots]"]) + if (GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay]) + return GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay] + else + GLOB.mod_module_overlays[mod.skin]["[covered_slots]"] = list() + else + GLOB.mod_module_overlays[mod.skin] = list() + GLOB.mod_module_overlays[mod.skin]["[covered_slots]"] = list() + var/icon/mod_mask = icon(mod.generate_suit_mask()) + mod_mask.Blend(icon(overlay_icon_file, used_overlay), ICON_MULTIPLY) + GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay] = mod_mask + return GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay] + /// Updates the signal used by active modules to be activated /obj/item/mod/module/proc/update_signal(value) switch(value) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 8fa2670c76091..281b4239d60d7 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -16,6 +16,7 @@ overlay_state_inactive = "module_armorbooster_off" overlay_state_active = "module_armorbooster_on" use_mod_colors = TRUE + mask_worn_overlay = TRUE /// Whether or not this module removes pressure protection. var/remove_pressure_protection = TRUE /// Speed added to the control unit. @@ -213,6 +214,7 @@ removable = FALSE incompatible_modules = list(/obj/item/mod/module/insignia) overlay_state_inactive = "module_insignia" + mask_worn_overlay = TRUE /obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" @@ -266,6 +268,7 @@ //Bite of 87 Springlock - Equips faster, disguised as DNA lock. /obj/item/mod/module/springlock/bite_of_87 + step_change = 0.1 /obj/item/mod/module/springlock/bite_of_87/Initialize(mapload) . = ..() @@ -276,12 +279,6 @@ complexity = initial(the_dna_lock_behind_the_slaughter.complexity) use_energy_cost = initial(the_dna_lock_behind_the_slaughter.use_energy_cost) -/obj/item/mod/module/springlock/bite_of_87/on_install() - mod.activation_step_time *= 0.1 - -/obj/item/mod/module/springlock/bite_of_87/on_uninstall(deleting = FALSE) - mod.activation_step_time *= 10 - /obj/item/mod/module/springlock/bite_of_87/on_suit_activation() ..() if(check_holidays(APRIL_FOOLS) || prob(1)) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index d2f1ceaef74d3..69a2cbd87b225 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -14,12 +14,13 @@ var/static/list/gas_connections = list( COMSIG_TURF_EXPOSE = PROC_REF(on_wearer_exposed_gas), ) + var/step_change = 0.5 /obj/item/mod/module/springlock/on_install() - mod.activation_step_time *= 0.5 + mod.activation_step_time *= step_change /obj/item/mod/module/springlock/on_uninstall(deleting = FALSE) - mod.activation_step_time *= 2 + mod.activation_step_time /= step_change /obj/item/mod/module/springlock/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed)) diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi index 071db6ba93ca8ee5ac897ad72658a440c5c6fe0c..815983f7094e6dd9bb2aa229860000f2a78fc377 100644 GIT binary patch literal 136036 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 z z^RUevyzYv6IRg)*zUW4$dA=$z$Nvsz4e(T}xB*!kv@K-vzygb|1a2wp2in78F{=-$ zUdRgvkgNWJanqa^#L)(iUzI@WBObj(%11oj9$90TFx1l_*~f#;oS`sSu$fwWHLZ21 zM}>ENc?9aqK}II2t}Tt3$<^$ zO}zI+24#HVTv>vCXn|tckeQjDbeYiJ_>Y^gfC1?gAQ3eGEBN=`Spg6;xxo4Ms^vDk z-b1Hi>zLtt{P?2Yb(KE=lhbIa^FiD@H|SSc(hvQBr{&b%L3Of*r1b|o4j?zES-U2( z#I25Fr@7%V@C>v*Ky-I}RJyp~bx$5V^mut?e4N39C2^NMB-l@2)l8ceO^rFy>_jQE zN{VlnX<6J95JGybsa&0Yd=tC)PTzWHMH%fUDk{ov8+4ahWktf>S@y7P!^XO-&blyCQHqKzo^^M|!EYtB2?F(Bvl z=EYv1perZl)TLnjIq2or#R|CwK&J&5G$5y$yyQZ#qhSp~zty8bxhNC85sPPs}6n1ks0%Ln^`qqdu0CH!|+!{AvCM+<++Gpw1Ca8S$QJ_ z7;M#Z>Io9d%gb7jG*p?i{eSp+?|7>IKXCj?QK>{(StTnOp-{$EDen}rLdLbp%-$|< ziEP;vMabTxj7w%_$Q~CrdtUQi_qylzx_W=U-{0f+$L~HK>D+tIJ?Hg$p68xxQ?)&_ z&f=EYPrw|8?&Md@43caN3=71J2|ZAn+MJk}w|AME)D(f2M0dKg#>Hexs~Fw{<)VNW z=9n&425y3TmTpg-Z4F5V%^hGLs8EMd5#i`~4F@{~Y-5u!;US~l2cX)2u(pRihTAFG z(v<^n4I7Ype(NGTGWw7vb6diOWF_xUw}>Td%5zarQ)@WS!F~GfQ|r3*37ThP=w^OU z>(aKrernntbPfuUEk<2{fzsBs+oMc@M(e9)Ee^7}gRee+t|>WP$Y=AVm3r+|`t{(O zzpL*vg~2Tt;V1hSK>?GS)nIP5gi^!=h(z22rCjDD)!UN)I0Po>&@c87yVBMN2gh6< z_x#v#BN{EPlMdW`KzH7GZE=6t4B6r_60rwmT18-xJ9wwa^|F3c3?$Q(&FwcO#BaXf zzk|1-gA1szdstfK5|CVHZT+-i_nc}@NDBF0(M9>4 z1drI5uzzB*V)qr>U44p4IUS{EbbO+YL2(3DJHr0I{$%ZDLC=w3L}T9pFOWKRZcwUf7zi{#+9!^#5|4JhVch*Z4#yAL`*lY%(+;bH93*3S^UN%gkZ zK*?eIdOo6MBuG#Bo#(4g+q&AdMNlI1>-W6s_ybi-ykzG2kMn5Oazo0y&|H*FBD=?> z8s9WUL@IJ^0_MMYz|~L_oZ~kN6;$weS_tj!wCLqLc)i@(;03r0{rT@AJDY;XzQCT% z1pjxalb|&1Eubpv&kq;;Xh9X;)q`BNTvnMYWS;1h-br>$iv0#CL|(!?Xr(9=M?!yq zh&i0V6MzXm>dUAoc;I`9&+%vxegp=!45q(5CBJe*=g=EehJVe;NWKR6Vpcw}i`2C< zUU^f{U>*T~__WHX1F3rU8F}ppCi_-pgx^5^sH89cjQ!#EC1MFQW;oT(Kd#*2YfP2$ zdMrTFaWFA`X7xwmzDWcafN-HH2|Oo#KS@xbX>s1VQqWN26Kp^EuFXg%)LIVKgALY| z-@mVuvWz+h{EuC_^@hGsp~f}bcSu(w@lVL5#9gz^{wi{PDcEGiqsTBmVF7=se+@|4 zbwH|1xeJ_x*LkqjlFXEVAY2ihF_=fbs6HOCvPLlKMs@6gs=gZULlbhE4FiLH z#{n>rPl1}tiwq2rb#)R^bBptppmcU{%O?ct1y!SNV|-$&xod)kpfE8`V@rV~d*nyY z*Uu6I0YjQm)j0`d;%`T6GYFIF_N5wbjuQ!IOHU3ZhN>(4ArQ+zh3#6q(Tn?SBsdpZ zm;~!3XkMgaAr~ykx36_&Dqmw}GKW^zz++kgnxTlWpi_z`xpE)uW&q?5Qa!o8DAZKR zOU$|l&@a-EHEJ$GHRXj%KbT(OOX?YS=ORBO;FRcJMC%a@PdbrWZHqyLf3@WS5dHa( zFU;Q|uGotW?HBc|^7J2jVm7ZgcF`oDpdGtcfhNF8d~2OkC+#d%YreZ{YSuIh-nx#w za2u~J^R1Xn55?;Kq3NSE*>}8mjaA_>4A?BCk)`TJ*ra{gk6@nUc8jNHD-H9(h%n;t$9M zBC4odi{*fi?rbV=FuL~$o~RAw5pNj7g4~GLx*!*)Zi)(2aynwM`}4wpC%&*GhM;g^ z=64^beIGFJ0pXH47ok$_2Ok>L$vPv#GF5`$1nM1?fOrLreRB3UlP@8>jU1Ht{|n3f z;Uv5MGwcmazUfok+h4fY;zR>e@qT|&-KUY%<@QL62XuhAhM$uYghfj%YG;3xPXMmR z%eI~rz=y@DkZN|}MBNkwhC-cmC%cUJZ{eoM#bRa+h051P$1nd|trB$APm>My6-rTN zJ;vxw)Dewd>Vq%s43ulml2bw8jIX{X3)mgtxMZ{w?wxW;d^iCT5dY?7US>WX9qigw zg?$2(H`C$N$rk`!G;E###r8q-;a5Ug$7I}#wWCX*AeSKp_s-atT=;EEJ$>@o_+?$T z>U?{mbjPHxc9HC%D6G+~u`U+zA2kBA>D&i$i<>EO@vW5(XJY!Lz-{@+;wUC?Eud~( z=!)rnpO{FUzvo-YZn1TokuCSX>N&D6gf2!8Nc@~wOHlox9tGde!cB+gT9yw{+&bXC zdYm!lEuNhwdF-zyMFF=4u&BY0E|FVod@|Uuq2r4NWJU$sQ+S|@eY6J52T(&|@93)h z!skBJ4G1B76IBJ2u#5=W4m71oD$-8SPOrNYB`0TONP6@P0m7je=l?89y1R6I94FWx zQNu3eT=N5+3SJTcl^&NeiUMUSt8HXJu3T~nW3zKDOoD9Tg!03@u0w~oxgCo?2&jAd zQOoDT|YJr6Hwozd9tSQuMl)- zNmZ8)rS-zdor;cMnq=3gyS)HthoK1EaQ85e$=xXcbpojx`L{SS3`aIV0M+aI3;gX! z5r->U`d>AqDB(-K4|9(eskJ1Y-wxG( zVy;tneH>1WWJ@&~7Y&(?++3Hy{n$BvY%vhIns(CdkI}dHUYjmCtF?%!+$7MA1WO3= z)vI?~*iFoC9jTt}UKXK%9sOvCuuFxsy;vjJ1hp-Cj&dLBm#6=YHW0~;y<+spU#M>` z^OF=1mogjD!6g&LHNqp|HXEuGqhWG$=V9cZ?SeF}!?~ziP)u-E)oe$TlR4=+t+c*0 zNa@+7AynNs`Wp%%MUb7E=q&b436APy4nu^?^2T@Fbt!P#2U`OCRS>@#@!r@zQrPq_ z3c3b^^S4>kwKP3lra;8clKbbcp`#ujKZmV^JF_9ZS0{-tx5L z#S>Y9OX*L7K`LUc3|4Nl6Q+(qMb}<{3i8~nn=Ki%aF$wk3_A???#LN!QUZ5dh4&?v z!gBAh#l$H{RoJJb>qK`f4QJd-|BHA4s?_3Mev3tPVyOHa-u$mmi^xg7frJ`yiD};s zKqk=782y6gqQx&pqn1<toFjY;?Q zK;Pi$PE?44k`dExpTpnEn+_D-m11c+_aN!8>mZ|oI_}XcT3k26Zx2+fKQ<+?|FlQH z-|N$DnK>|8rnro%WTJjb`}I@^&uY5({AGduw>caJCf3+?E!K*lDDfPW0#?sEt5wj? zrns5@79F}^aRhX*qTtopDHb~MQ}FaM2B7Rp^sRe_Png+@TP|>BgMSv**S5fpzdAmW z?haLUBgaqh;!!m62P*Z7{j_xk2C-RY2dSO)8k=ed(o*0td~;usRrA!W8&En6xclF7#MEMi@=1GKUA&Ot3nAh?+hG?ymz!Bz}fGkf+2G;o5X9@4$(>qi* z+0Ai(a77{MkyBOdsi{RjCcpMM9uy?&>`w5ER^gFZ=Ne!}jqE73qJptdfDe!Hvu8C( z1M9iu`y~$|=ECU89k)M1*q;*nZ{?teTo2UHo?6wSV%W7=h|||G|J+hcst43mrKYQiIDVl z%Nc5zbN&ocGGFvNrBZd2eh*h)W?|F5>cxU)SQq15SASMYJ33WvVKRas*(&fSUQtbJ zn=0SXF!hu4iyO@KKW0T47h{0t5x24FOBw_Xw1_@^1OzK*2@}$7ee_G4V?1OaEs7fDe9j+m9mJ?MAn{X*^_H3aV30q|6%yN3u* zia1kDnvTY458Jxl^V~F>fbRMbbssSR1h@W&*jsb&NW|n&Y40ebnUnR3>QiqAyJw%v zW6yZc&BKp41})5t#>3Ca#8uLR!x~V5wVKn@0Vcz&=t8TQO@K9pMDpKg+(*Zu_9$UQ zeuIefjfDN_@uYuaj*CJTfSt>mHEn(aK&A}r_%$H5Mox4qcmR2U$Yi8%GPG6vg#&9F z2dJ%$jNj*xJ|h##q95cSK%*b=BXoFZwQ7CZ9!!K66^+fNlec-qAT}VjmD-+gqNLCN zSFcCZ}4x!snu-H?F}2AQ>w(mo#_xyBcM5&#?s8UEh7`|n+_B(I;KOe zS)UuQPj#D8-KX=Lk2Vu#+-*jr7Yb$NGaC2E6JOvk|0Z6Ud8{`%#V6ppuuFyY~ zj&0L|YP+E@k*{5YEkI2v&WeC+H_kqsTb13S@g`+v{LpX2s{Wr`0FaRmGXh-`@Ky}_ z$seGF%zcy8Dt2XMJD5Mw$CRw61#}gkm6unfyXw_p#BI1lvl`trKn)Fw?4E)Z5RPJ# z;=B?IZoSnxAn=Jovk2qEpa!Ys^|pUL^+3@f&lOUmk)^0$&;Yw4Iiy3w1kU=op_2Uo zev2B-!mzr%2mXfDTJ|{MU02TBGDg@&3x`tS`r6>qrkpFAqhdwJvmzD@WBPboZCLloOHy^aa1 zSKV!y8TpDUsu2)=Wy&ciJ5y%&_@0heYccN@To-A)^wTi3V$Cocc)jc|jIgz*MUiH;@u+)5&QULt-D#cNT@X9~lg)hEv1-Pm2X3r1r;&^^Qi?u0BRqbd55&YJrAiL1{+L4>A$K z9IX1;+`gZzuTGbt?q;NOdaYga*-3D?@G4UY`v*}Ovt6uIp_~@M`f%bSWW_3{S4p?G zSVV$u!*Dxq{A8Rg+P{)ieUIKMtygJy9(LnPKm3!rgiG#S%pZnby}Z(-BkAaVubcvA zGg8E|w;9Dp8gcmgTkh^nTFg7uxHIZyu-zP?R5rv7l%coCqO+9G5+(6f7jG8Sv_mRp zDz_QVJ!hOdHkSU-FkZ61=lSDpxHQ2TNBHbEkB3I`hHBug+fcDq{-vpNTuRqhkq1}P z4lx+mr}R49{XWsPY5YCm`m)Q2BZTBlq4&kmR3PjJp`N*Z$Op#0Svj%I8&S$X^t@Ut zmIA+mgyaq*)1#9!luS_H3-6=D?59-yC}1_~Hr0>2pT+CG6o`8v=>AXB^_L{AbUAZ< zk{vg`+WT!$Y4N3aBuq(#g8<+$S+)6Uk_xut5K>$68(g?{U6aFpf=RAvJq9lsz8uj3 zS6ymn?@`56skU)I;e97)FGmUa3AX)+)5@WV)NZcSN*QV`dj6HVxQ@Pe);w|QlP?Bo zz%l|Azx`e~-i(~IAWn(4qrYKZeIS|bV&MRe^pTf5^BUdWYjSyEq^$$sKsH#);c&~vf- zhaDm9ZP$FL$A{9EKIxGlak((jRyd|ye)^kmSJ-W2+OMd!#>ZsH-qzR4Dj2;|{1ya~ zCiZ0`z{f;Sqe~t)|8Z=dcbbjYehdIrCzb@2GCr}kq27Tf;NBzi!)||mPD{eI2XA%W zRBc{W_94|z3#`X$r?r8y?C6FwGHP||PE^q)rduKflTYOU!_^T|dM+ zGfrE}U38q#>!E(F(yNP``SWUG4&i0~>cL#9FEoPcKM)A5ghyxr2mD z$HGU0s)Bk>l8onF^(vo2yO(P8g--_F*KgQM{B?WPn!X!)9wm1#34#-av4Hn(Qtd!X znZpa|0|+Ii<77tqx zKE{U~e20gRny!&jT&4IH1?$G9vur6B%s^5i!+iY9se~qGRLxH9xc3z2TwrXDs z^A}#JW=y=lA$A99yF}aWguM48+lF0L?>KWcgO0`W12Y1~X97=AK*4~g8i|pb+@Xj} zmkWa1jhS`%f2uI~hEdg%xJ&-1S(cOAmh z_~Tz6yFDSqpjq<~nTM?CHDr(JhUo4UPLQela?j1SFE?T@m9ec2#`=zfL$%w*%*FOL z%+4Ht0T37cm4zIKO13}R-U^1xmHeC^v#7uS(f%zk*S>mMF<=cE^ZE>9dF2hR3cw01yR* zxP@aEBH8Cdr9-#)688d38H z383EgJNIy1DEPvd(~-Os^`ph~Vx-8CgEl9*pP1Up9Jw<4irQY4+j-d8kCqtuC11An z_16Ar!)I>yu5W0wpr90iNnfPw#xzl)4(`e3?%>Djjz&b0Z1UpTQTYojc7wS)*jUt_ zQQ2TF0s=oIM$LJanDYJt2w4HC$%t_6o8?@BrKa?Q9)4 zxYK7fG%zxYsLXv5=WX$IRx7jqd0at z1zxZ3jZDyQ7NuBLyrM~HG!Ua5F+|E%$?czX61l|&v3PNkw_0(UTO4`e&Gd*vSN$hu zJx=cvu|Cn2HC;Y zXE*)^++)Vb26wtUu#lSkTbb%tv37P+qh7E8jYZSxUiKQJpFB&@r%SNcw=b)6Oh{n_ zR-Fg8hI`pZT~>T*^xBc!Rs#Pd5c{x)wqcU*?;560bCRF$^;z-*2<;+C?thy9bqxSr zbZl8+<5a7M&EkbMq$w?oKb2(`EbXJRv}v!HV`BG1%Rv=}&lIpJZ+95%L!`bJ%x!Q?|;*Q-; zKlijLue#FaXB;^zLCNnJSFd}m_Xl6pDLKi^zaMhsu-25Vv6#8jAN*WT53}W!Uok#@ zrAy*^LVGQE^g`frU|n>uUt<-Q1{nqWQPqKl{#%DL!pXt1y$@jW!#j5l`+R2KL%H1h zeh*Ox2#q_x(kQ+3CJ&A{$m=L6+l-*vE-w7$G#uStJUv|GDj^%|2rxtGGZhRWLvq)X zMEe0Wd08X7f1L6<0367|JxRCDR!NRe+;IBNi(6J}kZG7#Ul22%PD0ULgtl~Jdj&tLre z@pom0;%cRQuU_vsgz0#n(0246iM_ zNN7Bh))?u_Zs@&xO>eHN(W@uEe3wfBV3Y5b(9!3V-EZfJ5q9q+#M`aAkqZkDpsd^O zKkKdquIp6ihrj{OCs8*5QoSQBi4sorI%}?>dOv}CydGQS_;9;7`=gilT1Xc$n5Jpl z{VL10$a?8bIl3%r#fJ|cW=zOmW&#^^zE|$pPwV#%`D`rMeWQkUQFcq#XBOvEN7|{S zJG;l9Od@UOOb?d1Ns$qV)zXD;@6vj#qH~2j#%~vqG0SI}7W>->Zw<|-VW~yEig2RQyHjqNP=)*S6ERfEpMN8 z!;VJrUo{AnYQv`O_`6gQ-P2Jy@=u6|)8cz92vPlDYcEJzj3)Vjpsvp&%ptVaPPj#b z+$)WYZHGvv!UzS0eo&K>^(7MZ=Jig1&=M}}FxLGZiC*bl6C5@vl{qmhoNW0N#jSp8 zlqxFcWRp>2y6MXb>|n+;${lkHX=mG_p{RtO~B=aUZy|wPSBU3l|+<1 z$J@ruZWpV|;I++bekf(^IPB)hli!e3<3b9c@wry-QbL=rho;M z#p~oRO(hZwl4m{Ip`y82A<3Lizp9wb-9kH{%`{3FF)Dzdxq!4D>-^n?q!-a*y?KEs z4*KrH!2{59!p{7(DZ^IbM?En!-e8d>JDY?%H!bFpFqF*OlNO}uPF%C+N^bjBe*s>N z@Q}gu1HdkiJYUWPeWJLY$g23j_e2x{12uFYey z(-Nc)p}0#ANl8I(!A+Bxw{M2gzM+wmh8hr1^jy@(R@!U6B(N?zJ1?-pxHk41kbtrk zTGE!pSFx!vO?6$DKCy$CpSCVOJm&JE=f_hQ;o> zDY7G~_)tb}NQJk=+>9Ee%XV;Zs0NrWq7Q6VM~W4De>~j{$Z;GFa=cjQcjN`j7n}%g zXGRVe2*PHYHf=oz&h2m<@X zfln)hcwsHENa^ug`lR)QUVI|UaMb3g^a^?}&Hcpmj!O7Vk`8BP!@;xq^%oj@H5fIC zy|`)Z7im--MA~?J@}z0?(7GDHJ?S^zdmhSb&xbXL8=}vSbZ*|9n&}fDvpsN}quFGA z8@O_&56{;uQKOzE6A`8JjEP?F`<^52c51SAbn~JIY3Cg{MaInT#O>!9K(8oL{fOYKuhV>WH%~ zAfMkOPqgNr_sRR{vODbX>%{54ZrrX?r797Qn^jWWt2!EIDRwwj^lT%U!LqJ_0r*?| zYQ%12^W_=2lSYaRFkh#u5UYh~nEtoN=3gDbkw5IkILRa_WB_dwC3h0$aiNh{nrx>} zwsIOR$uTG>yf_`?HPa&JyFX9Ac!TZi$9J$FL5t77DtZ#5QrzY~y;=wYn(4h%w+uZ; zqLo>6#UF3UiEWj=ic?QZ{>=4Zumq0k!X*>#po`9=^>JELAadDM0ekAktN!+5TmFDd zUT3hHq;0ud+qc|349UH5jk?-8X&3_3QvW}k9-m5L^m%zm*0bYl$V!0}vlNRb(C?I() zf#+BMHXSW0HWiP^G=7favg&#y+eroPhi%~mtzJ2>P z_xIzX#keoiNlv9yZxSau!Z|(L5ef4;o-3XIV1o>>^DaWV^w)BV*=%L~N05HicI6_z z4c6-!oJ4vcZLX{MidOfL^^kd_VALyfX?k`zT@?JKz(njZGgXiwSw-Z?{_Qxc_Dq$d zr{BM+{%*^R6V17?SniK=l(S3|KtaB0Im>ehaz?f$4;n6Lc_WiN>$S!!f$|C4t>^rr zEI`fkZUa(irxpXvx8e*RyPh2dM$22-QX#F5iJxx>c8t8-m(&}~yG)lavS$AH0_mcdPC$dsn27Nblb5npvy81rXqgkgV`NUlSQ_~+Q+kJ zH2aCTtZIs@b(`VJNznadko2V_l9@um-7T)NmJ;yZRy-QqIkV&{+_>C9hjunZsjBY3dbAVTUxs2y zPnP;AIc9TKhFAQqUnb9eG7E7?qln}GzlJw9#GC4ud7?o! zMI&N0o!bAJ_-ohLc7D@5;lfU)dZ@&-I zIl51_)4TRAxU{c7Z6Cu2cU(!}2@9bZdyOWn#NA20u#kU2$4eisX-fqurCwpLyDs}o%h zu@O8xH^TS7(@ix0m$pN;*;#gYfBo;9xGQrnk84CKHdYoZn`sP3Q0Y@HbT3dI5q7~B z3u+HN?GDC7meC?!kboZMDeIrrDNEEFV8rQRya6p_925_rs%xQSsJjQG0%XY@7usad z0Xliv+Fd*AG{4HpAinu_M9;kI+DYKH8=pLrwdJ9-8};pylA4;~tBGr;SBv}%2{{bc zI@+Tu3b*iic43=4S~l>3svo0NruQH4{KbBS<-Y|z{Uv76zB&81#m zVB;D$9p1ESWT1u7gd?Tq=GDRh?jkh$G>meczp0)y-#F$!LU^BTeQ^UA-BPTh5s6z6 zv3PE*c>0yKBF<8ik-}u2(;$!Qf(eOw2R$_qU~X<+MNS(TpggY5R(odX5WgTS@RiF5CQFXZk+%DWPuu0cHLVbEJ>G zwz#7RI$z_;*=_XH5CyCorTo42UUY1#r46|iUj5&h+os#ooPLy7WiG~>_zN@{v4T@} z=S6_`8XVZN5Fdx#q=c-3=oo;+T*F7DuOJj{Vy7k_wStA1lI%KBf`L!Tz5Ucy{tkpU z5xXF0P~`LGf$U*$SGF z7p5d?bCcsWkrTF*?zU+lG#!XHuue`pwqsT<1?rz8as?O;U%0ZGCj_F=Asa;(YQjS4 ztX{oEb8@`NV}rT7yDmLNB*e#`|AyXlQ23OktLt->=$;KMWO2raCxm()CSbmD`3jc) z@roEJ+(z^6q>tfMsTQ*Qxh}8FQjN0sxfh8CG%liV+Z^S@<${vrp1Lt#Ni{I&SjH}E*7Ti<98A&+nLcgcO7PEAvZ)MqkjLNUFQJDzMERb zfk{xwvmSUBdGs>Bd54kD57cC6@e6cF&alk8C=x-<{E@$d{Zyv!E;?!j%}0pM$DV3> zgZ#!oD}=h0J0bnD%_O`lKFX*>`Bl?XL!VI1PE;P#4}~}uA0QMFQ8J%7rA5S1-DbRT zgURRdo;OMR3SsH7slj^pkaEOmYW}+SoqGJYapc#&o-98C3ayFnFE z5|WX*+y4E7EX*Ge&X>ieyu}*}a6ye7)#V7_FIVe~&h+0QjlFB9>54h%Q}K}Dq1)`# zdBVZ@52*=$YxMDQrptA_`?u}c1IZuro!Ti#PoJxM+YXD?(sMdVfVE2w zMz4SN9f>>q0N=&6fc6gM&wj$Q;GkuP!i{-MkBWXx#u`J=E&Hv>BOl5MDQaSG!ZM+${Mma4Bw|-8K zAY0vaAm}7INtq+Ahp?uUho2XbdhW4gzs$Vxx$O&Jjhj2s@Uq5>Rv{6!(`lM&*j z7%wvO)_ap*LRd@WqN){JZSt8*ag=yNBm&9sgUoG#BQyFL>#j9f+&Mu)_Rr z9@cx@&6gnFsXIIxr~>ayBRRXsznJV*?AYQwa?-Mq~Ok-bR5$*A@O&0d<@elGw;>hBv zxp!o5^WkTXPfwK#hC~c8&r7rQDgi>+AnJsK&}U3YiooRK9l z*x@C%5t!7pu@ zw~fhL%9$_D#NEDT)MO);X=Uj0$?&IX5szZNeauptqX>NTseb{Tr^^on)??u5hXgE| zk~lRE;r)2dq6md%GBZ_wEAulI?W$IJ=9d4pO}DInHEo?`fCuV}N$NZPZ~xF)?S+j< z4I3QQ@wQ&Q>h$>E%f5dW!O|dIb5;Z9SDS&RdDa-sBd@*djdju%TB)*iAq(^M z((=tSOaX%WR5u?9!45G>h$Mo-DHO`_pY9KnGQPTTe>$y8BYh+n5n9+LTn+i@hQ&ie zmBT%|SCnhb66lQ_NLozZ;SN3#3ufh|B*QXs6kU?wh(wwjc@)fzW}JQ4ts+(JCcs7j zUdbUU69kdFrdZ%zbcViMT0nX%ry;r2`)X`gto4ELxwMqfoBsB|T=dBI8z66wwKZ>; z{-r(l_A8L}@1^RgT-k8R{)^>buk+mxLLQ_zwnkZy)saVUw=jl*OvSRfN8{Ltuk8VP zKZ!Upo&bKKJ)#osA?MXicuz%BJoe1uWODIPQ8J&pQMg+zJ2o>$SIKPw9Z58j(za{e4NzgazvT`oWh)8MIDktVhNd z+T9ZCQ_`wD2w%Hp-=Do$iwX+DH4Iv^o*Ar=-2%5%fUT zkx4rXmzlvV={Wc8t=t)=HyN$kJmaQMvF)Qp{WGFl3UOj4vfuJN1{f+U?_8)w{0R^4 zTpoSbMvM~t2&{&8*K>q`O0>-BbT5{@)SPhuC|Pvr?&(MG=lS5R6TGI#uNLm>55b8klUvL1CIGbG_v(vaI}s)=3M;JJ_e*Ws4LDQvV!uhm@C!lGhkRaF~c=3LCS zfrH6~ecwgf$xBlG;2{jOg};iq;?eiM{$Ib0vsgnv7?LGo=L#2wHsLs{I)v$Qvkb_UsjzgV6Llr13*Adtj!9LzeGR1#1 zi{OkPqEr(k$Jz!t{_A;Tb=rBhspd~-jp*%97Bf8F-X~wCI6gvYN8MZpZ0QBUFT=^m zV%qd1^Y=4Vd86_km&`D^wkEd;U&2rAaE?Vj>w;(T{Wn%tfey$oJ6&BC|E+;YpzO%u z5}Ll&eq|QcZXoTvuulN0>}ol(Xz5_ZyU_(GD+mO(fk~wLw~4N9@<7jFPmUi&qY=99 z!jN}Ao8i_ynId}FEGcAIB3~2=6cdHw8jj(y(&#b-fPRwWB;&r=bSQRjS#eT#-6?Q91#fX)Tr z>|HndMy!YoN>_hpf7{m$Y4@YX% z=9#8bLwz>DYB=+O-9B&#YZ_xNnO7uz#aVc5^dJZyC9DCI4I9lIe_7Alij@8!!r=Ss z2Bn(&PZ?Nag!uRP^9t!QDVe9P98fk!<6s~jk#oD@7Q*?HBg!s_S`9d_#M`PfPlL2u zbL-=Rlk%h}8OgL=Za#(NC?0J(WKFxuZ)~?)yK;-G7*uNhfOJE)RhE)pW~Q6smJ~(- zgr`nYQDu^yWekDFroG)=}uV zmq120cWOQF&D!xq+oR~*5xa!kqiEapYZ$WFQ%&Y94 zr7Yp(aoil>6PT?-Aoeg|Yxya##4JV@O8#Fy9u6r=@cWRExAVY671ovm?2Z{u@ENM= ze(;Zr&)t8=FgF5#_2bRjJ+kRE-wfUX{#f19i|a;OfB@tG_1|U|w+n!9Y%%vqMz5)W?Rf&Ww6XGB zj`9Hqf~sMmZzIDbem1zfBs!p`yDhrm`IAF~1UO3=tbg3!0}gZ&y5gO-^!k1fEfWi!Q)d+iY?= zv*}*20JGx$XLKrv);~u?& z0;`sevKJ_X0SOkr?Z&?P@V>cx1=ygw6TlXp5f-R2=Y3ncHS1#WaGWcM0;W^BBEhpB z%_32@`%lq?2Uo&M?58BC8??yJqCNJ1fDDxXqymxj81~EZ0kDd7Uc8_JTEo~H)3wrY z@mnDDSg)LyOg*Z8@z#EjfFIIS;WI^v1D>vtNSXW*BI_l5k|NeIKY_sy77@otVNUy1 zWVay-`Ak+1HHE8RA>G<2kf$74aTBBbe_1nlkSIKJkAFQlcBhhZj~{W9SVT( z&3&E2$=e9a#iQCnn_!p&pXGG(`S;o}=kfFKH)onEVR?V79XpGwe*GnJyDd_$JTy}@twTg~M*0a>NEnT8X_67|N4X?3- z4d)5pBdMeKRUzbkqS3PJc*IWm9&<2z`ph(Hm}hCaz+`bNX_vD0k8u$PGP#-^WXAXiu=6?=|J<#5na;8F9?RQ-hnd(sKRO5bV7l zaK%pGz^Yz;D(190k9hdqh@_Z(59&A6u~=zDj2eVIF#`i!9%ea%xXTCsC03Qx&1&lx z3Fo}b({FeZtpfeNA^iGQ{LTh>aj9g)vb-MP9b$DZmU)JiPO@{6-CxK?ZfG6<) zB$485?BY|s@Xa77Q8n$Px~<3cKvHwIoDy|6)G=@uj2TU5aM)aIX7v* z{becpDcFyklAmb2ReHpMh;Po&d)z`*4WGGjbK^n(p~5`J^R{-0_6tE?CEKIMCl3!x zkLpfznG}I=(KYeO$Fa!#&ur*{k=QuKi$1%(&B;;=g!@W@c!Ikv`a|$`?pcLu*T6^BHP}# z^F0M_{e0g&dvLBDKn_O6XFu|$^?k>l-Wmn7W^sqP2GQxMc}8R9g82qxUd#dRFX_rk zeu;5x7}S=Ue6q7TRi#J7wV9|q^30-A=tJe5|J2i^Y&wtF>#lL>hAiVMLqTsZF0!)B zvZiX75;5@fg7Nl%t-0ciis6+suMeStR<92JWQ|>iUWeXVKuaCzX_0sy3oIh`DqOgf z95hCtCJI>UVsCp{nb^^0q2rToaA2Dz4WC;q4Ch>0ZSQFsJS?ETLF_^=0E>T;O(sGf zftts*k|FTS0HSWsqHHbv>&gO5{qsTV>vFTUE;dCIMVr*KPG^k@h+PXUd741!ZJtMj zYUF(}CEX>99rez4>#|m(j&v%-eOK6EeCz2T^_?5)7R?_>hJSWa zs#eM!x93ultCp0>7ikq`nvLjsJuGnV_00ZTOZExs{Xo%;JrlNb!4G6>e8Xf3*PnQQ zX%x2W1U^PaaXv{^&aK+8P~g0s@ak!kY41cS-Tmgtd;@ZOl1QW_tPJb)v-YGk99w_d zQnB;n?<);JsO!CZI%5%m&uEI{P5KWnu550-tXKWWd;VK=Il#R*T#QuEt6Zu2LYnyQ zcXa*m37sDj(|G3#Ek<1gLnFt4N7TASJdCVS9wP2k!svAGllHG1%!~RJ&pDLDob!vI zG{zh5t%d2VpP_2@Et_k3@Q5mc5!*=3vaTr;JmzfS7OiZ!1wR9Wtho z-#*c`-2E6J0%PA56yT{ndDb5^KPZZ~>bafQE@jaK+H>(%>xu_MZB*3mD7GRjgnx(y z?Mt6$Y2AUz`B4z6Ii7DJm;}vcc>@_H`p2P|pu=eYVLYhb;VtzSZ$9&DpNwcF${F}n zejL4$S`hfNjCn9dP*kze{0uB4V-Cs@yRjwU(!LXw!(F%8+3>;^UJOeVux@_4TwdyO z^=;h^V~*H%X%)_VAg|iw}F2IW{M;H`F_ovY`6^48^74XZKP+q)FI1dVCFxSuKO z20&n8&qSy8T@3Y06aPaaO;yuYtROT`*75x*kfZI=2d5iTJ-eAoanf!5F_08TM&vMr->&tLkbU@0QVYy|8}Qod`=4=pEp_AV16i+r zz7h|$mUXw5M4i9`jZu%(-pU)ymZyvwW)y@8DofSa9h8k2*4;Y zK2<;Ou33OgWD5Mb&2@8Z{Gq~^_gIHC1LT4FvV)C4rRy=mkQ2J^0E^G4HI=YC81iMw zq|V^ZLD7^K#h1hG6ZN>c=}JA%wXDsGxuJQ)PHku_IUwwLD9x~s`g_&k-9cPcXX^1^Wm(Bsto&1LKIKi755Fy8Ac*jKb3CFamT%=I zm*(aB;a#t_Ii$mToEKNI+I8P(S+o19%$HZeiL}yx6=aZ69NVt(FK{Z^rpbt!P(`036^_PoGmarUmb=>k`d^>xnn7%6 zKcN~e+w5B|)^}JFBpL3ALv_$7P<`8G8 z@u4m37sjDl$cg)g1b4<#bjWBo@{3Cc`~b+k|G?u6!heo2Q_~a*w)^IjY|l0{MA>^m zO2%t25)@Ee)*x1(^ClQ&CgWTGifn>+TiLy4VxVL$=+3td6ovZd{_$JufL>!wr;7hw zJ4|09=1Z-EIhf!z0Q%WomSlNN^)h8|;tRi#;N!2MLQ!^t`$=Kyd6E?3?RVNh4>)_n z-=ybHoCI4Fz6-IkZ&!ZAM=_#%iK(W%_n_z?aca=TCR>yi1QoV%&9Hh~OovlW`!@z`f0Z0C1WZ{Pc0YrE!c z5Z?xLWJ2&fb!Z2~deukyWni6wEdcARz{8nSqVHo=rOn7FBeL~f>}%D|2b+1tue|jL zB_&4mFr$@2_~-x?W{+}~XW4CovV&}S-T0s3r639-nIMPc{6VSU$#Z;xWCtMoBN$NR zV*{D=i+luShC+F@FXavoM;-vK7zF*Vr1N+4J z@7AA&j!i8ZLBq?UTNi*!&hP(W>?;GJ+@f{|P*6ZZT1r6$1f-OPL0UiwDM_UfMnEYg zh7jpeB&0zUr5mKXOS-#r=on`1em&=W-@X6t`$L)D@7`;#y`E=PCiia!py)V6ya$0A z09c~R8Qc24YF29Q(fESnFA21C>^?JK_v_FTkyt6^w++Bk;|n|^&=u5Ss42c!N>Fov z|N8871xJeKQs!N}8GwE!dO7=Q!-pj~;|Px4-1spwlUatNCO`%g*cb+6#9A zySyR<>2`G5t9pYD{DBMgL2g8i=cv;yuie8A6*3ofKIv4Z47YmOPAm|+Du5Hg{xWxv z`@Uj)rbqbNc_kUzJAVbA@(b|+;PW>nhW%&b=A`S&Waj3>*Xd~a%OAe>;+&!1(YXVx z7#=A_@}{+}kI;=+0!woEb&03UJdgxo2%TMfgHwEM4bSwJ>=)hB7|?YsPZA5Dw8wJf z6kyOA?|||j;CcWNqV3i)(8gloeQGHPz!({bHP!cFX*HlXZTBy3KY4o(a=Dn{hq#jz zKiJs9@lr06%&?^}5?NEq73urK&>syVe%A1tps-l@8021bAEkp>`e&zhw%IM?_x}Nn zENPk0N~+E9nc)WzdrBl-2X5Ssd0;{a&(CTf&UT5{MSqSn(+=qP9D6$&DAyOf^r>p$ zIjzY8kO%wbWG%4L$S-Dr-x*Nh4ojBeA~6Qvd}vsge2D>V+4*7D ziXWJQO*HChgyUsj+s1S|jvudHw zlj2C7hYEjO91O{=hy|4=aUlv|g-7~+|{L(y+sP8r&%>FBS#j;A;yi2|ePZPA2nZ-i3hCeb$TS#8^9XtE!_Gbl0hJK+L!olQs9xf0` z01w?vz<_Jz5X$VAM8u>o65<}Apn}bD+M%Za_Gzxb$6*hs&iu0L(UxK0ULYgHS>71l zNBH7>uH=Rp5NzoI0#!qSX{OZ;|Ct%#ZIdsQ3^WWx@Vj?aL(1XfKkdA|OV8X|nc-i7 z9EL}l#^O*C9?pi;cxLpL0ZDnU-YJY{WoP4x->3Vu{%>MQz^A0Dx=${(U1j>+3~W@H z_X2L?EhEi9z!^)SKUe*D2uZfEgT~B4J2=Z5ej4slw%bPS5LE42gjeXWc3tFM0 z7=$9+p%|O_mh&E8G>lt8|1czAB4Z(9*J>^>@?e+^Kn*D$%|t#M0sGP;j*9GlIfy=BmBhQk z(|GURN1(yn;rFbS`Ds=4KXSw9M##gL9|14MlQ04Xo)}K%bjCI?-mgKI9-H&gC2MLG zhn|K8<8or zXD+6!v`%9#K5B?ywX5)1)4DXlco+Q6&OqO+!a+`2+W|`~t))c`=+rtkGY=$0qJ}c% z_IH#3ubS75fIJZIJ;Ku~aUD);+c-TeNp*`=k!xYv1!9~?wcY_Flu5Xb=|xRJY3xt{k2%2^_j+(t+W?L zeW#p{uuZJ-UU(wYM)0~>#ILQpX^Sk)2?WY{1CyT%$y|R>)y9gG^KylMxv$Qc3FxfIxU<>BTyUY>ig_xhu&ab%8{ZghVLeQ629nfoE$7PmxP! z0e8xQK-h9buPiRhp)Z6y+dP~nfZqEWZ5(`Uz!Gq~>f`teOj6p-H%ei*A3FiRouL-6 zMIN}Q7f4=VCS5?iL2V;g=yjfh(kcMm+!FHyVVCL?-`!QA?UAM9>J-BLohAh_7 ziu;Ao!cb7nbj4!L-oLzKW1a)ZM0Nhi5xm0IK;j;)nv#qnvkbABTh0NVz;w{NKs5GhJa7D0^smFm7iwJx_{34ZW$C5uJrBL!Oi;jG>3OCdxy+4HfC>%O&VH2BQJ>qz{)B2x z{KWDfKYm(M1Vw#_e|Ou5Djn#!N@ zUC0IZ7Hwxq_F z!}U+EbKQL799i(hnG)%>Ya|Oy1@$}^F2B5&p#1h4!LPL(VCta421My;Jagkl` ze*!LE`xfa`vPh^hRa49z?Z)OAUNwf_hL6xzTR8YnmrLJKyb8QC65LJ^DbUh7&m<*F z8KV<})Y8}Gy$TF^GC;mT)FBgB_0zYi9X^wuYr{XHp7^>uo$8cG8N;U*B%K+v1abWlGw16@$>@3o+PA+*qB#3*R!O zX9d*S^ME)Tm9&rNlZ0JL80(m)N5o3%hZB5oSu9&HBuEFJkZqbFVSl#*h5rJ~2f2M7 zu#7nw1CEz(=NZ+E>!NA#$(sk?7y%OMZxTB4zn6d`Sj-5s^nymBz7A#E&R-`k#i7-+ z%}+mxQ0Y=o6HOcgR8k3qWcXoFz836#eP@_7rKQ(3{vMdJE{2Au;mCV50q1YYZ`3>p z4S2u>kjh&Scm?7x@r+pMK6LaddN-_}zz))aZ9m*?RabIQl5-abWb;T}|DDdaEPXa5 z&Z;D*0_dt-G>Fwx+S@@z$u(Cc2Sc5HUolg^6URqxa>jezxK8) z<-oO>YSqs6-htYk*Bf;MwWmo4HZ_n?Qe5vIZ-`JdvsL2xpV(aW!`dp*^+yCC*}3dQ z$o*Jy>*LP!4+MIzG9o+yExx$8BFEj88Nh=IK}0x%F4uq4P(WCFzCi8};-8FWa3dde zF<-=rzn6u}Rp+g3nL>}ENIr(5EW6?|kfT(_K|FA-G2af$9=Rofm3c8c*WInn98l%u zidn+x0r>Nzhn}gL5xgf|+*9t|QvPWkd!FVvHZY9GS;9Wpq6?c#@VcP-O7Vub{sU7? z>p1>@CC}4t-R*H)m}YE6`Sp5`k29oXXE7XB=+C;lP;XB;Fi==NEx6-3OgUTEX(v1B zvJ)oKu@Id6(C7+BlVh3FY;8V6kBjA_N`~@>$0RVesHTe<8q5{w^Cz6U#=2qKrJ&j> z+~(4oy)Pez%$Imts>Q<6x5HA8rz%ZJ3ipPNKp=Lo)#=O&<;6$XA%O>2)$loofBl;v z-ununK1J^OQmJ0wTKu@ByosGni9*o*cil7??tYbeggvduM&wh zvYPb4PVVDlj{V>b-Qn)^+r94n!zUMrO5jNYQLT{E)jQfyDt98f{GxT=zR=G8V{bbv z4y=x7=XHI$;Z}Kx>=bbd_&MDnd!B@y9_iyBjPGr&Tc5Yi$RKt6KaIA3gBXwHTJUcX zD;BB+@bop)S*2)SXfvz&szPdNIX$c_3m| z`z6M|Fg^5wCvW&(vIvdH={rb3#K#X|zb8cVQJp(18$nJT=NZ_gq48_A;t)p%MW!St z*SLM(J86kyV}2?^06ulHMRQR;7inwuBrff^-JDaE-MW>N{;tiRnTyu&g|&(IyNN>L zt6-0Ug`tnVHk5rZ^MemdkJ-B0+JSYIHpMiaBF}_oik5a7pe&TD$-m0yOE3sn(p=2Am_%(g5=DZkv2)ifJY0GP(pi8-$E$kj{vafR(#!4Ntr> z=W7B5Uv7u-eRTYNFmSX_7)6yDaycI?lgEv31;}rqAcEm>2O9^NBqa&{UBQ~%Am{jX z!LF)eX{^yh%0Q}jysAWkmuGkOpzCUna00IFps+)f(VhheGYaB%gjv@fV zjR#|LN%XGH@fa0%k^C0=Hy=j*cSL>p{?v2bw;NlTo(GRU^k@mqUcg-hty14k;M}w( zz*ul%7p`7|fvwqqJ$JHJDi$&NgvEGN{u3N8JB)7b*xLat#Pj{ebK7rvnDgVU!V+E? z*`E;U4>>ZRJODb63n@;owTiRs&*1m3JYhCKT2@K)jo3X#Wk9|F@Oh#zKW2*0Z1R(K z23R&+JjCI#o(`I?HHuc`Bb^kW_j*=0Mq>Pa-n_t(?SYL?+(^Qq%z;BElSX1!lWw$r znAot+Yg@C&85rzV6(ASC z_ISdRgHEyR-<(xxS(FfsuW`AR^95Ct0)S{jI54mutQAOM0C&48-~gV19IEe9)C8uV z1e*UEfjm3!_GAH2Jj7LY(E-g?XMoEDddkB(`q#BIz;?XcpFBM~2H*mG#ca#z82LF$ z_lX7Uo%kIPB=CKv=H0ft$2$h-i2VIN)q#jfSL=u4fL7q=Um6u#tdXdX>p~LGPM-`x zLCimeY;iIHA*}%X6d(%z7UTx8=2ZddPS7;2NP={ok zx}^^P%1m9PiJHiT`uHbe%@Xsf%f*`53#(73-yUX7M1zC!U`OHeV+gI@o#~klN+*~| zH6)pIJ9%Ukg9rA`!o-;VmnNdbi7+?#F&9uiKNeA1!h5e6w=X7(A~I~&WcQFgPMo{b z+3pE%rwB7nd%xBSoA2`|j|2py(V=KhAYL0#h#TkKZT&Wo?M7U>7SG$Mk^tn_C^N6j zR^l}R5z1stsCIqegpQV7>ROYI7CLexX6?uS3uTu_{zBR8n{1V#PGpGY9lW~Zn&WD| ziyE}icS;;hN@Of{mH!s7KiZe4yOU?jj1Lz4kkeU6^iiE zrq<|3c}l1*+rn3UmD$rwH501mAeQBN z%|iA1iL-GsV2Hjymz%4O^Ga73c&j0O^84%cDdMSAnI}qTU;hbgla11R)2P6+<5v2p z)_NH&ec?=XB!L#o2)C;+a4GLLzW>BgIlJ}W--@PlxT;(DGbhJk5dh^)95WqM>q^$s zGxg{%hy=dIRJ&Ify;yfAgK$nbn*a!-?n|wIbY!&m3^?Bl97wMFPDGk4a0a=?sGFdNqS8K|_GW~QNYZrU2@LBNast#Pr?R)d$Bbx}}Q z>$YEu;_gZ?j^)q8TJ-QVq3zr``=6-$oH85z28lJ<0_${Ag~X6oW4ZSi0rPeJqv^;D z<2Um$9fGvsFT#iKik;m`($z+Ia*se6D;&x3SGxH`a%bWlhs{*tL>*o%w~Z3LZ8`b6 z@SvwBo^fO+F;R%Vx>{l(44xo;%$0z|;11UAuG~6)BFb6gc_Y{=Tw*P|UAL60N^?W1 z?)MYs&?*-z>aZgrarL5|U!N zW{L#K7fRvYLM;)JIyrq3M6Gb)z#3B3ro(*?=A=3l>C?1637bV`CU45$-=B8N+u6A* z=p7v$y;vW#t(N-U(4T&Tgz;6-I2-C{K({IA$E&MqU>BNZH-|y{b%DF)FHSBwKi;PhP$m=V2o5(Xqf0 zD14O@u=CH!6`6Fx-o==|(4cgnp;AC65H3Fp1@>9@DD#^eaY`UOPBuAy!qmJUiZ*sQ z$i(k<5HM+meAFPqEoccf8oL7oK+X zxa#5ob;11B*golf>@AkGkehO_Azx&q65cwfyrs*BE%;k`%K@tJ<8YBe=@nfw5Cr_7 z4ds+sKwyA-vw^mWsS{&Pp|Iu@vWm={oUz;%8JKP;`*!LxMl zj;_=qKapwt=6HafV11Z#H5Ufrh@nH^frA}x_5TMlzh-#$loOEH{tKj=*GwnbovHTn z-)y`UPR}!b?EX)T!rIFh8!t6`6G@vY6hgIr^>Wn(<@CP9@q(sm(yr=mdbVcvp5hEso#%KwcS+ zh(b~(Xo~t3=kJ3$=IR!o2JnGfh*qecpy4t(hg9ahk8R86tbYwRO`0}9`W;B@hHMpO z@$z_pV1xB7^={YkZ%x?~h5fe>d>V1s$oUBeG9QP#UlScdQQZYNHGGf{2=$k*kY5A= z`d&t^0mqV@K-0Z!Atva7BkQFS>L>0T0qqGJWWpuOk#KGarJ4w1A=_uJmWcZV`8JhE zA-k$S04z7i*^|MK2b}vA{Gu;BGNSJ_@%kPt9_`-L-7X6+Zrv^q4C+QJ*r`JM9nc0c zlTf29^<@-b6~lkX&LCT>7TExC48jz_Hvt>uBNt5}3nqk)1Q_s547*GczfytJ3Rnnp zg)?`8rx_%EfpPl(lRp}Q&{0{2YyA7&L{MQYkW6VE{tnA{QyfqBXiohhkt{xDZuFhZ z_GiJdhpa4Bq-y1Gu+8ibtkStV?Sbp-U`Z8bf3q)F{B9jO9?IbbG=PUNz%bXLGXMWv z8Ug?Gx&?P&6(Ew4F>V?wuy~|zPewq0BPve;RAEcZ;7otYXY?n(ez;^*yTtdO=u}A7 zFLBgN`uM`gP^Wxd^$CA8GB)xk7?GB1O5A$36{_a8Z^hC|Kx=CTC$aw}!5mxWJ4|DJ zodn>6JNh1rT-8@_q}o*&-nw&~(ZVOlXBd=gjKu}2c;=As3iUOW6l6t#2A-Fpf~ZO9 z<$zk!|3SO~ENy?Xz_-Z0e0htIi0E)9^f)Vw*@il7{iH>=WyenMJso)3Vfgv81KdzT z>>JYzXYjY0u5Lhlv=Ma)cltkW9Y`S8LIe!Kdr{MFjKcP_UY^+bxOZo^3|~;D5*Wo} z{UQ7X%bV^~1SAY~ZaYr132*mIE`FK!h_I>dxWze9W+70s|C6ChdCS1yglwmJ#G4c@ zo;%|SesXutzZDUOW5%`Dbf)LD*`_-;raFgFGlty=c{q9>CNq8nRRx_>*IL2U)#5#f zZTfJ@(Mm;H5yvBdB?Xo@KC5AFQH=^|En&)MVG5 zu_|Qe3=O^zzrsN{>~-7VtCUH{&Buzd#Ig;T3%=|`2{E@%arq_fX=VusYDi9kPrHgD5sHxSzzVpcF)MT zjEXfpULWpvs^xEmyV^|?{$zWBQ`hl@GpeiWR_p@~WsltAV&bKx)_mKsH=PSVCI?9u zT5zsDBwgsI@T1k+!~2PdJ^S-!DX3P<1Pr*KCYvXzYSS4uwd3nWB$d;w`~}H$dYw~J zMMnH{?z68}2u*zz;4!XVU2 ziVHS-I2NigPvkb-rBU;6lW?+_?$9RPYpBH5-(Mc|*D8ZA>;fIUk=D;XB;iZ%=^{5NMUM=ExCREzb{lS>|(q9nw_0X3H` z!~(oalU$9edTr-_UmJ2N=ij=gLK_nld#gW|_db=*cSFCA>!LqVIJ4hF9m*|2DcDGn zsV#v4f%UUpj!i#q&w?BD>SFPV^}e3`$*VqY?bW02?)q1sGGTB>vK^$kKJ(M>@5EzU z_lg*$tQN5aXj}ik!bm=bSfk2mW8MRHRsXBU+4dA+2oibi;UW8q86?mq3f*QL2-bNFIm6{-2)Vai~KU6BB#Dx?NP2R6O^{N&QVi zLH+$JRYydu_a8OQm1hC{Wu07USXt)j;u8+gfXOCCCN2_*aOc~|C_=~68LPS>E{Fxh z_K^egKcYr-W*XO$fRQn1`XxGgZZu|$UDR1D$w@ZlwVC&>B zcUG^%s`ds1!Gx!jRM6!v-<55;eU`{^oeSY^Fu6(xGpaR_G&(sUvU~IkMRfQsCaZt& zL@%eiThgsBf&G};3w%pNk^l*x3<(Z%Jkzj3SA^BK6=DT*2e+GcZr2Ar?7JRd1G$xC zoEVLaJ;KvVDk?hBc+)-~o?qmJ=6OsTW4gog?i`5*sXmr+SCUp-GCuh1iG+MkY4$>? zW{IXt9aKt@dknu~JSl*5-Kutn?fD3w3F{)6YOYp}Fg6`s-w+hp&b@kPgP}sGN3%s$ z_+x?YYnQhwY^Hzg9H;|2cPL;v0?9@K~_(Iw4C{pwfKIQxcDd_Un(9vB?OP*G(b=z#H@etY zG&ZQ*wN}^;6`&&Sk^=LHp*vn`9;vZqwi?lSF`%C(TIKe|;Oygb%)HIuCTnA zxlLcXkwd@ZabHxOaaCuxEd4a&&EqS30ST6jJ2eHG95dP*1K$-aN%8F&u;PDc^0e@) za-PK$Uy#Bw^Q3f63A~mDlLVQX^^j!taew87tUnH)i$R z%KIYOdstwyp%y=r`Z?;idm3)zn8{X>lFVMz7nMvG3pza}Ce+J1PQe+`qbaA*=B_6{ z<}wA1miVxYhfP3zj9)HFxG#ApwUNJiyQLN=S!i$18*F>kw62B7qz@#V$QK_Uec`<^ z>HJ?TK-NN_&C?%M&qhOXw;WsMY(8y2jM`%+E}GZ(*xDv6IU*x(*VH_q>-fPWW8QDQ zxYQncX#C8$aodT2{Qmi`s^V=s_T=}(o$qIvq@>mREfrOny@37)3wi%(z48WzTKkkV zru0*_&pnt(qJvdt-Ujb3HJ)*tFLMsqR{@G^v@;}WJlVFsjC`TG2b%9}ufHI^*WV#eVO(FjHO>?+js^o?Y zXTtbS}q@Dp(T8 zucQFK8Hwy>5KjP$T62A`he=0RR>l@l-2`*mmAhFd={raS3i_=eP*zK{CQ0(UmIKZL zdcyG1KUQX1ANAmMUZ?%%2EiYLJ5^;-a+Q2JT+XcoRRSSRvsmM-vtPYCXXQ$-403e# z!%czVbhu$B?#g|Sq=N_7>fE?X3ez6rG+?8;jM%g4)>AKS<#NGG6!vw_A!lXF)MVn~yp5J1*ix18U zT6d58FdGu4)js_0dIGi%PVNdUWQ4iy8(*!{x4+)Z8;Oh)@M{J> za+rq2{OUq*TKG{q73#2{X+*nA@=sZ-u|7=XzYgKDa~zp;QYLF(JmVry#;vTQ!oOBkD@8}Hm9NiY3(SmbM$4Pfi9z6Y}_w%u#6vOITOaVi2Lb7fR)K%Rag z69Ja%?x5^nycx|tF>u}3@Hat6}7K!TLc7})maH+3eam80l`Jvn{ z>ZerOrBZtwUb|#%v95-`>P=Bre8EzA<)0qyKpHtRCA=`z2V%lbuWIKwK-=go9q8e5 zaYs17urf`3Jnznq|Ln|G|7`zbvO%P_^W;fODT1C7dGXTk*^eX6iBg1GlZU^?OOWFB z_mWmn15HM%CKzh5pkEQC_tV7jJT&GQDQz^3&>$l1jOKO$rc+~Wj3+^(ajmik8o*{X zBTr)RLd*>$STTQg=_!ZSZh&x!fbr=WY{H)?T4Kz>&D{uqLis{i{19$z*L*Jk!j#C? zF0j&h*#;HTui&GMwPi(+=7f^&2kDolg$H&mxsbh`h3vIb=$E zNnfyD;oc*96>t1L{l$zy^U9h3gBicI%#DBkYR@1Ip)BA<`*=nB9?`_1&}7 z_@u}i#(hT~?@swtJa)=O_qhb#1{|=gLemmyN3K7?^c;yFi_Dw;3UP7kQ*Z1Ne%c~8 zwES!H%=M#;Q*PfC9?G-XFmSE0$|^o#G5Ry>ohhOoPM`y)`2;rwqm(5_M2!JN+uM#T zBa|Afw4Eq@6bGgwE%lOfS(Pds*nJr7Qq)jVe@qN1Z8(**?A*RBT7)Sme0T{`JsLBe2YOf$_lDjdkx zm~=Q-#evy{paVruXgmbo&FAfgW|BVP!M*eq3pd>0mNjrOEL;O=mW>NAulQpIQ_NgE zvR?>BM)M>83M8KrL9`*Y$Zjbvms4bsjN}G>AG^~7mnmXJgGJk^r1GlQ5vl7 ze1y2kZD0F?Ts+>LJ>!1#Lo;*3(85C1Nb>zJ#b_Gp=^V2r_sciYe_yj5KXCkkAbE9_ z_E6Gfm(-QuEUoPsxS>NFSD~dOag>fCT7fXBqC_^a;H5mM!pHq+9bt+d55S!@O6y;yXm zK_~!r>Y4{}KTmn?ovBm{)}c2R0%{y8Zae{bYoHb7RFg``;*QV@#8c#LWG&8PUjk_{ z)+UwtvpM+#bye2A9mkf`?9FGwi4Ge3Jh{xTWtpA)F5e{7wYH|a4r;xbr={H#+Mv~L zF%0|S5EFkx$3Q@6BUTkh`rLtP(XHe){rq_X9z_uuC*JSX#CO3^}(MP9gJmIN}xk7!=@$VmEi0G3|7YPnoFi} zQ0q20U>Y&cqL@!)=^j`)mi_4diP9-+-3d8z5}0>!_CUR}^kDG~U_H|>estib<3Sm+ zy@>t2QPo-3)djCZ69H@aZ0a9wz|W_bR0j{{>EkW@{+#OMs@GSF!}WcO_`Syx&Lb7y z4D_SNMQL7b7{tD5xY|`z`EdFAyPn7NR|c8op6Z1RqAi=;{ie=IlqyQOSg>?BT|uC~ zgs2vfgycs{eeDZ;YllOO(?X7Wt}oW3jvoDd-1$-#Jyl6!g8o1bn-v(PP7bddbCc+ zU*dFMMUu^quXFV5ZKgx<A6rr@?e!{skX4k?1a#3l?cS{~#SG zc9?7U`9#PAN-B@#qL~07QhBV`DqR>q#I@qAs|s94VG+D|ixD4A5=$=ca;vzX%sBwd z*>L-}C&%92>$j9(bAw$`PQysVnpjd&iMsE332d(9jkQzwZ&RVWhRJ>}!{(&suHhhO z@(<+{H7TP!)$rMq@DTCBN#jT*kNa%=8tcTNKaP@d8#1Fb7OWbdovXg|o4OY1b-JU+d%AMBkFpq; z=*ge`Z>(={g&G5hB8lEDKV!dl*7d3UERJeo=KT;koEIlP(qhfx<$WDiLDp+1JPJ`t z@oZt7pwr{^Yo|OHDZ~oP%L`wg*bz8R=?GTmFvP|0FuEUmo#;_04U1s%QBL44J_d>z zJ$gRYPXfV@sh5shg@x%IO^kUd2fqC1mkS%QYK1+6%v!Qo0vUPCR#4s$JroOnPrIsi zN_`VGo7C?+s8G=AOSNMcbF?!pkxp<6+}!ZelNbuRKsR~P!b&;~UaaBYwNme!C%BvW zg9JdO0A{OhlL3NWS=0G29bzIf3YRJ$@JRm;3AZ{rfA7*=^3L^!;5u~K2KOnpeKTIg z!#MwAIPJ^z^ZU)YQ|E}lnXwWv8;ZDK5EoF`Ta(Vc-Wa6Y%tRWk+WrO8Iiy_Tu9T~> ziPHVU<7@)jsm3Gk1g#0#(!n$M~ zjLLtV4wvd*+>h@5K+gA3A+fcS=1e*K$DO?mpgrejSAOekbt0!ru-=KEx7v{{0g<$x zvsU3;!naP3*`TP?Mh$0?{`41jK5i( zeS|hUdQzUEZ$fD$R@t~ZPSFy6w8kc2ea4$PlRKs7>bpQnZ>)3Qlc^MSVR#PKkrRB) z1KXG`5ATrN#4isu-SQGHWMn1AgO1C@z@2NoVPVba#lXBaW-#e^LTFu%qu8lbI#H8fZ%LUPVkWnPT}|+zTz+V)$eqNeN?azCW|BD)W~4&u1p1+9d5@qkUG25G^Y0~s42sV!$nC^ z$=^-{8TVl$1O73iG7!!sLLK0X8MPe6G!Ok)_+>v1~f3oc&SV6DPXQMBZ(^q zXD-7SUagH_`0i=Fr+3~k2{?hDw^FJkop9Pt#eG0W){z7vVuOrdOe(sbo2Xn%I%$m} z*(&s@t%+F5<-~7TV<3#lA`d=d*blUJ!Prf|C8qE<08yhoZr5X)1kr2bw}3e?q}$6N zJkI$q_?rt)$0ta*dJx9<2!w) zW+};N)4+9*^bZ17KUn|`!l%qyyTa9MW$dU3J(vj*e-kXzcI%Ako=M?XUlf`iUweyY z@@2zMD?EBsAXXFY{M}EKei^ZGWJCwVE3BKwvWB+gv9`+cOqLL+-w$04%nH{id6B*< zTl>E6?cM8K#^R=YUwgQZ(ZeRDuz(eK|F=Uqz>ZZYN(iyBG*l4;QNc!k3tWZSf4|*W z!0A@Q@A*8m_nhGwc3o}yyrwt1Yl`zTFW_1i_BIJG?=s!Mf$>OurLcDxH+F~hl|Eud z9xLsf^E~v_$qu7aLB^8z8gDL}!;jx}vt#)*foCaGZYbr$VegU_dYFT zTgVexiN9`S00iIcGqG!bsu83qOL*K|?f{A-hg9S33TTw;0&!n4oiC=j80cH!O$Sg2whtAUYN_Jt= zc&C{(N{g>@fZ3wIHCH8YiyynT&{c`_K*uHvI>liRXcm_YI>TbUj|j-sZ~j{{ZRiG9 z6Diyorigds?q~HNh5DNP4AahjO@{}QZ0)F*6>M~$3YK!TFo9Ze@GP?>3O-3JV6{lO zxW#=G?BYCzwaL#{Xc;MD{jO~ZYB*C~`KNf?m50VTtrQp4$wD_lb}yZET~e^!C?2dJ zmbb*?Dka&*+fc|ei6MPgdvdR8-lcgxw*J6>%-v*1WsOXAhQ@~Ns~cEFArl3a)GW+R z7D7!mHyC#Zk6IGX_`1t`Q=L5HdzB0H&4v6H?4{m+B?55G#>v~B3u$OvIq@!AHQ^>2 zzC&g=eZU|5z1YPavtY#lRy|g+H$lgeE2`M*8M%|8nj1S#SOj4YF(-ViTz0;zZU}wd zOOU`o7waP`udkC#+1)+QU@4_Ne!%$4%z29g8@5>Cc=9^@!`&OLBSkDV>=@x=W`)la zzQcH0;PscsHNMeQFJ$SRcfJl^*l+ZjTC4<(mfGWM=xkE5cL zW)f1)vTmENiT)yCa=+XZLaEQahmYhnFM%HqVHUszwmLLst2b^DZV zv%dgFG#=~2UBN801q9VK)WpnzGncm%!vM?lD0qdsZjFc13XWkz(pXXe*BzA1i(^{~pQOg2^v@vGSFfH?=JUy<^J>r$!yqj9tsak$pZl^YLw6>--NR~cd6fUw@$3|K zB1=*zTdO{{Up>017mP7BRUPK#p`fo8LFXTm&dpvuN@F4)MGQ>U+t-)^zzoMaXxGPf z32%yxrYc;5)0e6IG2%XcNG0}ku@Drm^)x`(a52G`C-o`*-jZn%K{ zCbWeJ7wGc)0cP=Gm>~EXAMIX_LD(z4v_mPXBRToBmj1gx<7!ahvchEaj6Wrjmzcnt zSR^E2n#IMq3f0NsbT|B<0rvk10t;F<>%E>N&L3b?#*``T_lHJ!d>X$5alMl)4Vx$A z+8u-Ljy0#oSk1#xbDkyi+2Q8!IA@4AeLLkq=S06Yo8dJuuu_7&ZA;Pf6BZO%`VNXfDY=!E1@RQx{ zkeZQUTC#6D@V0Ncb5o|~AVa2fXzPN&Mn+5jG9vvp3s$~4%q0AW&dSUyaOa)>*Y7`h zD_Fb#eL?XA~t<=ISk z>M)~X`S7PL3O_INams}#HG>yQ7<2pEh3T06R)R~FHt-^m7xDwadqkAWGkVT{Lvp}| zYlunz_U-nn-Pa6#pMk|AMP_&UX1h0THzoDxkm{b^y@95H`L^;e-8n?$zXFv?j(gB~ zV3)mOKDNYD=~v$Eg1jedEGXJDt#i zA3lYgUZu5%ul$qw&=Nes&ewgY7K|LuoDqqfX2|yGL_y~)*d@ow4`uo^6_!iOA1lgdQrZ_S6b*ak1XRZDtDZm3n&`WpIa$|4$_W`Au`O`}o+$O2&=VNlp9w z!7!6u;|Mwe*r?ugW@&TKyzk93>87DF1$lB{pHBgklO=8XiScGZ`bqkfjgGUrd=rHm z6TJMaA_9H-YH0pWkdMUYj!N8X|R+nR)Js`6i)CL=qJkZ zE$hqBqZZ>^9d-`P(EC;i#VmbCKRnaW`JcV#ZUI ztqvA8&u;0*x57UiA8D==SePHNND8_;k0Z(I~}r>ySy(v5T09~e%Rht{bTj*r zWo`u)24T7>V>%zd@aqq`II5cp?J>Bosva9<5&1+l=?b6 zV*GRa{Sx*$o|@P-R;GE8q6M44=hSDy&ECdM1GueXP@$ZY8JY4SPNs0 z8u^hLg{=QI&<35|+58LHK6k<_4*3?c{~QWA4M5PJ(yZmDz*eKTFr8q;lPsw67qQmr zk(dZjr?$l|zGHfZR2Vb&D3>^D_v70YQ5o!KCu|Gp5wWvPEB;yJ^o)T`m)HPrBaBNb z|2-oU!OvMU4OH9hq2yG;1s?pr*{^tDSZ z?O75y5duZq(oe>5@&P5z1LLa^_|jWqfmIUb=B@#cEN{+2@X_O zP%CvIKC#ZFI=si6({O(7rB4&Hd4_>rb1k0>P0lJyk0iS>`+42S6uBJeB~=WHHlEP3b1ip7bfJjq5?&OQ4c>c)Y^#OV6Mt7wS^Q0*qk8 z0!|glPU09bY6vW{Gnv=6j^EB;*@=Ghc?j*MvU_3V%eDKZhl6N>XI}k1^7*2r*@CNi z+_cRR&nbC-mzG{D#28$fh_P5P?pnVZ75jxvM(4EbD-}=}gjAfd?ozXmB2g__x{c3P?32f0h!wwRz8zw-Z^sWAn!CzDP~& zMzE=NX!Jyz9%gB0yq5-{HDT&(i@^BaV#U@Ma{f0*w}Yg#yW6f7r(7rWvCaYquB^$k zfXpAd@rgfRbzvA9*a^njh@p{v{}Kzrom}6&m_@R$X2s`d^fAKC3`=(3vvMo%nl`ag z@wx3KF)1O=8cD2nGtDWm=CSgKD}IkS{u)yEfk~gK4C!~DE@4<5IDAU3TyhPDkB^v9 zz63|J9b_%SUUc=bmq=(+-LiNRpBvytZIjBWr^hXU(HGlq3Y!t1U^G@;Uaoa+fz0Z( zBtOt;MP2HEJ}>YZJk)3-5OvvM^S!+0hZ`duIH$`l(~gkIUEItZ*ZShj#y0~;hN~tC z_=WFLLnAumg66zVw&0fFxLel?TgTh4^z;XP6jj6X?1*5U!91_Jg8%JSg9|$B1!gJ} zDV2%@Nida+-a5KT&TPYgU_WyG#x3J;e3|^eSb##Ynqgq00Rvy4ieE&B$rtNqO@1MCF>WJ{^r z2ZV+la5MzavCn((TcnMG`J<=E$51LF+`-<<2b;T}dIGjUr(4h;sbRq~#t3}#2$lK{ zv`y_YG4J~Q|0-`wQZLc4FSLe80hbM<#Vl;v+aBoge*wihY;5y{rBvO$A0GsquI`8k ziWWB38Q`m<{||9*9Trvh#g7i4@CpJVB_bh+qLhGyAfc4fh%`7zHzLw8paMgS3W%g2 zCEYQ=pwf+Wmw+@w%>Wa3kG}8sx%WQz_xC-|!*I^bKIiOMd+oJ8EA|>chYdZBFtZb- z7pXBRb18Y6y+v7N5i!TYCq~E|c*el7%k-eI1Bp*lLK-H)oK3Tk^oqgr#I&m5SkG8d zY&@w$vPe#%JK#d(Gm!I35_K|XmsYHV`j8wqd6UM4FX3L*nNf45NLTyv}h9Y zBZJr`1`cMK=~p>mqM5op@|WRTblfstG;`K7S$*J~swSXlu4E^Yc!OUY!TZ*K%(+H!70KnaEE*&2l1^HY`cx0UQjtkIP0mg2<<@ zwIVhL^Pqq0ai$NFDHxzX6x#1FdHdLu!%9&pqjO6~>*^&r8=}GpuFd!AWY_(y+qEv= z(+=o}+0puOQ=)A&oeWYX1gu$H&g6Z76%7wbLWoM?os<{dl(`P|?lF7&rzg)&SX|{; zJAtAG>WIZQ1=@ih@&nAh{E7V6+SxPh9Z*46Ibyy8G&jGMQ<^waw^?NV>6g0_0t7(f zB@o`1&;LPPxI{oQhvO;V%J1^w&_fMD`N~yhwrYj5!X#4NIO)a>LAra+o}Qc?|yXflG%uV#5L> zE&q}Zgi3xmWWQoE@y>|kWa*9_6;WYdQIvT{POAvsSjnFE9bm}7e!>!%KJh=bF-B4H zOY2xyKuhhwEB1gl(s%`A6oqelonj|e`9F_YIP(v*~Qcc`4HZB9T@WghS931!3uR7aP5ZNAG z2rW}ko*JL*9uqrwx%TECbu#FPMV>C}F%fNl_~yqdPGr%bvXV<&>ajp5U^GNQCn7=L z9u)#aF<#THQ_}?p*JoTn4Fz(hS~|%S_sm(=?m?UJg!ia6(U*cFSR}2^zAM;F5gT&vejZ=?2G)anyD2qLz&U^Z2Q>Br z9NEH)mG?Zn(OFi`bW0RM(GU`Ty++0C^3nYIs(O0xGX}!`kC97B2^Nq1?>l`j6gc>O z`e0OffU8p9Q3crdW7cnd0;@#l<}O3xF72|&;0c@f59X#`NAu`*RBEB>opXMS@9^PZweOz zo+(LJ29&tI)`JNq5oVJJK%t62zVC0bw-V9fs*r9Hr-68^B%0m$7XJUObDp31MDj)G zXj}(d<}ex}o;JSUwmx@6@mI&oVpQTp)y2Qw(GGVVW-6F`=F!kMX>K6B8RI&fkd^{- zn=}H;CRmixgI53yqzW{wdWyIxqASXcn*r2`)8VVuOe8JyNKR22NNH7rj&meqE5-eT z5O{%WY!nw{e-80SeUMQZ7a*Z;{TQ)Qa+Pnx;X`~tMAXNUFO2snsdn^5ESg9;z3k(X zT3+OX0?&qWa(`s@Dl&Zfw4IU#?=2S1-v9CDKpb}HYw%P zIf}_4zrIkPS&!wqAwVv6V|`?`H-T=S5#WEk%ai59qjlO~Nl<>3vNRB$hb96l|9>c& zGHM(M)(eH5t0(_Lnd?L(sB`t#OcyW@*Oq_I-jE1|156NTkts91oSC;rfgWkyW~79x zQIw|oGQOn4ankG4KAQdmm|}?(^wJY&zC>kFDrB)iF>BL`RzX}-oklw*`n1oBpo8ef z0=Gm|!eqz#JL0Ym{88+RGW%gb$~(XUg1htw%IDPvBSsp;V#~PSEd#>?QuE zW%Aw&F#`^Z1N%fxPT{oSyw;W+qdw9esI&RF2a3aNi~>dLPE^f^1~sSKdEF9TwvC%Ot9hD3~TKbC8YEwzN4AnA)&fN&Akt@XT0Mom{ zmU{rqaf(+V<2X_27XdKs8-z?VksY&^v7wc@2$>+Dz)Ssts(Eq%X+;M^g^&p%np4Yw zN$Ul`W7pk5#dr?Khlu7=tB6LUC{5L?T$G`M>ZE1phnY68veD36JNwKvv%(v5i+zh^ z+7#c{_Y)5#!~!{;KLK^?A}iZkD#@@m4_~2b59C2Am4=H}*dKM%Rf>P|)Ci;kluFdX zXSeUnu^Y?@@)ZHiQz4lUfosp+Y19QPU5o3r(_Um!OM3S88m|ibtxYKyQRateQ&l9E z(;;S12nSuKmsVjL{Xn5R_vMe-Sn2p|gdLUnHg1w=o!R-Sp$wEPpg!yLGkJ;zy#Z+J za2R75;D$TbKU{SIf=2fE(z$|HjC3JkK&H5JYc;?o2z&}ilRRp%f8jSAcH|>{r%ooJ zA94}xOa!hE16#8?x1Qkz(nze7@bvU44xhEo-$roF=Hh16!b{ku$#02EUDR;t=V{+5 zGy_t|dH35Q0!pgturZexe#FzRMhEvxb~;Lpnk@&blHExjxU z7UTdp#uG0;`|HTCn&Pb)x)Vz=DxS1itEHoTPSJ}}+@>{QgdA6OHtSNkX4avXvoos| zuI{%cNng*ng}zosOW{2h0LzRN0)YEa{h1MjbTU%DJW}p~B;%9s`9+EhlSCj6XlV?> zL)?7}W_S4mF;VUZy0)QkbQhe~+g2W6H35_t0FdT!6cUAb00dcJ8OR$OrBS!Y;uc6I z`GWfloeCvd3q&YLxCmTLM_C<6C$1)OaOz~XJolAFUVoYJZKVHhi&K`ljX9h}C(-wx zRw5X4rUI*S+6313uB(@l=X{2)+BC5U)WlVR#;*byuzttLuMMKn0N6H$ z7b&|~%gC6A@7rBJsX>yv$3i8dV5qtX_kg#92H!6A217&^h0@;@z+b8L8J+#@$I@oy zIc)`PF_Yyn5Jp@g&RMR6tE|qu>28&0B?~eZEu^h0p8)}|%PLz)zoDX67}yMyKs7;C zxZKH1voMh1iJST@6j;}CDWW++1!f-HGr!Apa-k*a3Q@C?A==mSbd{Cj0eq5A(_-x^ zB~)B8XPcdw&B(YsyIN@Yia1BXj4+XyKr@>hvEKm-;`3}4SIUjcsZoZ#`KB_$fwuJ( z2EExWe^j;N(ivhh>R-kH4AdF?`IU(othzc&cKZ_qqFrI%7l4}fYR@WBN>P_pScw2V zD0o$NtW8{0cHT^LSt#ZR2%it7Kge(T7;K_2(X^H5=qPbG?s}AA*^ST{l=MC@D1xzta zA%HAWA3=gZ@IefS=Zcr(r}yir+7YYq9kfs1nTeNyCIKfFHy_UsQpj0)V3Pf7^!*OS zN-wlvti=MCcAh3#sbY(NTT+%=Ts~}1U2X7NSUdgUG&$be9k{*!$#Naa*5x;cPKvow zu_uu;ixkKEVbUYfj#pslu50S8LSKFn&8`m&aCDo8|C(L7*0YIqyB6Rq=yLacgxk_6 z1j62*R?<^neR=zX_m@~ypZLw=Ir??96=BsJBEKw43(UmPy`TZ7?Ko1%^SL^e(&fEd zJ$~km7dz%_hcGqm+yOo2NK}cc{ey!@>O=-PZT;3wP1r{z4ul9#bvHIQR&)n{h_Vcv z9Ja;}LEk323rJg#PlBXDAdT9eqm-Nq^#f$y`57bwy?U8CPl;^0rv0>`HD)*`t06M&!`zwM^o*ENyW3w zb1t&6y>4kab67VyDRp?9#x5r%)pjGHnoXY}W2M(D4>OBEXX&B;8uS(lVrQsOq5>*D98%xT>dS&g(FMysm$G^*bvF^#y2U2zl<1*HYQ!~%pH3*jY_}+Q`znIEi7>Mwt zgnvAKY%~!C9`fKduVROwEF4o+1!5~)D@(e6c}j50$gl-@9YyoP>t=e#5$K@dafrW# zouy-9i#^p7nRuj3Mj>3_D3G+_RM3d7g75PQ(lQ{>bi^>* zCAZ8W4-O9A+7Sat=|cWw3k*_JY0nc?|2Z@ScG?aD-TXvf-?$w65P^*FV_Ed72{jK{JqIOC3>vOXo3EJj*f5OOkvBZ57LH+*8Xx#lQfHf2*>zLz27Ayv_ zVA%+Qlp;V?$uWC%gHrR=k)*c~YG&KU<2c^4Gv2#cVg>5dgX<_UFswgV{|pr{aB$p^ z!p{7gRc}2Cpr$R`;umy2-o6!Nco#F=Hn#oRQqMm?TG6EC@fSc1_NRk(S|mgL;^phJ zNw7Ijc=bU7*2@MpQ^N--Jy~PcaEF9Lu| z=MvJ=2tMx2ww_m%OiITR*j(#-GGxA4osqPJ2!|uO-T|3`2FVVz! z_x3IMNxhfHC5-4>Zm-ERP{a1{SVANAQNA-BY&800?kmA-GipxHq|j-Ko5nl4n=TCBug2Xd(!k3deHO&+V47E$}$1F!75z-boT(pG7=3d4X%BOFGQ` z>=v^1^+iiMQBLyS++>Yov^TLk7JYLalBIg8fA+)cx9d?v^80YV4ukgC90w+UTDj?& z1(|Zf%m|b0sUrH@+Ye_9_0Ign6BdOCB0JEQ9ezUjDb$bj^WZyOzI`D(_irrbAmjsH zDs@&JdmFPc{63Gbi7jld;jBk%&C*!@4e)m5)a!!WF6()U-t#nT!H13}P!I2UWpHgD z@a#q$p`;HQvvECu!?NUNEB5y3g zzNU9rdOd~r`n71dY~;^hzTE%uV$EmNc?%{EX<>c4nQ`KbsN>b0obH6?LCsjO7g&2vN8_-{r$L;0pd(f zdHKbvs?nCQHWz5bdrs%k*fc!h($5~CKvm>$?n_6GkGEJ_ z>~rVI6HdHX3Y2UE@%O07Q3JNs(^Prn$Lmk@^s=Dp z^nGaQt6~IAThsC7xwWVY#7)KF*OyWuBNO}OlLI5G`sMEWc_U@esgti+71(b4*&ZU_ zc$ol`rm_3odCdH}YkMGVfT$gWjwR^*&4&H=3;X zDynzuW~*`)Y%W{h##vfrTaI|-0q6DgHi4bN_<3SE4UMvE1TER)x0Z`yb5zM#t%emp z@4e12-O5at_6|D#Xqufy< zO#0v#*6~zqVDXc8dWWtgh|{|+O=w^lB&6PsoWZ$z`NN#o1&(vmgbEXa)_l+_ZpKV} zvVETn6S-u!_t@(Qv2h?;h0Z<1qinI{wymXZ(&CcfDqc?US_toVJM@o1Syw$)2!@K&D8ff*af9E2*2-qf{mu)FuVfZaDsh47k_7@A^~K+s4|qe;fPg4mi^ z;OH`;aK0W;{z#Z!D+iqkLq?1H-d*p^Icr0r(=RK>yk4kO&>T(!w_f3oUl( zJt0JYdkkAhOUs)Kyh}JT5-|Tu(w@USt$@qRTUb2Mt~gaRX+?K&p0ws^72c9PxA;`3 zssuoG=cZWXO-7N6d1R&5ja9-$k)tvT1InV~Zs`jHHQV@qDIRAO=#s= zk^=kK)EWocYkW&<;VkkeSd&AO--)9oZoh4PYG+o`Wtn*gIf4$46K7Th4PF<`(RwG= zd*niR9BD6Q?4Q0n-qE%l6VC##_Hz61;luc!v_X_Q76V18&PzL4QNj71p<#i_L3l@_ zR*3KbGdefj!=hEWLs`wV1-CwRgS!~%x4C|(mc8Yeh4nnFXYsYfBiuDar=Ih_HL?UNiW+^L|_(@M3&RWN+D_Y6yy0 zHkBZ<-EhZN6f$*rycp{!XG@eKNr|3CbaclfH|lADckEe+_tzPCEaD2}Hm@)fAVYtm z9Xf=lIn-Kj7peMBFT+^|nwYz-bBjzugn5Ol6`Uq=pZx)_n0-OYLwKI;-xS^0$#Ohn zn4ydNw*ZpdX$?q_Zq;n;je_K1^kECem3`cWDay92pn){Mo@Q%7D~W38d4M5uc_1vGq=AE%8H9qVN-wp*y`LiP zjHpL42|O+-5IV9$CNR#ytA$#gG3XDp)en<0{HJv*o@q9D!XoX-kkaSvQ5Tnhe$yre z)^jj(KCCHyBrZ8w$~gsP(TkDd9dK7gSU*_C6BvS9_A2`J=+3*4YWz{P6cukJ7Ldrd zFY7P5*C31nVhb^o_pTf0+K4Vx4P!;oo#qqwkkQ(SocH-%P535ZIegj80gHh+2aUfW|jWZ3G4s+!th%?{9<^+&bs zTPf(EwYTolK(DwS_<%Qyc^pQ_CJc;ve&5UNR^bTv0+)Rr@%-(7z5rtgQ1;O|G7Z<* zCPK7f5}~m0Gfmd2RV#XoJPB2Q5rnvB?tWt-60)LI9tc?yd4{#Scl6u6)s(-q3E;~CrB3?A^y2htB zsnUGZQ{1n`2}pnQbAr6=hfhx>xfoIYz%Q|hx_l|b1WccX=OC9jk%q-wx3%IA7RDAw z?;Zo?uUIwa2YB1(y#e-yO8i+hn;`gv+=-FA2n9h|H0HXdy2^-K;z@&^s5U66;80F4 z?WKRxAUMgJ#l}TI6J7*{Im+S3rCPhNk$>;ocWsZ#D#j!;T6-bjyayn0B2i6TA6{#- z#4LJqUytI5*5OOE_>LJQUTR9Pzh^&fWln2u319p8PV`SdA4|GfNImsmIA>p`R9NtC zX?KxI%Urcj(lq``E)$ISgwG{7O=JIOza5dfrw!}1R0cfl&p?3&%y)VRlr1>3N8y$y zK%KbSKcu)hJZp;pr}L3Q_kzKA#Ax%D!#&~H$iS;y>y&?K)#`Uvtn6cP7h?*DwG#g?mmbD-LlMdC#R5s9`8#XN^Qri!ZfjEW? zoa`xxA9}*(^(eZepU_Yz7r(b!D815)%ePP>!pHxn^FJS;UCyD`Zr0IzN`gP>rIVCe z(!3&R_&Q5;y9J88OIqh6CqLrGEXx~LK@kmyHGCxng&{%sIAIX}-B1W>tF%maE!QTa zvXTK*_@kL52P;zcf{N|*O`hU7;#1m6Xj?YFA4{&e>@TV!*ZVI}us zKQM@58`hDFK{exOZ-SS-9Ys%KQkQ{CTL4~(?%};JXO9$E{qV0Q5`ZhOFVi14l0cc` z!%j-b^yv`_x9$!(Pq>0FBhE?sk*$7k;-} zu_eBIur}oF{tZ*wK{%*F2%9%UoW@J<8%tNo`A?$AN)1oSUAC0fB4{}R4s>$c8%)F? z)YtS4oW%;L7u{EotE+@|ujyRVz-_gLh6TON$;LU`&^XDMz&>YDw;Tc^W@#t=b|c4T zjL`IpZh@|2l1GwLhO`hv&oQ!(w*&96`yJfv#k6jy{ zj=mw7Hr={LLHJH6_SUYu$;TvA*F@8f*vWjpzw*|_^>*bk>?nWk+p@!(A(pUg^z=;u z0x?t1-Ma>1*7(Rsxz-#Ft+1DV;k=bNhweEB5Rb7VW_3Otu92MnEtGm{WXu&Iz#LMs z{h;-8>cbQ%GRW?RNt5j)QrfefSrK)^^5+vsbM6!YZtW!#H09FWx=In_$*bPU8DYk) zLfs0UP_~z(;^wg(O9Elc-gzWI+M6nE(0NIAuyo)MW4ZAmLP7c}0%B$BpG6ue8KSM< z(|4(rruv^2fSB=d5KB`3JD7^HbRvP8hJRKAP+OZz?cFC?`)O{YCg zm3K0W%7K^V&-Fs7CfknFH`5- zMQzwW>r9!|)@qEb`3#kmUB!01oEdOdM#XPjdB|56Zhq!beIR*V)136~`Gv~+W2f!A z{G)}1=R`YwN3ZPRObrA-vXpQ8rAf<=rmkx9^8{LIj_EH=6}8GPmAU;$^gi;U|I(6t z{L}ROm6ucySGJ}Z<4v=O99E7bMI3U*xKNy>^04Onu`geJd%_AQ{3O!9Zw%TsmTLEs zgn2zZex%W8%!+6Q;!@Vsq_O$cug{^Co)8ws5ooB&KWO(e9eZ(G@qN$N=to6X);OiC zn-@2bP7@nCMqsD2wus{jr>q;YSt-Ru%28Vn=pRU*&V!nb*Dk0*{t`cCuQ%Q zV7OxRP*ucw=dHL!ZGG|OcDcg}tSD~G!j?`q+$t@QS~0>Gr=BtwAf3Qp{5FyhxZJp0 z@W7aGTCPIgxD(673PdgjIwpR@pk$Z&bC6+6xNH5|b$-KA2<{XuAv61XFiY5~gjhgrKvJVM(O<$oK>S6B~q(-+i-4pdF|KQkN=`thL^GQ@_*#2Y8A+37lD9F!^ z?%bVQ&-li@J5cL{ zbzXR}hN={mXTO{nZREaUBqdsvk+hU$frL)UFZG` zY428QNQjJFIic6FgNL>+#YVUHBnsXmY*lLsqkFx+NN`u8stO}Y5`B$?#8!F|S4e|~ zv*s(x>!)m*?ii%b=mut-$xl3d$JnQR|9-IZua3BgCVV-baL5cjO^HY0&MDz~n{}Ic zxil`x>Cka}?hAnzRyd5@nrdwPIgr141P$iMkZ5OIP`MFJCwJwnYnEJNIgI z9)Z}rLYTtfQy3RzH1&o7H&_tNQi?`mF&J+rL*&U~y3=FqMn&ke`3#fcSa9+v7SOne ziHl2df1|SMi&q+V%)hMp8~PuR|c|LTnO^h!f}aY z_w;G>i)#_$r_yF2CN96DaR{$Ru~oz#X%|x0#qX^=UY6tV<18e&;Ff!{yA+ZPlv?7J zd#}!>Gw$dPLp`rlRK7W(k2@r%J`ztLQsQA9abmqDk1e$#?*jx>`V8lgZfy?wNg%Ss z01S`lo~`9c1^IwTrNY;(w^dD_FalH{Tl zJ4R0&;*yw30R)m?Gh+TNL;PW?5t)+XSxJ?bR0vd`b}y9r6?(7b`O0m9_kp z*F1i>4ph7pBTlPyn=m`_4^^6N1(C~Fkb*AQou)1FE1s!`6aRQGg$k8{&hW<^OEhon zJajyhA{$Wu&0Q1op2MN zZ%jYxiF{iRmj2R^F830 z`2x$`i*!1_YIitTPrFap@Nr*a_;8bPCGf+`lqv{$B(V+XayAkkCB42*#58mo!b7eUmtm;DNywPDC; zlQT0B5WufZI&kt(huh0&mpLLXPl+C1&9<9+#JPP@S2J`^#h+R|DC<7XdUO`vgx9}d z>8EmZhNq7E2P2~T$5wIGH42CWKgw%+V@l#yh2<8;%4fIAmJH5yF`4ZT zfU?(shLJBuRxM;kV zG*hl)!AMRNqXsV>w{Q^!5E4wJwig2;PfCodx~{LgD$zVzwUuLeq`vW4e6f(TjcfRm z^!EQYIFoIO3d@?qvgP*oH$gJ`zDrWh_e*pnlU#Gbx3bHfV1m42Ig?tPa)n$l)U(oa z|IllMS)QUZEyg@Mrr#KzK2`d$WY-#q70>3lNa1a}(lPz|Vd~*t?;LA`P3vaK^UQP- z2C(zozc5zL*YPSdv%nE?!TU1t8!?;bRHtgsTuX(9^7x&50%lGem=Ea~(4q0O*uh)J zD?73k8J@*YgF%;Pi^JY%B_N%pjmx0UZ^Bt5dB`gF2`SmBuNt%caVXz z>ExE=6_i88{SEL?460ofT-Bbe7u*IfZ0)($zABq(>S0}fd5X8GpNO0lEruymg()w>En|*VS0Dp+yaQ- z;a|4~U~pXeA9|^%BRKyTR#O}nS*A74gveXhq&}1#r-0mc{&A`MDE+*LzcY=o{_=&c z@kvY}vLxX#EQ0;NJ<+jU9F>Z0N9w^9wv@%rGUpf3C&@n>8d!2R!}5_a;<6AV%KB4E za_&k7u9S;n>vSwoy|1_87p?*?fWR}Djf3z?;-Rp(Qej|f^O_b%T{>mvsH(o@QHgS- z_vAb_=NP`ec{@r-4WGf&RaF#r+~5WI&6pS-JVu@PNrCuf^G4`t3j@bkHT!kkzt0W$ z_qmyosxKvnW3}N0O_$?mJh_Tb9J(zck~kL0uRv5CB8S_(mxJrEM}PW}sJb5R+{TVm$0_-KEr(SzF&tP4}H2P)$J^Biv1?vVUhmpg^8Kjf)OH{(RW=8@3Vo5(|?X;mJ_k`3rnDnNK{Y^6^h$`$Ds@ki_%r zG%kuPc#eG!e8hJ!yQ}gtFki^m6~ny=^7c=e70h0czT%eC#yGYC2BtTAgXB&MNqODN z#{QpISl-bdeG5AHHjbIOoW5#MEYQ5>5Zhn-QA2t(w?M|QuDW^kFnX?tSmd#7kljYQ z|JRGiaU@%3?kyvj2Cnr_$}&h}LOA>6M6YWKXyogqK<=i7;_ zlK%Af@d}oH%^hhZBHJZo&O_o+Wh8%I+L)786@I;$3U*vX9V8`agEvb7a|T{E+6L%% zz;WFuJ*5rjk#RGcS!NWuJVIE>uIlPlbBxE{SM!(csc%X;xI3%s`ToWJPvarh&&RJ5 zc#(uE>XWk4J;GCG{MHL zb##+e!asZthj%-y1G-Ub^Zgo5z5+xgCbN!9TGJg~MiOKTllWG7rS+U5Xr*4s&8E=< z7>DXgrG5+lxr)U|;DJh0onol39TR5q_y9>?|oGC^#S6LP|y}C zDEAlthV8)KEcYTymvIE>O~F&Tou}ewlG))@8>X+ToTp@$PXbvmo{qwJ-%6S++v!Ng zp}F>~M`aiKyY2dZE%$0G#|B;?YR3It`K9bb`qiFYH71c|7OjX2YPKCx#HJcayb>wV zSbHLvD*xS9;O6+vp=u(-*%#6j4LAQp8+@@hU4D^@r%LIzyZ8sYSF)4Yl&L2( z;a`hp$=`}|@UhCDpbO1nE~%3xs5OJB#akH9F%b*e6$hH9iQ8^L27U?#|DPnw0oqUt zpUR(0r5nVO1mV$OlfW!n1MK>mv_fjcnz#$*;+%^>+aXTmt$!q$+E5txF;mzimaYQY z<2hkH!-`X8Zy6` zlqoB*eq=g?=2Vp(Z@tz@N0U^3I4t5w5&_6huC$zZr9Mco5GC1;-zKIt3XLalFn)v=Aa!CZ2Dd*zf^rYm~qW58FQ^ zLKB#U(*VrT8inw(x1;~*!E566Pa6V6K3DMulc1>pxWlCOxtJ7>ltL;wol@|Tk>2__ z$8egkngy;;7gk|2pzeSvX6y?fKfF^|H3n^;7dKd#ysOJU&d$A0wf*HT^ado*!)jNQ6s@WO&FYvQWt}{0m3Yb^3y`=dj;6WXKz~G)Y+R*EN%No=3y z%c!-8En7LgWd7|pJ0uY4Id6K%ye5Wysy~pj*^g79{bTX(!HJ2@iQAKy#pkbyMVF{D z&;8QG%noCeBaWE9*1=`G1v~fh)P^`Ny?%pF;a@vPtoXasw$$v^_wsO;{24|QpP3cPu?9HYs`M+0TN4`2u=p~~&Q@>97GNM> z`fiI%wNXPY!1)8>VAST?XzJL$ukE^3irdVs6|SHiojJWu1KV;Yo%uMCJJ>JE*Yw=d zhQsP$bA4YY&`Pe)xgwbzYKZx*e0En*lv%Bpo{a{uNblDZ?O{l9(Q=enckE_6keCY8 z1}c5RP00p--!w0B+WO!r?5y*+p800yITBhsCF`o6e2o;EBk3-qZ9bo4N@@VdvYyXy zbo+|0tfas3=|M`&pkR)GxXZYU@l)dM3W7VsX!CXsh@gk3vnNi01qyP^21JO8(IiSC zLalMMb%AdR8pNIUh}qKvxm)(QPqSU#-n}cK=YZsJlh9@cK)7VR2vIm zs7h{Yy0`DFG&N5|HSJFcaBt)(Zt2+}tVwRsFBq&f@lw|nhs)t@-;XNNEygkkkF|cR zH!j51Rv+Gmye&U2*YTH`K9iY4n z3)|t8kb^2O2;@9eQu^(^?;=fc(X7=!WC$7zzMAv8uT${P(JeuHPLx@Wk?4(TuOQ1s z%bYg)B{~0R&*vWIT)Qzo8r7{EVXlc&0Db@k4NOW%Sm!Bc_q3x#ydORpV)td@mJ9N#SWUETDzf9~jzMpYT37?* zBrcwDHu-*JlByH_Lfi!T7g}W@uj>iU7;evR2)VRsmS=kY5W}Wlf>yD||3JR9rvr&d zL$1Px$cvd|>z}f`mA#ZlnoxZDkKU@UTK8v%jdsKOZ)n_Qv4&R@WO;++Z*d)04{GlL zms=|8_{cTKouCK(=S-dDf*bu}&VEucY#ZzDT6ZxK71XMm3?wy}3T8_Sy?gePt?nf= zL`frAadkT6IjQstlI3N^7vUrB^JmmK{__P0EB$Q76)LgdP9<~W_U|YA8ysC2-^r6O z`ncGMLy#mwMPEV^q;2_*I3`o{T2kp=Cs)ze_cE!KfI-9q;SY_76Twd1-Vp>(8rfCi2;lht<@A*&@Whw9`fpBEqOPTU^|2I`y za=;jOda&QYz8}X^5qp`qEL5G{vmyNBNab5_BO~eaAi4I~*vgcrcSCQYe4<$6?t;I` z=hZWw-clJGj=d(7jO!TXP@xp(sfD$mnp@@{-xn@J@x{3BVf)Umdfv9&NiwGjQR#*@ zOuVSo-aHuZ5-Z)I#3vl%EiR5eJaOLuF0KmegUyKbCEBZ>m*%tsuvY;)aWL8>S$ho} zMHS+QnTVq=+uxmIMqUkOk!ne;`e7B6+C;#Ed>c?hH8?Gj-DXUj;7m6!nfU!b)pB?b zt`XbH&-vNT^(uS6ckfQx9h-Jor5Ynx?8zL{1KDc`$3Fb^Cw@uTSL72nNBAz3Cy!|J%Y#r+evEfp(&?eXKb}gIdL_8CXs} z3VM?0mD#-o3uK4v{zNjUEt1VrCzx3?^5zRXc;rk6F&xE`G*kouvVO?s6{n*6Nv>Jx zPxukB7cvvDNgW z2L($MI5!{6RHB6N1B*}DS8`%CVI|S72leXuO{?;D8~2Hj(C{Uo4F1lncACfpXdyGG zprX-+Rr*+$@eRu!fg~c-1%9*WjLxeju?|7FB1la5G`WDwx$~XEk8<6kLfJCJz=%<) ziFfEG>u#p(LJtw}#h_4jqtw3T7Jdn|s2xD5wWrmrUs^^+VVmP+;t=3{RoEMGLg8!1 z=Ky^345vVe^&X*uMM|#GEqk^&FaqE;U;lzE4(Gub4)c~B*nkQd?pf2hXl=lgN|0ob zkH;s{wO~jpOOgXb@A)o@%620w)dEh?JFfJ-6c8dF2+&+%oQ*&6ty`ze-7#%3Y>xE( zo!&dfnKWDpwQDdiE}2Ea6TOhElSp(OXn~R^uJxUSaCbgb)i0g=gZK7PWsD($PzzoU z3}PRIYphfW^&mD48VOE~Cxiabdq=C~e0ZJ?aEQtquVTx-xitcnGs0I>LuA3HGZ=;l z{2?B9n#@E1bmHxSx&@%bqm?W~Q%4EF@hYR$nsx7TYeW`hb5Pu0@uLmHC?67b_g!}% z5%7N+N$kB9ZDZpIOU4^IzN4(@drF)4dD0N9+JuzC%Mk74^zykHI#?AXNb6cVF(@Xp zqn&6f|9fO!Nem*wal}LEuHb(=-yyeI#8kt>%L-yQHe@j7%c|WpSN|a*RELM`a8o9H zQS-YiZ89GUAljBSl_*-`FL6(SL5SF5a40Ocjk(0?$yr!z*4hs9s{Oe+fM(LPCAv<1 ziM>m&at8rom-Ci3K(hXmihr>e#lVTJvS?YCN9!9hyWZ>bsNqMhr0`@IT}jg{H{X*i zLjo07Bi;!B{lr6u%wpwrw_fq=8{c~#&+EDbl0w}2^K>GHk|yWdYMN$2%Gi;2Mx2uq z9E$;CV}8TRK|MK9;-QB4r5Eug;#8rBu}vrLwEtptd);g5A*&PV=CEVt-Fv6>DMEg> zJchu3Q&g}rwusXOFOvpb1M?l|n_Xgw%wfS_Xi+&A#n_z=_Jc+0 zozku?!9xw**Zcnk{1k_SK5l7)omoMGhvqz50yFS=4qlXPN?z!SDM>w>8Ne^yB>q3RD?LYKbUAc$ zK@P}?JHCBi?-fQ#Z+|vj{ynG*P#Yh^Kvyvf@9K9ShBeoXhkh0CPB!5NUY0~QPVvw(~7Cj;;fY#w9PeiR|}3gFW+X4 z6#6jC^bAOUpQKK00U(3HHOYM&Y(0m5#+=jk>*SZEHQ7T#8a*4cjeU`+$zLo)DP9|U z#y318)rp#&=i}lxd(1s>N|s7ac!$=Dl_CZ*fu5 zGS86N5#`L#bOd>pOTY83vBT;eNKl1s#L0Btlsk1Ik64&p(?48k@RIo7&p*y$>GT0^ zD28BrIPsE3$b(SS?+5^@;iS7F8hyRG2RqV(3(Wx3TPLP$(YZq>L0Fdf!Ubsc|Dx+Z zpqlEss9`jSq9Prnh=77LLArn_1XMt!iy%mqE=544NeQC#CZKewO7Fb~q)Ul3flxvR zsUn0DLUQ-P=l#C_-tpgzAu-9x$vL~MHRoJ=?Zt<@s)M6#LwYPzKYIMQzQmCLYql#! z+NwOV1vyPSfjN`(kB5obsq;=7E>g4L`Rgw@P*S5mEliE=SB{!g`rGZC{j>Rwvq>o? z8hw@5`q2{~N}8x!LTDHyX#-Z~)Vr~lU>OZW3jpwJ>3IfbHCbsl%JWq10)Wh|jkeZ# zzKA|`GeE8hx;Zo;$~kIdSHH1nk2~;!4_o+B0fh!=N1*b&1mHs5>jO;SMAPwgqK>IL zi{j!?wG_T*V;iLp8VkuTkX0(II@}!8XoE`YwH@3SsF!7=QoaoM@%cb5bz27u6B9;J zP_l(^`VF}r5E(#^lKhcm1N28o;%Yy!4q#5ukn(`S^K%dMSL5jbtv7xB`)z6s_)#Zb zuSkGTO2I)sb;CEfoAe%!h-L}Mbi7dn@c>Gz$;)chbk^w;`;||%0agtBLe9y3X zOz^nFKJ7%dnA&MTCop*5tiQ#n-Y)9%$k~@}g}c&G*P~zaavlQ85B1gCH?A4xs!#3V zN4aPVXI?LA*n!6a@eB-75de!j1p^ctI$(EY-G0xW*#V!?=nwP#|4+kb^p3TzbzGZ$ zchzmSa0`{lz7PIh2VDFDxFcy@1VfyKhZl&9D}uSi;BY5J2G|-hM<*kI9#9v^ZII>MOUeM0XGvrntD&{|P(fIPfd3S~1{f^6lq5wc0UC7XW z*jw8r1{cZT{DMTMtdl%9rm4x|y$okGu)%5!6o;ShN}WQT^d~Vu^u4_MOmC}d#p_&7M|dpPhlK3$BtD!v&BI@rhs=dgvz z;0H~iDW|fyUy4+v9y5I2h#na#iPq4WL;q@p$^TgDQQF2@bfW&nZnkR)-<74VlMbGp zkDmw!?8zN)ay`RmRABPUd708=W{J06axXx@*S9RJJ;KHQ|M`<1oy)(eFM&J)jTeL zGFrQtbMeWy2R|zL3yO$Av*V8@s;uw5ntY=@DQ^4e74D546cP<5x1qjL2&jxRp!5&q zbaEvTn_Ci;;9h&WP>%Sc+iI=FJ63r}uo`D2%NDXql5s^(t!D*|_Gu>rjRs#iakxGQ ziU6#+1O(iQTIxJr6#hkxpyo#cxBSYjA2svV2P=)|Q)B!gLJ4F9hrxmmNpZifgMbN1 z+CvZp1Yxb1`6KbYHMSfyPLvAakQ_J8J9E?3VcS@7$9jGAwrZ%${?}VS#(9aPDrRzy zg9pOFhnKBW@zkKz)nhv5fumE+MQDR_;3scFmjeb`YZf8n5PDs9m!8(2GBR8Jxa98s zrqNeGv0^=y!XMYUZPBetd@U~{Ox3$Z`3xrOxADKYF>B`=l*qe6MgtSf|Dg=5uEqES zXXWclz@sI7d79}O9 z11isXi4o57B%-CR()1?8X!8m=?o9@r&3kId1F5a+q8zio{6^G5FhD$(8@(V2Ms1=U z#CL#*YK)8X%VzXqcw;QK8`9IJeL?QK3h}Y&uU=uuv6D73jkJ1?jeOm9<8V#i&v*;m zmh-lT$jr*zZmn?%m=r^X83b+fSE5;js*+q{JZ?hdCeP?F4zx%nwQf~mBt+QiN{o=u&QsDm9`YI ztG`XtA>F_7OyjpseS@C{vLtF%(P&N(GfC z2&supKw%{iRhW;7NdQ4daE;Xu=P{p9LyyMa^nb!-+slkDTo!UYwt>VRX*xAne(a(k z-aw&kQd9YHky<j@F1==5`Pv&iYhEP$1JJWe-%Ke(ve$1< zSg@?y(lC?hL9JcMQZ&NMR`q43N=9!6=In!Yt+Ima90{_x3_!=*lzPh`4|Tr)%z&No z<+k2q1PsH?+p^g*_z88P`hcn4r>3{+<7bVWPWbS)@V~2rz^!6j8ml~*KKbRoAAogs z2Nd`>B{MB?|A_EmcDbmf>Qif1-iqJNI6OV%s&@~X{dqp>5w0e}GtOHnl0J}_xla$0 z++j0xQ06Q25TgTC2A}Ht*9|}NJbin{DADp4L7XWRev^j@_EBecYQ^4GwTK(Y14q8V zqviGp71$DB)AQ4D|5*IlBsc_>z+(Z$-Qx2dXngYg!$Uc+E!uT(o#vMM?{d3Ye*eFb zcnQP@k2B>CP^hU>+_+V=I_U^;lI#I+M5f>L>1XxhWmUhQkMQ)OtpZ&;RQM#{3FY1( z|GhMnq%vB52=ZZ09!wXXkUkJZy!xyIg{xume_P~eP~FCUU&D(nb-Xg~01+{^pFj)Z zf_vTXdXPa6vLHG7wQ=O`0bx$>qSWxM50I{nF-ZoYbh&slpGk<@fqu}!0b_vR(|K*}|+;~;0;)h)P{ zzM&}Ny=g=*@7Zxtwoa&g-V~*f?4YN0dsw4$&MsyioTz zQiBR={deSVfet}iDcE^O+1qF2I@*94yUiN<;!}(&c!!mZT3__I-TXKcNdN~k$ev_5 z;c>Ma53yX5wc$9=4LkI5yWIdChL3|*gP3oh9>lf^(Z)=#XOMFRI>(r#1Dav=@_)26 z=mF>dA(LQv$RxC8^W;I%=WfyP*i}Z?d$QbtEenZ_DE!uj>Q2ZAs<}J`J4>;JtKIvI_twM9ZRP@rBC|9mM|!ED>z6A)<-jDm)RXWW z^ebI~@rQr&^XW+3S!vLnb6A^j;Y5vuDYR*?CNH@WuhyGC6de>Ud50^k_r>N&!N&jU z3~YDa-yMAz#BL`Fh_-KG%bhu|%0a7s zPaX@I))O*syv!J3SKRj1D}1ox3!BsDVJio1f~m637VVDxYkfK^GUuBoZ1`o|$-KX8 zcz1AtBXd=np(apkBWW<79vwICQ%*8Zt2r+LnGopIHcGvnZvNLBdQ!nNzFrPwkJt>W@;aGL%4`6DR{Y#rrewKMRaV$pFUn4G?yi94cueMJscdGNQs6 z>~$|58P9whmIglAKJrHhlq@jUI8!fP$Bp3;-gC)&^=RmtkjsYIV&+9l>RPNWYechMWu;>&;;rzUA+ zi(drjw1QPD^T2N?fgJXDer<<_lG;HXyt~WOTod@}qQe~rb}`KDwXGy&m3(N{R~pWd zJ@CwYzMHIi>y|bH;0E67uA^q#b5Fl^FiNFZW}AQOw9QLS=6{5$a(V0+pihi7LZm&X zKV4F^2S%P<2iN>(aD{EW*GOTuc>>=EQ$rolb+21#{{$qJ^5yr!8WN`RJG-}nYG7A9 z8AF=RU!5+NA!*^bjF3Ob)OY);>W=Q}N98 zsJ`sICCq%TIF{$lJIU+jg9fW!{;aW* zz~YR4so5SYCO-hvSha0YHJ$b+zv*1o<4NB&N3r%Dw6}gQ&@RFqhJ9&@dy<3GQOfK7 z=IwpRE3qVp`GMnlULjBbb)ZPhEUKw zRun{FN0&?$kFjdmn!_gW3n%I^x@M|!wGRR2KFrQMr87&b@P#)GZ>+p9a zog6*l*ba8&+32W4?+YZ-p_gLp(E-XWh1p)O2A9#7ak$W>zySh$4%JhDl#JCnCeeF_ z81NmCO0^jJWfE2zhSROWgmdw_k$+hm!qfh;dc`f; za7g*fHSM8+LiV@+w8tJV5|LF4D*GMv4pa2~nf664wLxN>z!u?KZmD0l@Zd}2SnYuQ~yTpu6eDk5-N zXLLx^o&AaFM4Gm`W0rTNT3|FpebGPRY};5N(*_T5n%!-?0IQkc-^yAg8%#NfLI1Zf z_dzKs`Av#*sdkb3(+rGlV_X_1CeU2>*ZiL5H^UC zE-N6^{A4JxCAC6g;iz6*Xoug}GT+BVhZ8B5)lbU$VKTG9z!*7C)4?5aB%_>O?O>Ke z3B>TsBnV}(B$tc~h*;~TBg^CC<4CQBPnHANtdm2*tpjqq(+}yFF&EH4Vj< zrHOg1i{9`4A_HY8fB#VL{5~5LQ@5*vnhh!!)YZOq+1d9@Hm&xXb2jugSC_z!qN#6g zj_vB!^9HMKr(VpQVRf{xf7#*RseN{#^8qL`_?}}Yksb)9S8o<++}RjoZ7>m#{6M7x zhJ8>WN`VJ4TK$UDX5&ceM`y1nG>vqpHzp?QnKwoiHkmejIY5~H$PGATAg_KxP`5Q1 z5UlXs_)8M_{bjr-8+MkMF{8UPADp15mWyOD9~c{bYreg)r^jFUQ|M@y$t1R8RXFht z7?wp@b#!CeE5{?JfL(tl>klit5j^^YcaI^1;+Hr4()EnZ*k8m7m%gm5SM_$YFG;Yx zuMKyZ-ER!wX;t2}1%A$^4IXRvUYA4u8uj#jfqiVw>iyn`_*KQo&tj2+CNi4}t5J8U zLFkC*is5Q8u_S|JaSNB8holwnoB>mA#$zu#4fE8y@hl|wt{q282)}!Q<=Y&p*w>!y z6k5cPmTu{4cPNsH{xXA$mFE(x$P!{$cuz?#TPWyL(r$05{`>F_<;S3B(J2mvNxwC< zjb6NH$XXq*>MzTBkW)&ato(}8-Z?V@qk}sP`>wkNpM>AN-f5w_e@Don0_GSxw;D2iYPy?9s8ro5g&J>*5EfHfM!%Xvp zds+x@FM;2Y8PtI%-VWT#O`a99k8pMCJWOV8-{4qy)%uu{$A_N2>ZYr7jf|V~PoGe~f82%2=+@@;BZ1RQ0K1#Dq!a{@{!W`k}S5H#+ zZS|orR8ZrukfSkLqJF6isj|eqw(bvNR#+9K*Fn%~-{wirK{m1LwgH3Q#k4E>2mIi$ zSePf@)6xlZT6%K;nl`5#)s-a>>w9`Gxv}~cQVmMtFCV*{6$@g0Gk$+ZIV}95b7i=Q z7WH@qR!U}9{-|Lc7wV2XfC&~N39^BCgmjq?ejqC`=>;hG0npp-z@|83i1roM&~)$q z)o)$t&)$yc$reO(;tWu$p!v1l{HxCn4UP=HPHt1E4WNfs(L_`_;Bu0rXx)^*!$W%Kn5a9V3vwn<s-b?p+j>6eeH`1A@K&5)&a0;gS zru75=q8M01cr4&`KS#%>t?z*29>O;=@!!(Cx=3`r(oqK}Sr)I?2r8+obn@+EH9JI=r7oh@Ah-XmH1K}L) z=C-gn)nr}kbays6IBWaDI$p%qRj(HRaKb4>TQG=FVa{v08C-ewE^TdJu`EP?_VoE&Qbc(ICC`9>yLl2ZqL8GPOHG4^(`on8>@2Qg+0h6Hh6@7 za+q+<8;z*I)lXG+{aAh99n*>Ht9{tntlg85>Wp0m&3W2(*{yHgV+b;b7khOB{dtw8FG1e*VJD z2EDiGhrL=YZj__(z%rRbi#Bq!=B(t(4Os7NtF!zkS8Sqpn3BD1`JiV=s|dNrog@9k z4_tYW+KR<9`WbM0AvIY+&%f>(8VDZtewz+Un)*PqnwPKXoO8N!Eq`RWEk%`hIoco4 z94;V-BZ_)Ir)d?_Q=q=*}aq$eQiQL?xHi6exW}OB2 zpdYtsG6)&8Ao1o=A#%cqwG>PJm7j5#-*i|Ew0WoBjhicL_Qm}oG%D&JWZZ6=v7HCK zW-Frdono%ej3-D=4tBXT+pL9gi(T~FvZ@9NYadM__tNUNwL_cv&u zJYNbAPxybZ%7^ux!LGM7z3!HMN_w+F@$tdDQ=8(Gc}|)F#LTH&IM|98+2+G#R!n<5 zEuh33-7Z6?xm?uIdOQzmw5xiScMmPebt69>PuRFZO)qdF|0d=mkTWV z|BcxX+Blt(lp?%{6SJSF((rKZkbn)iU6)uxIJXP~6|1Yb_oc&?m+sk+G_>v(Jzhu& zhC!*R3iLFxjFXv|pYoHkH|yvEjn@|E zgWY}%+u4~j)Tuw3dasD^cCdFS?EU`#xJKdr_<+RKM?l8N=K#itMykPzF8g{r?=_X$ zCPDCFRz!HgvB*7tEV9OQ6~%435a(t-enFhALMnCIQqm#Hr~8EqW01R1@97sp&f$0C z+&ol%*H*1QX4)vbHemC!gF#$k)5evNNpS4(dzIo97s5W%UIwjl+NjRcT*`ASy2bi0 z={@HdHifjz_g$(SH3h^=2u;tP9aoA+_#Hls-jn{Zl>8&@7zIdxn3Z|3mj!B4*l*;4!@A%W0{*nt2cWbAcZo>j&+g2CPi&l zc>3eSOYKf{ueoNDc!1R?oLP4SZfFDE04Bme1_Hmk<(DAg$O}~sQWYf~UK=eDH>?IC z)hdn=%|PxMgBI413<)U&yIgaZN*n3@QF8t4@zy<$-Ad`VM}q>7M<_!qhx%cnuLFA8 zRe`(2a+qY|dI+6b#7JZlA^o89Fye(Hnh{(%$eb6jzG5SVsUJ(t&n>dw>qDkZEeQWS z@NI}0yVOy4@Vab1;pQ(ZfcFN|Z!?IktdD_Q0fpK>Lpo>N zjz@bARwCzp*|%-E+VTz*&!Qv_bX>hk&zGjSXvo=VV1Y-4p?Wh7_#tIWJzOUfnj zMi>!ct_Unj`WH^s@)yi5|IOhta7Zcfx^#vMG$tb4z75S+e0Z%Kyu6ffqnKbuZZ85q|Ki8;2Rkn=v&bZ;!{3_f{S1n~By1os5+Y;| z(`ts?^P8~kmlX!U(3YP6qWRRw|C351>pXjL@yinBkOcPLFJEoUM|7TEl}x9vxYa%R z;pqZQ-WvrZ&CXv-Y2Fy${YFyC{XS9p|M}AU_oKprV{4A6mv!2>ohJ8d(_;?p2J4(+ z&)qioVwc&$RN7u#7UqU~tL}1SVb2hbeTU9wy$u66=42bIXWuT51U(BoV^AWsD8-sP!Ke1f^TXv|W z@tc~JcY{g$t-m42<=Pc+{Zt!5QFSD?(ru&UI)(~xMqLS#yRrlTXh#00P5CET&QPygt8MJsnj=o$$Zi*$IF7 zZnN1P2Kxde@(DmruaubMX??`}ooA0AS_8%}i8$Kg*J_{RJr?*UQS4pk(=I1*yL&9! z!iEu7cr#+JmM2vYG@7b}qjtb=xz`{XxWSHS7jzfW!ujVuf7YX`B0*qFWZ2gnAC8d~ zfOb`6`fnS#fQoYV3URsJNNhP5C;?!0c%-B2CA;CdIbH?fcER8a63NHu#eo$63<_t6 z+`kyZzqkg7JG2!SJ%Zr3T)7ZzD=Y}0;XfdP0buvgZjuwNNt^BZQ>YRerd$Wok1=|( zy&X8I;b_o01Hu0SA6-9@NH|%u=R9yWfNc7htmNHaI)rlx5P+Moy|d9BI#+wf;QDq+ z1%=R`{ggs!$}*seI92T%Q0rH014CRS1ZPBY04!RXK|s4J-O|%SAhvEj!H)ids=z@D z%KT-{{tt#nckObUqWitB8CK_h=TCL|;r}1h{jL!c>kIaL(nyeUOu@PTUFZgQ?Ir0I z2bsLRy72buyI=}&%UxxGdI`A1dkbcY?CAZX@GmjqinHDSi>O#!TVauh4p}?0Y@Q9$ zh8JzcJs%f3fZhT-XMyawNSx@)$#Xq(k<2NDLHm?20o{gBx47QGR$8#{$F!n=!R;3w z6=jv$x&`h`0B%kjiE)5K@|%{N+MId*i(k^RklT{|gjPj(-4)AHJ!X?TTKC2trr+Db zdKfWoV5u)l+Z@#OQV#5HY1rekI3n$e+01bE$pG#B*xOhemcAD_eWAL(s>Ld(tn**y zB}93Csx;qkokiOPGRq0u@p^5zFbNq_R@eVpF8y2)9tX_X@RO&K%+xFuqPz2kWk+XK z)ZhQNjxnQ){tYSLHw+uh_k~HXR%#E@<+=kk04I6m z=nF+icw+T|!_EY{9f`!{&_k4Ek{qcuB*a2-$rVtvEwE13R{PN&MNUVNu;-o@=z(^O zCqsF;#n$_4bJCZc<7GYH>h)GYoCkFJzb+0jRJiFoM<4BMrg0TQ^c)Sf{mYf~p5)$_ zB*Y5!wuQhxEB$S>p4)l~llahmy;3aw*WLQe7QL>okviZ-YDZizPuSQ2I;WdcvZLy* z@ifJmbKb|T&uhQ<=$lC|oX}qoeBjMdOS8)pn00EK1!N(0S!135Ln|$>3)y$br_Oau zY!vBOHw0lq@dZ~BVU0yKbZo18X>Uf}s?6DbE_xP8<>L8sEkt0%(x!}6B!hsXtcG}V z2BB=8bQbJb5k~G060Ji{Vz1!FGP*1$Dqd)7riuV6CALsCQL?#%8ex6DJrJYtyN4CCT_xrwa z4+AiM?-1mgF-xuswaL)^dD+5h+k5skFF!EPyLEGqK#q=7bo>h)FiOD3ml})#M$Jz3 z`2c0x&CQv;nBO+tytWujbiCdX4uT^qDSK-leKvwcndUPJLlg86#j($z{Qm; z2NdDzU%dV;OB{2sQlO0lY?{p1=7FBe&M~;&Gk+vy?~}@hg@*CK*0x3-p9ppg*U=n) zZZ!?UgUVD&zw@xGj1pD|%;9R0dB~Wp;<^;8&{^UE7uD%k(sNFnd#}DmUJlEC%Zux~ zl_Tq0aRMVb)Ebp4qGZ`;C8nYMbPS397oM7rmDB^RG2T+LXSRA0t(=*4^bL}ic zZ3XAF=j?*_B`sIC@DYJX?Z3TgU(R#+6gqnnht^!$Khw-xRNT+I<)f=UZk#NtMsg}2 zIj;7jJ=CN$c--;bu!(NWlVPm&A_EK<&f8#8f7bkka8_v5J8?o<70hn;m?*mNXJ9k_ zI&0e`4S`qt-ZmdiE@cR1bsWv~x$qfPvLkA+(vnPy{nbz0Ecuu}dKj{0LhXNCu9gDU zf8TgNVYK%8`xwYu-8rP`c@Ep6tQ#+v-`ytJQbQj6jHbl|$#IA>mi_LW;A3K`Q2Pv& z`5lG_8|DZs^$10+CcvD~BF-E5C6N?;9Q|WqyR{v!RZEBM-oez8KS`~R=dz4{>7pww z^$z-G$;=n1L5fRM`a=(tK%i?J%vUDA4LAu64tkKQ2{xyf)7$sp_Gwz60D?sh;G&SI zA!P-}EU>-;m256K{E2751O?s5N(!m$M6)P}6&~SV3mUq=ujA40ttfHLivX9fcd zBCkoGdG9C*l8Qa^yOwxri?QLkwp90s{S*5DJ>^qA9W2;=fG&qCJLft~ti+YtAn$r< zc~Ic(O=jK%6<;A;gn$J2XY^LFxFiQrlK_^WSOP`mPfOC;r72&Lk88zJNYXkQMir<+>Y1t^5j?XTvaf%okOx(dkPm9)d0F3o0K!_+_r5#|FXoMxI8_<29l z(fYp+T-JsCIaV-GbKz!Bxlr)Zt3HW`)|oxU;3{CVckWbk&TJ`SF$;JcS)3w_Wq3cPgb0V@3!lJ~}RBEW|om z+JP#;Adwp^kCn~Y$AUXpxONdhiamai84ZJJYrG#auI4xAi~+D){TQnvUN}q#vfs9O zILkr?x0nBcKSYIx3!a*J2^Z8LmtXsX^EfAB*Km(sQvQ>MUA|nx4-8)jU9L2=_%c-LPq?cNV zTgcLCcZhycst_&kL7vz{#K7>Y`gc7=4T5Q??wTUF;Sp8*AkAy(IZZ9&;CuBdADxYe zzVl3o>N9LIT`ztdm#LLm8D8pdj;_6iT0w&*OqEFp#yaM3pHObS@ejcjixn*qlo}*l z8NNY|66S2@SC?9Wh~WP6Z4+uuY(6w;8Yon&#bDsxl{C_pjhM>d)-+ouF$JJ-aQ;Op zq2m_GfIgzSUiXW>CVnc`S1$XY{>A}D{PXIvq*T*h-MbDcoL9LGCP}LmW#gKtA68_f zZS-54SNuisQTB4`xfRwPxGeF5n$q$6V8`785+Sp zCmCs94bc~%p->v}p=9hsm3bJR)lp&ni1a|cI?UzTg9*Ahqi7;6tF@cN3J9MyPJ*saTCD3 z3=BM%>V3G!uBn7_c{8S^?LhdO3K`=Y;8Zup)|&PSuaXWXmpTy87CEM!Z-7~mjJo%F zj#YH6F(EhC1>ls}9w_#uxh#L5_6k^T|5)27SABN;u2}p1GP# zt|*cAL{&?k^{&~uV0p4=Y5J=Qn$JN#Qo$ElPpel`c3ZVxa8xUOnRtTR2KKJl+83AK zf7E!}_8+$W&1NStUC&B-Yoofaq|9NC^jGU!*a>>YA-L;!p@yE}VNaQPK zL$5Qfi#m55_N0!ixnaarY+2)pUHvDV&tHxa)b3VnBTF)=$s3qWQeQ0{jw`OodD$

5Ljctxsx-~RtC9#1#|C5whJRzR8Jx$d=gN3pc`{rE9TrP&^rTD5)bBg6ieUUl&uqQ-ckp zhdBxAdSW|q5#Y>WEMX2;0E+!6;Y0(&NST2K&gxYf>4*L5VC+q%&2L;bjVG~JVvR>^ z)kMW2$l;Tx6HkblmxYy(ruDOxvq@-FWn>I3X5&>J0`Dy((3H{yGh32-0}`!pRbAil zo}m?ZZFjT(N^dnlUyF_jyb213=;%}$19pmn)#T+df)WJ})Y+{Lt{Ap4mEzl(MlIU* zl@Tbbi%@CUTrcK66GCO6h+Y&3LW=Kffl>|qaO)4+22eUA^f=@bE{4q@s@~P;8Vfm| zSNHHZ6B5aIc%0}e8KmD^vz#UInYw&ll(-~*o5+x2e|UJPTm9}X*nKfU43~9vjHqxm zI_4`9 zmdmPAW3zvnRK=KZ7`cu=sUW3gGfQ#Bwz3a(=WBuYzJxAn!+$(qeJ+K=FmzX$V1w>` z-`jiUQNIbHz(?+Q8Tr@q?x(1>84g(Nonz_E!xoUww?(~QkRg%JQQ=JuBg*Vj!b~^n zv$xwE<4*bRCS2)7SS27A$ckrVswzt7B()+tRZ|v~--T%G86)*^%3Et$sr+>8hf+Bv7#l}jo@GOiX{;%|} zCeLR$p@Uq0mXNVs)q4DyKlTAU;!UnEA}1D~XmB~zC)dd4Gq7TENMXw6|D&4Z4uatRu2Ek85XHsVG8@zp6vzQ+d^mV@^~KDUp*bdo z%X@XYnofFey|io|T#`Pw7cVV+dB90JV}#@Y+$bqb=?=c8LNaKX5lAo_G~QQUlLbi< zySrQC5k>@Tc}&=~l!+hzb=%6E=$~O8S!+4pTx3d+8Z0kX_~wn5IyyHlQ=tYz&C=GK z?q}xZ{i--Xk27Z6@XeMN$Bxp!Ydrh4Ed{q04D)^86PM@Q?w#a)*}}~1)Q=v4kMZ%Q z&oHDdUx*6}&sVpT#XiM7y>iQgnVj6zwvQo@>*qHg;*G^USP4gik(Lw5(O7Fiv-I{KEqf8=H3}quLH$Zbjz0)<3BH%!3 zdXso2&|5B%+hzyzld0?)56{6aR_lz!|JDLjj~|{yd^3KwbDIvEc}%=^cxQE~#z_4) zsfIVGR2i+m{jS68y`G=>O^4eS)q(%Fzilpbv&chT>RQ6}`cHP`8F^gPki$3l`G-o# z1qW2+?<0%l2)3*~85(c~u9Ch>c)Kkl2F?QZH+B=xb!nA$K^4R{yi|1KX;oAKJ~Z{l zJD>#ThrSQji$D(khpM)^V01PP#PtZvXM_KN|ceZGA zp{vjM^SlRzavYHgYKe1Ao83wjOh~xEfGDQ{<1_$y<-(gh%@Uzfk@80H_NSs_WGGI9 z=+J%P`9|ZjC~8rfpG>Ff_J~3R{QZDWdwAQ2MURQUk+Z@@5&%msvsDi7W_^FVycZeB3mLw02aKBM0z$Z;n-IM#$ zuhHrIEyLT}h_CqG*U}l=-`9&p9kHKt^71MR&RroRR7W5wGaM_tEi8!QME0meXqb}= z7Yf1jA2z_~SzAKFZQ7TWkXL&8ebi{T>Oz@Oaz_(sKF=$iW`{ytGbceIy50nFuAB+g z`z;Ugz22{vTWiecUNLao@RQ}CdcD-E#gPejo$gY|Va8KmnmlVax-|P`$}wMDz76H& zAiCavl^ooa6yEJ!{Nd*#_ovW|ePnDBGEx4>xuq+I~?-~zokPP+XLD48pxUS9!F1g>FLCfM4&2BqK^N^CLw)`$w@n8T()Pmgf zMK@K$2!Hzi+1b2~MMtw4xQ!DBY?@SyWwVy|Vy5FIKaB8>An72=?^S)Wd!`7LZ!+c# zOawHRJBbR^W~(XyHlTk_eQ@UF<}{vq%yK|@BRCiTrk;*iYT+-=Axrn_d3XLiyEH22VLgm z&U-s&PhEbP>7Ev?+tAHI7=fqR|RU`n#eM|Cdh$xD3CE#SgMP>au! z;1A;xAvSUH|DRUjWa8}`jvk5C>_wvF@h`H2}U-seS-Uk2DJ5)__yNR>>O7()h_1BX1<;ZxT;cAb7st zuE*?M(hE(X{tnvh-tz%k7kX0|vzUztaDp}QBpJ-L)V<*QtCg6(NQ75*9TVlxF={bu z(0p=SE!Vwf+n=r41A8`Q@H1+#H%IRebHNe>nJu zDb-BmsCUamr((M;n)%pQ@7D#>!P$J)pU)tl@iIs!C_J36{3%|#r%ADSB5`PC{Dmz{tBI;^_SZ~ zF*b{zL-qG}L}zn!LVY+qwzV;_fmLQWo)XID7iVja=2O7?z|sg2?hB=!4q}lQ#$#c# zRYcR;1fPK14hP|IbgA}Rv3J{i1;*|^K6X0JJ(+eJ`?qRY^60JRl3knpb_J0)+>5RE z1ewxnxkFycitzD5EIT$(4Fy$D)%i)(pNr(po+Wwq7Xy zk0~bl8EmlO8i2CGE5^+B{0X=(_dW$2omKzTgW*+AB}G^qQ<)OD1c+$;wi{oxk|mrz z%5eP%Isk)xc-cM|0{vU!iF^`dwlM?QsGIwfW{inr)I$$?k;M;wz-j%fKMI0%U{SSg z1UuLt1aY4%gfM@Ld)2kCmpb9-Yq0i}%A+Qj{Pw_LfOgtK@+tm6DHPzqpo# z5gpbh40F#sW=UYF;|TwQclV&#f6DaU+Y4x$Pj`jx}dax{I)$>jOdR| zsFfGxA`;Nob|~lNw;93EkBWkZa1|c!l|KREH45tXlILOF-Ed8*g&TbCOt7zxVf=Gj zlclY8#EW180-O8tM@KUHn6IqdL>q?kUdAt?0D@1yn#3XX4d8PY@0e`ZwO3aqWgIq) zS(GYT!#t_Z0Jtq+wPey^tU?epJg7L8ro*~jwdm=0vk9KjOeZ2Rf~;j}?I_ZU>tsYQ6x-hIq{_YbMQ}A!u^rUAwc`*vbhqB0$ZGcne^(1Q@;BLLR2goRpAej3-4g=H z_u+&-9JLnzk)bp6e8dO_tCso}-cgZwWVIts&F?nFas~$G3(2TDp5q1beL;lqiaBBJ zr&JbkvvLkl?_)<7udB&_Q72oE-0gzsMfi7V7J=%vucpi(?lH1z*_8mQu#*16ekkd|0Z0F>rL}PFJb}IMFNkzOi)$l z&~I55e2t$Xm=V~K)l}n0%0pIH^w{9yuirg}|EW7KjS)k59YRjdz7B8hpVH7 z(hu-YnWwWaY~s`_hB=#8o!zdxdGlUsJ$j?CeOT-?=z6}>b6**>H%9VO`2QG()(TYY z*p}8)HMwpL-$5LH>)p5U>N_B?o_6Ywf{!tA!m}e|#$bH&vAblBrj5=91svH#?aqsk zpu9umAO`HdMQ9Gz7$Hc%sK0gtXm;Gi(%^^A!YWaraDmpUocwR?)&#EG|EWKEKnG+j z?`%uoq>jwA=z)*ekq#0r>@BK%>ts|60O%*){b*wq3$UO2MP7?RMwUq--nUZ{=Le|a z5s?zdS5-zF+%ofKx1etsRpaS-;bUaY;#}DWaFd6Q?*TL~uZAy|kM`B`2*Sxb@XHRU zn+{u75uOymEO4vEf4##B2|8v}$`XJDhFC6oj@X6Lb%F@D5@4VqD1^T#-5g^ok=!PJ z3X*sLlE^nvxg_0XrxavQrCfpA2TUhC`bP77y{?3u=@tpUbERmkde`0KY~mineK`Sf zhd*0R_qjknm-%>`)AE7;(B&SE?)xV|X3pxLqHy=*A~?+g6kq)n5qxy{JuSFFz-u{A zSSwZQ#w#;d0_$V4*76-piGv;3{YFP8pE0>jx!lG&A?U9BNH$UTXg+<*%ix)4+UPWC z6`ZjAdeOAiUVxTpw7dNxi2{ue{jLnbpTQkrNfXI@nrm|jUryLQx%dAZ$5l=sEhK;z z=i`$uplXVV349LGOTj=|R+8J72f)<%+D{O%yA|OYV^n(i0fRiy@+!H&cWCzo%uY>{ zBF4R&@yb?&_N8BH7Y{5LzgM6(95dG%HfpP4E27W=&=4l)0IVz6qzTQGNGR%#2EOdD z#oAJC6w_D~`H6`gt!)Gb?`&p~R@Uax&r85&`~cHxb-USjTQ~p`E0IB5dxo?eed{su zq_FZiP&R7{(GhkkY+UrX5-26f_|TzF7-|VKkx{gFc<2bE8PK9Id4-ne_YjPs`c`wb zBwLp5V4fU+pZ!^-rAs^0ZJ<4Z@B~v+&ii>5kcdKje#M1Vi4em%MZquyOvjc?6SSPA z{-JThcsf&bouNONd^4Kk9w_H#O5RrH!|(SR{?Lko3qPC+5|2;5EdFRdAku&&x$KW<(k?I}hEiQKez~512&4M^*;(4PA0YLlH%Jlbzpjto3*t1p#3xcTzqvV%~(q9yE2FUy}@RM)krA;y)%k4aE^qOqd^9IpLVC<5BRIu68*lQ;_B?dyz%xQ>!%ZDgvyRsWN8fYgBv$2ibtCJw&&PhlDly8OSwg;;O+kcE zT-Aa70BnMO$h4C5l|E}!z-qk!uyk2P-P9wVe*zC36P$nupO6hqJ|7{{`e7evLz2EL zcYsufWsr0rF~(2QiZh^FO}5b{wDPP^CtP97Lz}u1gF=CcUx)z?Nmk--yb)bAIVcEU z@~C%<{au#b*}4(^7o+k!huwDo-AG+|#PEA(@Ua=$Q-i&mZ~y*!qImhkzy-D>k2h^KKVyl%RI~)hM-bW1_W_Qs%K66Eso7opd&6t^uKNWuFY-S2db++c}l^x8hS)ekC zMeecnySb36ib^waRFZ0B`jD-qDj${W!RHnBQ1$ZJaI#fumS^Z?rQ`m86t7)@PJkTl zh~3|-dqKyJsXPU=xN@~p_a@^VG(O2%jkzS@m34X`yJ>o71>6y~rzJUsjJ=jed#^Y|QYAZ(nLNP(rp z$(|s@KF~r|+Uz~tp}{oU;dPA~wZ(r^dZ*BYm@ISj`1Z`N%|lKrt}gq)piH8^u=#l> zy9tYq3yuzg;#*HmOn)w8!lW+U4}(}*Dnej-~R(M-3pl0?a?L6artCo+rZV=H;b8FtVxm3FUAFAFupsDZw10JHF z2%><5NEk>n0V&Ckgro>4NKQg}q=W(+28yJjlpvi_(#=phM>mX+kZv|Mw&%>x=llGg zXMb#PckkUj=e*c*OtY}KY6p9)4Fm-Mq zs$;Aro+Ag7TD_Ae@0j2LNQNg0HdgV-UbH2>HJ0QPzKtIjT?qy zi4Hmhz>&FdsR`2am0%-lzq#qPW9)`gJm~^uOCD(-v$49SREBdE-kGQ_aP17)f_I_4 z1ovDe``;bzOQ;rpOrXdJSmy7$lqxnK)LB;JhQSBnTurKgxXMq*Aa(qv!;)nt*wiO{ zOBSTcuS!2mZs(rA|%yauJp5z)g{l#N;b`` z%(-&J(=J=3(Ccy184Kff$jPjVe6WJ>xnJ3r-#3-!XJ(53;E1p{L(Ut7xsILo4|~Oa zpm6XYX#=Q-%R5uYpY02Pqu&6Z1zgcTNYuxK%9wtfYdHJbS{yQs`E2f~kKT+=<=M9C z$d1_$J>~bFDHR~~u09x~i2qN}nGk8_ZHfL&?)%wFCb&Ig6zzjsCk%4p4xv|%386(D zR|D`MkM;`NFRj&YNmXD&;M`F$%Dq{_EQMcfZ4>JQ&>? z2U+H;+h76ZKhZNUCkp7ph?UtrNT>F8q|<&>98&Kz15yh6$5f}5LJqcO;55Fww^!go z38Fn`_%|46i>bp|{a21qpLXsItzusv`dS4fKyYWyZk&^ST?J!ni#-2dh_8$ED@a#R zY0cK7>|cYA3{Y=+Rnu4#cSx_T8iixHJ8NJdes)dbZ(WJ*Wmh!E#?z}G{b-_wcg~1z zk3zLX7dW1X3O;79&BUjd#r|u(009$|_WD!M**s7sXtME{s@iM`*LBBG(Bp_4Bg?lt zD0z~%aQ|)|9R2q{EtQzdozp=BgOec?WY_aV}c%wD|LrK-Kfrj84J2guFLfA%VOWvAL}QsvXpSqux+$bx%;$t zZDJM*2P~ab`vppPt z`rD)Quj!%xj2si30G`}^Amtz_qdK4KLg**jI)b;nW#+tP`pZc^6cBSf(x@H;cVdW1 z8=~$CrJrpEdWjTud;KP4pU1y1h^`*l)5XBZ2%zG5Kkcgz5I^W3Zo6;b0Hvq?U%1fs zl3FvhTnjUDNA({SHGg^Jk+b0?btdGg#q{#3(_!SP0Ix^Da)J<`5)7lAU5mm$1)xR1 zb#fgAW85i_4*q9JUMe%!zl`et+A`C4nvo}~$I&GuZ=L^#VOynuq37#dVe<4bP5r&E ziF0e0=NGU;VT&Wt$D-8<)h)Tf+Wj=R=!7qBm@2@`y{8-dm;6r5E5%5*t>hp?Un{u+ z9JITE|WhMo|dWzTYU~fuME=ITRj5O)mPG z#>^%!c8O2;G4%}O;qUw%vo^ND3B7&GaEIc3;8SpumdjS8-SA^WNgKYYbXi}_}?9d2c@g{(Wpk(&C>lZM*lZNADm+h9%brBF;kN(g2n(TuUFsjM_1Op zsg;);^yfr+|1nx&82y`Ow&w?13%o>+3j9NNQvCcL^KH!s z>mgE~x3PtnA#wo?9yopJt2Gre(5`b4tpxnKgg8yr+@g$T#uD=6_-aDN7rz(Jhvr)m zTxZAu=x#C+1w#c%1Hm~hnw?3%27+{rC*Fl<8tu_X&DQOSO^IY5S5GcBrv~VzWpod6 zEpx|TqS0gjU7viI2%lYnR-)#9%LyACXikXXeOU(3yWRm z17V@k2bh62jh?RmcYLM@M8hzg+ficUT{6&^nJ9=ZSoxRJqm;a`TuB}a)3^87!+#O* zV(H=37V(Ao`e~_(@B9i2nA11AKFvVM$K=X47|3pDazHb}9)yg3eg1q`Gcp;-ir}h> z1k^7xQ(@xK1S{YILwveNICm$C_n##Z@LH z{gw&e_`ZW?pLtj0jW)_6HkIxi zRetAKy)^{^;wKdP(pR!^X8(rFP7r00wh^H2mLcR&&W7*dIL2fb|CFqQ-M11DOrepH z!|HfsP7ex&T=-m?C1|^dO2C_94Ye1xNKmt3X*<%Xz-nCV39>%(mYt3fIUrBY$Y9bR z`bnDGn%glKluIbQ;0K!sJTlVqxJ>KE1$pf~Ta>-o?~e7u?lH1m>tBjtz!f1+Xm0Y- zD+9Ce`M2HhGJ+kT>6!;PDy5Z0GAGwjIjX1>91L&bI#)h@SgHRFNuyRtugG9Nfm03@ zA-{jg8P$~&rNJu-Nj<+<7zur#EO`8*b#1F;{=C(;;x+i$O|{sjVQi0!9$of%=QtzgpRKZWf=RbWMBoNBCWiRJjG4kVYy!~%iSAFO_W zv<5xjc}_66X6>*C0mSpbFY&awDRN;x$ZA$WW``={ghj-Hufln-zk(rv$wh_ebd}@b zLpN67%dlF2YIUJ}i4VJx;pxhI^f#~5C^^f0duS56LXq@KnJ~sGw6^*SjBSi$DYG=} z7xPnoNDTk zmgCOgfXS?BKc5(1!$@C4F)I*xK6L?|Yc+g<^3o|I?QRHpU#-iA{IJxDX4w%A*W_O$ z_IN&?rMlxT1sscN{0Udg4Me^xktB3Y0a8A@cW?9pYk*PmJ0vpc-b47gjAoWoi!i3f z?k7}&F|%LeftOqN>a~aJ0^_^7LV}pJ@jye5#D|wV;jRw=cY&ms)bE;`p)TWSr~zN) zx8T?B<2F*J@fuoYERmltqgIsBVk!MM82dMB3R$ObuUsB|)HDt`Sh7l5aba=xuK2ZwwO%ov&x_|x#upR*Aqc;wL8kzWB4cAs=^N%^o5skJkmH# z39uOFi=PW81{3HJKV(>)uK|OnJ zC#feFKS`D15!tndpIoJYfxC!b_nC)c)Cjh2Nb#31$78Nk2yFKy7o1b{x%Sod?RL0_^f z%zt6HRs;J_uE18-NomZAMOByS2$pPCk5>IIgtOWURBJM zVwwcE@fR*0$^#_f)xkE)Pka(j5^?7kLJVx70VX;NWSB>p(=UpYG@=J%q)T#S+VbQ~ zjeGHHcuS9>ba0)QwPILE5?2iL^nZR6bp_GE#^@s%045-ErLO>0J+&Ww;)Q!0d)x(L z4m-XXh}!9$7H%VU6p&ln22=ga3T7{o)7AaOzEAgTUr(9@7vH_<^+n&_@f`e;BWB*J zIRjw||EyPrYlF&90f>7P%vd>Jj2*wqsI1A+IHL|gD| zARXBF5Ger`VG%{67)i+Bt>~xr7{S2zg+J4zthW&^AC3>qVMChouL(dOO?t!Qi|UHT zmorgtNR0f@$50K9;#3=@6jxUXIEgZe2p1tiwtr_t+`dbi08q{-t$5q!xj%Af8L@K3 zOoI4g5~$%2`!|?B%>K#dNj*@we91T%>@N~!Z7ZMK_P>TM7lo@as7lv^(?3?q8y#;Y z0G~qUXh2eV;Dq(8E)Wj#2oO?Bi%d0lS#r(&+W+?wIM3lj2JvDO4_7PKoBe9VTn45K zp<|s5c_#ZvS)jnJYH@R8EkD~kOq?0oSL{m@Lgk*a+ zsvkXVI3ZUqNdi4CuXS`=R|^W5(-|bbA@ObNMl(F64=gsUR1sOipws~rHdbDLa~+_X zcX?RP!Fi|Hcb6sho|G~LJXt7zq`~ZtHWZep%txa}2X1R<)tjuKiPtljr0``J@s0`n&D74ChY2o~J(B*QThfc!_tHO|*9QqVoWJMneJSjJY-gPoH_ zOgC01z~xpyi|sOIJr2w!ZGf2*@G3id?!_qdo+Vm!gt>al6~y!keUhh)2m^^RI3}Ulm=k6*{4*0HM#gX{u7I zki|Q2z>uS1Wfq%)_ZKt&@J3 zIhqv!;QkPFLplgyD|cND=5ixT(ld+F6aRpJnnwF{iCQM^Ojunl_9G0RzzJ1Rcr51?$nDyF zcG_b@>-E3CrWwn_w~Kiy=^rWweGcclaPS#bklRky;zLf$-(q!okg>8QfL zuxDr5#v&+MCGU%U zishg1{D6ne9$XNMH%O3T#Ihmk#1?jV_GRhO(-#}DS_poFod0m0!||qV zH~n8DieF}Vwh)I%i_>*^yAw`ocZ66M*2tC*h>D7dumFVY!}z}hWdxT2umFIk72s|0y0bUHt|?>ad^-0H1owOr?+k*R>6*p# zs<}HEq$SMQD3Ixq{Cdj_r4S^iB%8YRTL?lUC3B343oKm1yZCaY7Vh}}GLrv&`s>$) z|J(IT_Ae~?(#ny^q`ZBq+IZFD=y9H590L0m!}?imnye0lMT_D+w> z`{-g-LQW3f!Cp;GO>hWko&W(28Zh;gLZ^YdV66=MH#QvNY;{q9h!s><(f1dhw0!1l ziQVRs#8o>_oC-#vpA9ah4E#~a9Q=SdQPV=d37#y%*h>^XCQ*a5vodnlIq-)Jpp_s` zS0Q&;7ZQdq2wFQ${y3TzW|cj3d35(1`C~o6Cp7m2Sx1mIv@Lo>x(ZcvaUjA>k3w|z zHN14n%f^N!h8>Zpip|SKY>Gmsz{5F#L{{>hzZd4J9X-QYjMhNAV()Gbx1nC_`xc#Q z>`8A+xB}~L=p*7bTm20{aaA9wB|Q8MTfjqegYeOjdaJJKAEzK6Yc0=MfZyrqCMGLv zSY%{nq-E?g=^N;a229jvk?@QGh@JT}knL5*coigNV@oK@karvo38cq8uD@=dv|Hcq zdRkBfrXSt3+?}y<<`~54`PVN?m}hLLdaQQ8cy?Uo=RUgM!N)J3X@PP&wlSDLZ!nl; z-OuO=fpo>#SP#Zrb>{f|_LWnpJ7M#*gL|IS_e-eVzzNK;_itz4$0p7xq9lkv5DG;J z(WFc1_bvNx>=n=BVsEFwbjicocQ|@!<#cSmJ<6*#@v(Mh4VSH3YXomgs6FhW)lpHg zd`Hgmxb7ImYEN%A`DFi6P-K%2?^7jIQjX$s3@2*qpkDM(n@`T@`A7ow4YkN9PA+>P z2&A!ifp=(a;$EEg#C(FiGG@&$4<4nlk2HWu$&$`5PdhmhrQjVu8%}E7+ujOW;3`Af zk%xO|GAVTa7B!RtNr(3!e~aeoeO^UZ!(UA9xnVa?YtNX{HX2~1{e4b>#Hv(cqUkDa z@Uf@MR`Iil2 zOJyhv^l9^oUflkIEcwD8ZZq`*)}aL5uJ-*2CtDM>ECzmD@>fZY#Wux*PE>|64WvJJruvE zIYPh>qmAT94Bby&UJet>nl2y+Eg+mHq9_|np`nP}2)(RlHUi)7dQr{ts}LlPcz(NJ z6aJj^5~M=P2(FkKBR0{OUyK@bzsVF`okBwRKews7h6ZPT+qtD6wT4Mqp)B2$iJQ1i zq;rgw?Tvepe0>j7kCNOE-gpH#b7*)twI*w#Y%I|32DWs$R|B>?u1|j2=UXFmd4>gN zLk=IVklnoZLVPcYNx<()!aF`4rDTeyiH@Piii1Wum7rc>Ay{IbHI7nhdu8dQoS25?AOvq^wAFol7C`XxZ z)BNI?PvW23RY{1Zi!7tm5A4_!gyp*lQfH3{jGwAiisvHE zr58JENN#>rU}N{J_zq)9hQ73lFkuxd;ZBQ$(%gQ{hiDIh2B&4mx!(*?3MkqNw{Fvo zGd#UY9!cE9d}Q3^XV3pJ#E@jzErJkK5n~^x@(H9lAKjcCu9F@HgFSj*BAvb63B^*q z=*^jx{$8q~-eBv0l1xGplo<8eFDCpz^szj-y4X73;B6yWw|BGa2kLRk?oYjc6tUES zKpKxN_4eq`k1|t^S$lcX^6sLn@tphXrt$uZsPq{wmi zkgN-N@a^ux0m}6rAO=A$B%yd{^sMsx3y%S#T6XGYy*#LY`kcsL=gw$Cyr1{A+@j%vkIKI>e}tNH4W7B(?aEkI z6e-kgUj*-w!#&(-7h}Ihg*?+L88*HJ@qduWn9K!O#C3Bb5*+*VHA+Aj!7VmVEoQaP z=iEKMT7EhYh^qv7{vvro%S2o$=zJRZY8P{(f_i>ozVAlGdmex?Sbzn`cW()fZu%K{ zm=2`5+LUxn{FWo?l2pW@kQc#T5e(=>c~DL{Ib-i$Cm_pT98Fhd7Fnt4a0D&=h09!f z&F6Sp+90P-{G%(3cL-VvS`Zr#@bC&K+SD=I>og+rR(?5J=FLhZKyv|y5C#~FmUS7W z=Zys}S;W2Yq7&bB>^c6Oa?sqpc(gCLKfUfyS*$A%AwP^~J`yUF>Q)jHGE5;*YW-OG zgnM$>y%+PF>j}dn9I0t5Ny*&Y3H2OL88)G)!h6HHkyDC>d z%fvHdF?;LaH1ZHWmCijbs$k=JNQ{MIGMMFv+qJwu{Bc>qXi_@L__b#CAn<-YzWdF0 zUrGxE27(mH2<6(d)^7ZlXK1;ihJ|7<<^f$xX|JU^27!dNAbr!x*C61@R~{YwdNM5j zh`*@7uVth>!5r5!o{BX;iVWbqQ8=3HIoZ7Mtl4$5SZx0MJl5U)*kI;R&Pz8gtjXKP zu%17Fa>l@}S8$EPhr7~}YM-pV79XU+)m+u`H%QTF5}hArdft;}G>$7{?kCRYzB6&T z$B*j$g?gTVF{ zK+Y7C2M8qFe)GNq^vStsgXnv?1@IOEHM1t1C#}y7sC-qSfd1Y)7n37d# zZmq+GwL7>&%&okiIuYqTz$Uk#M7ruVxGkqw{WYI@ovSFe?(5IC(F8mTKRH3?!%q?r z-Z$);@>aQas@E5Jf$(c-O)LO)vv#rp^GGf^tM4z%X%2bgc zE-y(sKw0dv5xNK*Ji8bm=pT(fN(TtQOGo0a*Xq?`oUV?><4{GhLym#9OOuo=Pz$Ba zcbC<5G@`$f03H6F0f_)H+wQs|RkW=2QUI7J-UX=qJ1h5Z_0v0An!4ru2#r6v-k{6y z3muk(xE%=~2~YvTdn8zjua#?I!|0KV7ex$N{;G@lrLfabu06C**Na2KQv1}d)5u$S zP6H(hKxS}csDa|h@USI-TN&D%H-r({555%xO*B@<)8^DDGjZS74*kvGypA1D8-sW^ zn64H85>58y!C)J~JYsRr(aQ%L;g}*`+n&VX@7Pk?-d|t6oNlKaFL(o=5>vE`81}`a zR+(UZG^XueJMR+i;20y73T7WjSo+4&Ya8H}Ze(x_Pzcrj+6Mrb4CamQep{Kjz0%;j zbBYr_#`wV2AK7g2+yEg~-tuPXunHXRO)G|WHxuwQ%LH9q$0Kc>gw1jaAFbdv*NLdX z!c&X+@uiTI;h=IbxLi!F<8X*%+tG5?5vCcid9i4tvsAolyAnFUjYL7HvsBbB+dVD) zzsy&K8t+m;D_m0v&-iM7C|ThETIS8J)>bQK3v8au7f?>|x zp+N6OZBEzZvY#XY(0nOdv?DApdm~iJXTvBqfQ-NHbkjslkjNRNNV32f5h-WEGqLqw z0C93pz*#&_#FKx-Ctm_|R{|jLL>Y-0FeLf)TiIEG)>m?RI&Q%jv@wR?ZBAl`WWe7F z&C}aIVYqIK25)OPQG`1s2R72F@mnYfoSgng|*D%qOk zg2TGwNx}TM?CoZQ#=llz`+INHr>Fq~GUk>1U04~;D&M*6RI(5Xnh@Sp-{8DvyB?Yz z=^)Y1B}TSCs=;cnuC5Z6P=$pT$ds2WzMPo|I+|=jNhJ$T4tvn~kQ;M7eL$)Lmqz0M zXIriR|CEZ|x8NJ7mis#r#`j-^V&A-{Jz`t8sPm-&f5l!w@dLec+e>)~Jdz`4w+A2z zknYh0=y(WS&NZ5E`lfECabMgAfKQ@S)RyoTez@+Zqf**z`jE#as(QZqO5-((g-|T1H?-v9EuNRRZMN#h8d3N;{3M$(gPD45I|vo_aRE< zw#*NXT&6ExzRVL~oH)EwuA-fC(DsG>pGlTLALPaIM|m_#{gi3_AVeWBr(g78o*X3t zUNFfDFT^~hlCWdId}vYpwUhB&8x_gtwsz8NXA$kt3X|3Vs6e5rKI%k%C5z zgMHNGorX)UpDo4hzCGcp;@}|}|L#%+i6Krq3_n6N(Is3b z>(pMxh8n^G^S?O-vcd~E_8p77K7@XnpbC&1Kf0=(;vdHmiHi*T-<9?Y{7?U`26(e9 zd<>*CU?;ubSELrtcvX86*Y>nAAMXq-m`+pWZ7B{cP;0RV^F9C9W1ynL@TT`#o|IEz zreL7Vn?ChOS18rbZMm_u`7PSCdj5SMnH9Ym zZr`qUPboO5<^DsgpGa9Ol4qFUwpvC#ukV3Bf<^LB>H4*MD-i=jHsq z?H7I}F7}~Fq@vBe*_?Ofl3sL!TxH^V`>@XrPfL~;`cKjJ#(zkreV?UhdkTN3ehx3b zY@4j0C>CID?Wb*J?0)U+UNULmpr#>?S2!Pq;POGf0$J7{_~icE5`X4Sd&N~2#KdSe z)*uVi4Vqwi)iCL-TUzK9{z9kHX^loPr?oX4)?^xwX} zWDvbL%q!-ApIm%mdEAO3?}_Jv3=9l>0o|F$P6fEA5flQBbCP4Dqknc|eP%#lETPBN zvv!&Tq@D>UP*6b@TEk1nHx9c(()e8KcHZ#|z65LAp-66!tyk&|H&4-yBbYV9%6bB( z`5YEXzJ$RrZ{-;+n#auPxsPxBS6*$zqMrZ6CSqj?I znWxkdV$prM2E2sdw^+PM1UZ30HMR*T`AK1*L9)@ygVmt8IMymNkwm!{3<*-Ml9`HM z?>_4Yi>C)sG_x7XeqJ%Vz+j@c7wg)QsO>%l@Y5&m6`}0#nV^}7_km~SB%M#2`@n>y z7s%AJvfcSdP*_+;bfKYuEPImyGbgUM zpSvZ3wd%iM)e=~@@VUwDPj1ud{gbCgqyTt02Wk;QLr+<`g`(trkf`Ke$wGi-{V1QH?t_G*ykNhf$ zrT0$L1$~rnWhycYn`E5ULW+|beuyqSq2K{->&8@>M}vY69IsA6q}$io?8EFB8jisx)wjC`z;5H55o?i*4b zDf7ua`IVLGOTefeIc>eV34f}8SaLiprMtnX(DeTDsAc<9jk804|INV2z=g(*?U_AQXbGy-w&|kC2xlK&idVAsk%wse>T#&!4YrBAaks05(MuZ0_5bAp%qXDcZtKaM;8Y3j z$_?mx2Wk?yBG8O-;cGNfegj2qxw2$gb*J0&XR!Yo*owfEy9-OUV+UH}%=qMxlYwjf zsf3y83vs36o|e6~{&C-C+ydCkBH>%JlQ4fktV}FOy7x`5KvBAb^pj4pDyOIR{#i*d8Kc@+3O;RE2#-(DxW5E{Geye%bgKT_liXO4Ay+1Rekin({; zY>g*JegOfaBWFUqWj@9$eE-lIUR;i_OPTs1N*P4ysfQiAJ9T^N*%R&3y&_%@ieLhl z;U2VMCh5Nsx9Yt3XUD`U>RUwR%**qhh(mE3yX^EIbMBs52hA|ju~Eu`v^|%ii)PKh zCL4DR7KS{LD6HGn1dRIS8^^nwcssY+Y3%V@(W{8tcN$_$!Y-l}WjWl9Hrs}cVBuUR zEBC`sc8=w4{5o^f7TFy?!brllDQ+*u!hYcn?9ooC?-ayJwo?NN%gXL77F1rmP4aHs zK5^UMN$5mz>>e(3AOn(gP~%=|YVR0map;~N_};szzd44b5B!hMK^if%AIqIa1&TJu zUa?!F#1u9^F#1A^N_Ku(J+&u@PL-@tJP%WR7fJD(_=obKt1_dNGUBkUps45w?^ABx zv;N`6AgCe;4?N<$ea~~lMKEu7D^h_Zb{i1G9~H}=2!5{O;^Ouhx6Zu2sBhmQh{eT9 zIto+cfB5crNH(Y5;A?&=(J(z1IJu#A@7^f|?GsrB1>(8R&dymkX}3&MMpECUg^85( zZ$Wqcv2H~~$f0`Zc_ra}FvT|ly4~tXM7#n#DmRxfIy9snxn+NyxKi*T0DNTd(Mt}7ZD7BJT9PsM%t)bm9%u$n$%tC}bpyJ2$6qNi zI{MjU6zW%&`NW?4Ggwh%;Ij0#Fiz0f*w}c(r74DRS+Xe2AowM;XrS)|mfwz2B<{N2 z1Vs?88v~f+-2UL`>*IMh>5mGnOZ?q;oaGV}TB$%`l5M|<%ODpJ8&HVF`qHv3;Z`bp z7$hkwV4d%)qyQ%z949)+v*VS;`j-LSI9Hg9-HAn(p6*0l&hJI~-I1kSDg5)fSkx{r zO6-MpC`lX+yw%lCHKOMiK-nKJa`Xa(3CL!SkZDx-NSQ_!dAOlTac_X*GzFNaFD(Xn z_$E|U=5F+z)0OpJZzL}okYTs;XB&8sLBepenE4sV)2RamSn^@hgQ~?AmN}1SPv4+; z$9`NmOdsF4LTJdj+BjXmOvyfSt*DT`U0Ck{zYn|XT zTjD_-Q6BJ~gW~$zSQvtBFzdm=Z%m;7+P4kgvpKR%131OWosVY96sxuaP$Tf77PC*h~6}k=nTL z6w2?TlN^R}orna79E=uXpqRJ7R)UAX^k33+#kx8g`PV0nJ}*9~Z;*nJ;}-7}eEfnd z_QAiQiYhmQo}9|yjY&U!{L&QO0kbUS>M>Mg;SJQ0{rXCyx_T^T4kx`~Pc;=v?+ZT# zR}tk#pgAWo59BbuB`SRJl8i{%9l7}sjUsJ14VKzSBG-P${ZN8IC?%t zrBB!TOy0d)sw_$3_%=RP?+X&f0*S$ce*r64wELB{UlPl}V^J$RXxg83dvh*?t=A)I7aNW%} ztJdci5oryDHrVeSd8ONjN(1&w|8hea)!N}O2!SBKO48YdhCIdG?p!WbYlb0?^k<*y zj_Ec~bN2*if9XZ+%2!F{H|@?F_!46)Sr6+Be`DI-c}aT=UwV$Zb5&N#KV*|N;>P_5 z$omnEbE78%Zs7Fu9RwfLovGEVi+Zf?wbLtO#WxgizZv)2c(K1fx31ZO1hA44u`#`O zC1Rcn)QMyZid=}kFb(MnBNhI#uV$rw8LUg9_| zS;8r%#J11rZIu|UK{C0SH;r!xsXz-962cnv;mv8@rs)BVKe_jq9nEC1Q0hB!?>2t z$mF`MTr2>;MiCsfSW?o<#g1sf&l$}KFd1V5txZR>WK^liRX#a?ZQ9KU~ikb_bCHw!3Ty}B_^-HBq`Ik{|X zSZJ0DikWS&yTXNu{~60FDhg!4AdHwwe3WT{F`Du{UDeH4MLyQwTJZh*?p=gGtXSF6 z{~9RrTit*@z#2skC!J@ANObM}&wvI+z>LtXJ0%PDTkjf$L&gJf^pOOq7c~F+z%Hr& zkV$xDig+K;azV(vW~icQjACk67VX8jF6jLfR!n(6;_A=U;XF9_)GLZ_0U&~q*XBqY zFFIBh_X>Qll2(ha^cLMuVEl-q&m)xn4c-I$`&IoB`xtbQGH`jp4<#zR|8Y3sl}y6i zrt}4f9M`h*p_$a6+Zr`Vpmg#V;k^zq0c13(3tCT1YcBVGbD#Tl=K1Cno6~4P@wB*S z%yk8n+uSJ+DT2<#BWX~%Zz2w&9h%2;e6N}1#L||X>{sKf8;3470mQH`DtX7b{uD%= z%erZ4eg9orqg?LJc>v~+)JwT=fg!WcJpg2ED&K$T+rIZ=6iRZ?G%F~C5g8A#9Kcpc ztI+TUH3VC|-)aHun8v&|RV`lQLt=*L_W$EQWI?}-eSKNI{1TNb$4HCHnK(}hE!EaKQel3`jx~P z!I?y~U+{Eew09KUpuGxdpWc=-Z7r+449P-6O0G9la9qE2@v3+rMBTLsq>5-hdc*{r zhYt-l9^n-$?q6*_0I^DSCs01{3|t$M)iTTwaBV)6?2jXROjMXms;DoPx66y$@mq}m zuff@gwWIFDOmebJn~!v%gIGh8dw3c4<@Ky}{NeqC^T?BHg0|B#QskfT>8+i~uNM&~ zLB56+1tdDJ%4;>aBI`WnvK7h86C6yiqzL{hvGw!)7mNBrB+A@nBZpbmaX8-D3^rcO6X0>~&P!vA(0ef{nF zBOX+CC}ZR+h#-5sIM+?5K`I!Dv@spvY&IH?*}$xX!(WWY&)}ZBd6G>8;>K# zPd{<$5HRPL)CjH^wQ!MSq%NM^7}+@W?L_R}xgI_9#hpM-cf`*H^d`Q) zvLokdk>;X2guCy5oAN9K0#VZ7*qDA$QfTof%a%j#xjOjZSzA?R|DwjB`1z0ffKHE# z+1@7?$C3W@HcHnf@czxJcu=RO)8^%=NG>nZeGW`7>SpB@IFwqJnqEIyZ2eU-uHp;_ z*UmjqUmF4>~-KGd*zDvpV?I9SIZ>u?r1;8!%vz5U!*Q_?KCmm2DgW(#{aBz zpCgP#;r;wzv^H$rrUHb7WZQlA~ki9fUyym199W}$BfrSCrjbhiZEA~z~~gnX>k9P3>))$g%RU)j9;1- z@{qb{1xCt-{!v8DWMlSqsW~UR_gOh>Qs2D4pb=$aa=7vfx0gy6xbcsVi-$J7&1US) z@{>cwexHaFul`fvuRY(ro#YYY@~Aymcb46bk`)4e^$75~zulz9i z@aom8oJsPCQto+``N&e!a}3PRKK9v$$5;jxUu_k7A&PH^8|ShVZY!1=mw2-Y?&pG} zrJp{V&#`oxZ*bX`In3PmTn&9YX{j5K(G0EVFCV`lkb`wsB@>-c7h&fa zDb;wrBE<%bS-G-A%LR!~YE>d`%Z|SsJF)h>BU;oo>2z=U$Wr3&MD4c#@xh5d&R(v5 zwzG7wNll`Z4^ii8>3*~Sg;HHjI!F`P^ZUM@q|JIJ?uRwA6D1BKhm$I;yXoMzy&B~| ziN6@%hQ*nzheI!mG>MBhz7BESV}>*lrz_)i`r&!-^JlmrkcXi8G3T=G{h5Kt%JoMz zFB1+W4c9ci4Vy|UB?$2WV4`;q=uw{w-hbou8LbgjW86D#%`CkvgOyS{Lbev;m&=_D zUNKRmDG_5?mI;(+V~rhe2{W672p@=-rmnXg@0gegHTaAtpVVV^;NCkurWeJ3i9o*g z^lf?yNXfAJ8t&!nczl&^d-WW}@ z@h^E{yO8@?V(~?VYj5x1zlcL?A=cuNIwQl>hFB2)<|;CcF2wp^)*4Ee0^XNKg_BA#qlZX;D9J0B_xIaZ1Sqr@ zM}08@jSxwnfOCoX!X=WsF5ivvI`}?)Xc=(m8Sm9nd4wxIN)TWfmFp!MqvFP;W-{HX zJBnX}%5cmd<6k|WBjD1G{P2#Mot%^yP~2(Mt87}0gzFJmB}N`EQ$V8U)~g3U^d}z( z0vR}$%D#F3VS?zyeWJ_Fbj3CL4f~bbpGeUkoQM=}m$Q+WyqOvQOKnVw-F60nQpxp4 zM~AligQzWYBZ5^?{ZjeNl%2(b_LPTWt;L~JZoKiM?~1P++#z5l{$+v}6{q@xmWvvT;LeKZ2BG+M(=zR`kX=n{8J%S#Rb9E_h)Z_I8 zRxe~JBffkr7;bTH7bV7C+yfDaJ!8-xKL2}h2aZC%29vzZ<>hZ`WEAW9yZzE~W~_w=NM04N_0|A~ z_6D?|G5~|_)SK%aA%}M02_Sj$A%FKHyV9LhK-++cc&CT*ZOj8ww$^byE_<3Gx7g3& zU>1pc^xXb4Y|t4V%R}cc+>@5jrV=}xuN@?)L!{fe?8&q9O5@Ikz^aM5$syxmqe}V| z*JfVxTw~nX+dMqi54BWe@I_YIDr81At)_}O6xU*|str4Xo0j?vR_+wYw z@i+xhUe7b4=l_t`8Ynvb+=>fM;IiGk&$r%c-%rns+>keo|PJJ zj1?=B-F%}GeBpNyxsr<>GK(J7X-B-DHDC(``x6~D`W-d{qsvZ5Bu5pQGC(mTKTZitN5~FE3JXo9*0wZRC4Dv za~00L{$Q|)E6jpC_MmzQgTbyR^f+2s-Gjs7H7`oB#ZDGdt}~BJO%rb2x;0Wx(j3|e zb-&uyVO!d{=;7$(BzX5m`XkFm`j*1!;o-%y@^b#zEQ0jN?r#xkjl;hdfT*%zZfCn| z1o>S&!!c@m6!byZK?hGCJxzJG<*`X>=D-9c`NH7XoY-c7sV?wADE{8))S)(`gS++b zA2gzRZBhcM+cwAdOkjTh@7I|T=0_qwL!A6&lPcvco6EzP#aSTb+J7BH7zf%YrNR{ z{mno1Q!aG=q)5uik8-QncN~Mw!z!2mrJB_nEPnM)I(1$*_-V`9rl*E zz+KrfF*)pzl-+U#B7E6^7rjEnZy58&kbF4$bW>g5k*^gKGL z&9pv`dvCQ zGSYZ_r`@TE%e@;(77HuHw*y6TS>nmWfBM@Jar^XN5R0PnHHxW)g(5KOIlVUM;^+cu zq!xBJ{XS_j4LlV1vb?@Qdez`sBkpFxMXF%*CN@R5iff?- z_(|Q6Qy?{4^T#<*WEs4ax{EW&D0xkPJ$Op9Ve{o9{RDwb;opi^qKB9v?37xK;L9KR zWLQA_DgcmqG=R0s`-w?xzBkHvf^Q*ea*dmmrS3&SHC*KhZ}%Ln%V&^>{P&{@ZS2ZP zJ)_DFO{VmUbL;SYZxkx(TXcmp-Ho!FyHNNhfijpHkO)9x`9NVWcTAUSjtmP%cOnrU zK5%>Si|bfAx>|7GMe5m;s^D!l<};bI*r3j0d))&q5x!~ zq+#39<5aoyB@d?ru&ag#N>@rkFyO@Gc5z;1wN`{?3-oc~_GjalH#GoYIPVgBQ@D)( zEI3o@f&Ks%`=zxlduX7f4c@ffztFpfM#_K8RR4|i1X8^2A$f_EjFDa`0Bd({5eskr zfd%X(9Dl=`?B`@4NhqRjO0hw%iN=7NLBR!)?w21k<~}88M(9=_Q7asz&UsO2AX>160#a0%a!u~xF} z615+;d}w!*L;j^)9~)nE9CDD$l8-qLm{#Y2)jj`)=P8(5J_mn)O~n^S(`iR1zo&g9 z6cjS&#wTAjb0*an02IMPjRQDcmXE%(y0k&NE5WSQ0FW@&BppO2eUS`}dTjlJrJMSxQOBC=Wsm zDYB%JrR?d6geF-t%ve$(+fgeX@o9n?opdb33@`TM?&=Vh5Rbo`n>!*DDjEG>J-??*V@l>RT zKqZwbY0=nJHh#kUrfdC>2NJx4XSHP?02#L`pep5Xkcd!{9|qyn=b&qq66-lPNp zw#f|;1!=@yoa8yq33TJO&@l^T+>YBWVbKs*&jOS#W$#OfTl}H~Bw~Q>lUJHVCMofG zZ^fx^I;wimI?22c_5?%6y79+J1B1O@q^JCI8Atd%)q$t50ryd4>>{l(-OH>`TMaK# zd;x0K!zH!IJg%T|J@1~(JmwNDA z$r|H0Q(oGr08r?Yvf4O+ML<#fu?$9&0Ib3iYQB0amp`C() zwy=jndZSX!X>yMi?o?i{=BW@{&^oF$}N{ZbUR`_73El2NEQ)t!piZSM(&Gf*-`juGMhI|2A+l3oyyczxJD{}pkrUsV)dY3K6pXed>=QAgv+G ze)SRGZ$PAy!r|gp+a`9%PNGo{pJdI=4qNmB7Am;$1z;~re{WaUOzmA>*cVPi_=M?c zL}s%?nOGqAUX-$GsqOChScv75UYf7V6y(%E5%d0(c7CU(X5Tn2fZ5R3Qs5HuOM78M zsIYLQvz}oK#aGsmWR@`U>K6c!BE4p3jckH+9fh~nHxJ&acNO{`$VE`MvykRKC_&Q9++T>t>8PSuNchST`d-*PESvYnfD9EN9qAO(_Y z;#EBM;dDa%LZ(bUY+%2RWTYI{UtK|#z0rx8I}}fl(bBt9o8=7GE7eITw!v(9ZIi`Z zYs8gn$1Fvs8&#)<$IMOKqY{0dv8c26F(j3QhGW@s`9^0)`G6q=kbn z_R*a4JxM=87sJqlrmAlH@tB0!>*v#>#=X5srWTv2?ZxKh_!iRfr=73CKReHOw34#iKOUEQZ!qq9aI$@*48MwNMb9P_2t`! z$>HRWr}1CC)DPA*;%)R`D4UbXj&8rzwhNERc#36%M7Jp6@Ft{v1SRewB~VsQ{mH-N z9#743rojg}RsQR}j|jdUEG>o2b?e{(DxQNzWE)+_^Nu;CYSy zg+1~&qm!ncH$%9767dthL{i$tcJ1B=&E{pZC$!(NVRIJ4vz2WDZr7W_7xAs+ zTjYu#Mx2RJ=53ap9qQ)%CJmG$iTH~eb@TT1^V*uTOT8k&NZhMbS;`uT9ZIjQ*=71! zQa&!BHTn!sxb+~vQ&xZx2-IK8?~f~RjzV!{ax8F6`+>IY^^kvF-#B{I$k7bL`6AiS z09Ukr>%f%s$<4T((Vl*0z`;}DtPHJl#Y@??$fmHyJ(Yq>_(Wb_o25k(`1YL)?jsoz z&YUZ=O&RPomx{&PGb~%)jhUn=6F~^!he_hr-c|{Y8+gy3oaPm^r_2ZbiFsyf|t4{UBDeY z0_3~H!n2bIoYeKxuFIXzi;G+r;V&rBElHAj1!E{mtqA>DZFRZl2lht2ClJhAQXqAI z1Nq)%yG6-A+D_i3>)1tnzrVRFDb@AiQ+#03)UMF2CIHs^#Io5J9%Ingre}PmA%68j zSzrHzvTYfr{?Wh?h-^H9RJ^k44elM+=S*CpQ&%?(a*GJlrIeB3#`1&rq`I`WWNXFYiK#DRiHG(1+(G-W(Q2+`ZW}ykUfq*e^5B}ZRLe5RR!x(Do0mT= zrRIS-o*DXh@)eYSn80Kd7=55U!*cl#GckvYXF`FYR6z@6Z8!Z450}2s^{8^C;~U5u zAsiC6&G>q(G0$F8paZp(%JzvnVO^f@c20(-9wWz4O;)EyB2WtfhoB5P6m;-2()*Y) z>)PYTx@g>>OA(nx7Y5nnM??6v zr_*+JpHR}dv6soGf4>UYa6q>)OMHGTCRpYj#cbBmz?&1&XBjNqD>uTZ6Z{Ck*fdg^fu2FN#T2q_1>gb)AVNru{ z2m}A8H(vLA{%b!!owY~9coXb{dS@B+8=b1~sV)@nz*?V<{bD%g`l-84zy8nZ++b$3JZ!BfYat?yh!sog)1&ftA%%PGlnLcTeRei+L$K=4X->9*5hNpvwUDX zU@*IAFiEd+{?t6OA3k&jR=zbTsDUcYBWz9;f@KV3J0#G+t=nFdF^>HAmNW?=E|ul6 z`@q?-GWQ;x;zP;Dc+WnY?k2L~ipAXhd9Yu2wzvsTWcj72tgd({5B#*z0@?_cTfSu{ z?9w-&>dacxq|--COrjj4fbo6>m;iB9`$DPRIqI4IIulF(3Oc)#I~*Jxv+n@z20PR8r+fyBz-5CqfUe#CkWUU>?ulSX&}G2N<~56?ZGynZAxZ)mwC7gp)n&K80J1?^pbU;ITb!+IEFYOnE8rkN zYsPUX3Be**N{+D5d%-1#r$N*g)!l+Tlj5E9}|E-`&W~wLAx)l6K|% zF`wfpmTV#D&s$6>`Voz%mLfUT!Rcnl*2dedf8MI*fFbvsxk-4Oo62e+!W`N=u76# z^)`;&Jy3C#gd;!0Ks{(`v#)`@LwY#aS5_5KUH>jY*n2I;*JAMl09E!jz=0q`5udk( zRR2^10(f0o1=JUG(I+yF{b%@)@O~EF1erljFEbnm`mn!-bzefVgFiVt>yo%9kZV1d zD&Da=NH2Mmb@#AW^~SqC@2C9S!Bj0%VCmRU;%{1j<==d z@Lm))jg8EQgu2^c18%olne8}IN)W;RO;DK9`iI;TMk@9}!5)#2w9gQhdQ%dUIGSz` zviIR*&J7oU!nMExU9`~j6=|9z8w?rnLl3=-0fPbWn+xrst@V}^KlDUeU;)*semA%M zNU7h-lwW@C%_PuZ*7tkPS3f{y|1C>Be(SpHuoGKb`5>RF1v$C7z%IIE2PEgacXO8^ zAZz?_*S*uutPflXdc zmG}L<x=> z?o;ZWzB$~=GIYY;)7?l=XTMV{CR}w1`)wmn3eccnx&4P3%c69hG+m}hw0c=~)Ki%DA&_~#TlB#brQi-1J5v({0?L(W+lw~OhJH7sjm`Pb^Qc9{;n7mV;( z4Ro1WwPN*F2YOb4uoFDrM~1pv?27}&c3R#)p`UF0u4M`E( zD~CXVE^v9pmEafZJD-)7{d{_hKHc#1#^~KxZZG34H;!|DH^~uq*V1^K=r@%z-D5A1 zA$5pW{d+|u*-bmGbo9;#ZPA+1yXo4pkG_w-{Ag)ebOYme+C{opIqc@tRfS=>%cy{o zkZX?TAM<8vM1L7mcI^>TcvRZp`%c8_legaQ$5ZI7(VC2bq;y>PlTG*HHyJ{&qZ%S@ zE!>r6oG#x;eODjKEBDAT_o#HsCsodf@_SFT7wo#_LIZTWv+iYnIE!o&%NTptqjo#{ z^$Vl&5}6pkN5MtsE6jSdj6oYt!Ossjo%;GP)?DqRf^p2ncbX^TV((gTHM=O+Bs1DN zjbkpg%Z6rBne2z9u^*P1{=XjikVEq$t*q}GqTdoLKba6 ztA3?Vt|&w5VBF-(1wW(mPkUp|CPp;4jU)OVd?_|E-6#p>I&uCaugd}FO^x-?kNX|3 z{}6FWIr-@JtKR|oDlsptPpVvy+_?Gedk+OKKD_Ym+$)7)#JmTM*?!6ksPs$I_Uhq5|tkLuI@zw0d;Mj;pOJv=i%|1KuPvh`W2 ziBx|XPVw8AloLkEpI|hpmRhGnO8KoNLJ* z8239m3}Qt%(LPR2{9F5|29@N zHV=nnKNhn4*o*)Bu{rJgR~yv(?*VH|L*VW@#E*5l%y9MBN+gjS@T^(YEmNPPx3k|y zAE{fvQXCe>B9da(So97pP9MX(m2M4LV1Ym2d)3yTgX2&)`)5zD&&P)x9IW@(j12Dt z+Y_b_G)h`#v54^p_g0@gmU`@>!Bv|(`_wL|DB!YK1 z(m-YGKA}As2*QQQ=8iJW`R@nYXA1EIqrd;FTou(Ynx3Ve_e^U@R_wpmW<~LWr{KTWAB)o*asT2FVSrSLHdaaCjY&z?GRBG;pdrMzwYAtxu>iZ*5(H`bfMv<9M-MBN0l*XM2~e8@-Kw#v3ha;}A@_ zWQ*-Zf+s~#iAz`NHgaTGyU%I6#dS>3qt6D(wT9!2VoV2N_3WA+y983EgJL4e(5~MAysy`z6};Vt~u#mnA(LJeQ(n3JT|L_3afdRmaB-Drf}`dB9oy+FYd$8xCAHr zFa19K47;k{u}>SIc%>QqB;Vw_t`v5ApS#E|Wvs9rAJ=}xiv`s1pVHy$oo2ru=!I-7 z2&4qGV!!9J71v;c1aH%^s-Jic1;e!!QJy|ASUM;uJB>PqBN)|2oJs zoBhXEWggE$|~Lhvw^ zp>q%8yFhdUA&HHQ1VcpKpDte2CrPHPj4l829n0l_*ngz#IeLyA98V1&M>0R;nkzID>J9$*Cmk@%@H{}3{bk#yu+0%cCMAn*GIja%Bg@j3$qXOiyI2FTR; z6!1GxqteO6@yEsHgRGvo`5IwGt5aWDgIP5%hig&nRaQJUC?x;={*Jbc;6eS> zot{~2Ud49A1a969LbnzBJ*gSndn|aZjUtUEQ}qNutqK=>KiA4FdR1zRGLAp@|E0zy zP;v432E@yZq$(q`Q(Wx5cSuzm_H|<*uAQ5ZUsY=>#h7R=Ev)!=Ffb@H;!?Ksmivu zVQsxc>>Vr_cg2E_j2}Ft^vOoo={xr%E*f@+Ietzam<*}RAN~%UKE@m{A`z-h9>Dsq z`(T^9(=py|&_u-hPx(DGytIMBhNxVJU#$`XVe*1j~3*6#XV2!eXLGuupbpbWkD&B~V&BS)|@K%6?EvrFZwN3e{ zl&@(G*Z+azHt#Y$YGSXp1e;b-^k?kEo`{N)MIG#3Q8Rnq{dUON)5XMjmi9CleCb{E zn-Wz>;IQ&_RAAcUsv;EKEVVx%&6qL7V6zP@p`&`~seAFfMDhSagE<{wAsAUdB0KrZ zZ#8$7b*ooPGDv`=x>G90YY@(_tuEP!;`glA6YSNw{L0-EGQ-(t!)!v`jAtAv9^a@4 zTH-mQ;qF99$+0n@!n!Hb zrzy;b{2f%?d+7bUxok#9MPp(OnU` zYW*5s)CV#CU_StXiU@xCXQ)wLMS*9In8-Wk6*eDqgILjiFR;5weZQ$~Y*lcNihZ(? zgdQAxnpL_L##A_Cixok&iG)c(#=Q;8z7rF?#zeUq>1z(Jq{7$VsFxpwx+(T2-;{7q z5ayakKUi6M!V0*zjIuAJf41LH4c7$Bzn!Pha99YkA-R{^v!Ij_!moh~@ zE@M=Tp=fRfO>=X-Zi>~P9KT#T5iC`K$4^SV47>nShG(yj656dL(|wWx@wq{ZDJ9m+ z6SdKrmPyRQ%q~QY>vsM)$=`ATkw&!p7RN}aeKge?LfVL7Z}px|2QR4W6Fl3Y2E&u& zu<#?Vj_bp@>d+#5O!nRx)2n&xmLOK8rOM~yTpTdqMQ)#P+0(H-HH?{Dm}d2}W`8*t8Es!N zbpYU%j0{uk;pBsiPFYSLiSS97sYr&QYIF>+Z9EUq-B13)fpMz3rAOrf7Aiuc@=O#w z!GoC2>g-3v#%_XyBLP72@J85LTTmv=k<)CIS6GLuxd@u@X%O|%>!pno;tM%uVk;mZKePq5fuEC zU}EakA&%;(?DUNvc+k(?nk$)z(epJwAzNi(4yK+b8*oRG3!kfOjUaJ!aJ;{~Bbv7s(^Eo`)*2&8 z6Lz!$?hV()V=pndW}I*nL~8s#Qdws2(Qz6>9ihnL^E?TMvMtqr;s+zmf?ydGj~ z*d9EbtHdEpN`*|HVPn?6*9k8&hzk_YFCh&JpFq8Vwn+Z8x7N`4EDXm{y)Z7F_C#l- z{|A9fhO%BKA0WX(q;E>Q4a!D&CksAy-8e$8H*`hlJ{iLUs4nmbEDs-GDe9=CA8SZF zk?f-$IV*_xNXW4eeu~S2xX|2R?=~&_-DjU=$!ZS#0>OiI?SiK9&wIa2ysCHw#;Ba${aK;!e_M0U(@DdI-4t_xj`i zX3t5Pvjul^_iQ3nVg3uDco3Y5O@ndny&%pCsL*@jUeV_8$|vd9^lNIXGlYeHgLUj7IJg+HJ-WLM4u=)Zmn`&(-Hg5 zF5|g|F2-DUOqpB zKBPG?7XzLh6-oYDrF=*YbzvDNkiXJ+X7(BzwIu+Mbj@PVRU@M>4>>XF!_55DJ@TIQ z^Y}L3aEafO2ANz0N;24amR|?H-6f*x$LEyCs7t#T?wO#q2(L371V(-ACJ(z5XA9mm z?ITRV_0OJLriHm>-^hGjtQpj`8mjUEPKay!`jtN#|!bjPiY_b2OsVA*&_8b zxIJri~64UBH!IuI@zEuomio58#MJ|9Y5o4ZVj)<~+iWRzd; zpkyDzfi#fsvaIVopO|%9)|jclY{e~hvwltfx5I@ai|~W_h=)mGdN;D`ljt$<@VOrK z7y27jC(?QzS!p$tU+;%ESxt^Djd!Svxy+`7!Qq~x%-94D1s;}~CnvXB`vw+FTSKDY zYZrbMUP7TCKW=~JfV80{efmX80d*zSjinS-J=DMc#_1x60<$WwS$tN zMn;c-;d0cKbFI2Funk{gB&oj+BT$_;^lSrhc*J4m!6k8w{=<-7kC-ifU46dOtep&& z6|X_=7Y=QBX81a^j6doqA}yWu2&YA&p=RboQsS@okuGIWEkpYo z17gbH!&5;SpS?Y6a100E&L(ucaA|eikzO}o1O4d9bQ{jmc&HY7inWO%pyd+LWA@4b zx}hK4Vf2<|L$$D)LNg(71zcO|MMf@V>d#q;UYvz{0f!?O&xEFD1@%Q>YdB?YLdUyq z4F^CBZ_+%lOOY(FM}Po5WFdCyU_9dYj`NN7M+d%JpxdwQAV1!BTRVrv(kaH+pTQ!3K?n`;cRBRdRHhyOx32#n3p9GailqW)5dD5rxN6TV+>R?P}HLr|m(0DKpe zO?IgLJ*Gjil!B1gyFoGZA%Q5grWM~GAvT)7nC&hBEjx@%x7zso**mH%Y2yO+QnjfH z%%0*i15pl)aoFz>LSxMMLC^X&SNMbeXA;#l!_C^*C0Ok%P0EP@)?!9}{^%Gt7R&+u>rCSwaMUAL5wFTlZpW7>x{06T-!?y$fO;b?%|}k)rO%It zR1Ls8!pf#2GoD$T7D<>O>ziixtE83eRX16^-&{Gz=&f-sd7y50^ebeg3;>YRK&?_; z*>f_Q-n#y@o0~jBIo@JJB74DyhNcz<+V*<1=bb-#*I%(DF%vh)57_+cxwa+ zYIJ90zNck)j#N-6jOo60Oj|m*7iBGskZ2ioRk2nP_ zmS-)#8G<+{D#}EC%0j{KnIpCM)u?54WTm~n&TdXWE=uUC?#wX~@NN-%*GRoK#QsSe zE|}>A;#D=AX9f?A&4t|KgvMfQHJmWkgA#PtGf!k#E-Rl(_`er}MYrFmPTGWH-Vp%R zM}pMILxA^<0CLKH>~MUOzo~cAF07rb-FUj_*fJrTS8?Hkf{rGBAQa%*U4gHvUa>Ti zUa@{m4k27Qu9-R=^EPQ85awL+1~Z~G$zenuV97W9iij<8$(TLEk>vKkMzDi4s%Yco zs$VGtCWROGsNZgVpJ;4|WL{k#3u@Qm)097B=AJN44rgqio*>$kQEw}ALWbC;)sB!QvAI1?xZJOd`!sAcR6}5cVI@i{~@uGWlw4`;)QmI(D}M300HdlhHM%Vt-h! zHY^f}_WAXb3ovmM)7!XZ<(nRW^SOT<+j(zgblLM430$Kq_FMh8YX>yre$}sPA#NNo zDYW!*xcBBgNrF1*xu%)GdSXiO2VS+#CUwOV#(VY)g^DrKct*elrX~6;Dy7>sE$FB^ zE1cJwxp93JX^{xAVwNU@3zci%S}_%dgHwv#IivIL((nw84@XijyK}!}i-|vaI>rHz zr#Y`dhdv;jk`Bf=k7)`}l0k}<6Co#Dh&(;jCdo=X>!)G2%^u8Aw>H-9htE?*)Q1su zojUqu9S_xP%cw`}UvgB%dJsK$akz}wKAStrA^`9O!0p+_H#CMQO4o7r+VN)*nw&i? z0;7MZUtDDbk9@*?DN{9o7iI1MJ->5Foy~dx+Cwbk%s!xY)qLQJ4E27l5+Bl!=H64(Dgj@rRy2^3Oq2!jwi~VOf z6_Qb!^f_UOm9E=CQw82LJ=IRuYGC$UU|+`k!jbYNXS&_Go*!_`7Kfzhk?HH1bwm4c zA@zs@Gt}Z5F}S%eVaYzXG~B z4U6%@?pUb;Oc~a!`icIzIHW zX|sPgRc55dz7p62&<83Gd2Ty*y%KH7f%J9uTT8vX8TzxQGGeVP|Aj^bN=a$^!6N5C zntd`rPh{Gz{Oti*MHMqf$YNetbo9l210#y|0`bRneT?6g+9@*-I@yUOHteBk}BEqrXd;i)7<@2Vst{ z2ULIU=wfx=3?&l{Qez~fRB7GwXsr~?g)ltH+JzPH`*|fWrghgWBfBcrLY@>+_qpo- zTn3r;oYaIy3U|2|iXK!NeAcgZ#Sv)a7mUZBB>Zp;VCLjedd{CclJxFKicUn66w!lc zWSBMX8(7|uYbi@GWV&Ri^uyK% zc&?N~*Vh7QqK&nWFagqoRPO2{pf^Ip=T-J1xx_&(Re<^P_Gax6eM8k-SI=!2U3icm z7)a45_{uL|#3yYQFsbd-SiRt#E;FJ2{9EyjJ*HW7?~C71ufsF=_Q&Vax(gbWWs=wn zc99(Mxb|X(pdf!YrycRN8TR0J)-gIS(Mf*Gg{-hpQ%Aa84y|ox96Et*nzRjqvAu0JrY3`X?Q3y}>@F-T*-d#eP@r|t4zTvup5Z!_WXd4m^PNW`RzYUZ@HH9(Ox2PA~hy$C9`pwl6nHe0oYG5xx_ zP3Gz15oDeo;t{BD=*njh8{dlFXXULM;zQPc4~ri|=+PUGZ_mD%ZqJL@uDcXLaV*G$ zGdFr2_F63D)4j|Xf1(){`!? zgvJ5wNRwLelY31ja?9A(t3oDn12K8*m&10(DxlK{z+yyXIJ3^4 z5`t4Bzm-S9M>Hp|0wB1(r2>%mvs26$^22g~m%n0sAHzl5H8Q&E66M34RcUy}6Tsnm zGco7uk@%f*KDu&yUDYGN*BDL<&=qitl+N=tlVpfu41ifVVXNjO&x*>1|1kwLo~x#@ zkcYl2l)DbpM>aK5aP3b={geV5YG4IJJ0CIuk}7)gE5t8UnN@3RR3xSOdqEb{T5+bY zc8{Fbv3^)yL-rGE4S`?UQ-sNxal#ImIGHD>UqLw^S6t5J7kikt)Z-9@KmIiCmuo+xvA^&FiOplby8E zNcb8-p*r(oh_t(Q6DU$^a)jj;C*|lPfO+J^7!LgVem5JzNYI<*HipIt@O1!x_v{&O z3)1l{tZM?O>HlM?;PPZOJ6uC%(;c2`(7oa)7=O!Y-e}4eHG=Y%zu}-7Ap$!_&}yAo zrtHZ;Zw&eO)cSMd2MI?|*h`YxVm%k9xF;9AxZbfM|m|9 z?cMz2b8aAe(&@z@)_p<8DiE7JvE8b+D2G+cw@GZ$sJ=0*7YU3V?Y7tONhO(4mH6|m z70(TswqO*K_`&A|N-HH5K89q3g>%Yc z_a4m`O@V$%+q$&GIFhX?gmJ<4PabODTM0nfOti);0sFfJm z(TUOqUp7z?-v3s38W7w{diYX!yqhkBf92pzN^+w( z3Su-c1UxNW8(R!xVK0Fzi=2qDE7N$j0agps`i>ktGJo9zpAm97gtyJl~-Lc9&YRAFa=fsW=##mKq7%& z@`In&VDp+KbbeO-vY+cstzY??R>Y9s-yE1Hg>>XA-+e=?kT1Z7H@=^SwZEbYB~sZ< zdFLtYSEJDV^Q&0>jhWGRSiomK`slBFL~VEwVJwkNV^sh<R9d<{_VHyaU$D97eTF@Wh1t$|TkO>wPiJfPy`>#l{|YL{&E>gWyecX(ZD z?fsfa?~_oAH6EKG5`#ZuSe8#<7209(tw+a?dO&qdev%Do?Q%wzrQ>Y z@uttTG$U%m-)dwwIEk!WQA4fGC-vn&l86>|wf3J%f~@zC!hP~GW-_F*HP?Nfw&U!m zZxomYfcx<0ngTcL%kqb3(xIQqSIquu1}CLfAzicahCCUV2|$jpnBrVqO|n1CO=tYf z4zp*&i(G@w=xC>_r+ca!6#`6{=huLJTaoqiM8%Zbqp48V=$$<;01Jr`u7jfveLM|Q zzQ;rYzK(sU!>-X(=kz~@l8j6#I?1eaHakm;=yG((9yX$+;^X*&lT&9k!q6`E+T7EN z``~*hj6#l#41r!(jfo*wD7X1fEyQP}_e;+Ra6?Qxaho%80}@Qb=O`?l`(CjSH!xD_ zeg&X^M15Gz-9IM^ckxSXYN`t!Sh_1F1>Q7sF z=B%DSm_^NIlNw;_O0b?X0q3f6vaOdiMKFv-Jq59mtQQ_RJe9R^= zk7qqP{~3R!LgWOkSdtNCS|sio;8B4 zZuUJFr1CQrco<1n(XxNva%tBTVtW#)`o$(4yVL>rXZxOodgM&N;FTB~2xGn5kS1F7p-ZarO(>svDBnN>%vp55dEmSK=GhCIx!0ENQYC5O7`faWCQ6 zEa!zEJ_rs{z5ma2^Sagvu1vNTQ@^+X?ed%n8S$Ko7pQ69OnQsOww)8wm4}&my_0vr zuyy6Yu9%tJA`YQ^l5hs|;|Z>U2y$3Nuq6Hj!S~(X*-G5`QV#iDN+L7;dCsImjKSJi zQoL04ROSYdB_g#7A1L|aS5A$p)X>Ne&&w_nL*3rq812r+Iz zE+`>b-;z1+|I1HqBc(e0Z{Yz7cZb8tY-eNI;Z@ZS=Za6E0>eZg`S74Yd$ulu{N|1^ z$He&~5M#j(ZkC7^*CIkw#|=mE1kwiVtB3-8dwV&`^dX{cb+VGNT~b;dws!aR&LRr* z9M4|a!uTsH4)?Z@v>IZfZCr@91P#kx)sleWFfk|LBlD-{Ca0K6MHskuC*yGhL8V>W77i^oSdP;&GW@&#jgisPoAdr-BN;PHyw{SqY9Hkx8n^88Rey8E z&9%lYf7br_?<_DuL~CfAcKQKrc74#t9vTGd}FB6#$+>ChXD zwf>}qCk}eRAVH&a|UO1c^I0Ck( zH8}T1+>|h1bTHaZ08|b31b-v;+PXZGwe)y3(!nD|K6_|By~2 z_@e1_$-43HUB?={z9g(r+V{yyPaRq7;>v#E&x41Pd6?4N^Og-!oe<8Qpq!1`+r&eY zG}A(EW}enFD<+Q)Yr5xP%7}|k)D>FA3$}ea>Mte~%%}ON3eh~A8}`^5Hv5}Qw!BFL z54A*WQl2NtMH}iz`DKUrPNG4lkh)a$^q-Invq9bUWaiO_!>JV!GtQ$@UwMuu;kv(B4m9v$ z`4-re$Cm`gqxJVinIOaxpW(eKr33H8Rz#*CmU78OR4px$Wl<)7*E05aggwD?Y_mbw zq3g)4bk^gjmn>)1Oo?G)`pRdpxUc&9Lym*o3*biQhIQ(XsAB7xLkSSrO!Ns(A7@M{ zSy$dGtS6;yYaT2;>4nF;P*kW;GC3(DW%E)Ame=a}@m~$#%ye73c6yWQX_l!uQ=*u? z%{;F@tl+B7{)u^Kvt=-#pO)em1aePJJhJwF#U+<3n|XF)WgrV-2? zv7X>2^*Vw$GXBIx0&{y1aX;`M85WCfi_UpBpBbNaW;m}vAlT*c;e2X+RV+CI%MhoA|OKILmR(Y00gz< zZcMLm&2jQ@Mh0M+6^=ui^tSNF?(zWDs{DVcR=#dX>B-#)+h4L}HJP&(*lUpU)IGja zp3}jJZ)q01xyLxtTb^k^Gc7$rYv|O9y1||QU>#JC2AIa@N0Jy^w>Q&1+>02}78AVg zgTHqCIjnM5Z&NZaTV^xfkV-E4J`>{##uGS}n}!Yx&%ZB8En+ zL%j6&wG_q=@k@4q7C!3HUS9pD6P`)kCM23lp{=8eoR~>LOmTO$fsYv*D85hL@`nK9 zyjq+mCfp~ta_E$5D@%mP99WdsUK>h@d1oNJ_Nqs2<}{GIIR#8_U5pI5xZy=S$QHI^2kkVB9X1qftS zhIZ~ppoK|5+9+nrnYld7@h0Gh;9Fckmxr6?PG?DOzJ_ST>TlmfP6)H^L&~>d)L7T~ zHs8|Xm|iVax~Co9>b*BKBlhY~FWLQ+=DEjmFm%`<<_Z%s<5wa;xe1x!*&moZwftfr zx0TejD58M7b9_~z#S}mrrI{fDppOFw2a)*F9Ino=yG-Ac^+OzSn8OX7^AT?XC;ZB9 zBHPy)QjTjYYC8DF`3Tcm zS-^ukgog629_;n_CB`6V+Lfh6ENgXZ#g#dot`)ZZY~N(7{VTgzKQF?E2!Jftn|bag zQ`W^SZ2!|X!@Sr{EdZ~N=a-}O61U+n#H5WJ)hD} z5F3YFSa1Kbs5uC$9Ds=lSnxdn0Fe|K-KuD5!c-A1|@RJVa@ z@DEMadBs{Htpy$si{2l9#`1xcNyFQ|>Xi$iUv|0Q`Jn=W*P=m38Gg8we0}vYG}%aU zP0aG$Us9yN1OjvaksMC5T4|F?49B^zoiMiN7v}sDh@Z4b#zI^8wBIkMWJ?U^QtN~3 zJBNRYIDLO{=Yuz*yU)cM84W0h<=GqXxo0=Kn|jY*%Y{#lB){Q0)_y-KOGPswCQEj% zQ;ZNG1h2=23|)6r_qxpcCeE}oHovAKp=_^uf%fVPkTNg$f}EGGLe0QuryHUuu+?Y6 zM6F>B+~}d%I66Qr3oD`vQ4v8jM&IW>am&0f_km7KWu9oV=cGY*bRsEJO@v z9vCR&72%#GX9A^)>(b<$aWRDl#12uD0lrC58dWcRCVqzI+QDac5PZ+uGog1-qPuF| z=B=1T=Awy2+oS<33u^ZoP6pj&HfWXM{o%y~h8EQf`QBJaPkPd~G~CBIST7^# ze&C;Xuh%-eQMX5qF~6uzw9Q>SR58EBkX)(Q=ss>-;D9B$*8}2t_n?Hz9z|TKM_W3; zrNWt>TBXzzGMrJA^E1m9t=KJG+nwzlrYevXY-Xjz-bosO$7A;*1JN#q_VwG#rrm8= z_U`OB6j+?I^AzDGnp+*>e&saV?X&=*fXiEq@wR=5xV=cB)6k@u#9k4h8*(G@(LU^+f!D=>Ct*evzkA;YI zks~f@vNbZTRY-S1KE1%~NhMoBX)P`!hu&qnpBqL5`-qtK$hc4_A zAqoIeI(rsR-Lvl>qI7~M=X+<=&#quTHZI6Z`(oOxC)NTu?S1{HwYeK4;!qIFxi+hN z%ixNEm%t7`fWWXfkX`H@q!+ZkT;1TXy+VlVKGgTww*Aat^8;Wn32Dz)t8|SVG6-X% zHfSr0x0_~1JR$5Pm^J~}H$c?9fI)F!T5=rrxJ~@<)MzsOxXsXCTq);dzj?NH71<>f!NUH)VWX==&XWF{ zNHyM{fLH*fq{O2FRvtg}GHpGE)I!29uT@5^(~=?JrjnGwBej$fV%>#^&c*Ff*N zqnwONOwrcI0IZ@JXqEVR{*)b)-T_97aWFB)#$Ldc&Rp zZcJqun(x>eRn2J>&z9Sd%P#+*r8s{VSq8DGl3?mxAkLwt_OU)Ji9Oq6#Cas9=+ooj_r39`$J{%KM&9DgP@T|AM zLz43^umXpH2*v;P0%Exdw$ZhlV22RTpQceSqkk%DNoa6J?dqKKTb8(BlJv~^F!%2A zr7w84+sJr#7w-k#FiH%it(&RZm$!dB+zV{)f`#_~>78%m9e{@jY{DjNa^k)^mDanM z{feXyQ~x0%_$PoJcKmyd;&**Gpsvk8T<7eQ4rUCW8tFN(#^!7Lg$K_hNFl5kcVe5^ zQHEbhbx#ABwJqARyii9S_}%| z?S5Q#AW>Ys+8;#=tzYUT8J69%fiSK2vcJ4>c}GGrjPw zj-M?!1Iw`o+orMtShL6Te>11%@wl!~AJ!THxjW{*MO&{NI*VIYR- zh1g*#0~US9ge$xs7lRD_nE`(T_1nT%Z+*_pf`(zOs{tn#wSsBX)&w-Z8%`${LxR!( z*Y;HY%4WLXvTPgHq7Z;;16syMf#J^Xz1Z|gj~J=$vNQ;RNhExWaCP%s3Ak<(vm!?! zwKkvzx2ac&_}M6sl)~OBtd4$f16p76JHDUN7J3H`bX_dKId6GQD9KO0mf@L>#DQq0 zw)@zj8NP45n_65McPP0fG3?!gZ9Fp5`!c@_WoxOz|B5)(N25$s&O4F6rsI9`pzQ-z zXgw|E0dLlj-rHlHe7Py%gsTnWXEYnzeq}&-wG2P}cFb^Y!!3rzj0bufZ ztBk|h6>lTJe`67w=|8k|7gfurwRf;j!ssO*7%9J|^|>?n&d!UgYD%0!&Zf<)Q(XnT z)$MIC1vy=jaw?rN-1z>B3@3OG=l2pnf>XYogblDc#$D2BoN_PD4FpnR==_Uqj4%ZF zM?YeVD?cS%?oaKI&#>ikv6#@GEM?m}aBg^IpR z!ll6QiUhV*SI`~f>%D)#1zhhcFiYE$>7UcQb7-zQ&3h-|1eja3adv7w0Bzr7#^h0F zsU_GyK4VDnE45riSPDE%1Urnuy=z3#Sw=Zg!MRH;nTXqoL(Q+?yt`t@RqOdE z5cr%agJE4Ao!~vhT;>9~g4Rggo>WKJ+P3mSm{XSDrRkqP638 zq=~s^eu%4eeU%iF;m;CnKXBTZxsrFH4LBBM0H{u89uir$=Ym$h&Sh>I|Lpa#)D;8i z9A0`z_>s=i01{^_5g7w3jp*h!9=o~DnXna!?GhMRCBZZiH>n64jEB@s&fecw-7cRn zeO>VCuAq8#eE!lguy)g*Q|y0I&N6{rLPjVp5$N*!l^53EM}O1C zI$@6?_29Scqs5%eA{FX;fioM+q(**C&X2bLcA9f&O~h@FxaAN;lJLOurWt6y)RVN8<<}2 z(`blCw7^%3eH$n>)q9m5)_APxa^+T!_G?^ z$ee9#oFc1&SjvEhhs<#Es0bcvf3=gmlFE3csNb0S=irajW5ZL^%#`2T;Gr{KB1_E5iC)bqT$G zQ)~+CJLLx7h&_XO7u&Lc2Ps+ydS&l80!EpKC-cbwHITpEsqQDkf|1pX;q7X-s>_D6 zUAE2*1VH%?fiE=C9sO9aa0xW@?^?I61lS-piGr-oJVv{n=KCE}aLNb=~=sEysm< ziz~@tixK$e&-P~Q)rcC$9AiX+^1hF%y1|n38>mT#7D957#X!xNcQ6+PXIHnn{d(Id z9li=?srVn5YUl4S8g_b9E_1Uih2R}AB~gJ)ivb#I^G}eATm-S?`UY!I3OjX&8KMWd zLN8_by3??Lmg)ElFdebOK{Q3awUTZANpo8I5UPe=31LnQCy-qcIbyup=|v0dMl(xJ#`5gKhp`Ch<@M$lj%Q7iIy6TjGVH;NO3*A-qRS zpwO5N2XC_tK>qM$iF?=IcpE)X?&SysIai;m!$pkeYwqv+* zRLf_kmEm|^<&y_lRe9?9YmbkX44I`TjI%SnK30km{{mBU-V9OOZ%=W&>OPH(epj5Y zGtN~7@I{ zlevLyeQ!|2_Z#<}2LFXr0C#-dxZbgN#VT^n{+vSmF_C=jd)#$@WV2(kt^kJve)rut zwkDG({8pY}7Cy%)2kRy{s44c?dU={Ca#iM0Ma~GOdUvZvF&ulJT$12^1=L?gCQ2rc z$cef2REB*Z3KEVvzH12z+sH?vX~jy+$X!d&OtB`PeUjy9*8`FI94Qzcd|kp_D##HdQU44j1}dU3$c3bJwhxjm|P2K}C1PJ`z3QZlyQ6iZ%( zKLJ7N*N5O4ulE0zRu*9SOR^^o^W){qv1XYmrOgjkep`Y$hBUAspKdm#O_*S;vA%Qv zfAY$8PVg?`_NMU+tnM&_b0dHvSbAv+`0dGI*3u~U6)RaO^nxVC3fYro*A<&@!0s~G z!N_(BQDg@)LC!_^&>K$|0YP*@RyMyVq6Pco-Ucd&z1GEo4-1K}QvsQ)uUpoMauon;5;(TS%;KSFK2858E1b_1P$j zy|7>JQd{f_DT6)$99i5=1wS6toYdd>=KQF;r(3Pxg+*}PH;%JE5dFs<={?PYf=rEW z>BRLIL$;oxxIrAq1M}YdnD{oeA35!}482~Sv})4qQnMOVJ{p3;`ikH6kchI^9)673 z{>L;9y24R#aJQmHfplSm66~h_fdrA5dLgkurhNge^1>fw*k$j)qZdOjvO3pqa_Ujs zV|#STDe`8wF0T7c5AF0uwGv0&F>mcfuNVEE5+hYzf5Eksffaj#7hw0x6xFwA7j1W4 z;DN7d+_z`pC`p>h<>quq4{qHe^d6s4cKN<;q6H+2Hqj65f3sBp+Wy{gn;k6R7lNi_q_WWX9Ix0``N|ttGTxL3`uIOES9) zk-R8j-BNIvZQ{W50w{_v+Pb?X-Y=7mbo6JHK%p-p?ro)E{8om^#1A9QJ-E&9$F3q4Gl_;zEJ!-a{pIGL)s41x$UW`%cXwj&Bp=TjH4B{aiu+Jk_O)Gys&1jtv3fUDmbMAASz&(W+dZOC3gNA7`^b<$@%FVFEcqL1{DM1;jpl2tg8Ln0V%-T3 z(Cm)W6B8b75Q%tbEF{vb>PP>EzJ%PjbtWBRY)QIApL*GcL8`&5sfgRb!n`FKYd zOUf0E^QfNWdaD=(hyMx4{6Nk=atRrqaPGIl@^Fh-)V6c~QCOD#QsivKJQor6qaWIX zmEy!IRIQ0H!5H1PrRX6^;I(TS9=E)uBDR+`1{XA7~!ea@V6P zoloX~gZ(Qd`0|lx)hUVp)EeNdm#sME3 z1EoQhR?#ffmdr3dm2r(jlL6;fZkNs2@(aJ2yoILSE;`5RQkM2F=0ag5U^^HQ~i%tmZt9CS-U>0<}{Nu; z5PA{k^OsAVH*R8`QvK9+7JVWm$+0G2!odB~yt~L|PRFW-$A{8MYoN3|No0sQ?&kyh#v)4_g1q0MM(7;MGnwp9j_`D^6RNQT)+-%sNF?s9&#E=i{N#=6v_qd=V+b$>mgB|)2~!z?-Go8c z;$K4i2kwN5>m|bFi489WIjgP>M$UST*YdD5!P{%yDBgMWt^8)B*b1qb8 zdlU2GoLe{dXK(Qh+xH18GtNf*eU#Yf(nfHIyb5R}+MCahKi!+g(p25-&NM8{39fnt z+H$}k1N+iCiF;tjT|S}QAanMR-FLUtD0K>}Akc{+{k9tWdh2=LSWy!2^a;7!eOH+w z71Ejm)!7*)zLy5bq~X&Uwqg>G?!3_8$)eFq{t5pa@MQXz(s7<@m*^GMTw|4;K70A3 z-(qJ_BR|<&6|#&zbXM41yu66eIXoDDy|+rvhp&UiI-69=_?xo2M~O80)SY>Xkvd>2 zjuYnd#m**AePw&G$BYqmAfFsI<21AjZ!DAGbVLjYzrUgZyGW!7lsesr648?0>4Vj( zw{?aGm&$X1O5*t0l4%$oA}(iX!@m!-z_`*zM~>4HNE>}vOjshb&j~9^53tL+7@yUyZ5T;-w%58w)Y(Fv6BCJXLF;Y z0K`J2Wb~Z{H(}h`ZjGRLpNI=Q%h?onZD60YRfUfP5lmJsvc7cDnuj~Q&f}TH#5C{Z zfjIXrmruAWD1agY8bV1Kg&Jo2POXuIL+0WwlM=C@h4}H)%!K9^NT9Bz?|AxZyN9{* zPN*cz05unTISppNzsKFtu}+9%&{53tq<%bB!21C|KeLTz&U<(ufq!2Mb?Sj;$O^c^ z-GjqfCX5q+-_gszuU~S{B!h5)2jgHi2L2_DE;&ZdC6{mS?c z;Qm;K@EvsySc=gTK0FP(;|$EfAPPKcC3QDZ%1oJ)Gd;z}o^Mm~{&}BZ|FO&p5U6DR zE(K_YqbIgv@7IxCpIYu!I==_au~6;Sro~ivFG}@k_zGzo1=0_G7(a5^_eA`v9RS?4 zFfG}j`E}A$tCG_?dDQ5xqosl+x{~6zNlr{S#8taPsfOjpszv_!pr5gIaUbeK#{ZFV zZE@0^M~&asIE|Wi*GU&&r<!|;9@l2_A6Q;_u6tNGuS=F*687-&e$^}<}7L+OZ zyy^_cmFB6&DLb~OD<7%5G40^i+GvPkq;XR=s>X49q(2QD!M}-CP(mRzt^WHMWct4n zEk4rUas-32A+34tTUPe|e#d5Jy2=#r6xv@)SdRrO8?YgA&eX>mwvc&DaWdmrdZ4Sh zC^y+zFx9qAn9|{N(5gb1vf9t#H>dw;KGC&4#v)B*tI>NGIjxdkJ;Uh8*X^aCd337V zfZNp>(_u^F`~)6y-Z#6-sSAibx&4#bR(AcrcKbs1GO_;D8_4E8t*P;k-7b)94^FWw zd%)IYJ2_N%<=7r>mgfx(%?c53=y`sxI!lMB63^4JFLgQ!pud(cq@v+EczZlF2CO)m(J!qkiic?b`JU~&gTrPu+?>@K23ePTJ}|Q% z9n{^afm}T#6s@#VyI&@@-hY*8+cz~R9h=@#75w>)-M@W8a9S>S(w68YU3#G;nexi> zACR7)`cy2ve>a{|64}9MIwv2$zp50p=xFK23tyREN)e`%2lEhg`0QyIl2UCnL%5vc z;kd{BPa``&#{<9npy1}ZMA-VGgpr3C!9CrKDoH@o-v0Pc{mhw59NJuTbekxO-h3cJ zdzK3AhB=rd!vo_S`~=~?|BFu(Kk7kVL1B+DM(3b9m{O7OF`+in78U3`#i5`#zP~w+qIWhA)l=0GKMPxj z=`ZLe)IHbi-nd}X*1EiuMnXQ$+&CI2s>gTVRWC4y@ zUQu!M`zyj;lNH1Hh7?rsYzfp~O5eeX{%oN8$4nIvf5L3yt0-{C0mNFl-*83Ns)>Uh zAiw!l3sQT=sJUAsjA$C0krKp_8H;&i1K1h(YV{7*`n%YVZRA7Wq(gw!Zx3BSBmP2# z$IAEOODHB+bHBQs{qgurT$6?A)xqFdWhOGgj*4@d_86Nsm(ipU&pFjvZGTt%I zNh4%kWrTS3mc5~q%I?qQS=6yYB&pUn)o&MyD(tuOY z=xL*(2)}SCp2=+|wKe=;wv-3eME{cAFY5YYOw!n|I~6+K<5*__gG!n(v_IE+(}a62 zN)ek61m(OK#@aOY7mcNkUD@lY^YL~to(&%G0@M%a3j0nespaV+6&wB%qNX5j7&O3^1QFx85Uiiiie|VnQv9iXU zT1EBo3SKm-cX@zc)=!c`nR;r(RBCr!j;1kVFViRwcT9Yz-C6>%|Lw;pTY*e6YxPkM zJLGfDkd^-E(IXA4DM(t1@J8b}V~CI~xv_-lOwJW(wUy+N{f?cK(%b3avFOGW#ubZ}uWI-%RVJsgBv%B-H1yZm75TX9TCvC_XD7{IP~I_q-%LB$#?p$;&Z&qj5g2 z6DN)pY4_b|MwznOa;_^yXdoFq{Rmp3Wn#g|db71~AnYj}!VKLQx}81R2Zu*bv%f<9 z<-HxX4!GldNV6~4hCw|F!z+z*cMh{d5NnV9S`$OooLR50-d^H8Ng-F5Y{<*~XcC|c zw*!HJ!c&{S;(QKOL`?-42OuZ4wtJ)1@yE0mUXNBl=ZnP3#6(#`KJZf0Wid2Vs7zhK z&=qF8wJRQ~y6E`z2|a%_C)8Hk-A#;Jp#5sa6@4=n(*CK`cVBA)9F<2^Z+@hmcb`dd z-ZhmZTMw*3TZ;81{=7e)5EoxS0TSoDcc`R{ys(Z|)qq`NG6;E1qsAxQ0n}>a%Dv8n z^evCL&MpbiWGa+Ov8*Tv?oGmVK}5<~OV5C55XQekn1`GgiR5Z_PV0~VnfX9MzY|;c zr37;&bB$H%O173d^AC>$4h&jbG_;LXaB;uj*jP*Bf9L0YC=3g6iv0I z57kA}?WnmNdEqaV$LpiFh0J`5O(H!XK8RI7-tuf<)J>i5+I4iZ(oF<7@@OAw>_6{H zZl;vZzGpNTT}JNa~61$8-8!Q3OGN8E!s|6z7G z14FfDnAgl|>g?t8&@_eLBIq_t$T9)=!t49yI#1bU>p|c;_J|ZppSX<_5>Lyxo3V5g zD#^GLaAEtn{KI(YKmpBQT%fw;rHI|FyYTWV1p0_=%$Pe-iu4t$V z;j!XLGVqFuaP;HpSqbted5aB#ICbcQT_SymX0=W^l z0weDG4lC%r%-gQ=|e|&ohAn zvvb{-1+b?dUZdsJ{T$rl(Fsde`gSHD+Wh{htc<5selzmVUGOun_Xy8aW%sDDyQN)e zhLPC4(rBdK(emg42Np32mM{=V{E`I!Q=Ae21lGwOdIEFEw8E!l!){xT5gY2ixQ+#1 z)`a(&UOV!+npaSG7gbbNer^ zuiAaP{zpmq@iVm)--#Ngqo!(m=uF=Hpq(GZU?7-nb!B}u)1#bUIdlvCy#@$sUQCnb zoH!cHJlx+%(S3shH`xmhY;y$;Ah%Z{oIWm8(Q^w@Y{&RoCxfOOHE!?MSQyVpnU{Z6 zkO=dP63duw+_JMLdg)h@=8h=OiPlmRBc`5=rnPQdxeeJqjjA}-37yZ(F!WZ1+E@a^ zU0LTy-QxN;HNu86+jlpot^!J0sOvR6E#u)ozo}!UsitCBc$^{+D$MiHwkWoU{#DJ4 zilNq_NjyqccY8?z&xJ&5aaZOk2ij480k#4q;hJcapQ=HNHeI0TDL)VPXWbw~Qt{de zTgo%`m*0^MFabaTVI;B9yD0RN6@^|Pl>)2#s|i@E9wOAd193_Tw#Kj}J;^D6p7q#u z{9iX%2*823$MB}Zc?3wp25>Qd#=>n|RU`kQy926`a!Wz)^SRo|4z?>W>~Oa`j=+KE z9?TYZ%)jK@Kzwj7KuLgQo^>N?1v}vpToP0NHu_wIgZn?paiU?zbeqQla zfB zsFQn08s;0DGu8Imhc2}wIl%TUrYtx7r)js9JI(b7dTK2fr>F@d;mf`$3x?JpaM}?y zilG5puB6%_N|DvOAv(rByiSGPtoCM|%>j#^+>GTa+b-D{_vRXmCsilt951-J_QfLP z@5qZ~B9ug71l}HB6{-#dN7HXQGJ{kl;iiiTGQd#_nWgidp`8it;HSx=g4~FrBs`nT%YhN3juD_g04b`dxpDwoz&FpI0w%_-}N(n z@sxO-fI7yj(D!&+pnM&NqoU@|Rk|j9{#ShbKUO?$QuQI#o2UEe&$t{J|MfKxJNvtA z49x%2+jCBjzfyjZENXG4FXnt3Cj#QELStXogkOePuwGZtF8HGQu*^+M%P9`*MiqPE z?qQ9}ojSId$t!_n$qwjb!$HE2?k`8aH+5fY9L5UNkp7 zO5fVdwkTgxcTrNaBrl~wjhrM`)SB!mZDPdXW1tos54>O8du8K`ab;M8`P&)fk^+UcDub54swxk7k+|YdaQ`8$|5Pvo z#47y?U?WH!^No3~6k>|Ks0Som{?wc@TG#!uCW*+PxvdFPvoQ)>V3&@+@<&%7n|!Z5 zmjj&)t_%A)^=T>gU$y9H$?I(wkaCaDT)aDb3t3wi4?6y>-5r9dKAL05`bTQ^mn$Cs3NH4x~GjqLI2lw?`;H5CKc$;t%>ZUObRss{Rax~-$vD;Cc zvR>JVM>+k%`*!{*1G|~+NEQRAhO9@aR0xE__FB`TWrBsM3fL2b=QOmPX6#-9 zr7z>%*bDlmdjxWmqUV=66d5-Kx;!`}%Ql1MXC$HFgelvta5Gco0tNsuR;#8@_gBR;$q zJ)riNx7n8^%QOx758s9K7@sy@+3>4yug_T%VdQG;kZ7v0u7@2j-wgq*ah063wg9Os z*;TBAC$kMPG6SKP7k3}OhtDrvoi>E+z23Q~NmNIfr#f#H&RMu)5v}1Tc;9Bx%4*c@ zkFdNBlzn`?-BkzrBMol1b(myS^lWvp6_iQlrg8DKvPc376!8Y@eTsORhgZKAD(=+o z3U!lCF1C>}iG!ETKi0~SItk-g=6#JgiPT9{l%k|xtM!PUDAQ+r%yJ}1g%#_?&}8*n zIwu53vUi1&D-TeSMomlIV^aH6GCybZ%{ zlfh+Un4K8Tts9tj03j<~OTRLLi@P!p+o(un!TD~mO^xHU7^mDLvv+=WncT)?$oJRAC zazlWzkjzU8hA0VM>FSX+mH)Dt2(?X?VE7hyulN)yGrigf6 z5cI%PO!^X5!2_u)wTGlhDo6%aG~^hkmBwM$Qd}SNYDPr};5Zc%n{}S_sWPpa6d_UV z@E(_prT4=4SQ<;erPM(t5T>O}Z30%CI6?NyBs=AIXOT#bDSC51`!LTLXQ#!s#BK7f z#G=?qp3JSn?DZ%uAzr8V5(*WcKn`UXSqwg*HuPL=b8@_PXG>3pK`^U|;J7DNSN~)_ z!vEvOn^M9FWOg954eo~0pC)wz=nGhY1!VXxc*|)0@N7VEswaDx!B>kdBMg>mG~>&U z6@0sldGGX@F;lyWc~?c&~KcZl;8illxjld6Mn0h%s6+$cu0Zx)x9OJwq!9q#*xi)4n=zv! zAG(|9-Mw#QDrQ`oBsnEtLJJm6uc>j>pEMs4bm8Bg;8S*?|4_dITsa{{lAKIaFu>DV zRayIHNE)wwH!>$9uan=5fSe#kZ^$b}f%@VGKb7p>omhI9Fu>~WP3zuM-G^4?$gb9O zx4Llm{5w$9m1lrCc{D1|@1f(;hr>gzP=$v?zwIT1lBhUw*tUNzAeHAWi;G0;N(XPJ zEvUjX)+2@tC3*fcBA`scTL0y^T z|A$lM)imPM1lV%+J8uV7CM4Vl@kEAw5rjk{WeIxaY_kMmqC%Y7WTE76KJ$u*6_FeR9GzOaHBhv z=2+$qFQfBj-WeNTeLpgh)$ zI)=YpgI0p3U%$Zc<#ilt4!VhX&UD;g70-0k$oPcY%Am9ZUd8BBHjVTem_7Zml#g2F z4U5|D;C2HNuE2Y4ebf5hC0mVcO~av5`wU7ja{HWaN>cgKl!jghD9qCWyD**E*9t8( zZj5dxCaxoEfO@vXp_{nrIt?b_Y ze9T}=MGZg}NcLx|o!X;6^PDdkAoZomIiwZB-N&zoUR`o}c|#CNXh@w}SeZy6htEyj zt~15ottqmyl^&1pNFKe0t7y78IB!U~!x#!)UQJ~K-tX_1fdF&(n;%R!cYZKwBO&gz zk?c5e`k-WlUzw$6oe<9+l6##uv&N4SNZK_w8Du+EvmS5RFWPl~B~zuT?13BQMozIy z#Fy*AE?um$gJVngo|})AX8>@He3r;-U`^^W9n@*}+~DVw1_+|Kahi10WOIiSJE!~< z)9I|VK9Jz_ld=q8lK{`|FcL{%uaN7GqAtU7OMLqmpv*I@x7bs#fx|nq?B>-H@R6Dv z!R35)a9Ek8dfV3@b1y0Z9*=o3A_@E6Hjvfn{<;SWKh3F4cspE}pD4t^-H5&$=5oGK z>MHI7hqbhN6|s;cV2JF!RurkuO8-VD)9SzFS5$s6{Zf7ROtat4qmUIjq>gN5WyFaz z@|HzBCEp)+B3=B^Q7m5h{3mMS-a@JBL2Q8(14h>*L{(o6Ojsy9uG&_F*~_Ui{2#o2 zu!PL|gU5e!4e73xAz3rUxT|ji-xk>dPY3q!(pI3KAMubMcBNwPb>BY| z$O1iUuP#}NI{V!e@q;7FW@fB~Ezpk2U)jfv%j!?0-92L?d+mOseu_i$1}L>D*&+po zTHMQ;5{hl&JsiU?N%O?hA%ATkUP^>%VwfC5CTHU!y}?1fn+28cy&AfF)V-6Bbu^#} zOXk4<`!-`2S49if{40Ur;Tz?Hv@!O{i<3_X;_bA+&VunbdT#-?=U-yWrQRhM_VX8{ zqE>*(JDG^l1dCg?r3&6~z(y0IfUOSAdO-oCtn9ePuU2%bDfteE4)UwH1_E#^PA}mU zmbV+bkn~Fp*z+E@+zYJAF8XZarFZhHgx`NWaWe1XuQthP zE4|M9axxpm2}L&D4dXOUPvk3Y-sjBzX~O{z$`ot)vb3fbEC4LSx(N_!Y~1PGU(Jk1 z?^_dNk5q10qAr4Hs37N;&h6=BYqc=Oq2~KP4uY=mwC2)5tFS_E$^-nLs;+$9U1GmX)`*ch?#Jj+xP^_aeu?zC!M}EBmXqM5!n<+aBy6AwEQR{ z6n9FM1@lPDn(5LJuMf%_7JVJ=m{WDdOsWr z-r{W+K-c2@s*%>*==X`pU8B7aJa0{<*J4QI_?Un@C;D&p=phQ9WvjBYe%mwS)($yu z>(8s7^4d{gx36FRil665gKt_ z$#Cie2GTrN*}XDgo6{(dCPv@n|@Dmi*Sv^ z+)$Qhe{{CkYz{gUBgJEeF8Ro8o!6bZ5_|RwJ2QM}`jpe3x^eWSwbxfDudj`5aRkd? zt1q0EGqbUdWVAot9Tkx}Idyq5T@tm+=vvz&tbJhnTyvx-05XU@8T@e)a_bTjn`J;f z-%^xM9R78ODURm9+a^{nlJy@#6Xi~^e-{SQ>Q4Q|yJuo_Cgj)y# zcf!(*I|3JEd0>$qV7S=Atq; z1B;`%ErZ|095K<$c>MnEp^Hi0d#st zA~pk0=y-Rvv&aNdZ$ZKx%izWxWFI!AD+yy5G~)?0jq}p%xK97wFEHaVew>jIRvA@R zS0elKWH*2^@cAfqHG$JAdYz+JFaD@Ba+k>aidUoZI8uOI>r4uHcL(eotAry#XDwT!nh5I5cpC;ZBR@#qW35u4yY_~5!phUIp84}Y+jV=LT#%pW81jQ-n3Sm>pB?fU2-`@9 z_W`K^pjROsWdBGLX?G(G`4)P%c~;q)7%z#Fv`UkOM6&9bgci7RRmtK0{LzQ(s{mhV zm_qaB&Wuw0D)L_~l;adZ&_dB0*5tIJZx6jB36PwE?JgsGJT}a0$Y0ZvOTtDxplkH~ z8f_k8PV2(khsDsjQgTO4gj#m;WCo333mE9z`rjen2Ne#C0X#B+V{SgJ6!^Rs%(r-m zDCX!CYn@+sY0GFh4N9Qj1rJ}(&pE~50J7wsNbxq9J-Js^7A`KA(wHyO&~}(7Y**y< zsJ+C^W`WT+E{uW(!x_;i_r`<%0Hb!0Z8xvdTD{eQv*un!N2A@lfC^P!gHOkabsOkU zKZ4mOA8zWC82Rms{A-U=_8NMJ1Cj5eH!XM`owrfvy&f?y4p7a|2_^*??r2uprgQZ=Q~d@ z5H%O4(9_++4_E4Hzr5t;H-A0D3rWYgi<(0;f-sY!jQR`AoR?oYts(z^fVTQ{^Zb#* z&<0=PSQ_ru0dG$*jn5_0^HQ6tL^W^L4GVoh`IbRwjGo&we2segxN7-Rpz}Fr1Yh|c zi0xp%0CT564>-=j%#n2aM2)r%DfIS0zvj)1Ek19a2r%s7c#%Jvzhxe>Io(1)ad=O8 zM}ygq^!-;;v}hI43pDyMkFAGie}@ zvi}dZ9-t;{lrO}gu+M?wpbFH4S8u$rHntrinNvRKH6LIXU!#&c2g7uUO4)TB=yyk>+ST80poBOL#Zi| zijoHYILbunXgdzUf@88Va{_LR#dXu(o97Lr+xDBX$3&U5fmUN_esPxOFu`^Ug?VO5 zx$K4Fz?fY>13~(ASw2L($(8rR?%$3oJPdbRMnlzf`&V6*Tk04^sJ|Xqb3|XxB%6E zXP2n-Bz~}pY@EQe#|SI>2eIque*X^3Z5$O$8`+Xr*Mpuq%=Vo@>+)+6uqmLfe4RM) zK*@Gg!23y;;WR78hjf=KK^q-X?s`9Apw`_|ji#h$^`1qC7GQ9knur$Htnu#lI}xJY zAIsiR5&lhQjQhRJc{N)+U+$IJcC>qViaSPW8oljAd33T}o2kUHJ zEoYVWz#NM-rlkmGdJ(Rum|{nxS_QU(PdE{1rLvj&33yDzJF(85Ea2`oCXjkeOe2v! zzh1b4Hsv(BP~OC@@}t2d0CLAfB4)jWbW@W31GJUTSVk6=D+0`k8}sE z$l|cb8|9)OL^H}PZxw=Uund#Foa{S^H5-9U+>1NScT4oQdw@gH`P?b|4>MPv*^u#$?5=y?kLsmPU zbXOLZ>_rHN#Y@5NPe+V-b=>47&^p*Rz%apCYXG6(#x1AZ8VtAKh^}DNkpBU`0QrB2 z9vsGLf?&I?vOE)X4?>;$fCx8J98G-(Ga1m;h!ZDo3k)|_X6FtW9xz=3ZD!6i4DM%n zid{%5($}^+@hVo5;;X#3Z64i|Y;L;2&T|F`!M?}`qmDhXyR_C(Y^n=Fn*oKuNAptj7PffZ<{O>!cGVCVP<<%XMmrtGQl8m&8}j>85I`*V;`oHylN}P6>bje_c_n>kiH&09_r`hFGu0=O z$BJmj<%P>^q|7F168$7)QifLuEAl!$gwecAOonPgP62(%}=77$nDcNrUm-_;ZtT)P*W+LKtYTRTpQV~KlE^`({h`k8zo%H}%?IK+2P?g?YEo}k1ywFDz9em%K& zr*9gFVL4|wuNqwbBH^=^z(}4!xA7$82hb)2J&hKE%6#9i)}d^I=8#r$sBiqUC0YR=6f#40DcDzE)tyayO-0-sAp*|FM5 z4nEF%1U>-j!JkzQ9CJoo*od}Hxe;RPwsM0OUz_(IVdZjAH4X&R2IipBJ~(x2(o1hN@Sz?WjTh=toi%}2mMoPZ%I zG7AiA+9gDtp!_>^YxuL(uXfj?MNZ;74_1tWU3xDEC1mz< zaJWGdlLg?(Mez6UGE2K>Iv0J#$@qp5|4tFL5k%~|CfWHCnY-vAIqfX9V zUB8e{Yi~=w^+Eh^da>=AD|_DzI$X5uyS0)>pbd9*1Y-sq3DS3E1BM?jopqn-a`+?| zp0wgG&u1w>lngK8X#{HCdckaIh}&{KVL8J3p(3l|Ix#W#vzW}@nzgu2M9mJ}P7R~Q z7r2jie#Nwbj`qeowOTjP>>#_lu5L!=?2sTg$7}Br)jKd9-Xtv6Pl?pj zD}A%w)qH!u9<7SC>>c6H$F5PYQ1>&q#1hnJ3u~#=ND02+U=yZ-aQUI1eT5kHQyHoX zSC!P(49QtX^ok&HR`NwAV{wH{QJMP-5ijLe5DTBs(wtP-_gCIDn!-ECq4Wddg*Id5 z3YPL+u#w*yfKd#?N!m+2|Av;)_pY*5I=Y?*Z9L(_U5OEO0-S)NLg+OUuaS=@gmffBgGUY(xtX6HHrwBFz*IIgD3Vb>A>zjP3SnuL>p7r8MO##YORLf|5hDsW zzuO8Y35fzqghSl)NLvTahaJSiua@h9#}z)*3oZ%1+k^G_gRY?CA%us3k(!Ny@BKAd zclEyZOKv^>GwP~9^=^RTEs4lw>bK@1l(F`Yc!iDW!(ono%R;~`vD$ss9=TIEut=5> zHg>?Yh^BL!oP{w;8&Qy!pvH=PHVK%=m{xCavEr-wPAz0dzl8i#D@(6k+zu|Loc|6z zC11~(=%-j;oDW97`PXzkz_B=xlA!?{3(xTZxbU4w7*Z{QZi>+R#!&$(?AeRwa!OtO z9(ETAIf{v5!y;_W)7_C;w4^B+!Didm5^|1ek9{tX=LCYE^Af0xjF0PG&mg6iIO382HW$Q;|m{r57`ejQofVPaI^bTB2OJ{u5Da zZPPe>HxB+laNM>ng`=uANcK(03K@X}Iu^8+B}DWb^_PHm!4_YIVgns7?YApt=1YY|l zvsHO06D&N$@ZiYW^XFV9yo^Tv&)0Ig6_pT8UWrF*%4z|#&c=h^P5-hUWjrj^GbVuP zSlGfprO|CII6HlWkr28-n6Iy??(E8X4@eF=^rdiCPhZ_Sugc zz56O-T`;AVf6EH`gK#ekb4*c^EhfC@=`@Kk(n#;?z)_d#zz;M1f<2&WS9Iftr5-J{6;xwm!)v}mkyIQ9lmpX1e6{P?0EsTd|Ph;Hd@pNL`R$HDrmqn@(Q zzk1sncM5hT8e^YLv1tPz&3erVbdMZj*h$rn#5cxvZ^v}rl-6+iu_4p$j(l=Bl7bP~ zxvORR%}cLx-nv297G1iF_BH>oM(tY*I;4(SeY5K@@e3H*TbDut8lGFfhW2v2BJc&E zgm}rR9VV(|-{|p@Yt^W}ORk`uZxe)6efXAW`6d0HTcD`Pyvh4CG`>c1aU=+Uq<%0#W=Y=l#IJHLP;;PL1N7wA zDOq^jRCBFJAZyAVJOZb2vgq3d%-lhCRu8I>q6>-!+^xSsUjZ}N&|3;8gkc8N?6$kY zf%39#67aEaWW_<+%EA02#d$+(=~^`)rQsHpE8UTEDV!l~oI)QE$`8(q+Eef?M9N&j zw;zG^lQL3_mwmjUs_|vm1EO{W}!(QI+;vQ|2-shO=06=9v0+ zg}Q>_GK9GTg?}88?plNDyRdKwA-qM?#+V%J?e=$+Y)e5}O2M;fQcvHo1l2sADI;`2 zWfd0O69|&eXKXu<-?POO6%WWdX@0zY#@?@VZ+Qg8x4^s2tF#l;pZjAZ0ru_%zA`v8 zo=~oqy^sJ(#76I@hj%L2iCttl=5l8vaWjkm7|p@@|7(1!l>>6B+t&$k^!9+vA;#{O z^KBMN#Lpt+Uj@&4E?7VoAImq!+(i0TCg7;Ke{pDaV*+#JaLoLdSjZV^NT7V2hyohb zUp-1Ro3Gx(+PD~KgZ>?ugSze^MUfrRDf&ekfKuJ_op~|!qSyo-*&8hdHT%*mT?!yv z$03sO(3!WQbtEoMOdG`em)8C#vOk#@Xx%+v4Qdjv>AAP!&1GzSacS6jpX%e1 zZQntYF@ZDTm*Xx08C{;wNL9c^*0qYO43ls1=KEXAWo?#dDg>O3^8KyVG7HND-+60o zz5*BdqbhxLuI3KG0f_Iu`NbiBK)qqPF24kgyb;{?ia2nMkJHOTWO_Kr3#WO6y}Rva zgj!;;ziKZPJKp7fjcMGV0N~W&?4Y;qXW>G)`A!~{a~+9zygbu*&;1W7k2{<{PI7Wv zqPmJ84&_8o(;asGk&x61)gb`^QgVVBel;IH7H3plgkie&tR%U-aVcqlb(BGu0#C(;#5xy4 z8UXzvR>oj|Yk0DeUhVu9D1j5NpOQBTYAj1=({)#n?0&^3k}shTgG-+$shh|Nw+@e1%9+VXc7RqjcUFR)*d8h1f1WR zPs6Z7So}i{s(PKf(4mM81j5k3Xafp;nguR(X93vY4_(OKJN;SYXxK-6P5U3FpRe&l zwx#b6AXUYBin6}rK4Ov%fL^GX>FLz*qCY^YU;Q zqz*`yx}q)4QCu+<16tHyHnrJ$apX(Zj86$;KZ|E%BAgCgPO|W1ER{KSGhsLT)`!fY20A1oH7^z#vv@}%O!L*} zXB@%%SKOWVJh#3HjzO?H!-(W_pIB?{9e%y*N}eGs*2eOchrQ?Nh_r1D3gL@}70kuj zCc%ut_a6%iQH?8Unx;sr;hS^w1!1e3Kby_8*^Gsay7{kjsJU!*x#{|Y90_vI!aF9) zZ*y&a**fA)3ApI5cM+Fra&o03prorw_kxRgYovJG^B0!i_z^6v{Wl}t%AzMl@p}`R z8`7xANEt0!<<`d0-W$v#lm?^LaY$EJ&5x!fZzV$3+zK{)WNr3@pu$?eAN9(TT$OL- z>-gg>YqM=4&f!)JI%-yR>}huv5y_UBvSH@b=-9CqZolcHdF}qh&K8`XdmP?;jw}h* zw@0jg8!FFLknuO|L&KPki6mvlnoh8YuRL?LPH=LWx0zMY*9{caueno=_(NExXIKw< zed+n#VCd-JRybM&FDcDRZx|N%m`=@r`RH%4-h;Rrg3FGcs(2-fesz8i1Y8xI1tSh- zStgRcyy-yCRja+(C<2_bc%X%OfvKwe>BwFkx^T`dj1*YjbksDmnAuk1GhtAy+?xN^ z#u$fTu6{f`IdG}J4Z>=fXMR~$8)3RlPkOXzTR9NH^4PKVO?cn3%)>K;F=S{dI|=PQ zR13=*sv3a7=1U$i``$TfvbBTdE<8ig=MMpzX?)MOpe3dbJ_~nq;}VN51n=l{KbeP; z^fA(^F`oQ<0Fx5QJTSzIh>XC7aF>YrIVJStEac{ZMfbUJ^3~^$K7$yEwx?lp9pz{g zJ|Qs>6QN(S^>sc;UafPC($kEw?qMAVcl}oKczqT$7}$(3FDj|>?EyN;b8hdcN)I5yoCvhl$p!%hYTb!< zyWJn@8()^ZSJ`vL@1szITc~u02@`y^^IDQs^imsxr*VZKazWIX>AXlMj|q*i^V0xQ z(G-w@(8_m+5lODpt5YjaLhr(5uLbQ$9L?xn4l0&><%`#>?P_0UIoUFgNFKBgVr6P7 zpJlGRfkh9F#3oPH4n)}3u!T|oj4On$HFt)DIRwvqXihW2!&g535l2$@m?o_PhnRmM zofN)NbBX)|75` z@4xXR{|=q%O?JNQi+ZM9RC-~&tj#BaT^A?~x`hv%``;{Y13}zTkS&YBg0>zP>l0k+ zzRwPoRMUNfN1dsjq}uPX{$Lc+risspGne|^B|H34Qzg$ncU zm_dlV!-7!7BZKMp8ecf<+pzr>S8bB;U5}5Sq9!SSH$VMelkkDnaSznq=l9&m){HuV zi7vATQ+MT*<%=0>%d%aMSAOzMvoSf76u8}m{1sTDZGWqs)?AiunpAdu&&mbAoz{Pk zFYE6;vX6xpf<3VS+S8uluvAEwzi5>!2`R= z1mXMHYCMesA5;WpkPJy3t2Zw3#Q&`R%HII#X7+TJ`I>i_@$CGY4RLSe{OT2QhiJ2RW$fG7Wt~=xZ5YdB9b+uRY`^EI&-?Q|*ZH37I_Hn``lGHZlh<=z>tnm$ z?q)sE3Hn`d1=Oit*d!)qkf@8xmBs0dI?eDvq{jV`FLHS59Z?oS7r%o#fGU$_&6*Uh z+i(a$vTLRV3Rca3wkhq_vb0lw-J-wlXSPn_Q6FRB>y~q@>FC8E-UFK+>d?)i6&sGP z?v6cYYuhx$ZS@2H7L!>u?d|&27V3==0G>BnH|T&qfm~koF;Y@>D(=?YQ_2mhIKbzd zdrue&euiyfR6hw(J+QfEqQqZtN^@5GS<3-n4+R{z9DI@@nz7V2Vz`*E z8TD%E87X9GTBBuCjKoxu(J%(s|B?#Ki0=84pU5u?Hl&kC-c zPg^*;EE_+E+abt)X)4=YRg+I<0^4G4VCwu-Gn!}N2# zX5o2pc4G-`1FEYx`SC2fL^$Y#%)gZHk60td)TpwEuhBXz{8nZkF;l~eS%?Jdn%y22 zxgbX_AL%h7OTO_!I0;^^;Z^fAoyNQMn+S!g+f=oF5~@>TRs(I->^b_)g2o9SI{Zt- zv6vGsgpeDc?C=~&<>zsMY$u!x`$ufOI(jwtXyS>|&JnbCs$7vC_`5Uk!rnRWAjx9Z z!LtyDQl0kX1b>p?;zYz3k{{90(I{ra_@M%a=cH?&cE-*dh%~vS*kstk=jnDZhjg^( z^Mxm@8#@muxU$yeHN15o^fYw$J8v9nKk&)p{bOB9Aar$@P`#-fJwtvF2PYS@8Q{(N zQ;QNKgEPPwtMk5Xi10+G+=pY#hfUlJe69hoj~W0j9N(r=I@xHmKS z297r`OEO4uqu!qu%M3v)8swyAdXtBl93#=Ruijf+TErfR(6uKMA>Il@XF)sg*`tP)!GE&8hc(&o*yprpvfR zT<;RUaC90XBe^^ZpemimunH=~5aMt*0v{_zTAAK&#WirdJlW|w0Q$`jtf#WEYexX5A zpRLRPc31kp%IQ}+>Rg|_PeN5E#ZRaI$MFhyUgff5+S^6J_7M2%0~w)Q?B*7)?y+`H z1>YaB?9!xjYn&^Gf5rpxZbK2ZhyRm94B&b_OGVCY5S97I9*3u-^@I=b8H$a7pwT7S zC3$qA$|49{a+8psI<9{0hCxN|N`t1-{^Owp0)!p4on)z4cY$Fm5a}50R(Y0D?+*x4 z6~m5~tY9vqYsZd17KA0l-y|DI0NvA#`PUQT5Hf#G_ezq7#+B_e3{En;|FwM?|H(YJ z*%FRd&Yn=(G`mQjdF7B0)9cH;vA2z?xM|iYJejk!EeM%4-fr;iKU3oP%vhr{`^t!- z%_jAoBR*3)K)#m6q>UD#xWg0D?aMA3ffg8K?4H>=-Lg*a4&7LDLsU}zGO1gtTHta3 zee*^`Om{YFefW1L48xj|;bSb53(;8SeRC~WUDQhy&N1h@<}b<_fb}Z5!;8#9mZ_rd zOt;VBg*P#dVaa@+33>?wK(OvXuA3}t9-2;Nk1Wj!{DwzlFV&e@4fkZq213IbW6KeU zoZvmX=7q(qJXRhhM|d5caUq7t4g1ypnul4Aq^Tb7K=1lT4Hf0`+Xxmg#6&pTyGRG7 zQNXCMCi@G(g0sa*=eEMw>ZEU_<(fBxwO>|VMp0W-KG%D7E?eFz1@&}LtHEhJunjc+ zUz=c;nU(2KHT<03&`J62I?nobA%uSdsy0H(wt9RERtGn_H$wBMu9#8W2L^qUUuZh) z>yL#f@^z(%Nu|6%7xkE&CmcXgj2Vd~>2~_M3oo1}4u7%u&ARSv0qB8|CdYo=KXiM=CjVCx)1U{oA??(ed9|I8-NP;)tnz@i zpq%P>@e%xsRsbD4v>C}T^6?tZ>(8ZQ0n^8gHdu?~Qxr#-EtKr|i(O8X_PZIRGCnP> zQjjFe{JUr@NHRR4>R023^R^)^#viTwQcw=exj9cnEP(QZX?wDKqu4x(iM8f@6uv0T z!1r!eHZ0e%_5e{)`e)ePdVF?(%%`82+@-*Cl6~s-rfms6c~Y&NG6|+Y8g)0_IZx6% z4Wi_r0KuBq% zSt#Jied`ahoCd=>0(PE8fJeYeE4iA4iaD+*vE=nnLk{hWhMQ|c{(X(l6`b<(ei+Tz z7Q{aI!{UUEz>-jPLyqHTiYuBb*CI9Ny(Fj|$hSzxmZTL})u!vii%o@EUkU)yLNb%4 zPY!Xg1wt(R0(xT7@hw)H^t{B8aT+mnYmsbZJB_LmM3A^fpP<}Km}OBH&i;82eH*26 zKtZIwz-}0PYD{4q(L-Z<(sJDU_>3MQEL4;D0JNwdFQWTuwEn;M*A(7?(f()ubNXwU zw{n=R{wPy7#CU%L+}$(eNVcy2Cev*7@+H2z;v;vL9UOkIII-a^)ya@sWqHbth%9MR z_LC~YY94naE2y-VIDvXpBDI)+z3fnG#wO4?s(PXZIYzlUl;*wM1ON`MOdZu_7}Nly zh-`hpoQMU1`Rg3hx$LVhOZJ-#xXv<~B5jnsCW>I^G1H?sHOSRn0KrL8R~fv!=o-Hj zYgWmYume|G*c3{smpSe1zzg*CHa+%^jISP_i!2j9(EeYv;~w$$+5NBWxC{C0C3uaY z7Bp94pM)b#*qzUdOQdV;b{x%o4gi_o+IPc{qC&Ylk|Cj&AI5N*RNw>x?S5)4)f}H0 zkX$XzB-RtcoVv>gPDolaD>f;YXaEfEH6&QsS$p7=1yjG!2kYUsuFj@2!-u?eSYznm zn%zK z#{2T(&H7XCA}V|-l`qQQ?b{^Y&$EAZ{VcGd1s;VL6PtG=kF|vvFP**5q_NZs_^}in z`%F^a<2E7~nZovV@6iP)(BYvOA&fLZO)y8<^q{C}bh_!G%?%9;rWqgu4D-3UD~=V+ z+CcZd^eqeEbMJ9S7QF(>?56nf!lFF7#%WzkFe_a&S@ABN4rs>}JY-@6n~(UWa!aZKIdv+d;PQGS9<$?`4w*N65f-Mpf<{MkV zv(nO4NEtyUZd8BKm0^DQ8f(;YmCYCY>b~HyOC{OTpuri^1I+Tic`>zD2eqJxl}z9; zylJKcT`4)#A(Rh^`AsMfvcv& zk(qWNCplz!c{w#Zl?qNbg{s-)?`gY*DKL(&K#Pl_o3u!V0(`it!DN zKl2zanX^o6tEm$#A2l+-ad&`GHD)E&v_IQu7#DMsT%d2x zf|W^%@@6_uteH<^aDx%xYRjSul~*^+WU01&n+^?#qv=Qd~8}QOpkk&lmS3R|&BjC7>6Y(d{tT?DTvZW=Jn>ka|ylVEV3Y^ts{q z@1ET=rl$K?oj*tk*zx7p1sn4epQbmNO+2X3Y-)>(mfzQwf$Cl$InvA}3|qPnJ6J1d z2_}on2ZS2n$niP z&UTfQ{pJ8f_Y0Yc`uoQox{1$khI}(7>Ri|s!rhTNNhTLBo1^(O9Or)!sAaD6weGu+ z6gU^6A>j4@-rxh6fV%NGvW4Q#~jThQ4@hunPNSLCfG8wb-qal?EQB9&Z*|~ zK=k%`+^WXgIwe@h8Sv4)bs9=iawpprLrP$JFWN5SKz8`wo}y5aQJMGOR^+GeZqoAm z0lU$u^s3ZAD>3c|8!F4*-al9!;XClXlgdt-d}97(FJCycKZCQZLpt#BjuvcDl^z1( zI$k{HmN^i<$Sz*5;N)8!K;P+unmqxh^(;dTcO>LGn=24Lon?XA&TPORt@~ebwu138 z4J$H_i`qRufJqC6Nhfra6b^=#Qb94dj>K~#u2VbkHAvQWUbg=CKMJd#;`$7)9Vz*> zUK~G-s*@Y0JPhu*?w7K<&`YVeW>=S*Yr4c0S`(e$ft-ySE3R7JCqAa;sR)q=x*LV< zo)_qPW##_2$9I8rXY=TnKR=QECh=S8vH$*@o07~{3vWm|pqq+T)`3=rT+wCUO;xhT z$N~yTJ%-oDP{#X#`w}YU>&t2{ldJpL2}XpL$FmwB@NHr%HCCa&3k0gF%X;J1GM|BX z`YxLv24K=s>}rJWr*c;fcW=g@ z2KOq@pNa$GNpQ~>O*GNH?($$HULWLiFFaY&(hfnL{_bi*Q835Ji<|wgETF|B>d>y; zQmy(v&BnO4jdTKZUsxz~XL1p29*K()$zQ3@_wPIR`-TIUi|s5ssYdLf3DAJ6EVJeR z4S*h!=@8(vp21(~CG`;4;IwxDg;jHpfb(#HK2M{lOzRm>343Hztib99OP8AR&DXE3 zC>a%V;2QJ$R3%~t0pNaTcPUHYT7N`7W^?_`y7o`o{Yf_|O({S9Vz{`q!y;kSoT*;FEa z>#miWV7b#n2zPbs8$r&r;HOT@HlhREOqXyWf!3o4WgOZ{!>he_fM}~VYBk_Ct{L!?B6on zfX<=1Fc*BlX-SH}@r+Z$;5evq5XX3!2mS4EMLm>5mEuWQ?g$J`kAi1>gD+QxJc&^01PzA)0|U)c(Zwxm6g zoY@gM&W4&rO{TfCruU-`yh-dEd63+&rE+VNcvd<&;~q(XwoFW75gbMX6i3>&GN!A1-_K`goy6lXc z+Uv%=W@G7&w-}ytkJFkphzS3Wa~sdMkDD^Xc>9brDQhZmrmW^g<0^9&WZ3hyVNx>n z%a?x+-3GW|MV2tCY9S0@mKUkN%IP_Enz2!<5boDS)~j!W+*0bXD`QT)F(eG#*0XV_ zpp@Fd7p%s|%&a9VvG3DF0E`8E=c7vkiB*zn3D>hNhHskpv$|O0Qx031prr84>%Uoy z9N;L=O;;p_r^1A_>o5$twn|?A+3AYd3$Cgy96gFEJz9ckW*=RIA$ZeQNtt*7-5$^X?VGOpJv}QlMwt(L0HK=*Aivj^%c;#0qi=|U97ZT3G zq=8Y3KQng&Zl(nD`=Pw$e%|Je8j^H=YM8mZeMpUEGqOU+=!GF6LU%-x2Oe^MtmnC( z`ghn>n?Y{u@c2N;C%ZOkB@;<~DZ=N6;fnhzHjh-n&N%NjTK`tYh$Z!LUegfN_GM!p} z?}}16jut(82;*giR*_HSnK4IC+UOO7sp`%ZbCKhRTN(H(%;6K~mMO0tBxT}f@b3hh zRjWG$HYDP_8o%Yzzl#n5naVdj`$o#RKM7|^FbR&l!}bY`&iVE=!iQ63sTIVuV8F`X z_Qa(xR`qAR{n$935el!Hfmaocx@HzD1+ue{;kJ4^!Xy*1SnVjI*`N=e>g-%l2J^|! zBqh(&z15M^&7B*u5ld+-i5BYkCpRn8?d`|YaZVu}T`2RmT`>}5Pl;Yk2jq+}Hd;$@ zy~=De5je~BeyIe$7}#PDXL$nT?SL|jwq=(nAR--5Sl@e%+0l;$Pdil4>yqXjYA586 zq7$8J`Ag%GW~(IwA}9^SsiuS`mlM9WV*@FRrWVTw_84-EQ3}#WB&$G6HiqaD>{wtj zXt@@sOq7G38zAO!RiWm5Jaavp%5_W&Tjkfp{CYpk*R&DovBdLfRevck)6b!9j0&_SBw|Ur@CIRQB^c|A9o~^h zDU6i8#=LhfCkB?CB159*{PJ)rJ*t%aQ+;JK2J70h`&~TnRr919VR2izF;qhyDeo^| zYUZJGdLauXcvlC!Pn87p@od$WQQ zin%^E%p@I_!o5y$-pnKNbElePU_giT=81EgWPf~=1O6BGRE%tFIwVn{PS{*Z&B7OP zoY}f~mu-puP3;ir9-zjV2D+LOF&`h zI_%i?8cxupY{8dPV?1t6)(Kr$nYC8lcDcGq0F ztYmjO5C(ic;Pep5g<2kLrTHyf4>}4(O)$wKmT@EFsXL-Z1tPkOs}wwshrKZ(>&ii4 z$8}nRCm6Nz%z9UbbY*0PUwKoX3>cvHXZnVKzt%jk!W0kF5Yb#n_aT;OQL1yridwn1 zPKY=SMcVWz6#q9{5VAh2xBQP_Pkbal+Jo@uVMk-E!5-A?%w93~zxW9^b*nhb>_Q0I zDrnzUR6KE{(4>xJ=&V^)kh%j#s+%v8(Mq;v=R?|ItK3>w2HxCPrX*v zXcwJS)F1*<@d7YyFSAUyBa?IIj2s_!YM#JVB40RS>f5=0nU_#o{g&EmrvlGAW6Iyo zQ4PtJ9-y(2db4_&Zd80z)j5N4iyZB^nX?QjdVw14GJG}gL;oS1v6^x3P%)@UYamz~ zo*t4LZ1u@Hl3hg)W>3ynx(WVY=Lbz39><@%eO6Lt3>gJ_mNCOm!8km%z-(HkjY;xm znz12PNldtA!%nq53->{#bon)seX!wW0uEz-s zjf>*}-b>@dF+H)EgPwF@Lyl?G;BR3gH!qh-KcAKm9?{=$Fs4aGkNd4CW~@ZQKR)t@ zr>yC(Sp*CfwRiVvPjl2+J&d9V zNo&c^z!D4tL9isB;gv(lJod-VWHmbiShtM_Vl?Xx4*RAlI2OBcxwmYSp2=JETrlJh zE{#^ipNU1+3h@-8No`3Jsy^sOp(4xoQ-4O4GVr0^EnNU6;1*s_0`cE*mVy&|rVeDC zq`Myh$!@FfNM&Rj_ps_P1e1N&*Ot3hQFYiAdEu>JU#_*STVxJZubY5tpsItH;LT5k zu=dsZfp~A zs?#RC$+ZrSV(zsBNv1=S9!O~py3Ya4duDh=F%n7nF$*pix&e^it_u9VQQs@UB^2#y z3cS-FwdIztx1ZLv0QgUC8w7do(fFk8h3pdKAnD)<1F3g~g}>pq8AT^bfj?j8*32bg;6D@{54f z@$Zg&RCym=MiLBE!j=I=`O-`PO8lJ>Y`EbJclxM;UknvN>9 z{L$$Vi2dRP@%%X8>21)3vD;xO`mEymlNH4sE2P9VicF0rtv4bqJUFV-j85y8iC}SE zxbCOu%xJ=JO>UA5HbIoVJ+I4O;_#5H{EBUM`ayGTO9C_^MM)L;-O7aT8}!N~2P#Tz zBXQvq5s^HlXJa5;!DL9`M9-S^Zv2C*onc@u4d>AX+?m=9!M~=@$|WL^G*gB|l$YJe z)#yP5o~f5yv8gL{FShMNwN3gG2{t8zMrjBbl5*QjGLtexk4FZ!pQn>#`nd^*T$HRJ zlP&Z3H!Jwe-+oCo(ikfB!^SF!p^{cJHiYA?v{tV5?|g?NoX`Bs+?vsR?C{u}xfj07 zdP$6zi8kOI{|>`wbt-RK1m7>>ije29V!dV!o4VOC{?E!OBu%||gW0-eDuK7z2?A}w6Se3!r6N4=F z6E=)HF9AHzdqLqAbTQW!AmeK8RG*5Cn)#VP^nz=m{!7NRq4FnsvU1oRf(rF~k+3PE zf43pWR`zhLXuK&?;(HMQkdzUcG)YBm2E__ctglGey+AC_hD|BW#FI`K$~gZM!+ZNY z^WG0_QQG@Fwt>rO)e2-m0!KgH5Zq9P>jW{cT{V$Tkuhph zT>qOrv)Wo>{kT}J?1h&xw86`3j9)oSpi_fcbcHXJu6F50*z zLw)Z75)|r4-rkO}Rb!7mys7~^k>$Q#dl;=N*f^QK#BxjK2_t12g=-N{cM48x9s_Guq(IaH;}g`a?PQ7$OdC(rA_-G*GsTjgs7 z>~j8OK0oDWu3ekp#sbzc1sHXUt4Mwqt#AV{iJH7M=WPS8q)#2nz9BfZK?l~0NwmI$ zrzP9{Di1~WLeOF_7nQJ=C)#J<0%^B)Kl>n3v6 zo-I(0fMS8v`qwBd6F5jT#_bP;IrhHE#6c|hiW&AB7bmN13Ht=9nufSr0B#HOd8mbS zz-=Edt?u4-t2alFsD%YlV6>OiaaQi?W#+u-!;imkPf2$#vwS_e(^B6nDMpM=axM&iI$b0{Js(v?O3jg#q)4IxS;?)!1Dd zxCtX{0d74+fSb#KyQ%e`FCJ*2z!RFL#Z3{fXoAIl9v=HnJ`JmV60az#bZ%nMy7Wv%boKx^cGpBR`HrR zki#vy4mYLkmTMvJ*UzP{(Su%4JK)5&$)Tu(A{N!|22^9`mBx?*3onB=x@X)m1D^wbyV7UK zYl(P{36I|4;qt;lqnv@N#n1&=uzw@JmxT!PNt|+4je~`h7`hHu0?5@fA<<2*&V-HL1@N!MRejcp);J1QgGNcN0x%!KvuDB^_#@mU zQPzgcj{o7IE?XJ^=L`#4DtA(QD1YHvQ1xww&-qVL%kqx~-()uPfXRjKz9)QYt{A-$}|bvOa*OAnHJFGf#$Ug89z^ZHl+dMf_I&-ZB&s%#su zw+NScceyt%Q42bp{-rbPten%n%b?x6Pg}*jtzZ8)hX53Aw_bzJrJy_1L{Z%Ys}NHVwgtWK z3Ljm=08uKnV!K%eFneIGYJdB~XW?faif}EI=o7=8&1`Qe#Cl-;D-If6*{!VDY8;;; zir;EZn@%BwiP--Bj7>r}Vc07JsUnKD+15q>_Hk4IWt6z+rVqWo2A+))9+a9qo_FVE zf>%FI{)`n!6Pb!md7Tf`F5@o+Y+{HG>R@uaHO}h`yY2(FZI#%Mwp)~P+QL3*ih7`n z+Es)GA2w{jQvCp21v8nTEFSH4S#bT948s!ZA^@Ug`+gK!l z(Z9!}&5Dun8zVI<|H z%zU>!<;dRI!`}KCLTII<;H#`%jpND6uyN*tf*kxh1+laq7`_OCkO(YFFa{kZz*GR-zKnSF%q>jhNrb`B3%lq6X$h zab}ah-*_t=+SpHI`L0$}mNsG5xWc2fC7|Og{O={7d1!tpI*}nFU7+vj*|?8Ppqm9f zTp?wmwuT677{>3O3;3m`W|jDZsIs9u%C!drhanjf(l!Sh)A)m|y~Lj)lgo=PwT0?? zD(LlOVs5?XUlxnqYp@04ORp2d5ebk0NFuNFchMLb zwgYF0R~*H};8F9r-C-H1c{g2$Wi4~&2iAYMDIXATu&1A;;fGFBM+f)?4%NBd8sr!O z34;^*U>y&}mzCyMjP)In-U^r4OEj^JaK2C9w=|^HIuTU3i{tq2FGkAcD;}yZP%QfQ zjsjqY@b7{@@2@I*+;k)i!TpM?e`~O!se0gu{K&%;AIWY}H#549z{ss+KMfAoUKf*o z>4gy7PIt|T^5#eBYQR#yc)gCZggu!>(xB_2!8F@ntOh++e0kna-&vbR@YDc^8h*aA zsvqIj2ZVPdutU#=on74TZL^vYyAloL!_tfzCUUBaG0JBdHC8kuXMo&}AU^o)pwOrrRH$>m*7sMj(X6tVs_s=N{XV23QzC&at zQ_tQ?>WIW>+2;WL(1!&s$DhFfA?(ha<>h|Uqo=i;)X~iEXMh>hzo5r+YqY1~Z5NGx zf=4=8JRYdQz?2J?_BZJW`>xUOsV_&XWmFpun$U9x@LEq%71|H3iP_SB?VG5E#|jyW z;uAVGi$kqIZOai6=4)*;94~{W4^`XnRcx|uF79^C2IdwDc80=a=i9l~Z%pR3Q`fD167~9M-iDBGQrA^~ge`M1I_5`v5 zn_QA3E;GSRpzzOtgE9 z0>G~9!263u!&6Mx26Xpn;Q;v>NxylIvvHNm3^%`o;JSftCc@!$Oc^WGL;S@u9()FU z^$V=$Gg?FACdaq!=l}bBGA9LOF#YjT$7?^)WFLam`%Vf$E>&+@V-HsOskSGu-3s zl~{wX(Uk08XY|%B86gsrgROs;teg=5t_ceBiNB4}WbLpZ{Nns9>KD9Bph^x?!t8z) z)c0$GgyRi;0KT}`0jkRTHPG`}YXkf{x#5}D{<$^7uXbw?UXrS%H{(+`76R3~Eu?0z zrGdVyb#$jdpiIR^m0udsKi%$C8#Yqzc>4znU)J$^q~m>z6IcpER3iZyeD%scICCnw zLp|S}GiuL2bHFE47Uanlv z75^0w2=iuD-Vpt((LLQe1mz>BJ;d!sz@aQS#imn@xdttN0XO-RY$5PL}eF&b5>64gtyu zho6C}hLW)!JLO}=iyV`U$N@!!#B>Z}sf4Py8Vxv6XAm^~&(7TjYBgJXRpxE`dvC81 z+t0Y#IKIPWMad2Att@nqXT{GBfPV0E|0zg*sf`EzNJ0HQ1oTGvN>kqVg3%1d_ltD* zO3Z4 )2Kc2>kZuNoQdQB647T~K{ctxZ&P%r(V-A4UUlqc!0UsbxLG!j@8ZK1i@7 z!Pv7CF838OBK)eY!M`WAK6BVDQ}%tB^e{l8U0~{3j<=-tqNwk@}s=|++p;?!sLD_sK@x@|jqzD5Pq`%XjjQXO%KzGkYhV(_g zPl_df3+TaneUDq_oeCq1l*DvxHC;YbGKlY?diPvzY@j6JT{LBA8xbaP+cdP@4?<9k zWndmKltfEeEU?Gu&FaqYZHbYo@PpXTMbi%bJaWr3v+@sIXS(WrY#(w45@Q!(-gYG# zd_Cu6C!cO*oV!~hh_N8F^vD~S4R(jlIq+?~`88%Y|0Sm3VW~08g5}dq;p&zd_Y|HY zZ4S0iGCIac)l;!msu@i}AXfmjnsr;eTS!z2;Bm2Om+Q>LE?Do(_oz>Fx* z#d(qDib8*5PXVGr9`J+Va{+FNwo5K;GGLb0|L^B*sBTJxYop3=r1fcy`A9|v+1U10 z^l+;)i69VVP*6%iepvo3U|~m+aat=_)aPsv%Psp5VGV?sq(?m4t(CeyE;Pda9_|A! zE>dHUVGc+i*k&QgJJjxJSvvLIbWIEL&}lu)9=I?326|z?x0A9BtGS5mPAhC>{&%vo zuefMbw6JG<`f-A9*-0*TTj$Q_pEPN`)n;TrF!WftT|ou*eGhtRsL88%3O*u*d587@ zv#_I5(}1uq*{_XSfmdsY9_DnrJb0nCPeK7}w;gl@B!g<*$!vnuFN3yJhF(IZ+lRgS zqOl$&LLHI%Bq7+#x!3c#FA|qeZ-4szV|Fp$Icu=dZo|4@`PQ7irAWf%w_y^QFWOvT zU`j?=Heo}1;CnQ+Cn(@{JCL}maYY9gOfn|IuPVA*2iZhIbYdslkQZ|S^nv-Deb_D- zgRtbnS!$OdZKzFbczxtRF@cxZttoViO}qky-B>_IH57^xKMz@?*4?9MyHh(XuRQ`! z9O9;*k;MzehPLDFu8ZO@(T+(nVbs?+0|l%Nmwt!E+wVmm)$uaiQ5Q5~5RR$Oo@**@ zixhdYFymTK$gwk#YAA}`YMuuK-s<9z$_l@ON7V|V?hqwoDL}xx#1kvikw6h}3j=sx z(ZurULx#3aR&`ZunjvUduvJ5IPERf-HN_|*IuOJ5WhqIl`yH+Uol2Abhwl7WoyUmyRF53o)QIiptr&oz~m<*Iv*UdG?e&{z9~t4 zfj09l!hLfzlT!EO7%dd+igImfLMkkedv4N0K zMJV7XyYV1b5>SoI$RE8hEHO<wd;T$Dg*XZDiyBd=?_FwNeR>36pWV=&s3D5)!?Zv1I6 zT(?~Ar5&u)JFLp2&bt&-%a0BQN8uvxzsKN}{JA>D!h^^&f4O0^&Wp!D*{M+)u%;=# zYW~;mojG{>OnqNGL523HP5L{J+D!0JxmHU_v_XMZg?=`2)Krji?knIj_9DPF1B`^ z!tUQ60|ZvnvLp{lLN=Q3bT!WxZGqRK@B_=nH{3|Ud4U)~mT}Gqq+Ku02f<(n=ymHu z8QpRFV)meLCr*Pi2w!pFXVi-r&|QS(UvOr@ea~ zWtiy(uqAG6-p8j?Hhk7v~@1y*qXjP8g%?I}KJmHKu7`B5! z40LBLy|ytMtvs8aw+Dlz{4lfoIl9*1)7MiUJQkQY#DINenFou&G`E!US;L|awH)_T z{WWc$^;+NAT$n0%jb!}wib8|IA?{_fQx(TNY50Z%X($$~*^421NZ6s{HLENqg3&5F zb2JU{+U~*V+Oy#U%F{z0^udFXl0UD#*5V#MRWlS#xoZA6hWFO%G^T3%;ycMi{q^EY zOx0JZskmR0YU1-$FY~Vr&!aj{Tbc@Vi6lxCkNK|kI*xx2y8A{&%q$^ysFeX5V+gb# zR|9(w+9#m5>JR(mo^@N)I)Hx`oj^r=&7$c&XR77!YGe^_X& z9e7<(lU_WOweV5o=J0J}aYG7b#2Ix)z%bd8K3ys}$v>bkoZ&3fCO;INbuAAScURyVRaPd*=UGSO z`sSF$@Z;dA$sJEpQ&Z!2^S5svecdwVciQ)d<<%}x_Z0U=+S{-`k9$FUbB(aXGaPP1 zza}$>{og}*@>tdQzca%(<1lm$lgs_ApqUw}SOqgDK5xHR8gBVcpum9;zt^;PGU2!* z!eXaAIT2<-js|s^1IgEeCK!_EJ9^9(QtqEXQ}-RpcDm+Gs8gsBOk@bZHN77A*sAx8 zfcD4Wn4y-Qo*u;Douk|vO@8x#*8*_@Iqu2HS!#fQEIK(E+f-n-j!A$aei*^w zg=Hr=t|N0Am+Q?f_;zw1TM`zhHZ}8!RagVsWTL-R(EzO_O!`h9pd3I#d^f-L@^QYQH(Y|0T@~FGu3otERB52m!lQ}c(2?yJ|7>TTq*+#FYW8NaU ziJ9M2h)}6`O;grauN2ltou2A6>i}>zujIZjK2s99gG*$?x4Gwe2dL@$J7COCrjoN{ zR)rr__3W0+T=e75aJ9jRnf7q(oj$qCbo!eICvp()@E)H9zvM!kVLA+HtzlAe2R2b^ zD8VJqZ+;;!rK-o@vjKq$_cjNT@-wBBRQHQcUFxgxMn3<@(j1%=!5PncNcJnxGP^Mm ziRCo;g$0L)&3q>5?``m(9)Z}NtS;_l3Nxww;kZnuZ=jc(-xIa!#Qhs6SEF)P zZ-Jg2iodRvD?wP(;doYxVX}2DHR%|H`{{R)7pHz1r*h3-UHMhX(XN_u(Pyz7)#YAW z_|@DXe&Z9mFK!{)BQa3>WRYs#X6s zW`VOOdhI%eVmZaaUelYIHK@~SU#_Hbbtt>34FAoIwd}=cmw9OV>60cI z@1jCAxRwmwHlc7MthV+Ktll2(u2=gU>Vt4NqKT4$7iu>j(@YxUojAS!zO>;IYc~Eq zE6w^&fD*^g@EyC_GN{t05ti4*Ci2JA1b8e`wNHKzt!U%5UnV3ZzKKZM~&h{WzLlVWxbu?GWVtF|!fosHn&dd4+t|d=!39hwCN|8)Cav zQfs)UE2p}<2l3t$m-zBW^AV$DyBEC<)Z1RzaoO|t3$yIzrkKhaN(>J;V?K}LTvKS% z(VdW9KDIv0OceGwG~L~=z;M_nYB($~VO7UDYo8}yx&K|jnyj7=U0~9dkV|(G2gq9| zckf+QAl3}sRYTX3mKKhm0M7(sa4ysMn$<1ei`UbO#2D$0BxCKlSqRnyUJ9An$wIa%5GtywPE< zE5rzaHYg06b8N?K)z+&APO~e@758{+6a<8}7qFdQNxD;5Nl-#n$fnnR~> zr%xq-EYG8~v;Emlg+&v6K?~_tg9c;M9-XM%&-*GhpFfM`U_bJ}_Huv>-17JwvwJUf zM_x{p*Z4>UgHq~hay#4bUTLY0fy@_{j{`YMxM^nX$yJSeiLH}A+GGU7tPF|sghcRS zVQ(U{RUBokMc&fjPjr9Zl_50R3$^;L^FO(s(oQ%|Z<>ddEakWH>g_M#4%grCxJEw7 zz85Ly3ybe~dH8_H`2GQi+V2f*QPc2O!A}>X@A~+n8bG)UTol}A-YNnzJ-xh?(0|~Q z(V4mho7OEys({F4kgvhlLd_s)#r4)G+0g%jIc$T%eMEr$t0bhQAP>QNCg?gfdpWDy zT|w*Pt|nuuLhF0QGXqi%&v`c9a3#xH+6Bq+C~-zCg%M#KDc}p?z^Oi|hOUs;Iwb=N z+ZQ;E&_YKH56a5qm`v#CmU#}XwL-{dsk9Yc&^VqJ?#*+tEc7< z7ma$k+-j`t(@{G*d7Go>Ce05jEe5!zW-hirL~Isq--Dk=VN(r>;756gSgp)slUaR( z;EZU{xA%R=Gk0II#GUp~&?nC@nXMS!k1HQwDk!QhPHrAk$jqC}N*G*X<<9-$%2lfX zOXk;Pf6;;?qaH>Z_)e_WZ$RHlGVfaKr0Vz3GiUQTm1+JN123d7B2GefP6^7hKCqt(5dq=Pz~nJOQr@O! zWJl{%9cA(94%Mg+l*5t72sNx6*)jH84TKtd@P7?~mpgkyv{rNcvwfk#;g@j;V!DJY zJWajw<)Ch@PVE+*^2{O8_5mHgREL@no^;JX-TyG)l>8!6ne+E`poUhs5%hNO5xe&x zpu0C$7iyTCHF(?n$wh;bnESID0$6aGwm0-ePtS0t?wo=8qUskeq-vk(PT9Xqds;g? z4&-Vqi9i z5<{ype*Mgtgd*AVA?Z3$!Xw_n5C+9}H?m}uip;!4ksOVMI?1ABGO zTz5~u$NBFHu6c&;Xbs*N-6tJpt?;XY`sD;zM55EIr%0Pj+h^j#Dt*&fXNANd_w@V! z{->jDz#x|M5si6IW`BRl4Sd9h$-F8dh~6890w(^r!>x&Lnj)CxZ@eD6kxzGnezu@) z1O3x5L4bX+{XT*U_9^wST9dtC9Wg5x`X`NpDhMiu@`8aCLrfpG+5GLe?_8Y=+S$_2W)SZt0dDE74u8@e`m9H#>v`sVG$MXsX(3K6A(O8R3njUY zq!zxEVvgjabM)>kA~x-yb^(V3SwC~Ie2LL8xBgaVMcXQ^L(m3BcH2clHwjbrAk6D9 zWZH9~B=X4Os>L4dsgDtT>6C0##(KZnv#GrsEbx*pxe+(Ip`CTzoK@5?g2c_a0sF(r zPllB)5A^j)>|9uo^0QL6X+OZb4-TJn+ekJE>h9IXJFNJ07}89gd%gx~xhOu3As|cI z=3elf3Tzr*&C6ffooH4bO+(euWR5+$VBQ81e@rcy?|S=-{`E3F0dS`qGOJsT;gSa{&bud zYruS0)~I#P68lMruDQb@dRd#QLtFTMrY?`?RecmsWZ*&x=|adJZ&szo9)`zs>bmsl zq7b5I`~$k9d&NAqf;Y^A9lhW>97^SBxJXN0w~8jp_N%cNZQ>bpyO9+xHRCcMU5~Ij zOY2UMab7k#_^1gLcc!OYpx|}=d^K-c;J1U^B>)3;Usm(JqRn-d*>nFnf{CUTWDS)X zFv}9YxdsatWBwni-aH=4_5U9y2fZWeM3QAxr?M}}5;CbHmF$LOnGlsVI~j%}VH7R0 zGo>VZjGau`#=c}7Yi2NIUowU63G*%lN~zd?Dsfc92RGbE^m54mw4EZZnU7R#i?b=-{iQw3RGf6Iyc zvn*_XO%P^7-55~l0+4rSu1#IwqGZ@ZCU3pjQTFp3V92z&&J&x~m~r0}bE0qkG8Dsv zn)3bm1~+wnpuMk80GR9S>=)cK3bopm_X#y>luJ7#xF7RbZW*s0dmn8j(L9hGXpp@`LeN8pF?3i`Z$i>9BW8jO2~^gIaA*Ak+eJ4ReOFM{n~H7KKJC+ zlmTt${uF<%L%4&I(#Gzy;xfDy#TqO8W?bLhz>)$$o2QD|duy-Vk;>soxXpZ{hK2v` zF$$qXg?#1MbI+0vzPA!DS-Uj|vA60fUv4eADPUs0_~SkFb)iGLzG=;|a0lkp693aw zA@1URMzMc8@;K|lsV>qmj?2yKxh<4Z<*AJY5OYi`)?OZh+(WPWx3|F!kH3?hxmGlz zg&BYXmwnFGGd27mA2P-M_g6c%?@+|eM6?Y=pUaFPs`IL=h=c>VRmiS*i~3GdTbHX# z^>78bLC&uD+6`ZRul3B$6Atg?u}_|~i$_K`j{ zmj^30v@`e4Jk*=AP^y4sPR|W}KLu_v#5}~wlbHJ+y4O8^_s0%4z3W3i)%r`-R|VG) zoH4BiuR?j8at10{YPMhP@xfO4(qq_ZS=-b3Y<|Um{@QTASxBlh_ukd2_hon%{*GtcVt?1(weq{reCUgG#woMxnSvTGCKUN7Rqt(e^x&)E~=U7Wu^!Dv{{ZD z7S?~5V%6}GHTSCGM}zpsX%ioqbGG%I7%M?UXjc%NmcEkjPbt@Bo?=D)X7sBt(KAS%GX@JoK zW5y`oWEhPls2u)sb+~McO*)JI{l0ze4OFkw^`Km%$^;`94GLIVlRltK^Gl)XvN&Ci zNyD{ApDST?$fO#tM!X?wb{u`@8S*df%Kx%EDXa(mfyQTXHIH|pt4x|H!EkLydIxPR ziS-z3>vTJ&v_YOi(l&3@FQ=+^vI(>FfOk(ru@`VA*P$c#MtAU76V5SbH;j|$s`ILFTEY;SI+VKUv4^o_s!}b_LD&$p;>5z*a~ADvY#UT z>TcyI>uYf|cXpaOoRP&TnRZn?I~-*-7@57y#YeT-rri8N=< ze_{UW#G0d%o&R8Np2NI%s-65-sdvYW19ng5#!nR{Y!6H@0VjL8Lz_5WhGO9{w}*Z< zY~P}8DsD)~?-)P56-thw8%s2E_tlVNF_#2FNXZ}PIReLzzPV`rhdyGrtrBg6dUMRg z53&@4E5MHUQPC5+ioX$#h?}kLzLtwzw~oM0W==z}W^wk?TQk;^1uOVHS^;S?lK> zD*==!nZ5lP)${XW-Y0{vI?d1hDv2j+H+HOFcC!ug4xq<3v# zFBeX21__xU!FDt`stLf8T#}qT05%E zN=LAja8gK6*VGGAP>S38jb=^>@C!0cZyv?k`nL`d-582vC*UJ@_sC?s_+!`A;t}1o z*H>QahSAc6A6uIIA;DELx~T_58~qOKhU6Bg_0PmvEUB{~d#tGbf-JA9a9HW3cw+JJ z`%GYcRRy1{fZzdFt?{#u-Sd^47e0aK+XYw?7dDE zE$r)c)?67^R~{>V=iqO%Co>knu5VU4H%5ECz|eB zO1bFi;XfU@arB%!CZQ(ZNZ2DHadmN)|Cp8G1iH~wj4LM$ub)%#ZX+*|suwZD5 zOF8^?K%Gm^lf=2A_t8GTH2L#n?G*A_`xx-sjH$KZFN9l*PFdiF0(gJDgB!<+1a4!@lGzcBCne!4zDN7HwgqXit+EVT<8rlAlEjBQP z5u?1Cp9-U+8>;qT=`%GhIt2w4wDkyYFAW^~?(u1|V9p|O!ndPgk!NcAYAFq)7CfPX zs!7#TvuuuAjK2__BD)i+)*K`L`07prj^$$!)0TE?ub=ZMzcb}+QlVK|r_-9DOxb;hL>BcC zf4mW!WL7{z;{E)`ck|u-A5ry6&ldga_!i5SL4_(aRZXG+a#EB1457C>L>kG%yG*Vv z$dSaf90R`flUUY6qiTBo7_@CR+{p)Dq%O9;8|u!42)>;0LYdxy5oAYWZf20czFYlQ z;UOI_PHkElGvH7r0qiE`k=B(K@Idw6Ao|P#6haL`g8vK(psEJ>DS2#e93(GPLxDLH z;VKvuSirfM!&dTjMYUUd^T|ddz2Qg*NnJFa?2UTZHb#MOttrx+x>OT*wi5-Bq_1!R zeNx4>T*L%#P2E=QP4JQ`q0b59EOQDdqRF z799CcwbZ$nN4RQ_ui6EEZ6aqU5~v%yVp#O;TY*Tt8o>f3_KIA2WZiYn?CNeEjn;m8 zF?RGXm1dLR2)`WnfoFC*z;C$KzK9m{sqx|2R@o4)WUiDwV?Fgxx&$qeuw}3HmbB8v z)XG9JFu?)NDG$~Bcq!9(`fB4pHf>f(MbG}+gyho-QwwW;q<%6aLN-j50!Fd^@TeDi z>!`yM&WIZaWz{Br3QwO)-fal|QJ$L8r_cE?@l=|CCn?3zlx0Uny@NNU0S!86;T ztzpg2Z_Db&!S7o`X(8MB@Uv|_7r}fYzunS<*7Xwr zZWO1XE^@Ti_*1g18}3;0j3G$YZ)x+ca&DFD zSBt4DS24_$CjeHt{Zjns^a;H>f$ArFd$Rfv4`9JB4Tii7dp-cF3p)wr44y0rss3}gWq8pYnK z@qwMXIaPlu4LvLPDwZn?!TTkJWSEYeS|zm2E@Ks7)Zy@vwBlc@cTb#DVf8;DLw~Jx zeI7K1Ov8@7XJR*IKOqk15Z3hDA~3Qzh}b>pBW!DLl4IlGO?Ng{n_i%qn3#l zYXDi+xSv(V*}t=rxRc>c<@VqGs&~7CLz17k-8Pu2?lW+tXvQWU`bf zho)Qmk0L9(5SMbI;{?oOv*oRZXT+E&-sODjP83796VVPD!dnw|Onc{9ioP`6qoLte0{1Z`8GlmC0`t6+jemg6| zvAZrY<)g?73$NQtMkneQ3-Xc+XUK%=>^FhiJ|5+Gw?b0cD7HcUzeiL1*JmiLME$6H z_$sL0oSjA9xu!yCPx%%0kDVh&!c+TbKRwJmuA%z~&QX`oBNM-EqjPyDfDMkfCf{)i959smfu4iS`cd2a0lN>TN*fw>jzYG;qh;4 zLG`CT(HfV=T&;+CHU%kLZ^s5Wt9@q7E#~QqCyxxXP;lmO_|_UTbU+NBq2b^^DlT=X z_7&C0576nJ{8P>aw!z6Meho=`^82&uUEU`gp&=FPqTHPURK$%tUp`qd22vfUHP6B~>? z&Cr`Ac~4W+_FwoP654O;NI2<KC(hmh!g#q4VhUC)m_ zD^!t>>A944OE$^I2VFr?RmKfp9BCam8Wqa)Y4d35ED?-KZaTv~d&MKS+=XI6@A#k| zyt0FNk{F0~(Pf~&>Laa#`XZD4ez7#9Ra9BuL_~^UsZ{KpeVzRXoBG#{6UqU`+AU5H;*eZxv zbW;2FCVFuG2TS<}FA+Oi!7$0P^sO%(L>4UQ^zC~p#F~UH<%Qy^=H02DI>?gN2i82T z9kY$^N*wJ_leZQfjR+~zK`4i@paAO{!7hBrVk(?lW+2No0BZWZrVfKnOE`Y}lX7av zTXyv-VWq8UAS%rj-6hd1Z9+mSW}QVWk0aIWhq{Vic*ZKAC?eOvb{cJz=jSRuGRW#P zD$5LP>8j;p;+_BZa`0U0m9WV>j*2B6v0RWQ=YK!p5-YtPJ*JJlf`~wGL4j1bT8eYx zVddV`+B05Oq{Ws}B0B|}AsbagzT)*J1*yAj9&U4su>HQXnH476vvMA6C9MpqQ|R~P zHih2}GR==gsK6}FEkA=+;UCd=S56Z$4_vw`HfHjOSrfmylgrTQmbZ{F z3O9GP-{#R#{`11o%cZ0yr@(7U`-i_{zZP*#DlHjV{n7g!o8}qOv67(QUKQlRBQX0a zYyWp9Y=wo0achYR)B%&-x4kEFW6xm-m7WS!ekQY)!M>RM%L$G-?%#ZX_|wuj!Cil0 z{B9b%HYeM`Uyh?asUl{@{tZd`^b^8_VF|4I%PFKk>i%jmIf7lSEPiP~myHYBp{i|0 zfGR2S+Uk#oP<#M@gDEM4*PD}b+-kt+#b7n(s5*znMWf-)n-+g)P^#2a)wQ|GS6}5Q zWMw_`htp)-eU?GGvI`K?Pk(UeA6ysqb+NbRF#56S6cbOldBow|_aV?kpS?(Hg&}cr zU#fBO{veejpsosh=CAMzKudoHh*K?e_TjGA{GQjO@!(8%iRWjfu|RUp6IO=o&A%Bk zmhoS3T6&pRwR$m1_|TdJk_Q02Jx6KvZ!C#+`R2h#8xd2bWP-Y0TvwL=ox*+B02J+1 zk3!iwk*X%B=oA4YDHLeYQUc}53nnXjhtql3nxxuUglERvXPC~Da|W(2gGy*+EmXWs zlR}nYVT&ze;225Q*Hn7tvc7s^XvQ{Nlbz~sN51aM%+K5ZJU(0N{1I*^%2y|YwbQ!W zWWrco(PGCN0sJeb(P0>-qvUnZn_u{DD~he|o(P1PPQz9cy0Yl1UDPqBod0ITbdzj^ z<&{K!XT%EkKI@?^yP%1PXKr*|{z!MO5ngpG<^Ie1b+EcjP!~SE)7z#suvuRC)Xg8* zftk7yI>fV3T&!pkc*6vB2v|Nq^*r43&-K%B#3INntq98h6B{tGcQdQz`9Hd!V*LHh zk9Qzwl+zICkfGU+u9xSjo+I2WtOEXiBq{5kdatMK6nEEx1UdZRnO8hx$D>=OZVq{x zWFb&TopxeY_PhxOd;2B6$B7c&r< zV<<@N0jUDMU9YV-!do}x-Etb9VO7ZJThC=K1bFwmu)f?woSa=1Y!QZB^f&WGoS=VT zl_j`u)1*;z5}M*ie%9l1Y25N_xW~#;Qqo?^z786ah%j4BZ8%PdnBX% zte}JMHz-#?3`r5K)V<-Ao<%jB;9@P%hAX1%Y`+-~>u7-;>d zP{Bg8EFc=Vi5{Q)@!pe+KK0{lQVm(C4HA*v*?K+?UFs`oJ3EL6tIjvT{`0ayumq>$ zL)!@O6s_C5-BlQ~@8Fh>n@3`t_4S7;U*q7kIpbZo&)>6)-B*{Y@-tRvA8c&$N+>TJ zgPq_0(#B@4zsr7Jc2+ww3q$1AgDB(eUL4IFs+WoQo^|Z-(R?9y~XYmHX&oJbq*R zs1!mlCz_5guaYy(lQw*+x_tgjvCPJlj#^3fqNszHysnaIh{%61ablEScTK;%u?kt- z(uG9lO<&A#Qpy##8fNkB^ecH_#S;XXGAKhJ2pP9~AOwc>iJO9X5^`X6L|mef!M$f4Acz?galwnr$e*}=Q8?pL=% zx%(4pXr~&zw}ooj2Dey8PcPdLxBs*qOMoA*Act4hKT(=hJJh@;XuTj!y0T>xjrTv- zeRebIA;Yg0!H3|zVeV@z{?U8&aHS4nNq!!x%Uh4`xfsugP?S^w#TEB;7UXjbVo5wm zxoA(DionwSe;hcx<|Bns^drQ-=tzH^2&6n>>UwV8ex1XYCg=mDyUyVF3v7KaN+)g z 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�>y>-&v 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 CMH8d| diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi index 5c433defa07555668b70c71d553e00ea28e780e8..3c68a87d5491d7df654921531347b795a59f080d 100644 GIT binary patch literal 15622 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 I<=c<{54u8!(EtDd literal 14447 zcmbVz2Ut_hy7i`ss0e}riWC(@L_px9Mw*I^+&8J+sz&*UTQmZtG~W9yoCTf*@9{ z>sR$4h#s8ML;LrEuT9@RA_UQO`x_X0UA^yV`^eGV%hAmhf_&49@7{77y?97@6xHwm zdFv;Vu6jkf{G7ir^~pEm@(v9S^BY=|2vtA+0oOu(DZWDt32PHGGPm@VkaZKPmsAYl z82&cp8-m;YNlQLKCS1(YrMls1%bylvzp8YGv!Aj#&?RT(f)jk$^`jx?+2%^Y1yj0E zPZICq(8`4Y9}Yh{OdVUv@ccB}1J+#$ZVKNF)Nz-^XlJ(xDjSqJ>bURVH+2b9tLQI7 z;(mvYCb&P}YJS3NVD%_6}2NU(qW4pHwD2>P0cZ)Zx!q~Khcpofop3iHUW$@0l66V>r{rJ9teyb|} z+-(E*z3%-h7i8Ty^&b9gNN!jT&oVMmn8>~&5WU?0^Ma9uIE%-fkVpY>b&YECMD=mHXBj>H} z2~oAe>w|g=y*ftl*GXu+pEuP@KH~ra5*a=B4EbEz0D|O9w63Zf_>SPl1AGnoYpH8p za`{ixBF`-{Jc1k}lZKX}{pmGhpACgq(!Z`mJ4wA@Fg+B>%CDwQ_xRDBJgm`yIb*#C zH){Ji4?5M7bWT0)bBfYCvc{2>bILGJ{fdy<>F28$0c&(?OnrN1P=+5WGnAP_+PRoa zE>T{FIpb4!avW3F?-&{;o`RsseEt1&5R@;H!4BcH#*K8XBbL^gkik)Q8i)y$+f!rdrOg3iv~ej%d@v$Rf~@Y@qNIp+9j`*%Te zzYB`<8ZAZX63KR*C?oXApHdH(r*&^ARYLH_sof(c-|yWcg=%a!O?Mp*$%R27Sun^t zOrs!@E+mvm4Ib{}>RMv!0-lG^7|3aL;h^_y*N`Y+RfxRJSLXW8LNAM928ex{UNH7~ z`e|^PoeR>rFnJXG;F&u!Am43pgxE0@8#rNQ|MI3OBNpWtA}n*Z6Z9i1k}5p#EdGUwo!?E03M-1!vp(= zS?~M9^w}3&5J|g|+M`IZHm(@NI@^06y4%vW9z7NZX<*={_^YF(Ubh=RwAfi@`k`>9 zw?A0h{(@YVKLUB#m8mKeW>lR|~BrBl7AB_>WBY5?$xj({f#Ko6cGo*TMl8 z)vUQiBvhQAzsz$*r}OriehxS$P8PdRxDE^IDpa`IY!N3%wT@p+mmQw;q7V7?axaO_ zC9|^slJ~Esj5;{LU?vxxtgJWo<wowgWFo_<&$(Iq!I3Bw$&(p0R@h_bGhfu&j8%Quqb-R~cpqi_nJ=`&rfZrF z61@$1HAUkPfu@W*kxc?ngJ?+rGyz(k#?33%#0X9A!mxoU~W*G_^FF@xzwaVJ&4sV-eBQ zVe_sUP_MG+g4EgVqATM^8h6DA?Q{BegEOL?Eza=F*XBOYiFc_ z3u0^QHo7r#4K{w32?}`@@nw78#5-((7b z*TKoGSV9Tvn-IshB%S>bV~~36drg6WMup)n9b&Xu$5UoA8={GPGe?&(=OU&O}VF*oR zzutRa)bwDsWh(Cd(o&M{=ZisjB5!+3Rs~l@OT(#_!OAnyivDA+k|Z4h6HxPC5AS#d z&}})12#Sem<54Jd_ZnL7FUzlv&Rpgj1Lz+twc_N2tO*OY(LB~)s;NES zau;))_j#GN+nSTyzS@UK@CBOo%**^FKo4moU>=NI3spYr+Sbq8$|HgAPod6CY$G^wN#KS&cqqRz#O8{@FWju~9h0S3sL?5?VHe2azrLP*MC?&{PQvU(#A=1T}c` zPOagd5t)!3y|jkLjTf&Nz=DseS%=F`z7UyMeCwynU%oX2KKnTFo7agvO+hSH*mjK^ zZulEF#FqCsf;!$@V8|BwDAv=N6x@6t+{1#l733{6tEqM)K$Eas|;6>IY;PzE#VvnI8A9EQz zd2^XJ`cj}7aWzoPdw|NTSApex?3H`M-(^rF?lZ8KYByG(3jjEdE>s36U?{o&g z|8&Mv;$=4a1CSceueK0CIQ8Gs`In~wh5p5sfz-d&QngnF`S~)so8F%Y7;}tI^EWpJ zM(EkRVPSVKDRE8sjRFc0|q}a9)xqaG#$wVgZ3wmm5FuW%@J2}Zx8|oF;>`2 zb4Ly~{LZlr3bIqR1Vg(G&U9Nz@MCO9Y=)&26%=OY;E*;TAjwS?d=-HP1|f2}bkRdt zS-z{Uw`VhyqG3zf7_4Jbt`hF*tLPb&puDs2wGG`YH|Wom{vh)BSo}(vO0MCt=r0`M z@74y>V5-FWLErg_N|Rdutvj>t27v_4fz&}R><5d9?CEZhP9(3NGI}JlsOl=q#{ZDz zYP){LWVkTDp#b)HE5E0zr3cb{FX7Rn7e0I5$UX{MZD1cAmyr=fQl}oMUdleO0gaZ*VmRU`3J3e#ViL--&ch%`a>amC`7_(oKQ@}`k|r^bz-s=W^&C6u8bk%<+(rn_N>3?8=##I0}`+rkUYbA1?T zRfHH^_(Yplm!ddwLGBQyl;5U|nE(KLpgh~ z09cZHgq}87&~iZIuN56cK*bJl!#cp=j(e;~*4F5|)tU^hRiw?7jzq1>Ji1Bq#fLqp z5+SLnN-`o2c}K|jgu?XGTuPEEr+Z9E!lHRnRXzgO4t44Li0)tvNf3v0r2JC{I0I%; zqR?3M(~8ggY9|l0DbNY_H+i#6HiW-84}*=igW=OBAG4U5I8x%M@a8Y|xEi z?2D%eaw$+kp+R~eJ^if^D-;L3)s%Sx9rW@jfrbKrB-%V}G7B_lqfXeleeZRV)c2ua zV-u+`QvCG*FmtZvz!;BiRZ~~_%@pz#{@5sS*DG}-__iV(c)5?I%w}z1ib*0(!oMGB z{kzBCCl2n}LAj%cHyR|hvXMXVJM4lYHhp)^Z6+#C>37@;C@*>Ve5x`2&NU3hRH@{S z^0n6|)bXnR7fikrug3*%PimeBAQaqguZ|3V)h?g|(~dK!E*8elR7Sx`HJMRpl-KY| z^5}UmU-$Y-eYIO$X%l4=^KD4$A}P+_`9-s_5)fy4>`lg6!5*U8sWNqSHpp zI+1E_%F2ImEP6UqlBeC9$?MO@JSlrH=7%^a z{h^14?b>3&Eobg})1$>qO5M*@Kap*5KBm7;TP|M1U;OOnR$oeq;H*{3lC2)v(mhum z)qS4vUG%Wdkxj=fl;-k}bOFy`kFug_kLqPrXJdgmZh?L!?h-Q{lK_LXyX9xSf;?v4 zot9aEKXtojU>7V-FnBIXuuf)ZO$8l+m{_mE~)f(je>NVu9)ssWqr|IT9+;{1A(qUe& zqO7FqvFVL!1j;5GI_YrRMxaqKW`zboc{!F^){EU$!@_^KXXiSSt#=z|} zV~+>zX~!)s^Y)FEqq{59(zf&J>fY+BsxM=ZLyS`jPdWAkJ0IJ1DbJ%&rCJNwA=&tL z_{=JmbIWCX3vZaEE(z7Ve0~frzgpqGe#SVvX+8F1FadA$@QHgmXgmA7+NXJ%6buQG zs-e@Ctp2-;Ap?APK(NWO-RQY*;l{=uYz-pn^bm)!Jcr9)@6!22BpPhusC^x(^N4Aj zD=mTOL{zQ28Qi_AG_gRFNVePzVXcDkfp@gg^=13~#W8vyvG`(oas=q?LYv@aEp!iv z5B5NL*EalrEK;8?eU0|iu{JB z=qnS{6{sYCiq;&BGcwHgsu^!r7dH*ejQmZGO_il?`B^C#-Tj!#C~zqcyS(EJv8{ac(d%AzGn?{K3lI1#_%L%qH+gU2 zuQ5S{5CkGqQ}>1&!0zWx)#Y7>-dBe-vk*eVsSNoszhy-2D{o{}Z9w83h5VuRp`ZGC zx`|OYDXjtTwu>4XqN?TWZt%Xx=GYgD9YhyG*bo`dkg?p=lY)eFszp1Ukq>lQ3=cxe znn3w`?t;Ux$~md+Rm0|khM}+uj3H`fe#`3v2K1QED8AKL%F9W!QOpM$Vo8$_LBhnG z$^%cq#7AAbc+5%n`^<0NN!&_H9W6}qMF#y2dK=RHV+lE>I?;|6y5f9;LoOeMMNvb~ zgN@3o#;s=7fN1?O;wI>bl2DQp(q;Tt1<#$WZ&~(R8`}X(t)-5_Z>Kh&N4fbOQu+g( z@SfJR)bs(qR3F#Am%xN>In3LuRsZhaZ83s+7Q^fWd5qcn@cYZFid1q2LzE@`b-TiM zwe&0bq-lGjvkpMFn&Ed?BtVP?-H`feJ5P+PV=@|i=6VtG^4Ke+(Mm)&axB#Ga7+OF zk-!VZm?9dz;fEPlpN5Qm#UAl#8oet&6-UxnK8~GQ_nOwLPl9tN6)MNcL zitksOsk}5r&|K-EZ-ChrYt+Q1`@7QJez)5;oX->|;fJ4GVs5FGw>>a@^7=LnpS--9 za47Y+rjS+85q0F5;F_&uB5|LrJTBJAcB2sUrt$24G;dI#PSECkKs%Y&QW^+MD@C_Y z_fn~c|3jS{vkK(SpqM{p1fw|lfbJtORMt$Ro#U$?+U$7;7~QAi>uvbbEXn(X<)Z)L%pQk@0%!vq&PtOZ(S@Uz|5pwhqaDoud&VDl(PXYctI59kMP{6TftTHqgz4QW z>p`G*A6WG~^~-={9_T1sxY$Jpy@9SzCgPXEen(rO{8OEvdgDUi##V-W2t(CI$7$7= zd>ZS%!m1Pk;qu-1A?96G<$Q=b1NNIjA;LIARQ zLRAvDbjK6Ro5|R%K5#+g-h+*B^9A^Gvc^Zi?rVFj&u|3c2-eod8+Kq$H8%g_R>;8C zrmq`?X3ERCrh&s!s(bJs5@4E81lvrCa`u|DuK><^ql7gjZbkfs&&*=(#i-+uUf7I0 z-PuPo7JG%%%pa1jK66$Z;c2pU;pQPgbq#@=1Qx;j14h(2x`5Vg)od0`gJLygHc0Oy zbUh&+552TV0A0U4w1j_^My7{i%9-jx*s=dR%a`S8EH|1S$4Tt;yIt^)xFG9PRZ)%? z>ifV%Jmz!S)9UA2#T@UHX2;TU9Gn^)DZU?l{I9r;%x0?3!9J#$48Ziy#Z6woa_~iC zfYGps>_7%T<={m{SJCE1K{}Vgs8<*!CDWz=q{YzZ@vk~)r~}X4>mT4?=H2RnBaS03 zXe7$Yi8RmcTQ)A9iKw{FdSm6O5_6m)5PnJ)bx}v>3D5>uT@(pkRD|vul+ObplLk+n zpc7d_{n{s_?S6XLhEqmbgE=F^Ms2-_VfCGB_M14Qs59X~h3V$yerqip{`7Sri@Vjw zyaR;zRJJp=%@a!2@eb6|qlT8F19`N7A}t~Br826F>3%mP-WA6>HHZ(<`&ZDy3 z7#_NgoMAmadmRQ?QB^fRDHM4>P-lD5?&jFZYz!J^*CN=jy(IOhQfhn1LHJ>6>CnkI ztFa;<^aObkCMhj<5>tX9qkB5d(Gxn0ji1NZ{fdM=BBaih(kw2PCWiU?hK^31DC%ba^VZ+=fq zeMdZO?zw)1HNR<8$@3IU@dVM1x{Ejdt%==Z<(dNmu+d(fa_d}k6p{7v!*n}%#9a^D zplg>GKMh}d$E1IWHX4_33Q`hPKEW&hwQ==f8m-08adtRjzZ<*F3}MXz0N|Q=aLNtv z0#Z9i=OXR@l?Qmm|L9P}S18LwB($R9KG__+ik{M_ z2Cw-kfRdNKE71j!ys^P zF0c8FZvPpImj7!IuJq2d}H0tof z?_vG7!9qbn-sqXdkMC(n%`5d#3H~vnY+B3(W}?P%26vKj09p7>CJ9wMpz)G6R5fz4 zY<+{3vP;hkzDGrLv4(X%9&r)B!Athk(i`8F)@(LN^7ztoP1nf{vElM~RrPhLxs2&~ zad8>ikUmM+>q%Vh$S1rWR_O%5dg&=ROam6MQAH4sv|Y@SaAa*jOF_`%AWomU*i?zFxEr$1Qs7FYM? z*o?epJGaF`!0YbyP%)b&)yyFUDLG9`rnA23!SgCDe|8%F+#YrYL=TNf`VGON>(v&rZB{cAme9VeHaIwf2;75&$`yY2oq4c7~ISw z=YKXnD8)%*I(EhD)yz)HbzZ}{gE1M&`$e1wk-@c5NFxokpXmLN`)5ELXsTX>j{bka z4;s@#3VT@So)r0xC}UHCx(4cU*ea&K3Gn7CSrm>x*dquW7;}3mmgy6{*jH*!} z4msCkm+-t5M+CN(u63FlI|UQWFqc;M?xTps2Y{kTV(-1{BF)6BHQq<_;#1=`M@6!_ zpC}5mM7H{`W2#H^tc@9K+NoRpRp+GT)J5rAQ1IQP_n_uDI~esIy_!|VFyY}i@q25k z@Aq3@w?gCl`^6^TM8f-yoe|OkHBYtrqLMws&Q7@N>tRut-8f1gWfs{@DC~LzZ$-$L zYK@Sh>riAKs(}_I+s3v@IF{te0zIxkE?!aIER!|eYe8=P>>7Ar*&F&;0RLLGu5ax? zee0U*?u@oMYPw*!q#~MRN<@o1eyI+hDbJouH|v`xTVBt`4^E_cMv3pAwTyG+A6Jx1 z)k{g(b*om?BnKOwA&brr*=SN=>#9VqMO{Ufxh!pH{~xP#3uCTEx=QNd;qikZo};U> z!jAZ_H)<6>#E~@fQoF|}a1IQE8fCmg^|!@*N!#c01{{BVp#xGhcNz1Ess7Cs&vx}t zY;v&jgzG2}rGz2IHD5Z~8!I`9^U}^$6<(y#&Y8b!*-e;>*Pts9uqt5CEvrjCoC001 zdjacHGc}}1M`N%~ZPiV%Ot~vJitBTAzB96r1(pyhlN6;Zzecnr%K7)Ops_|M9~;k( z2l?gY?H5v%PTkImnCm+Ub_Urozww&$_w1WXa@6eb!Q~B?^p8rGjSnp0vMOZ&jSap& zs$FavA}tMe4Jp*_z=CR^kPvPN&^4ou-+TA|NZ+N4t3EWn%WE4qSNM9u%!qtVAl_2S z!!ttX5fMC=^$?x0+~_&P=Xbq?7l)1?g~Pg|hXEUJc%@Z?oi4U*;mGulSqsQEfs)&_ zu*hyRjpgARr*q!{KVE&bnM9WecE6bFl6<&VTU=a3kRDk@ze&1mSQLM-kW|F8I!p167~yQz0o%IMOLt!6Oim`347I{>tkqk`_}r#gWhjD*o8 z9REgpor5z#-J|pSVsY2}-(m25$cws$%B!+ZxER)TDSrMM@A&K1lss>L?Q_5Sb!`fB zT!$L?a}QsDyB@YZvjY~#*P5$ygvi^i4&_!lT9@fQKk&{R#s_MZIhPZ#C%0Nq!au{+ z*2)9g4@xLl{z+0Tz}l!Y;q_zBKVadgtqvVbbsdq*q_i8G^4Nqiy%Qz0wPzSvuAnJC zA4ApIRpsI)n_1{#vzY41OoA;leml*}?c>ZU-7Ak%Oi32m`!-c@&s@-Z8>O3;$sR8x zcE=pb$xjgv%s0>?IMvLoXie{L-uA(G-O;*P&#dlpxJrU|O{fw1$6eLOb&NmpBwOmx zC4E4dY?Y@ItX>uV_Lwr+rB_Gd-rq5bxVoZbVP?lox}*`jbO?Qmexi!+^+z#_6{FmAR>M4HPvxY(Iu z+$*obo30JTl?_7wNmQKcj}+MdQAN#Y91LkiEMZms!*}gQ+tw%mMXGm3T{n+3N*x26 ze(de-AMCDwk*bmpBGQ+YmYU4XvGG{rQPpb-{dHnMiatV&2)g~m zF>Lob&Cw}Md4kV3;P`Ju>i_8Z{_Q;aaa?B0Q-R;yFgVDn`JPvRlA->94!YjJ7os2T zDhC(Xxe6{jW~rL()^`0Y@5(A}h>$TbchAuJor~UTEg&*g`J#Rt4Xj>7UI=1L!)ZgH zBb|$2J}g$fkE3B^%kM|%4?=1&#}gA1S>*L@yN9Nvq`Ylzwogn_t=~d`9oe0+aJr8R z3}D9~c&7*nGQpuIMQBwoa$8 zhw@`u-(zR*y#qUHBf+Mo%pDyLF_@Ifod67}b>zK?d%6NY$~NwyBHd33oJ<2(yj>eh$k8FXp}}&^$jFXL0nE@)5y+b? z%&$a!a&U{bVQJpd-5Ook^|5w6;-u&1+B2!MXON$7a1N;C#v0vgVq`i8HB9B_3P?Tq z3F<--ZuO!jcHam&0)V{m_B$0JEhA$9y5dXV?!7BkVUQZs2~7o5zd5Zs5Lm4xXF~0C|`9Thm&t6NP8gJb$iqhq0^j33P_{A zpP*AHb3+KPJBiB3JPm*@1-_HCq`p}iya03kc5r6xYIJpQhjbzmahq2D3(>Pa&A5cc zUhd>Bl`54IkzSa?Eje0^AXzulst`*l78xj|il13mJ=>bf_M4UO-~Zmk{eRm?@vlthe_q4-7m;!2ymF>Mom=aP zjZTyJ$OSy^&k^pX&Oh@Vh5KK+8xU6>xH}eKNz)$vIOnyOD$N*GqelUT{g02uQn|^> zB74HrZ$A)5yY6L{$PLTex2M+$1UrC)&^lTq7uNKmpo10^a7Ma+d=0o;M z?XIOO=9rOv`YU^BgN9Wt;R`9z`SqViyGxX|Q9UcjH3%KA?dpo3<|GG#FB=iGOc3!& zlt|TF+kA5$l{S3A4y->XqJ3ce(Iqw<+EM9NO#>ai=ol)W$nlxORqLuA(^bc`sTT99 z{x?e-TkR=uuUIOdD;D+UP5oH^Pxit1MdgFsCrq9)I~!fOg66z`nmo8V@}cP4Q(KFh zKib+N!I@#Tvrz+iG%U<4TnFv~JMOlQ52EmWVf^{|m)lqD5{p#rSNJr5*}l= z(%5+GZ}dTAfBK}So|raTJv8zoid5Ab&EiB2E*E&eHjCY!xMS!&8Qx9xAxeojIrkSN zNp`lk_rdEtS9vW6c+EX)0k#k!QK(2mBW~Knc;(XBJn~+5a7?qUivzmsiue1!7{-AZe{depz0sc`*-)*&n-TK)RIYqGlb-B%-%N?bx2S;-}-x1 zo%cNoT6tG!x9S^MQ;paSMO<=-^6P4Ner=QB1joe*B_<`oGM_zp0xssTeMa_)2(pmGl7SY)(Qa}c^gp2x(fim|Qj~^jdB}mYpo|(ROVa!!Evx%ymn-x4p zuvGOr_aQu_<=p~Emv|yJ(voeC3<`&oWE!uUeE!*T;*xRoi4#hh$?1XbM*DyMT)UbC z#$)HIY8Gu+TGx&qJ(^rm?IY^^%L=p!-G}h=`w}bb`w_JA(Ix)UMxoaV!`8py=w1ZV zk#6Rbn5Vuc?*VM`&mlCqcQI4;lNR@_VyXdN+9lOLa;FRaqcR{Qv;*XC%fw> zYNPkc$Stu6oz(3!nwydBH-pZ|)RAD1SSJ6(jwoM%@Z@`>h2MwZa_>U7nbM6LtC`Oa zMz$DTQ-2wj)}p!#7o(aF@9dp-DI|IwIq`Z=QQiOkeBns#a!93N&>I0#b(xE*IfWb7 zsr-iSX~14^I?C-~Un*jAVaI>nVdQ$E z4@6C%EIqUQ&kJv$tlD|><6Ma=4#G`vMWLTeAr*Po^)4L@&-k=1wwd_E;fbkxT8ADnUHKYUz@+ANPeMyqHZj-@kr-;-F7fRZKFjEUbuCM-F?3`VKmFW8L?BHKmo?M06}3u)h6 zO)hH;w3@nbz(r825o`qFO-UhMv(Kp%P@EnOA*@o2=hMgcKC1@65$Qc)W7T`MtS2&a z)W7%MTmJ5ZSvJO_e4eQcx>=oD|Mex9p@KScMC&*w7eY`24!KfyvQh){?pP|3y)ew< zzt-`z;W&3yO{#b5wnOCY zaSZ&q{hA+Woo(|cs&pdNu-0tPAt);u+P`4YOgbz`3 zFX72KH&=^X976uUJN`T1-&?X=C35fs6q7c4lAyuC@lVH9FHRJb%ft?P8QaneHo~B| z&1Lc)jG|1)&kYQqC+-b=CswDnOh_djJRe!}#Se?A;(sl)#rw0j;bd>={21wev1HMJ%-TmWIyN JlFL?4{vWRoKhFRF From 89bce6cbed09361d22640ff03f54719c5fe7d2f0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 22:02:04 +0000 Subject: [PATCH 23/64] Automatic changelog for PR #87452 [ci skip] --- html/changelogs/AutoChangeLog-pr-87452.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87452.yml diff --git a/html/changelogs/AutoChangeLog-pr-87452.yml b/html/changelogs/AutoChangeLog-pr-87452.yml new file mode 100644 index 0000000000000..55aacde561888 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87452.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "MODules don't create visual overlays when their required part isn't deployed" \ No newline at end of file From aeae79fcb245359b67508f360204fc064ad509b2 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 27 Oct 2024 16:19:10 -0700 Subject: [PATCH 24/64] Add time dilation to hub status. (#87499) If tg is gonna get new hardware might as well use it to flex on the hub. This takes the middle number from the 3 avgs shown in the status tab and displays it on the hub next to the current round time. The hub status field is only updated whenever somebody joins or leaves the server so the real-time number would be less useful. --- code/game/world.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/world.dm b/code/game/world.dm index 184b13be6427f..fe55b3963b504 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -397,6 +397,8 @@ GLOBAL_VAR(tracy_log) new_status += "
Time: [time2text(STATION_TIME_PASSED(), "hh:mm", 0)]" if(SSshuttle?.emergency && SSshuttle?.emergency?.mode != (SHUTTLE_IDLE || SHUTTLE_ENDGAME)) new_status += " | Shuttle: [SSshuttle.emergency.getModeStr()] [SSshuttle.emergency.getTimerStr()]" + if(SStime_track?.time_dilation_avg > 0) + new_status += " | Time Dilation: [round(SStime_track?.time_dilation_avg)]%" else if(SSticker.current_state == GAME_STATE_FINISHED) new_status += "
RESTARTING" if(SSmapping.current_map) From b50479b9993f50ad309c6a5f381e7ee19dd764e7 Mon Sep 17 00:00:00 2001 From: Pepsilawn Date: Mon, 28 Oct 2024 00:40:05 +0100 Subject: [PATCH 25/64] Fixes selling space cash bills not giving the advertised amount (#87509) ## About The Pull Request Basically instead of passing the export value through get_cost() it was being passed through get_amount() The oversight means that if you sold a single spacecash bill of 1000cr, get_amount returned that you were selling a thousand amount of the item, once elasticity gets factored in that amount gets reduced to basically nothing. Ended up just moving the formula from get_amount to get_cost, which is basically how holocredit exports already worked so hurray for consistency Also fixed the small typo of an s being added at the end of bill despite unit_name asking for the name of a singular unit. ## Why It's Good For The Game Fixes #87476 which is the result of an oversight. ## Changelog :cl: fix: You will now receive the advertised amount of credits for selling spacecash bills through cargo /:cl: --- code/modules/antagonists/pirate/pirate_shuttle_equipment.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index feb62ec4fca66..da9df063c90d6 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -469,12 +469,12 @@ /datum/export/pirate/cash cost = 1 - unit_name = "bills" + unit_name = "bill" export_types = list(/obj/item/stack/spacecash) -/datum/export/pirate/cash/get_amount(obj/exported_item) +/datum/export/pirate/cash/get_cost(obj/exported_item) var/obj/item/stack/spacecash/cash = exported_item - return ..() * cash.amount * cash.value + return cash.value * cash.amount /datum/export/pirate/holochip cost = 1 From 18807f6cd12ae0a533b8fa4d28cb7d1d8de0f0aa Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sun, 27 Oct 2024 23:59:09 +0000 Subject: [PATCH 26/64] Automatic changelog for PR #87509 [ci skip] --- html/changelogs/AutoChangeLog-pr-87509.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87509.yml diff --git a/html/changelogs/AutoChangeLog-pr-87509.yml b/html/changelogs/AutoChangeLog-pr-87509.yml new file mode 100644 index 0000000000000..c2920bd63c88e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87509.yml @@ -0,0 +1,4 @@ +author: "Pepsilawn" +delete-after: True +changes: + - bugfix: "You will now receive the advertised amount of credits for selling spacecash bills through cargo" \ No newline at end of file From 40daf54c42759b9f2f93faaffb3d1c7337d34b11 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 00:30:47 +0000 Subject: [PATCH 27/64] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-87450.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87452.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87475.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87477.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87480.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87483.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87486.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87488.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87490.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87492.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87494.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87509.yml | 4 ---- html/changelogs/archive/2024-10.yml | 24 ++++++++++++++++++++++ 13 files changed, 24 insertions(+), 48 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-87450.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87452.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87475.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87477.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87480.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87483.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87486.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87488.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87490.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87492.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87494.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87509.yml diff --git a/html/changelogs/AutoChangeLog-pr-87450.yml b/html/changelogs/AutoChangeLog-pr-87450.yml deleted file mode 100644 index e993748e7e393..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87450.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Changelings no longer have a soul when examined if their brain is missing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87452.yml b/html/changelogs/AutoChangeLog-pr-87452.yml deleted file mode 100644 index 55aacde561888..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87452.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "MODules don't create visual overlays when their required part isn't deployed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87475.yml b/html/changelogs/AutoChangeLog-pr-87475.yml deleted file mode 100644 index d94efdd28d97f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87475.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Fixes a runtime when trying to remove someones scarred eyes. Now you can remove them!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87477.yml b/html/changelogs/AutoChangeLog-pr-87477.yml deleted file mode 100644 index 5569ec0a49cde..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87477.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Time-Green" -delete-after: True -changes: - - bugfix: "Randomly generated female bodies/humans no longer have a 50% to get a male name" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87480.yml b/html/changelogs/AutoChangeLog-pr-87480.yml deleted file mode 100644 index 1ad7c1c67f4f3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87480.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - sound: "bags now have handling and equip sounds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87483.yml b/html/changelogs/AutoChangeLog-pr-87483.yml deleted file mode 100644 index 2f40bef080a61..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87483.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - sound: "shoes have handling and equip sounds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87486.yml b/html/changelogs/AutoChangeLog-pr-87486.yml deleted file mode 100644 index 7c770edce590b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87486.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - rscadd: "adds big pointer to chipped quirk" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87488.yml b/html/changelogs/AutoChangeLog-pr-87488.yml deleted file mode 100644 index b329970b77133..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87488.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - bugfix: "signers can sign past muzzles" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87490.yml b/html/changelogs/AutoChangeLog-pr-87490.yml deleted file mode 100644 index 8dfb4fb51bba6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87490.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - bugfix: "it is now possible to succumb without speaking" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87492.yml b/html/changelogs/AutoChangeLog-pr-87492.yml deleted file mode 100644 index 2e0a5664cd320..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87492.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DATA-xPUNGED" -delete-after: True -changes: - - bugfix: "The parrot from the Corsair Cove will no longer be immediatelly shanked by the pirates upon loading of the domain." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87494.yml b/html/changelogs/AutoChangeLog-pr-87494.yml deleted file mode 100644 index 3c8e4c2e52120..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87494.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed deathsquad commandos not getting their berets" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87509.yml b/html/changelogs/AutoChangeLog-pr-87509.yml deleted file mode 100644 index c2920bd63c88e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87509.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pepsilawn" -delete-after: True -changes: - - bugfix: "You will now receive the advertised amount of credits for selling spacecash bills through cargo" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 9a585445641e9..163b1eb715468 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -841,3 +841,27 @@ tontyGH: - bugfix: pointing at stuff on-top of plates, griddles, stoves and ovens will point at the plate and no longer just do nothing +2024-10-28: + DATA-xPUNGED: + - bugfix: The parrot from the Corsair Cove will no longer be immediatelly shanked + by the pirates upon loading of the domain. + Pepsilawn: + - bugfix: You will now receive the advertised amount of credits for selling spacecash + bills through cargo + SmArtKar: + - bugfix: Fixed deathsquad commandos not getting their berets + - bugfix: Changelings no longer have a soul when examined if their brain is missing + - bugfix: MODules don't create visual overlays when their required part isn't deployed + Time-Green: + - bugfix: Randomly generated female bodies/humans no longer have a 50% to get a + male name + carlarctg: + - rscadd: adds big pointer to chipped quirk + grungussuss: + - bugfix: signers can sign past muzzles + - sound: bags now have handling and equip sounds + - sound: shoes have handling and equip sounds + - bugfix: it is now possible to succumb without speaking + necromanceranne: + - bugfix: Fixes a runtime when trying to remove someones scarred eyes. Now you can + remove them! From 9dfa54cf2980bd9ee202ec0d3206588d646295bd Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:52:10 +0100 Subject: [PATCH 28/64] you need spaceproof arm and leg covering to be spaceproof (#87507) --- code/modules/clothing/clothing.dm | 6 +++++- code/modules/clothing/gloves/special.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 16 +++++++++++----- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 8c595876076ad..5e095f3899378 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -430,7 +430,11 @@ parts_covered += "head" if(body_parts_covered & CHEST) parts_covered += "torso" - if(length(parts_covered)) // Just in case someone makes spaceproof gloves or something + if(body_parts_covered & ARMS|HANDS) + parts_covered += "arms" + if(body_parts_covered & LEGS|FEET) + parts_covered += "legs" + if(length(parts_covered)) readout += "[output_string] will protect the wearer's [english_list(parts_covered)] from [span_tooltip("The extremely low pressure is the biggest danger posed by the vacuum of space.", "low pressure")]." var/heat_prot diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 88274322e7161..d9b888fcd0e7a 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -168,7 +168,7 @@ resistance_flags = FIRE_PROOF siemens_coefficient = 0.3 clothing_traits = list(TRAIT_QUICKER_CARRY, TRAIT_CHUNKYFINGERS) - clothing_flags = THICKMATERIAL + clothing_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE /obj/item/clothing/gloves/atmos/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 38d4770244abd..0109c422210b9 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -12,7 +12,7 @@ strip_delay = 70 equip_delay_other = 70 resistance_flags = FIRE_PROOF - + clothing_flags = STOPSPRESSUREDAMAGE slowdown = SHOES_SLOWDOWN /// Whether the magpulse system is active var/magpulse = FALSE diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6bdbf8322f26e..048f7bcfe2cb7 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -52,15 +52,21 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) - var/chest_covered = FALSE - var/head_covered = FALSE + var/chest_covered = !get_bodypart(BODY_ZONE_CHEST) + var/head_covered = !get_bodypart(BODY_ZONE_HEAD) + var/hands_covered = !get_bodypart(BODY_ZONE_L_ARM) && !get_bodypart(BODY_ZONE_R_ARM) + var/feet_covered = !get_bodypart(BODY_ZONE_L_LEG) && !get_bodypart(BODY_ZONE_R_LEG) for(var/obj/item/clothing/equipped in get_equipped_items()) - if((equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + if(!chest_covered && (equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) chest_covered = TRUE - if((equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + if(!head_covered && (equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) head_covered = TRUE + if(!hands_covered && (equipped.body_parts_covered & HANDS|ARMS) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + hands_covered = TRUE + if(!feet_covered && (equipped.body_parts_covered & FEET|LEGS) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + feet_covered = TRUE - if(chest_covered && head_covered) + if(chest_covered && head_covered && hands_covered && feet_covered) return ONE_ATMOSPHERE if(ismovable(loc)) /// If we're in a space with 0.5 content pressure protection, it averages the values, for example. From 04da18d55cc6d78d1e36b8f98e944ccb6994e4db Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:52:17 +0300 Subject: [PATCH 29/64] can sounds reorganization and new bottle cap sounds (#87456) --- code/game/sound.dm | 6 +++--- .../reagents/reagent_containers/cups/drinks.dm | 3 ++- .../reagents/reagent_containers/cups/soda.dm | 4 ++-- sound/{effects => items}/can/can_open1.ogg | Bin sound/{effects => items}/can/can_open2.ogg | Bin sound/{effects => items}/can/can_open3.ogg | Bin sound/{effects => items}/can/can_pop.ogg | Bin sound/{effects => items}/can/can_shake.ogg | Bin .../plastic_bottle/attribution.txt | 3 +++ .../plastic_bottle/bottle_cap_close.ogg | Bin 0 -> 15943 bytes .../plastic_bottle/bottle_cap_open.ogg | Bin 0 -> 15860 bytes 11 files changed, 10 insertions(+), 6 deletions(-) rename sound/{effects => items}/can/can_open1.ogg (100%) rename sound/{effects => items}/can/can_open2.ogg (100%) rename sound/{effects => items}/can/can_open3.ogg (100%) rename sound/{effects => items}/can/can_pop.ogg (100%) rename sound/{effects => items}/can/can_shake.ogg (100%) create mode 100644 sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg create mode 100644 sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index 4c001446471a2..f8d66620dc69a 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -321,9 +321,9 @@ ) if(SFX_CAN_OPEN) soundin = pick( - 'sound/effects/can/can_open1.ogg', - 'sound/effects/can/can_open2.ogg', - 'sound/effects/can/can_open3.ogg', + 'sound/items/can/can_open1.ogg', + 'sound/items/can/can_open2.ogg', + 'sound/items/can/can_open3.ogg', ) if(SFX_BULLET_MISS) soundin = pick( diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 4c137786baed8..717e2248ddb01 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -264,11 +264,12 @@ cap_lost = TRUE else to_chat(user, span_notice("You remove the cap from [src].")) - playsound(loc, 'sound/effects/can/can_open1.ogg', 50, TRUE) + playsound(loc, 'sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg', 50, TRUE) else cap_on = TRUE spillable = FALSE to_chat(user, span_notice("You put the cap on [src].")) + playsound(loc, 'sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg', 50, TRUE) update_appearance() return CLICK_ACTION_SUCCESS diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 7772a64f60e3d..a23e9c323545b 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -118,7 +118,7 @@ if(iter_mob != target) iter_mob.add_mood_event("observed_soda_spill", /datum/mood_event/observed_soda_spill, target, src) - playsound(src, 'sound/effects/can/can_pop.ogg', 80, TRUE) + playsound(src, 'sound/items/can/can_pop.ogg', 80, TRUE) if(!hide_message) visible_message(span_danger("[src] spills over, fizzing its contents all over [target]!")) spillable = TRUE @@ -151,7 +151,7 @@ /obj/item/reagent_containers/cup/soda_cans/attack_self_secondary(mob/user) if(!is_drainable()) - playsound(src, 'sound/effects/can/can_shake.ogg', 50, TRUE) + playsound(src, 'sound/items/can/can_shake.ogg', 50, TRUE) user.visible_message(span_danger("[user] shakes [src]!"), span_danger("You shake up [src]!"), vision_distance=2) fizziness += SODA_FIZZINESS_SHAKE return diff --git a/sound/effects/can/can_open1.ogg b/sound/items/can/can_open1.ogg similarity index 100% rename from sound/effects/can/can_open1.ogg rename to sound/items/can/can_open1.ogg diff --git a/sound/effects/can/can_open2.ogg b/sound/items/can/can_open2.ogg similarity index 100% rename from sound/effects/can/can_open2.ogg rename to sound/items/can/can_open2.ogg diff --git a/sound/effects/can/can_open3.ogg b/sound/items/can/can_open3.ogg similarity index 100% rename from sound/effects/can/can_open3.ogg rename to sound/items/can/can_open3.ogg diff --git a/sound/effects/can/can_pop.ogg b/sound/items/can/can_pop.ogg similarity index 100% rename from sound/effects/can/can_pop.ogg rename to sound/items/can/can_pop.ogg diff --git a/sound/effects/can/can_shake.ogg b/sound/items/can/can_shake.ogg similarity index 100% rename from sound/effects/can/can_shake.ogg rename to sound/items/can/can_shake.ogg diff --git a/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt b/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt index dd3b21b412e39..719d3306d5ef2 100644 --- a/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt +++ b/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt @@ -1,2 +1,5 @@ plastic_bottle_liquid_slosh: liquid in bottle shaking by mrrap4food -- https://freesound.org/s/470606/ -- License: Creative Commons 0 + +bottle cap: +made by sadboysuss: license: cc-by-sa \ No newline at end of file diff --git a/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc07387f557ac21a3d6436ae2f8192358ee3f998 GIT binary patch literal 15943 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

m{=1#J$&nr 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 literal 0 HcmV?d00001 diff --git a/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fb376707f49844cb2beb8237de20bbc08f88019d GIT binary patch literal 15860 zcmajG1y~%xvoAWh6M_VHUEDRedvJ%~PH-o9ft-hJ=8 zcfQ`3p2|r zpMTsTVE%oBL`2mg0C;eF7CDk$zlj(%06+tPj}#!(I5TNbL3|F4M{>N>YpItxG&w%B z7soh)rSHEo5_S_T0DuPkXb__EcBQSxc+7FAqa3q&EETwmNZ`Vh)_D-RuBeRd3hN53 z?Z!Zq@F-d^09b`WQl!C{%CDJG2Wvr0BlnsW%^!6c1b7pey8`~B>$`76`#_+FN{J?B+a^OXg z|49Nj2+7$dNu5Z&80A4t-N`P&Oq=cuRZXLAE=f-NYeAba+%2#zK|?9M*(npLPGi!@ zsRjQ^9_VRs6(v*PI^4Z<)IMB8a68MXRJf8wO>keWiPYWVW=wD?G(L^GzFGAjzyH9Z zL_dA3lV=0mBXlXvx*0(aT)Hz!KOIGQt^42MBLuda;Q~%yMgWOV6s!>@X(4GGk#jU^ zTsF%9D4!@YNo2 zA+E$OuY#pFiRCi=&Qyg{Z<@n&TFrFU)pW7JRHxBLtKmNm^UrP8=3V}W=e)WI8Bf%f zR4nxW@|xDa_LwKtyn6LMDx(pl9bGYl3c|9&2ucmiju>MLc;b!qG&=BEkjdF zn{#c3Dvw(Juj#)%N79i3oWPzV?nv=JJg0+&KosmvHT3cq|K`X)30A1HIQIWE004Bv zAj|$;N0gKqW|cW+l^N7j`Tx%z1E$Wh%TKd|6`KG6xBx&7HgXVJm}88H9ls_#%Ps{> z4i9Wj4^B`K8XGbX3Yl|^Fg1TuEKfJ`#kw*LmY7^%BqdiA2})O?uJjH!Jb2lI29yB6 zk7a%g9GJ4y^!p z0^qxRoULB+e^|+5{$<6fHs8RZm;5 zsi`%nEneBGCHibQtLbT&F5akVz5A>)AG~qxvw`!B3$=xr_Egh;cFRd&es;Mfgv^fG(D~n5O=u1oK%WBFWO6iXpic4E6 zhHAd2RhAt!oFR47AGO$*R#ukP9KTXqDvtUbj#`+#3qiw$Wrr;#EiHCOEe<0Mwgh>l zhi$aOUEhal&W>7`>Rd>b)Ld5L^|my?^RP8=%hb6EuCe87uXq>&Gnl&N8UIAk4DMEI zhYzmnyPy*^4~y5U<$47!t}M zrGxb2h5%qm_b^q^XnRSV(UcEK@>N-2Nu3mAdI{n`$XJoa&(QXfs76T-q{pGlSb*ZE zl;Ls;KFC<-#Lp>PR~OD0osi_eld)uopVGD}>6_7xcx#Ntx|eS+RM&I z6_F{($CQ;}P#*yUId4i>sw5v>MY^OO%&H*&ovaK?1E!80%Nzl?M?SiaG^h_##g?Hj zmAsDx%xdse_+J@2$?;%TDS@#vG8GB2$|LDef~jePH2~1vs)Y)%EYJ?O1m4WGpLQg_rcc z(}@BLSFz?OoU?i*=-Belr8>z}%*`lAf(gd9KW9_D&i-rWMpg`cb4C@f!fC4$V!^_9 zm$V~z;-`$jtYVcTz&&(qnhO)Hz=Txg@cP{)CmW9I8SU~{8M5Ffgj00$l{$FU@q+?{ z{18mDUzd&JLNpx!wic*=rzva}4n z>ee6-coq!cxZ|(e!pevCLLj1OApl}vFYY4&uRE}~1vr5dIQf{yXk-OAV7nAx8iRF< ztx&SoNBlK?!Rf9uFcWFusjFC@;Yth8@~ zeKV1`hZR zg)h!Yje|hTZt`~$ek5QuMzDOrGzw$cOBaO)^(KR3oI;$}&;$ICeT_dNzy$DZADFPVYVDsdN%J9%o zf>8njf#C!8=y+|J6ene6TFQdN*QH}dTZRG58;-JIPT2}9g%`e{Zst|gg0K{*U`{)n z0qk-z;9H{zjxWmKCcO(r2$ z<8OEuul$Nguxefjf1&!fgh2YLuD^{*|Mh*11;G%7dR>Ld_bKv*$ZXg*x}ZK-49Ea} z$N=E5V08qV8zAXT4@#5`ig83UVtlI{#v@s6DuvsNGaJuRfT^Nvy`OFrp`@5$EW^@W z9XaMRMyY?U5ig*r`*8ry4>>ZjE*xo}wF5@)mkUV{2{dU)F9c?cUm%8^ z`zDHFQzrticme9ay)wk>hBOw1gp4eeCki$CO$^$%x3TDP81Z2E0>C0wyFR z#4IYWdkcy}%p@qkXB(RGFZnfthyS-#f&N?mx0mh^dZhrs>t6a*3>}oBF$HLql9HO1 zje}#24n)hz$+>WK^yhGTcaxKYgN~kohkJ8rW;PyT5(d6OT}Dn&^qUZM$|pQ5dt8~_ zN@tCKv7DC7MEfNtP^P zrZQRKbKB}=!?VUzHl<(cpX!N5kFS^OboJ5Y2|nsd-B$Y*+D76PH+lof&$u@FoMTGv zjiT_*iy_me&9&BBVaY!!cSqx?WgJ4*9wuQp;9GS6oVXaL;nh~IjkXZv)sL9Zq0Et% z>w7koD@v+zJKXK8@7xxL_Tr2GkD-Gb7=Vy9Lt&}!=wm1C^IKIn`ch#FrN*Adr_n+B9WukIU zyg!IcG&+rQ$6KkY0c}mJu!p=8+rqyorXIM)&SnRYul-b~l>X4!_E7jd#5(^f=*Cr% zwc7NSR&F2XU(m)6za4$d{{(rmlC+L{mg>U7W=&@SNe@dt9h2`1U+~_=hXSw^@2D8> ziPT$mZ)AH=@A`E&yseDua-~&wzw~wCD_J%Os;g$+3aF7}Z-FMUFzoOeKb!hKO_z3Z z?C)1??dc)7L6M();F)2}KC^Uter=@v3nWp$@UzZqXX^GiR>$PEHKZp^TlW5SAV=g;YdM2#lv z7Og}E9pvyf#x9a6E9xW8#ul67!nyp2IW!GWvx-}lCHS)&|B6s)6)bIeZM(fZw{0eSKSpMOFVx`Ap0DWC*I zp*>{@j7|Wl`46^G^K-`l17&wbde&W>=|?|S$nq1kvg3#+Od&{iH%NQ`rAhB(=9&IB zYs2ONo`ht7r$g7gNxHIhIVfQJjVd$@|82y8nA|_lV zbOgBlUl&Fotv*1X;QV^y`m_{%2RuR`1vpR#97SW-HZ*X2%eNMUJ-$wa;|0k|s85C3 zhL5$*v;S#m?^QeMoA~708L%M9rDu&Wa>9<`ZWZP+8G8V)vjt=mXn3zh{UYg*dzl^n zV)9wF_3S8ssl<-%x54qV|D5CC%Z``<8L%Wik_UVDJHWy2_GWR?Lh#qwO&@J;F#_SIMa0U$wHk-F{d;YfrW1D>HFxGq_mtg zi_ctgRhKNrf*!h384rn08alyrcGcjB<^yW{IWxw?YZ@nJLi0Ee;r!FD6#KdC zWnWlm$n>X^z32BFq@%fC1#1#{4h?;aQR7aqr-?AUEsrDC>q?gx8lw_#7fZz;ZjO9rred??p0Q5mfL3gr5xFx8PD>_ z5orMmpQN_bs|NetixDS%2MF_ab*}nh`kbAEg3jMhBHJGms>z{bEgVF*2&55pP4nVor#aVR+7afB#;g;Rot;g(#cVRS5yiy(M zyFI?44GQphT@-fW%S8Hq2`{v!QSpW#ioS=^DlE|=Y7R7ouE}L#X>Q(|kZ~QTmM??! zm{XVw_?-q-`}O9GSRv!bYTcizwTof4)fe}xSgk+WX99cK1$9<8nPIe@Y`@FDpZe#& z?KIEAf4}M038!8rI$B=suozBOpTJ~P<7$FOMgCQaFgs1_jza%8OAAAUSUyE%B$afj zhT#yd*{?~t^%NN?SKaG$Nx?T0tn9YQ2A>!^+GSNt<91y9YsfTkWR=-H3QB>2$}9{*rlY-@i8nI&jrM1vk9Uhv(IX+a zjDxctX&DY;bzZd6-vk2SYK9iN(@!XhkL6(7ASU*Fn)`kCpu_U=P(qw@|JKP%;D_|U z-e-~LKTk6UUl&2k_%o3lZ5jz1mEWB>=V9_16?baMn$R;%DAW2jqe#9`D93p?-Pllk9iMhG&Dm8l+gr+685KCS7f3I`Hv zpTu9xe&NFJu{mM@MDtsEL2_@>5;eVemNR)_KB6no(N;Ms&=rQixY1KOOt>d;xw{qf zuNXOzI_Mt__bWebs}mN6?`pC`{%jRtK85?pFSPYoTkvE1k+r5zxt>5dC}LJ!CGwW44Ox$ zTsyIuOY6%vjv$u~V*gwU`wA_Umtn%~wAIIm!XNn}pN%@{Yan3fyer422qy*dvLir( z9vI(vwppVm<`>NaN~c*w@W>E0;jjp})BWSq7iMxf)x+@T)V9~*ahVW0yjY00JZG|G zSikv6r}pHd^Gpu0to$6^<0mAV!9yAf9&s|e4`tApW_ZU(T-0UBB&ANQ_sx*3R@`Wo)i!32%+mc;i2MA`e<0b?-(^^zvWNo-7HtmR#XG>WOGP}efoG-T z9g|M{_iFWsfjc~=`6LGB-Qw;ICbn&>TW(?Zil(HUixf&4cJejb?If&tegl=V?Y_dV zkif_lA{+A;-(m?XXPs_{o&C6@mo+|2bla_+BM$+rfDAWIhJAbEAvfz4U+7P$#zJ9@ zPESO@;ux>O z=`~dx&%M0N&RRO(>1lvxUg38~gVw&uZGU<34S8yK@oEnhKnDokRUw;REU|@$+#;aF ze?=PJC7aHWYuKt8ap}PHXkyKS5j0tD)5e1foLlgCQAW%zopN?JkOT0j2~gE>rck=t zAh0TO-HpJs_F|RNjIV{dak-K-+M4T3S05M7PMMU@2D5swvxv&-X-kr5y7vdr9T5WT zH(j)8woog-h}Cc#(2J)ZXucta&~_pCP3Wu59D-|L~`y7o0c0l|hl+q%pND^66IQ_2}fb7e$XY zFsf^g+*l|bUmGgbYBVd}^pRljNbUcs`0?4oz^{I*VMmx)E?)BL4+h-kZyCQpQT^t< zf!hXbw4ud@+2nJS@ThS5`!5WWCvVY_8zzW~yz`PnC~&D_IGb8Zp*cK8ec(oL;wGgd zj_ap?;TGH}`GzG;qb5!+vGh~rg?)!4;suD*>v}jKpvR%wAIklPpoy3ZH|k>1Bu|n{ zj^DC}mn}Vb&h)wPPs-`PXHSsJ_^ILODTrcNwfern0>w${LinqwiVJ#1I0q8lBG%BB z;AF}B19V%_^NZ6~kWHWi?Hh4yGhkEWHa!l2+*P*2eKk7zatg! zb@NjNNEVif@19He>X{bqo{bY{X6vJ}{mF*KFr2P<K{o)*N$&CbZi&2_LaKmJ**Zktm6Tc1-` zBQdLrMz|l~>4+yus)-+sJ7Cc&Evv}tyK|}?jJW&f}8LaP1H8Y!+%CCf|=vtfb?`twdk9e$8O%MTmPW2ui9}DC$g&Z<1 zUjSB4=t>TY1>IN*Nv5KDzT9q<;{0MDyL?w*VkkN5wlXwyP{IAYbn)(Y(ifB@^`5j# zte!kxt~X3?Jcvsfkw|@Z2P?i&z!9%f@3dZs*Njf2m;7j^VI`+Re$S?MoaJRA@$K-` zuX=-9>gz9URsoqI#U4%8e8wt>-C}@je$wBWFl{hTdZ=y-h^LMdfb~AlPga6Za#*v> zW!^{p#LzuLHYdmYh#ycV6Tun{9kY7Wn)rcftxn@~6LvtpI7ghJzl9O5mY12DNAHLM zxP~2sHF+vVuE7)@K6R#CN3S513lPhX*KjNwLBR~JQ$Oc-o|@w>g%tqgp57BWig*!5 z;wJdL)zq`VQ!Hrwbczw(e$OaeO@~?6tXtk7HU&7}6_+lSyW38xQOO8>-O9L2O3)^I zu9WiVg|g)$*RNElet)=XrwS2t_da|oYAzWFN6ia34tJiat#teCULkHHoDMZx8{LKgkd| zuiffMZ`;o=LsO)rT8erN^)}Ob*w4uviZnlaaiAX7Hrj(EtWEbP?R|$RSU!3QGXXt! zb&HjlZSVYl(fEi?bXH%paf~)6Co;>K^l;PnK1w@ee)oU2#gi7ezM5F!9-DIJ>IJr8 zO7?M2(&H+j!!#gSCSb5j)2D@mP{gGZ)RwFQYWeB*Yo8JxH|@6{ziP?-M%Q^`(H8@3 zLx^u#YS^AjIxk?0d1ez2@>o)rJSapvdwguJQ#nK|!`{2)R;F|n)I`j`Bnc_yE-a(92n5k2r8DJ-D5+XbG=jOe_RN^vr#9w!yBmWjWhOsk3|MXiOL@b%>uNP@}V9&NRb~BiHG$}`9>z{&3!WFSb)`e{4OjUAP=Ha@sIDYM8`tZ z&-jr!#6&eQ|R$)rs53 z9V2&Z<`nPKhXz#i3oo0dQz9nu^)F9OPi%ypYK%0kn9{T5x2}^X>QQ+s{(KS#q{G+I zezKRaVZc{luB{mEug5x0DGChLTdRzYf7pwdyyhr&c{0$kU(up|mzd7J^5x|gEh1&5 zcD7P7Sk>3o!!Il35rL^&W%IVH1Oy*~Pa2nG1Y^FHLG_`m)%5fJB%L>JJ_*myRW#oF z2_!927>m0{(ocgK9rtl^Kqd{r1d0u+rzta!{V{sCCtTn6HJAgXI2p>s-z}fqe*32( zZG2C$zOyk9VAm*m{*rRMSdNmXj4jJvYdxUTt25v}N@CNqA%m!QUbDW^-|IibOL0Ca zak-}w+Hel-hku1pj*L2%qE0&h8)7-QvsKSumtE4UN-Rr%5_V`dOKCEbv2XOk{s(ub z0^WjPE6J=^5oA|5OP$E!*w92!uX`j6jI94^=OIj55X)?zOvxPKVo?Js#c{!N+xlj} z`V+F+!AIZgK}&=r)0`)tW=*f8fT+1=dfrVHWLT$j%;JR)&YL9@aNnswfe)Qrm?|ZFNKiKMvjHH{^%h;p%ErE+aBBC;YHx zD$|1JrVRP216R@ycXRkMiIq-JcI8MU?6*g7a_#$V94j;(aX!?>Sozu3GQH%MeO)Ol8US5vWb5|gz@pR?uXWGOTnB~Ou9J|rhfqI?!iy#g*YT3_Z3OIHKOy*B= z&zgeArH;|luDK$I8iT#;N)3X3oEhBKkN$$tUxQeJ6{^}Nli+!Dq$eDouiNW3nY^kv zCPxLmNtwRtnyiboJZ|(g;%cMD(fS7G#Z3v7l|P+3=d>L>-P${NOf_Uub-dj{d3&lW zNIft|F4~>FTl}c7QMrd!vosLVbY2si{(G7c#V@dWL-sCpX_M$Yb;_Z_voLO^e(1|pcIr*ufhJqp4;NxH{DNH+QvoK8 z*r-qsZC#2g9=>Xmo`MD6QWoj%a>MVg0UXW34G~*~@Df-)#?2op!pf0KnS&f7=S`^i?drmj$V9y36cgCJ{ zurVwW{XGr8H#_R7Gi1uTLrCN4iQ6$tX*ou6e~^K^{mCwZuuWXeA`(LM;ReTD0dMBX z8I^l7DTI27-lh}hy#2|ScLcmb?pa>{I(p!(7}v^iKoWE@daFuX1yOe%MpnFC>YUD^ zkR7*wO`sy#<`(^9x5+ZhAu4|V`Fe-(*+xP_T@YCVh(8$8KwEjC}8E=5B8e`9lSb$MKI7eepKhvRrMNum)ABLHF<%M! zN=N-gru4c}W_*giziSR9SeQktKR&*$pP=3w_SjrTD{3}FtK9Umm0s#q4xFDTar#JmQ z&d!bEM_)^7tOccz`yVRD*dpuE%b3x>4AUZAt0)6APeX1GMG3<%V)P&-Vm!;b`7txp z!Cn(YpXST(INMlMxo|jtx2xJalS5DTAv3*{6g{K*QwD$n(QVbA?xxG=vv|PNkxUOJ zm1Pb{vTK<|7DK2Kqi zh#cB0$wUnQkQ5z!eoxQInYLL(_7W+aSpV{@D2~aDDro}X%`I~?LvFo67VGzt2u$06 z^Grvg>5GMp5_8N`lZsbk=gH)`3+F%Gx|Oo=I=mKfZ8$T(9(6Z-wwYe*Rx4GTjp&QX zdPBtU;x0G5$TOG}NmCKuy-$au;H&pEA1?W(U*7RW!`A>srFzW3o#<)mcTGTNh`c!- zf4*}iW#cbHki4c&>>EXti$${M-}y+IVh@Tf44d^APWfd*3`Z;|J3y}%l_9lOar-^Afnx;nlh!6vPr+n9g!};Yv#>r{QjNo=s<r8bhM>h{t-MChl!RepptS3NZ-*C5{?MQ35B9f_J=OzJIi(2I#wym* zG=|M>+f6SusgSCa`h~75dKCBFo0H8GPT>|T?65P%MbkPZJK=kpo^y%iIaZY7uuinV zbi7oRt((}S|$k&960hiy;#lASO^($p3Y^i7+j*qkAo-8*Hsdioif>0a3ls>VBU zSy3yu%cnhBWv$VQvz9uR94G;GwKg5e~KrRO^waey^n&Q4Z}p24V9RFf9-H|`go&v zFl_~zjIVT&8dwBHU*;Q?&XCAVc51Ov_?2mY;_YLqKv>Pddpo;vd-V(W8 z_*kgB7`p(!f|x*A`JExcphfhKLEZ3F0a9OG>|QDk9`AQ%rym@Wu@E;3?7pn%i1w}A z!I6P`qGRutt^5P&z?Wtw10+)wTux)z0dx$W-yYx2*-r}?eK}JYWL&;DQ*E;_6FLV7 ze#GFH8Oqu3%S7>CjmnbL8_SPNvX(uw*Ik@cyx$1vj5k^AAQF(tiyYsv;xi%N<%fIA za0~iCkyhku7sB{qB8hYJ5l@umWaMBU4?`&Ts8Km1egXr=l*GkHW53(#no-$xqOS9Y zfBQ7CrF3fMIvNJyA+_Eb8)62%>)Q+yf`8`|(3bUok0<`VMe+J}#nR%3FZgqmujdmi z92}dcb6cCVG#u<~oNQ|&ORMvp>T0UJDH!ln_E`tqyZp~y)xzbd%<5Hi{axQOb8in` z!Wq*L3xl$3$7EkHZ{`Ip74*t)TztvvmCbB+Mp;L%G37fdbb{~s$!2iRe%(MYj+&{x z10{TMAQ~w9_I{FMx|VJ`m^D#H!Z|N=OFzTMp+YGOZ3{_Hly z&L~TnyW<`H&{Zd9ia6<^+7pk5N}iV^q2%3US=C@iNk|?i)nIHNFM5G<)7iJV+lPhrC+95i)q� zf;?EJPWmE)iaEkB^ZU}(c)gqTE!`i)YJQ0Pr#h_+Y%f;5ktbOSW^{-=zP>&>Qx7qY zt)L(u3#P@WMHVBaURG)#{;4(4Qn)bO=03na+-#(>V$vdM$28&49{X|6bx(Wxq*AYs zz~}D6kEJfe3S?nQfCAEID#VkBiJi&!4T(zlyEcv^vLg9uvVrL&rlLOZMqB};)Navl zenc6&KE@xcku~ofce|nx<_+n89$?5CJKF$Z04QKPlA1x z!<1EH>4=DtNc6E~)*Rrzad;S#N^mAhB;L=Qm*A79dp-9tAawO;pR9@ycZ_sUc24a3 zXS9mi^hal3{j#0ivq@7Of%|Iz)w9;rMcY(mViym)eIy!{@uQf71=P%G)g^wj^4{H? zZW9SPO2D`6y9;E_EXcPy&aC~mD}3MI>MGYZOD{d^LsUSDg|5!LCFL)OZ3xtZO&env zr%hv^7(s*>gAq8NuYfBG)H|kJ`Gr9r{Osm!B&oyMvs`p@r|4Jg#_O<3VLi%H-Y z-k;|d=P}l<)p2u|ivtR9sjG#6F^3jPlXao>ZH^7Uvs&-9dNU%2(Q*b}xw3XmVdP0* z;0kuHYGI_P^;46zw5B+9`;pRNF%FMv4%4t@i&kIK;*bnXWDu2R=3+9Vc`O|q2EiK) z_L%R(+wVx)+#XWdUX0>SrJ>kbO21^qj?6s!Ixuc{MT7D$UwFoM00NS--riqIE4Wi% zM|ZR0YQwfVeb*j%1r~-q;XqJ?G~I!x_YiCp7DW{X`5)x4kPfUB%Z?7xv6YBsaek~M z|GcouFi5NUC4+36l^+#tViF7WlKdq4FgtjpsVUEG4+_Iq%26k>KZ zZ2WlTb}F4G`W=3#eG}W^f%xVxL7#Le?5QYjCRZlkeb?S_kvFrt_v=3rxQ$`!jH*%k zvo5h57l`>dL2V-VUmzli=Mm1oh&~C59Ud$f?^sCL=-2UUBdu~ZB~~3*SM1-jY|ja1 z<~-y}F1zr#o3)ZN3y9g~uFe7a1GOgpIQToPRNZ3)YfZMBBpIqrbyk|gG8mt0E24f5 z2)NIO3e3MWWZXISpI2^=VsN33^n88<3dtgx-tG#n=)dAA6V$Id zG8QhEYKkEgYDcwmv!B$h6Pnt1qxJpKEib-*{a7A8LRVfZe{A#6La*Xt%R2N))!XZ1 zMl=2Fjfdf$EYwfb;zp-#U5|w1m6tI%{)!!GC?Iw>xln8r=R3zmSAFFd6$vfIPo~)c z zBe`1g{IfcCUvlsNP%ES?W>(zebwZiLf9+qwgW6Pt3-j%q7gPZ`a_*Xu?Rh<%|NG9_ zAGw>K-sDHFu<0BA5?Psoa}m$8WY8Xz^Pk`RU4?ywylfQS*?7R^0b;%hlGn?dN8(YT zubA^cJbyAuzU69t`utRrsX+as`$tvbP{c?FiQLN1gkQ1uwe-*&F7U7tMHe|s<)JKmPaz->fr)yvSQ9+7X&f})e0 zh2^Oh&NKIp+Zk^5cl^SawP6vtjA8px$wk2wofr*aFCd}vdwIg4P=db9Ol6bXjj?_q z`kN(6`MnlX!|~GlkbsEr57wn!BlUt*aJ1HX`8lT1KlGoYwwPwc;Q3hS%5)#%b_Jq~ zs%{57xjK}&)gz~`IACO%KO*EgfJ_3~zjL|$xjWpH3p>cOTH7>(*t0-**GLJ0n zYI~mYC+)8oQ%5%Av=ZsJYB(RXT}@qAtqkTB1V_HD#3cVo;FkBHNp1Z`Jc7#>^D`zd zRC;NzjgCAE_-(}#PhqqAfd-Zt|9gD@&e^u8)XLZksp69;=H1?1@`h@2y} zrfP=%M(=^d%ndjq6`6>POEEK(WXEc^|&c#@nxJEkyg!OFqQMn?b5~7+s7@xY0Wu zqotFiabCd`kca|}g}HltW>-e9m+FA&g}+@uo&upHS#`OhCV6pqR!>tUX9#gRpROs) zu41K=5gC>*J=6X(vw|crnCPR}L1q6rhD_c_T=T@i-nF-!M2JUz(Cwh^wmNLjjB*0x z(QKEHBVEd6X9SY=5&aP6>KlD}M92vI9hqD&9hx zv$U+2XNL*9qs48a6b{8z!LJ-X7o$c}WP55MBf|%S^;9$#3|lI7f5 zEL4E83F5^;tgUQPFoyGhJ>bxCcY=w`l}IDRxYlW$wze80zc>SrrH*ouD6j73CiOVz zr%tmA<|5?O+o35wHF(3cm`@k#x?&psa^Sy42z)w*g9r3Yb%(rN;`9RtvN<|gRvAVh zEsUAfo9al#F%bcm&fUYJqJuMEeQwt!b}F8Sq1`i$67!^*(Kpnc?gnvRk+=I(7zhKo zGMMq}?y(z!tjauSmzjd!srgGIj_*g2H$eOG_@-Olcnm&l;rwP3P-7eZK{vs#^m}J` zlpm()X*@0i_HM4wZyunLd#a*$gwQcTnI|q&mo_y6aICnw)-#WnGOoaz%O5uQ=S*Bw Y9VlOj(yIJ976I|ku(3M$r%+t~58f_^5C8xG literal 0 HcmV?d00001 From b94d4f910ec727a9f4e64e4d13174e9c5eb99548 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:52:31 +0000 Subject: [PATCH 30/64] Automatic changelog for PR #87507 [ci skip] --- html/changelogs/AutoChangeLog-pr-87507.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87507.yml diff --git a/html/changelogs/AutoChangeLog-pr-87507.yml b/html/changelogs/AutoChangeLog-pr-87507.yml new file mode 100644 index 0000000000000..a4d7aab8ecf19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87507.yml @@ -0,0 +1,5 @@ +author: "Fikou" +delete-after: True +changes: + - balance: "you need something spaceproof to cover your legs (or feet) and arms (or hands) to be spaceproof, not only head and chest" + - balance: "magboots and atmos gloves now have pressure protection" \ No newline at end of file From ab18546dcd18f3835024c14fe031e1b3dd426cec Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:58:29 +0100 Subject: [PATCH 31/64] Gives the Bridge Assistant Axe Delusions (#87513) Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> --- code/datums/brain_damage/special.dm | 176 ++++++++++++++++++ code/datums/components/twohanded.dm | 4 +- code/datums/mood_events/axe_events.dm | 20 ++ code/game/objects/items/fireaxe.dm | 10 + .../station_trait/bridge_assistant.dm | 4 +- tgstation.dme | 1 + 6 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 code/datums/mood_events/axe_events.dm diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index f49a6d0c0bc52..486af4b278080 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -525,3 +525,179 @@ owner.ai_controller.set_ai_status(AI_STATUS_OFF) owner.remove_language(/datum/language/monkey, UNDERSTOOD_LANGUAGE, TRAUMA_TRAIT) to_chat(owner, span_green("The urge subsides.")) + +/datum/brain_trauma/special/axedoration + name = "Axe Delusions" + desc = "Patient feels an immense sense of duty towards protecting an axe and has hallucinations regarding it." + scan_desc = "object attachment" + gain_text = span_notice("You feel like protecting the fire axe is one of your greatest duties.") + lose_text = span_warning("You feel like you lost your sense of duty.") + resilience = TRAUMA_RESILIENCE_ABSOLUTE + random_gain = FALSE + var/static/list/talk_lines = list( + "I'm proud of you.", + "I believe in you!", + "Do I bother you?", + "Praise me!", + "Fires burn.", + "We made it!", + "Mother, my body disgusts me.", + "There's a gap where we meet, where I end and you begin.", + "Humble yourself.", + ) + var/static/list/hurt_lines = list( + "Ow!", + "Ouch!", + "Ack!", + "It burns!", + "Stop!", + "Arghh!", + "Please!", + "End it!", + "Cease!", + "Ah!", + ) + +/datum/brain_trauma/special/axedoration/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS) + return + + if(!GLOB.bridge_axe) + if(SPT_PROB(0.5, seconds_per_tick)) + to_chat(owner, span_warning("I've failed my duty...")) + owner.set_jitter_if_lower(5 SECONDS) + owner.set_stutter_if_lower(5 SECONDS) + if(SPT_PROB(20, seconds_per_tick)) + owner.vomit(VOMIT_CATEGORY_DEFAULT) + return + + var/atom/axe_location = get_axe_location() + if(!SPT_PROB(1.5, seconds_per_tick)) + return + if(isliving(axe_location)) + var/mob/living/axe_holder = axe_location + if(axe_holder == owner) + talk_tuah(pick(talk_lines)) + return + var/datum/job/holder_job = axe_holder.mind?.assigned_role + if(holder_job && (/datum/job_department/command in holder_job.departments_list)) + to_chat(owner, span_notice("I hope the axe is in good hands...")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) + return + to_chat(owner, span_warning("You start having a bad feeling...")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_missing) + return + + if(!isarea(axe_location)) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_gone) + return + + if(istype(axe_location, /area/station/command)) + to_chat(owner, span_notice("You feel a sense of relief...")) + if(istype(GLOB.bridge_axe.loc, /obj/structure/fireaxecabinet)) + return + owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) + return + + to_chat(owner, span_warning("You start having a bad feeling...")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_missing) + +/datum/brain_trauma/special/axedoration/on_gain() + RegisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equip)) + RegisterSignal(owner, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(on_unequip)) + RegisterSignal(owner, COMSIG_MOB_EXAMINING, PROC_REF(on_examine)) + if(!GLOB.bridge_axe) + axe_gone() + return ..() + RegisterSignal(GLOB.bridge_axe, COMSIG_QDELETING, PROC_REF(axe_gone)) + if(istype(get_axe_location(), /area/station/command) && istype(GLOB.bridge_axe.loc, /obj/structure/fireaxecabinet)) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_cabinet) + else if(owner.is_holding(GLOB.bridge_axe)) + on_equip(owner, GLOB.bridge_axe) + else + owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) + RegisterSignal(GLOB.bridge_axe, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_axe_attack)) + return ..() + + +/datum/brain_trauma/special/axedoration/on_lose() + owner.clear_mood_event("fireaxe") + UnregisterSignal(owner, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EXAMINING)) + if(GLOB.bridge_axe) + UnregisterSignal(GLOB.bridge_axe, COMSIG_ITEM_AFTERATTACK) + return ..() + +/datum/brain_trauma/special/axedoration/proc/axe_gone(source) + SIGNAL_HANDLER + to_chat(owner, span_danger("You feel a great disturbance in the force.")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_gone) + owner.set_jitter_if_lower(15 SECONDS) + owner.set_stutter_if_lower(15 SECONDS) + +/datum/brain_trauma/special/axedoration/proc/on_equip(source, obj/item/picked_up, slot) + SIGNAL_HANDLER + if(!istype(picked_up, /obj/item/fireaxe)) + return + owner.set_jitter_if_lower(3 SECONDS) + if(picked_up == GLOB.bridge_axe) + to_chat(owner, span_hypnophrase("I have it. It's time to put it back.")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_held) + return + ADD_TRAIT(picked_up, TRAIT_NODROP, type) + to_chat(owner, span_warning("...This is not the one I'm looking after.")) + owner.Immobilize(2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(throw_faker), picked_up), 2 SECONDS) + +/datum/brain_trauma/special/axedoration/proc/throw_faker(obj/item/faker) + REMOVE_TRAIT(faker, TRAIT_NODROP, type) + var/held_index = owner.get_held_index_of_item(faker) + if(!held_index) + return + to_chat(owner, span_warning("Be gone with you.")) + owner.swap_hand(held_index, silent = TRUE) + var/turf/target_turf = get_ranged_target_turf(owner, owner.dir, faker.throw_range) + owner.throw_item(target_turf) + +/datum/brain_trauma/special/axedoration/proc/on_unequip(datum/source, obj/item/dropped_item, force, new_location) + SIGNAL_HANDLER + if(dropped_item != GLOB.bridge_axe) + return + if(get_axe_location() == owner) + return + if(istype(new_location, /obj/structure/fireaxecabinet)) + if(istype(get_area(new_location), /area/station/command)) + to_chat(owner, span_nicegreen("Ah! Back where it belongs!")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_cabinet) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "smile") + return + to_chat(owner, span_warning("Leaving it outside of command? Am I sure about that?")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) + return + to_chat(owner, span_warning("Should I really leave it here?")) + owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) + +/datum/brain_trauma/special/axedoration/proc/on_examine(mob/source, atom/target, list/examine_strings) + SIGNAL_HANDLER + if(!istype(target, /obj/item/fireaxe)) + return + if(target == GLOB.bridge_axe) + examine_strings += span_notice("It's the axe I've sworn to protect.") + else + examine_strings += span_warning("It's a simulacra, a fake axe made to fool the masses.") + +/datum/brain_trauma/special/axedoration/proc/on_axe_attack(obj/item/axe, atom/target, mob/user, click_parameters) + SIGNAL_HANDLER + if(user != owner) + return + talk_tuah(pick(hurt_lines)) + +/datum/brain_trauma/special/axedoration/proc/talk_tuah(sent_message = "Hello World.") + owner.Hear(null, GLOB.bridge_axe, owner.get_selected_language(), sent_message) + +/datum/brain_trauma/special/axedoration/proc/get_axe_location() + if(!GLOB.bridge_axe) + return + var/atom/axe_loc = GLOB.bridge_axe.loc + while(!ismob(axe_loc) && !isarea(axe_loc) && !isnull(axe_loc)) + axe_loc = axe_loc.loc + return axe_loc diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index dcb8d63a3c43e..e903d84fab0f5 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -195,10 +195,10 @@ var/atom/atom_parent = parent if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING)) if(require_twohands) - atom_parent.balloon_alert(user, "too weak to wield!") + atom_parent.balloon_alert(user, "can't wield!") user.dropItemToGround(parent, force = TRUE) else - atom_parent.balloon_alert(user, "too weak to wield with both hands!") + atom_parent.balloon_alert(user, "can't wield with both hands!") return COMPONENT_EQUIPPED_FAILED if(user.get_inactive_held_item()) if(require_twohands) diff --git a/code/datums/mood_events/axe_events.dm b/code/datums/mood_events/axe_events.dm new file mode 100644 index 0000000000000..1af7c116ceff1 --- /dev/null +++ b/code/datums/mood_events/axe_events.dm @@ -0,0 +1,20 @@ + +/datum/mood_event/axe_gone + description = "What happened to the axe... Where is it? It can't be..." + mood_change = -15 + +/datum/mood_event/axe_neutral + description = "I'm sure the axe is okay." + mood_change = 1 + +/datum/mood_event/axe_cabinet + description = "The axe is where it belongs." + mood_change = 5 + +/datum/mood_event/axe_missing + description = "The axe, there's something wrong..." + mood_change = -5 + +/datum/mood_event/axe_held + description = "I'm not worthy of you, axe. I need to put you back." + mood_change = -10 diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 265a05cfac74a..162af703ad2bd 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -1,3 +1,5 @@ +GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe) + /* * Fireaxe */ @@ -34,6 +36,9 @@ /obj/item/fireaxe/Initialize(mapload) . = ..() + if(!GLOB.bridge_axe && istype(get_area(src), /area/station/command)) + GLOB.bridge_axe = src + AddComponent(/datum/component/butchering, \ speed = 10 SECONDS, \ effectiveness = 80, \ @@ -43,6 +48,11 @@ //axes are not known for being precision butchering tools AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[base_icon_state]1") +/obj/item/fireaxe/Destroy() + if(GLOB.bridge_axe == src) + GLOB.bridge_axe = null + return ..() + /obj/item/fireaxe/update_icon_state() icon_state = "[base_icon_state]0" return ..() diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm index d776ae6251f7f..562ec695d8a10 100644 --- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm +++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm @@ -37,7 +37,9 @@ /datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client) . = ..() - ADD_TRAIT(spawned, TRAIT_NO_TWOHANDING, JOB_TRAIT) + var/mob/living/carbon/bridgie = spawned + if(istype(bridgie)) + bridgie.gain_trauma(/datum/brain_trauma/special/axedoration) /datum/job/bridge_assistant/get_roundstart_spawn_point() var/list/chair_turfs = list() diff --git a/tgstation.dme b/tgstation.dme index f11340f1e5e2d..3191d5980063b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1694,6 +1694,7 @@ #include "code\datums\mocking\client.dm" #include "code\datums\mood_events\_mood_event.dm" #include "code\datums\mood_events\area_events.dm" +#include "code\datums\mood_events\axe_events.dm" #include "code\datums\mood_events\beauty_events.dm" #include "code\datums\mood_events\dna_infuser_events.dm" #include "code\datums\mood_events\drink_events.dm" From 9fd401f416e4b10f94cfb041338c8470751831dc Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:58:52 +0000 Subject: [PATCH 32/64] Automatic changelog for PR #87513 [ci skip] --- html/changelogs/AutoChangeLog-pr-87513.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87513.yml diff --git a/html/changelogs/AutoChangeLog-pr-87513.yml b/html/changelogs/AutoChangeLog-pr-87513.yml new file mode 100644 index 0000000000000..c2801b7a95cbc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87513.yml @@ -0,0 +1,4 @@ +author: "Fikou" +delete-after: True +changes: + - rscadd: "The Bridge Assistant's no item wielding disability was replaced with a duty-sworn axe protection brain trauma." \ No newline at end of file From c63c34330bb354c1a6710543c3b5d6b6efba1425 Mon Sep 17 00:00:00 2001 From: r3dj4ck0424 <51569477+r3dj4ck0424@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:59:10 +1300 Subject: [PATCH 33/64] Makes office chairs named "office chair" (#87505) ## About The Pull Request Adds a name to the office chair obj and its light variants describing them as "office chair". Additionally removes the custom name "blue" from the blue variant of light office chair in birdshot. ## Why It's Good For The Game Chairs are not lights and therefore need names that include "chair" Fixes #87501 ## Changelog :cl: fix: certain office chairs are now properly labelled /:cl: --- _maps/map_files/Birdshot/birdshot.dmm | 2 -- code/game/objects/structures/beds_chairs/chair.dm | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 402b8f827c67c..a82b58f2e6ca3 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -30219,7 +30219,6 @@ /area/station/command/corporate_dock) "kmD" = ( /obj/structure/chair/office/light{ - name = "blue"; color = "#6495ED"; dir = 4 }, @@ -64493,7 +64492,6 @@ /area/station/security/checkpoint/customs/auxiliary) "vKn" = ( /obj/structure/chair/office/light{ - name = "blue"; color = "#6495ED"; dir = 8 }, diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 41291cbf146f0..50d06bafef0fd 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -227,6 +227,7 @@ fishing_modifier = -12 /obj/structure/chair/office + name = "office chair" anchored = FALSE buildstackamount = 5 item_chair = null @@ -247,6 +248,7 @@ fishing_modifier = -10 /obj/structure/chair/office/light + name = "office chair" icon_state = "officechair_white" //Stool From 939d98ba21f8fc51275a326f766e5adf3fda74fa Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 21:59:30 +0000 Subject: [PATCH 34/64] Automatic changelog for PR #87505 [ci skip] --- html/changelogs/AutoChangeLog-pr-87505.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87505.yml diff --git a/html/changelogs/AutoChangeLog-pr-87505.yml b/html/changelogs/AutoChangeLog-pr-87505.yml new file mode 100644 index 0000000000000..9344e7ed64a8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87505.yml @@ -0,0 +1,4 @@ +author: "r3dj4ck0424" +delete-after: True +changes: + - bugfix: "certain office chairs are now properly labelled" \ No newline at end of file From c9cb044b8997a8fe1a08ffac74826413445abef6 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:20:51 +0100 Subject: [PATCH 35/64] Fixing throw impact sounds playing if the item has been caught. (#87442) ## About The Pull Request This will fix #87404 ## Why It's Good For The Game This will fix #87404. ## Changelog :cl: fix: Throw impact sounds won't play if the item has been caught. --- code/game/objects/items.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index eb1f54feb25f5..2522b8b9af3ca 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -863,6 +863,8 @@ playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE, vary = sound_vary) return var/volume = get_volume_by_throwforce_and_or_w_class() + if(.) //it's been caught. + return if (throwforce > 0 || HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) if (mob_throw_hit_sound) playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1) From b0f8f943a5df90fd51068f6e931e1cde645deea0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:25:18 +0000 Subject: [PATCH 36/64] Automatic changelog for PR #87442 [ci skip] --- html/changelogs/AutoChangeLog-pr-87442.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87442.yml diff --git a/html/changelogs/AutoChangeLog-pr-87442.yml b/html/changelogs/AutoChangeLog-pr-87442.yml new file mode 100644 index 0000000000000..617b65f4515b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87442.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Throw impact sounds won't play if the item has been caught." \ No newline at end of file From 3511a73fe1c1008a7d5f9718c2433baf8ac028b2 Mon Sep 17 00:00:00 2001 From: RimStation 13 <160794176+Aliceee2ch@users.noreply.github.com> Date: Tue, 29 Oct 2024 01:25:29 +0300 Subject: [PATCH 37/64] Floorbot 3000 // New RTD item for engie cyborgs (#87465) ## About The Pull Request - Replaces "cyborg tile stacker" on brand-new "Cyborg Rapid Tiling Device" ![borg_rtd](https://github.com/user-attachments/assets/27d10d10-cbbe-44b7-b127-2a31983ca585) - Cyborg RTD works now like RCD due to budget-cuts. (Original RTD can place tiles up to 7 tiles range, cyborg one is only 1 tile and no funny beam) - RTD consumes power pretty much like RCD ![image](https://github.com/user-attachments/assets/49e66627-4f69-46c3-9b56-b1b4271d3507) ## Why It's Good For The Game The reason why im making RTD because tile placer is broken even code says so. You either need to make every tile with borg subtype to fix this or replace on borg rtd (what i did). Because it suck to place regular tiles when you repairing med white tiles or just want to make fancy room. ## Changelog :cl: qol: replaced old engineer borg "tile stacker" on crippled RTD /:cl: --------- Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/game/objects/items/rcd/RTD.dm | 55 ++++++++++++++++++- .../mob/living/silicon/robot/robot_model.dm | 6 +- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 1925b3e6ffc66..c217f93962ab2 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -38,7 +38,7 @@ var/datum/tile_info/tile_design /// overlays on a tile var/list/design_overlays = list() - + var/ranged = TRUE /// stores the name, type, icon & cost for each tile type /datum/tile_info /// name of this tile design for ui @@ -289,8 +289,12 @@ if(!checkResource(selected_design.cost, user)) qdel(rcd_effect) return ITEM_INTERACT_BLOCKING - var/beam = user.Beam(floor, icon_state = "light_beam", time = delay) - playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) + var/beam + if(!ranged) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + else + beam = user.Beam(floor, icon_state = "light_beam", time = delay) + playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE) if(!build_delay(user, delay, target = floor)) qdel(beam) qdel(rcd_effect) @@ -392,6 +396,51 @@ /obj/item/construction/rtd/loaded matter = 350 + +/obj/item/construction/rtd/borg + var/energyfactor = 0.03 * STANDARD_CELL_CHARGE + var/delay = 0 + ranged = FALSE + +/obj/item/construction/rtd/borg/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!(interacting_with in view(1, get_turf(user)))) + return NONE + return try_tiling(interacting_with, user) + +/obj/item/construction/rtd/borg/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return NONE + +/obj/item/construction/rtd/borg/get_matter(mob/user) + if(!iscyborg(user)) + return 0 + var/mob/living/silicon/robot/borgy = user + if(!borgy.cell) + return 0 + max_matter = borgy.cell.maxcharge + return borgy.cell.charge + +/obj/item/construction/rtd/borg/useResource(amount, mob/user) + if(!iscyborg(user)) + return 0 + var/mob/living/silicon/robot/borgy = user + if(!borgy.cell) + balloon_alert(user, "no cell found!") + return 0 + . = borgy.cell.use(amount * energyfactor) + if(!.) + balloon_alert(user, "insufficient charge!") + +/obj/item/construction/rtd/borg/checkResource(amount, mob/user) + if(!iscyborg(user)) + return 0 + var/mob/living/silicon/robot/borgy = user + if(!borgy.cell) + balloon_alert(user, "no cell found!") + return 0 + . = borgy.cell.charge >= (amount * energyfactor) + if(!.) + balloon_alert(user, "insufficient charge!") + /obj/item/construction/rtd/admin name = "admin RTD" max_matter = INFINITY diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 77764f5ea44d0..9acdd0ae5f2dc 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -397,7 +397,7 @@ /obj/item/stack/sheet/glass, /obj/item/borg/apparatus/sheet_manipulator, /obj/item/stack/rods/cyborg, - /obj/item/stack/tile/iron/base/cyborg, + /obj/item/construction/rtd/borg, /obj/item/stack/cable_coil, ) radio_channels = list(RADIO_CHANNEL_ENGINEERING) @@ -415,7 +415,7 @@ /obj/item/assembly/flash/cyborg, /obj/item/screwdriver/cyborg, /obj/item/crowbar/cyborg, - /obj/item/stack/tile/iron/base/cyborg, + /obj/item/stack/tile/iron/base/cyborg, // haha jani will have old tiles >:D /obj/item/soap/nanotrasen/cyborg, /obj/item/storage/bag/trash/cyborg, /obj/item/melee/flyswatter, @@ -919,7 +919,7 @@ /obj/item/stack/sheet/glass, /obj/item/borg/apparatus/sheet_manipulator, /obj/item/stack/rods/cyborg, - /obj/item/stack/tile/iron/base/cyborg, + /obj/item/construction/rtd/borg, /obj/item/dest_tagger/borg, /obj/item/stack/cable_coil, /obj/item/pinpointer/syndicate_cyborg, From d7c7445634520e51843a941ce5d451efe30b72d8 Mon Sep 17 00:00:00 2001 From: Jackal-boop <61211748+Jackal-boop@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:25:40 -0500 Subject: [PATCH 38/64] toy huggers can no longer become shredded (#87504) ## About The Pull Request this PR stops the xeno larva toy from going into a damaged icon state ## Why It's Good For The Game the toy hugger is a clothing item so it inherrited becoming shredded at low integrity. this gives it a integrity_failure value of 0 so that it no longer becomes shredded fixes #87386 ## Changelog :cl: fix: fixes the toy larva hugger getting shredded /:cl: --- code/modules/mob/living/carbon/alien/special/facehugger.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 597769f11f271..3fcfc8977231d 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -316,6 +316,7 @@ sterile = TRUE tint = 3 //Makes it feel more authentic when it latches on slowdown = 0 + integrity_failure = 0 /obj/item/clothing/mask/facehugger/toy/Die() return From 423edef5ff24b724665d1194ccf863fe39f448ef Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:26:05 +0000 Subject: [PATCH 39/64] Automatic changelog for PR #87465 [ci skip] --- html/changelogs/AutoChangeLog-pr-87465.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87465.yml diff --git a/html/changelogs/AutoChangeLog-pr-87465.yml b/html/changelogs/AutoChangeLog-pr-87465.yml new file mode 100644 index 0000000000000..f32e9cbb45766 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87465.yml @@ -0,0 +1,4 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - qol: "replaced old engineer borg \"tile stacker\" on crippled RTD" \ No newline at end of file From dbd1919c99f5f828417a47bbf1d5fae3970ecea8 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:30:25 +0000 Subject: [PATCH 40/64] Automatic changelog for PR #87504 [ci skip] --- html/changelogs/AutoChangeLog-pr-87504.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87504.yml diff --git a/html/changelogs/AutoChangeLog-pr-87504.yml b/html/changelogs/AutoChangeLog-pr-87504.yml new file mode 100644 index 0000000000000..dd7c99d7cbc2e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87504.yml @@ -0,0 +1,4 @@ +author: "Jackal-boop" +delete-after: True +changes: + - bugfix: "fixes the toy larva hugger getting shredded" \ No newline at end of file From a6456f42a171359eb15d04b51e9f27f69dc7936c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:27:09 +0000 Subject: [PATCH 41/64] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-87442.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87465.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87504.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87505.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87507.yml | 5 ----- html/changelogs/AutoChangeLog-pr-87513.yml | 4 ---- html/changelogs/archive/2024-10.yml | 15 +++++++++++++++ 7 files changed, 15 insertions(+), 25 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-87442.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87465.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87504.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87505.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87507.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87513.yml diff --git a/html/changelogs/AutoChangeLog-pr-87442.yml b/html/changelogs/AutoChangeLog-pr-87442.yml deleted file mode 100644 index 617b65f4515b5..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87442.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Throw impact sounds won't play if the item has been caught." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87465.yml b/html/changelogs/AutoChangeLog-pr-87465.yml deleted file mode 100644 index f32e9cbb45766..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - qol: "replaced old engineer borg \"tile stacker\" on crippled RTD" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87504.yml b/html/changelogs/AutoChangeLog-pr-87504.yml deleted file mode 100644 index dd7c99d7cbc2e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87504.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jackal-boop" -delete-after: True -changes: - - bugfix: "fixes the toy larva hugger getting shredded" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87505.yml b/html/changelogs/AutoChangeLog-pr-87505.yml deleted file mode 100644 index 9344e7ed64a8d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87505.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "r3dj4ck0424" -delete-after: True -changes: - - bugfix: "certain office chairs are now properly labelled" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87507.yml b/html/changelogs/AutoChangeLog-pr-87507.yml deleted file mode 100644 index a4d7aab8ecf19..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87507.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - balance: "you need something spaceproof to cover your legs (or feet) and arms (or hands) to be spaceproof, not only head and chest" - - balance: "magboots and atmos gloves now have pressure protection" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87513.yml b/html/changelogs/AutoChangeLog-pr-87513.yml deleted file mode 100644 index c2801b7a95cbc..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87513.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - rscadd: "The Bridge Assistant's no item wielding disability was replaced with a duty-sworn axe protection brain trauma." \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 163b1eb715468..8223afd7b5985 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -865,3 +865,18 @@ necromanceranne: - bugfix: Fixes a runtime when trying to remove someones scarred eyes. Now you can remove them! +2024-10-29: + Aliceee2ch: + - qol: replaced old engineer borg "tile stacker" on crippled RTD + Fikou: + - rscadd: The Bridge Assistant's no item wielding disability was replaced with a + duty-sworn axe protection brain trauma. + - balance: you need something spaceproof to cover your legs (or feet) and arms (or + hands) to be spaceproof, not only head and chest + - balance: magboots and atmos gloves now have pressure protection + Ghommie: + - bugfix: Throw impact sounds won't play if the item has been caught. + Jackal-boop: + - bugfix: fixes the toy larva hugger getting shredded + r3dj4ck0424: + - bugfix: certain office chairs are now properly labelled From 1cd662cc8ca3e74efeae86c531b07c73f14b2cc1 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:57:09 +0100 Subject: [PATCH 42/64] Magazines now lazyload their contents in order to save on gun init times (#87224) ## About The Pull Request Ammo boxes, this includes magazines and magazines inside of guns, now lazyload their ammo in order to save on init times by keeping it as types in their ammo list and initializing them as needed. As a side effect, you can only use get_round to access rounds now, direct array access will probably not work. ## Why It's Good For The Game trying to save on init times and delay death of guncode by a tiny bit ## Changelog :cl: code: Magazines now lazyload their contents in order to save on gun init times. Please report any broken/non-functional guns! /:cl: --- .../mob/living/simple_animal/hostile/mimic.dm | 4 +- .../boxes_magazines/_box_magazine.dm | 103 +++++++++++------- .../boxes_magazines/external/toy.dm | 2 +- .../boxes_magazines/internal/_cylinder.dm | 24 ++-- code/modules/projectiles/guns/ballistic.dm | 2 +- .../projectiles/guns/ballistic/launchers.dm | 2 +- .../projectiles/guns/ballistic/revolver.dm | 7 +- 7 files changed, 90 insertions(+), 54 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 253fe799bfd2c..0d8c1d86bdd40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -275,11 +275,11 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( Pewgun.chambered.forceMove(loc) //rip revolver immersions, blame shotgun snowflake procs Pewgun.chambered = null if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len) - Pewgun.chambered = Pewgun.magazine.get_round(0) + Pewgun.chambered = Pewgun.magazine.get_round() Pewgun.chambered.forceMove(Pewgun) Pewgun.update_appearance() else if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len) //only true for pumpguns i think - Pewgun.chambered = Pewgun.magazine.get_round(0) + Pewgun.chambered = Pewgun.magazine.get_round() Pewgun.chambered.forceMove(Pewgun) visible_message(span_danger("The [src] cocks itself!")) else diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index d6fa14771dc7d..0404d52597dc5 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -49,7 +49,10 @@ update_icon_state() /obj/item/ammo_box/Destroy(force) - QDEL_LIST(stored_ammo) + for (var/obj/item/ammo_casing/casing as anything in stored_ammo) + if (!ispath(casing)) + qdel(casing) + stored_ammo = null return ..() /obj/item/ammo_box/Exited(atom/movable/gone, direction) @@ -71,7 +74,7 @@ readout += "Up to [span_warning("[max_ammo] [caliber] [casing_phrasing]s")] can be found within this magazine. \ \nAccidentally discharging any of these projectiles may void your insurance contract." - var/obj/item/ammo_casing/mag_ammo = get_round(TRUE) + var/obj/item/ammo_casing/mag_ammo = get_and_shuffle_round() if(istype(mag_ammo)) readout += "\n[mag_ammo.add_notes_ammo()]" @@ -95,68 +98,84 @@ return for(var/i in max(1, stored_ammo.len + 1) to max_ammo) - stored_ammo += new round_check(src) + stored_ammo += starting ? round_check : new round_check(src) update_appearance() -///gets a round from the magazine, if keep is TRUE the round will be moved to the bottom of the list. -/obj/item/ammo_box/proc/get_round(keep = FALSE) +///gets a round from the magazine +/obj/item/ammo_box/proc/get_round() var/ammo_len = length(stored_ammo) if (!ammo_len) return null var/casing = stored_ammo[ammo_len] - if (keep) - stored_ammo -= casing - stored_ammo.Insert(1,casing) + if (ispath(casing)) + casing = new casing(src) + stored_ammo[ammo_len] = casing + return casing + +/// Gets a round from the magazine and puts it back at the bottom of the ammo list +/obj/item/ammo_box/proc/get_and_shuffle_round() + var/casing = get_round() + if (!casing) + return null + stored_ammo -= casing + stored_ammo.Insert(1, casing) return casing ///puts a round into the magazine -/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) +/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/new_round, replace_spent = 0) // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type. - if(!R || !(caliber ? (caliber == R.caliber) : (ammo_type == R.type))) + if(!new_round || !(caliber ? (caliber == new_round.caliber) : (ammo_type == new_round.type))) return FALSE if (stored_ammo.len < max_ammo) - stored_ammo += R - R.forceMove(src) + stored_ammo += new_round + new_round.forceMove(src) return TRUE + if(!replace_spent) + return FALSE + //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo - else if(replace_spent) - for(var/obj/item/ammo_casing/AC in stored_ammo) - if(!AC.loaded_projectile)//found a spent ammo - stored_ammo -= AC - AC.forceMove(get_turf(src.loc)) - - stored_ammo += R - R.forceMove(src) - return TRUE + for(var/obj/item/ammo_casing/casing as anything in stored_ammo) + if(ispath(casing) || casing.loaded_projectile) + continue + //found a spent ammo + stored_ammo -= casing + casing.forceMove(get_turf(src)) + + stored_ammo += new_round + new_round.forceMove(src) + return TRUE return FALSE ///Whether or not the box can be loaded, used in overrides /obj/item/ammo_box/proc/can_load(mob/user) return TRUE -/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) +/obj/item/ammo_box/attackby(obj/item/tool, mob/user, params, silent = FALSE, replace_spent = 0) var/num_loaded = 0 if(!can_load(user)) return - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - var/did_load = give_round(AC, replace_spent) + + if(istype(tool, /obj/item/ammo_box)) + var/obj/item/ammo_box/other_box = tool + for(var/obj/item/ammo_casing/casing in other_box.stored_ammo) + var/did_load = give_round(casing, replace_spent) if(did_load) - AM.stored_ammo -= AC + other_box.stored_ammo -= casing num_loaded++ if(!did_load || !multiload) break + if(num_loaded) - AM.update_appearance() - if(isammocasing(A)) - var/obj/item/ammo_casing/AC = A - if(give_round(AC, replace_spent)) - user.transferItemToLoc(AC, src, TRUE) + other_box.update_appearance() + + if(isammocasing(tool)) + var/obj/item/ammo_casing/casing = tool + if(give_round(casing, replace_spent)) + user.transferItemToLoc(casing, src, TRUE) num_loaded++ - AC.update_appearance() + casing.update_appearance() if(num_loaded) if(!silent) @@ -225,18 +244,24 @@ ///Count of number of bullets in the magazine /obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE) var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in stored_ammo) - if(bullet && (bullet.loaded_projectile || countempties)) + for(var/obj/item/ammo_casing/bullet as anything in stored_ammo) + if(ispath(bullet) || bullet && (bullet.loaded_projectile || countempties)) boolets++ return boolets ///list of every bullet in the magazine +///forces all bullets to lazyload /obj/item/ammo_box/magazine/proc/ammo_list() + for (var/i in 1 to length(stored_ammo)) + if (ispath(stored_ammo[i])) + var/casing_type = stored_ammo[i] + stored_ammo[i] = new casing_type(src) return stored_ammo.Copy() ///drops the entire contents of the magazine on the floor /obj/item/ammo_box/magazine/proc/empty_magazine() - var/turf_mag = get_turf(src) - for(var/obj/item/ammo in stored_ammo) - ammo.forceMove(turf_mag) - stored_ammo -= ammo + var/turf/turf_mag = get_turf(src) + var/obj/item/ammo_casing/casing = get_round() + while (casing) + casing.forceMove(turf_mag) + casing = get_round() diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm index a153c25107aa8..4f666e119b84d 100644 --- a/code/modules/projectiles/boxes_magazines/external/toy.dm +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -47,7 +47,7 @@ if(round_number == i) //only count odd numbers. continue var/obj/item/ammo_casing/foam_dart/boolet = stored_ammo[i] - . += "c20r45-foam-[boolet.tip_color]-[round_number]" + . += "c20r45-foam-[boolet::tip_color]-[round_number]" /obj/item/ammo_box/magazine/toy/smgm45/riot diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index c60ec087c5108..1b3a5dfde4587 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -15,7 +15,14 @@ /obj/item/ammo_box/magazine/internal/cylinder/get_round() rotate() - return stored_ammo[1] + var/casing = stored_ammo[1] + if (ispath(casing)) + casing = new casing(src) + stored_ammo[1] = casing + return casing + +/obj/item/ammo_box/magazine/internal/cylinder/get_and_shuffle_round() + return get_round() /obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() var/b = stored_ammo[1] @@ -37,14 +44,15 @@ for(var/i in 1 to stored_ammo.len) var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(!bullet || !bullet.loaded_projectile) // found a spent ammo - stored_ammo[i] = R - R.forceMove(src) - - if(bullet) - bullet.forceMove(drop_location()) - return TRUE + if (!istype(bullet) || bullet.loaded_projectile) + continue + // found a spent ammo + stored_ammo[i] = R + R.forceMove(src) + if(bullet) + bullet.forceMove(drop_location()) + return TRUE return FALSE /obj/item/ammo_box/magazine/internal/cylinder/top_off(load_type, starting=FALSE) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 2222140c805a2..45bcd9d870ae5 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -311,7 +311,7 @@ if (chambered || !magazine) return if (magazine.ammo_count()) - chambered = magazine.get_round((bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT) + chambered = (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT ? magazine.get_and_shuffle_round() : magazine.get_round() if (bolt_type != BOLT_TYPE_OPEN && !(internal_magazine && bolt_type == BOLT_TYPE_NO_BOLT)) chambered.forceMove(src) else diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 03c7f51b936be..6f31a2fa6ca44 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -93,7 +93,7 @@ . = ..() if(!.) return - magazine.get_round(FALSE) //Hack to clear the mag after it's fired + magazine.get_round() //Hack to clear the mag after it's fired /obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user) return //too difficult to remove the rocket with TK diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 1817e7374832d..bb589bc011a14 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -26,10 +26,13 @@ CRASH("revolver tried to chamber a round without a magazine!") if(chambered) UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) - if(spin_cylinder) - chambered = magazine.get_round(TRUE) + if (spin_cylinder) + chambered = magazine.get_round() else chambered = magazine.stored_ammo[1] + if (ispath(chambered)) + chambered = new chambered(src) + magazine.stored_ammo[1] = chambered if(chambered) RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) From 2c9fb2bdbb05af19e7af42e36b6399a0c4b38a10 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 05:57:32 +0000 Subject: [PATCH 43/64] Automatic changelog for PR #87224 [ci skip] --- html/changelogs/AutoChangeLog-pr-87224.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87224.yml diff --git a/html/changelogs/AutoChangeLog-pr-87224.yml b/html/changelogs/AutoChangeLog-pr-87224.yml new file mode 100644 index 0000000000000..defd625b21388 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87224.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - code_imp: "Magazines now lazyload their contents in order to save on gun init times. Please report any broken/non-functional guns!" \ No newline at end of file From e52c31bf59d56084824d5350f3966c8ca818a9af Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:20:32 +0100 Subject: [PATCH 44/64] Wraps detailed examine descriptions in an examine block (#87510) ## About The Pull Request Now extended descriptions look like this ![image](https://github.com/user-attachments/assets/edec4c49-0772-4787-b044-7c429146347d) ## Why It's Good For The Game This does not look good ![image](https://github.com/user-attachments/assets/d8db7c34-487b-42cb-ab84-597585d5aaa8) ## Changelog :cl: qol: Detailed examine descriptions are prettier now. /:cl: --- code/modules/fishing/sources/_fish_source.dm | 2 +- code/modules/mob/mob.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 9a02e0b270b42..0e80ee423cafd 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -458,7 +458,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(rod) info = span_tooltip("boldened are the fish you're more likely to catch with your current setup. The opposite is true for smaller names", info) - examine_text += examine_block(span_info("[info]: [english_list(known_fishes)].")) + examine_text += span_info("[info]: [english_list(known_fishes)].") /datum/fish_source/proc/spawn_reward_from_explosion(atom/location, severity) if(!explosive_malus) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 23e405c873729..d3e0df9440b69 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -532,7 +532,7 @@ var/list/result = examinify.examine_more(src) if(!length(result)) result += span_notice("You examine [examinify] closer, but find nothing of interest...") - result_combined = jointext(result, "
") + result_combined = examine_block(jointext(result, "
")) else client.recent_examines[ref_to_atom] = world.time // set to when we last normal examine'd them From d9c3997e87a79b1ceae83d0f211e5c0b62ac4d0b Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:20:51 +0000 Subject: [PATCH 45/64] Automatic changelog for PR #87510 [ci skip] --- html/changelogs/AutoChangeLog-pr-87510.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87510.yml diff --git a/html/changelogs/AutoChangeLog-pr-87510.yml b/html/changelogs/AutoChangeLog-pr-87510.yml new file mode 100644 index 0000000000000..9c100eb49358f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87510.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "Detailed examine descriptions are prettier now." \ No newline at end of file From 7f5d9d7e09d553af09bf7f3781b0d09084273d46 Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Tue, 29 Oct 2024 13:48:27 -0700 Subject: [PATCH 46/64] Tick checks unplanned controllers (#87506) Shakes fist at random overtime --- code/_globalvars/lists/basic_ai.dm | 2 +- .../subsystem/unplanned_controllers.dm | 25 ++++++++++++++++--- code/datums/ai/_ai_controller.dm | 3 +++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/_globalvars/lists/basic_ai.dm b/code/_globalvars/lists/basic_ai.dm index a8646bb8d7f92..561d874c4e915 100644 --- a/code/_globalvars/lists/basic_ai.dm +++ b/code/_globalvars/lists/basic_ai.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(ai_controllers_by_status, list( GLOBAL_LIST_EMPTY(ai_controllers_by_zlevel) ///basic ai controllers that are currently performing idled behaviors -GLOBAL_LIST_INIT(unplanned_controllers, list( +GLOBAL_LIST_INIT_TYPED(unplanned_controllers, /list/datum/ai_controller, list( AI_STATUS_ON = list(), AI_STATUS_IDLE = list(), )) diff --git a/code/controllers/subsystem/unplanned_controllers.dm b/code/controllers/subsystem/unplanned_controllers.dm index 3fb5f46dd069d..57b4ed68f169b 100644 --- a/code/controllers/subsystem/unplanned_controllers.dm +++ b/code/controllers/subsystem/unplanned_controllers.dm @@ -1,18 +1,37 @@ +GLOBAL_LIST_EMPTY(unplanned_controller_subsystems) /// Handles making mobs perform lightweight "idle" behaviors such as wandering around when they have nothing planned SUBSYSTEM_DEF(unplanned_controllers) name = "Unplanned AI Controllers" - flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND priority = FIRE_PRIORITY_UNPLANNED_NPC init_order = INIT_ORDER_AI_CONTROLLERS wait = 0.25 SECONDS runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME ///what ai status are we interested in var/target_status = AI_STATUS_ON + var/list/current_run = list() + +/datum/controller/subsystem/unplanned_controllers/Initialize() + ..() + GLOB.unplanned_controller_subsystems += src + return SS_INIT_SUCCESS + +/datum/controller/subsystem/unplanned_controllers/Destroy() + GLOB.unplanned_controller_subsystems -= src + return ..() /datum/controller/subsystem/unplanned_controllers/stat_entry(msg) msg = "Planning AIs:[length(GLOB.unplanned_controllers[target_status])]" return ..() /datum/controller/subsystem/unplanned_controllers/fire(resumed) - for(var/datum/ai_controller/ai_controller as anything in GLOB.unplanned_controllers[target_status]) - ai_controller.idle_behavior.perform_idle_behavior(wait * 0.1, ai_controller) + if(!resumed) + src.current_run = GLOB.unplanned_controllers[target_status].Copy() + var/list/current_run = src.current_run // cache for sonic speed + while(length(current_run)) + var/datum/ai_controller/unplanned = current_run[current_run.len] + current_run.len-- + if(!QDELETED(unplanned)) + unplanned.idle_behavior.perform_idle_behavior(wait * 0.1, unplanned) + if (MC_TICK_CHECK) + return diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 07e3851a1aeab..b8bd03d7cc501 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -466,6 +466,9 @@ multiple modular subtrees with behaviors if(isnull(ai_status) || ai_status == AI_STATUS_OFF) return GLOB.unplanned_controllers[ai_status] -= src + for(var/datum/controller/subsystem/unplanned_controllers/potential_holder as anything in GLOB.unplanned_controller_subsystems) + if(potential_holder.target_status == ai_status) + potential_holder.current_run -= src /datum/ai_controller/proc/modify_cooldown(datum/ai_behavior/behavior, new_cooldown) behavior_cooldowns[behavior] = new_cooldown From 7a951a393d283fded4850ab40d1f01e007e27d52 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 29 Oct 2024 22:11:09 +0100 Subject: [PATCH 47/64] Guncode Agony #2: Fixes harddels caused by certain projectiles (collosus bolts in CI) (#87534) ## About The Pull Request Closes #87349 This may seem concerning but projectiles always assume that their firer and original can be null at any step, so this is completely safe. ## Changelog :cl: fix: Fixed harddels caused by certain projectiles /:cl: --- code/modules/projectiles/projectile.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 07f2f47ef2727..a94d7adabe104 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -764,7 +764,10 @@ if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) if(firer) + RegisterSignal(firer, COMSIG_QDELETING, PROC_REF(firer_deleted)) SEND_SIGNAL(firer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, src, fired_from, original) + if (original) + RegisterSignal(original, COMSIG_QDELETING, PROC_REF(original_deleted)) if(!log_override && firer && original && !do_not_log) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") //note: mecha projectile logging is handled in /obj/item/mecha_parts/mecha_equipment/weapon/action(). try to keep these messages roughly the sameish just for consistency's sake. @@ -814,6 +817,14 @@ store_hitscan_collision(point_cache) return TRUE +/obj/projectile/proc/firer_deleted(datum/source) + SIGNAL_HANDLER + firer = null + +/obj/projectile/proc/original_deleted(datum/source) + SIGNAL_HANDLER + original = null + /// Same as set_angle, but the reflection continues from the center of the object that reflects it instead of the side /obj/projectile/proc/set_angle_centered(new_angle) if(!nondirectional_sprite) @@ -1064,6 +1075,8 @@ finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) cleanup_beam_segments() + firer = null + original = null if(trajectory) QDEL_NULL(trajectory) return ..() From 857bf3cbcd4dcd815146c008ef5fab2dd9c57687 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:11:30 +0000 Subject: [PATCH 48/64] Automatic changelog for PR #87534 [ci skip] --- html/changelogs/AutoChangeLog-pr-87534.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87534.yml diff --git a/html/changelogs/AutoChangeLog-pr-87534.yml b/html/changelogs/AutoChangeLog-pr-87534.yml new file mode 100644 index 0000000000000..f2d69c7fc997e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87534.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed harddels caused by certain projectiles" \ No newline at end of file From c77426ba278136aa29443727dd2c9974fd0f8955 Mon Sep 17 00:00:00 2001 From: JackEnoff <166665535+JackEnoff@users.noreply.github.com> Date: Tue, 29 Oct 2024 18:16:17 -0500 Subject: [PATCH 49/64] Spellchecks maintenance airlock (#87547) ## About The Pull Request closes #87544 someone misspelled the name of this airlock in the code :P ## Why It's Good For The Game spell fix good. ## Changelog :cl: spellcheck: spellchecks "maintainance glass airlock" /:cl: --- code/game/machinery/doors/airlock.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2b473c3dbe6c1..7d9286384e45d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -2001,12 +2001,12 @@ glass = TRUE /obj/machinery/door/airlock/maintenance/glass - name = "maintainence glass airlock" + name = "maintenance glass airlock" opacity = FALSE glass = TRUE /obj/machinery/door/airlock/maintenance/external/glass - name = "maintainence external glass airlock" + name = "maintenance external glass airlock" opacity = FALSE glass = TRUE normal_integrity = 200 From ee498f855e8a5c4365fca628ddd4f06db88ed003 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 23:16:37 +0000 Subject: [PATCH 50/64] Automatic changelog for PR #87547 [ci skip] --- html/changelogs/AutoChangeLog-pr-87547.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87547.yml diff --git a/html/changelogs/AutoChangeLog-pr-87547.yml b/html/changelogs/AutoChangeLog-pr-87547.yml new file mode 100644 index 0000000000000..e3747b1ab1a1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87547.yml @@ -0,0 +1,4 @@ +author: "JackEnoff" +delete-after: True +changes: + - spellcheck: "spellchecks \"maintainance glass airlock\"" \ No newline at end of file From 77220bbada8b9757e711a4899625d88f2e5c9f96 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:16:57 -0300 Subject: [PATCH 51/64] The Traps won't spawn traps on walls anymore (#87548) ## About The Pull Request The Traps won't spawn traps on walls anymore ## Why It's Good For The Game Yesterday I saw a wizard cast the traps twice and both times it only spawned them inside walls. This variable was probably overlooked on this trap, ain't much reason for walltraps. ## Changelog :cl: fix: The Traps won't spawn traps on walls anymore /:cl: --- code/modules/spells/spell_types/conjure/the_traps.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/spells/spell_types/conjure/the_traps.dm b/code/modules/spells/spell_types/conjure/the_traps.dm index e9717a1325329..bd25d163a56e1 100644 --- a/code/modules/spells/spell_types/conjure/the_traps.dm +++ b/code/modules/spells/spell_types/conjure/the_traps.dm @@ -18,6 +18,7 @@ ) summon_lifespan = 5 MINUTES summon_amount = 5 + summon_respects_density = TRUE /// The amount of charges the traps spawn with. var/trap_charges = 1 From 38c74ecbddc32c26f8c1b16187540b8a94918174 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 23:17:20 +0000 Subject: [PATCH 52/64] Automatic changelog for PR #87548 [ci skip] --- html/changelogs/AutoChangeLog-pr-87548.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87548.yml diff --git a/html/changelogs/AutoChangeLog-pr-87548.yml b/html/changelogs/AutoChangeLog-pr-87548.yml new file mode 100644 index 0000000000000..a530411c13750 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87548.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "The Traps won't spawn traps on walls anymore" \ No newline at end of file From 0ec91798a7ef8d98d6199d7c41ca5afcdc82beae Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 00:29:04 +0000 Subject: [PATCH 53/64] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-87224.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87510.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87534.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87547.yml | 4 ---- html/changelogs/AutoChangeLog-pr-87548.yml | 4 ---- html/changelogs/archive/2024-10.yml | 10 ++++++++++ 6 files changed, 10 insertions(+), 20 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-87224.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87510.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87534.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87547.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-87548.yml diff --git a/html/changelogs/AutoChangeLog-pr-87224.yml b/html/changelogs/AutoChangeLog-pr-87224.yml deleted file mode 100644 index defd625b21388..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - code_imp: "Magazines now lazyload their contents in order to save on gun init times. Please report any broken/non-functional guns!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87510.yml b/html/changelogs/AutoChangeLog-pr-87510.yml deleted file mode 100644 index 9c100eb49358f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87510.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "Detailed examine descriptions are prettier now." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87534.yml b/html/changelogs/AutoChangeLog-pr-87534.yml deleted file mode 100644 index f2d69c7fc997e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87534.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed harddels caused by certain projectiles" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87547.yml b/html/changelogs/AutoChangeLog-pr-87547.yml deleted file mode 100644 index e3747b1ab1a1e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87547.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JackEnoff" -delete-after: True -changes: - - spellcheck: "spellchecks \"maintainance glass airlock\"" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-87548.yml b/html/changelogs/AutoChangeLog-pr-87548.yml deleted file mode 100644 index a530411c13750..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-87548.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - bugfix: "The Traps won't spawn traps on walls anymore" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 8223afd7b5985..88818203ba465 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -880,3 +880,13 @@ - bugfix: fixes the toy larva hugger getting shredded r3dj4ck0424: - bugfix: certain office chairs are now properly labelled +2024-10-30: + JackEnoff: + - spellcheck: spellchecks "maintainance glass airlock" + SmArtKar: + - bugfix: Fixed harddels caused by certain projectiles + - code_imp: Magazines now lazyload their contents in order to save on gun init times. + Please report any broken/non-functional guns! + - qol: Detailed examine descriptions are prettier now. + carlarctg: + - bugfix: The Traps won't spawn traps on walls anymore From 778ed9f1ab4c91ad006bcda7fb6456bc96819ff6 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 30 Oct 2024 08:03:02 +0100 Subject: [PATCH 54/64] The death or internal/external organ pathing (ft. fixed fox ears and recoloring bodypart overlays with dye sprays) (#87434) ## About The Pull Request This PR kills the abstract internal and external typepaths for organs, now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds. This PR also fixes fox ears (from #87162, no tail is added) and mushpeople's caps (they should be red, the screenshot is a tad outdated). And yes, you can now use a hair dye spray to recolor body parts like most tails, podpeople hair, mushpeople caps and cat ears. The process can be reversed by using the spray again. ## Why It's Good For The Game Time-Green put some effort during the last few months to untie functions and mechanics from external/internal organ pathing. Now, all that this pathing is good for are a few typechecks, easily replaceable with bitflags. Also podpeople and mushpeople need a way to recolor their "hair". This kind of applies to fish tails from the fish infusion, which colors can't be selected right now. The rest is just there if you ever want to recolor your lizard tail for some reason. Proof of testing btw (screenshot taken before mushpeople cap fix, right side has dyed body parts, moth can't be dyed, they're already fabolous): ![immagine](https://github.com/user-attachments/assets/2bb625c9-9233-42eb-b9b8-e0bd6909ce89) ## Changelog :cl: code: Removed internal/external pathing from organs in favor of a bit flag. Hopefully this shouldn't break anything about organs. fix: Fixed invisible fox ears. fix: Fixed mushpeople caps not being colored red by default. add: You can now dye most tails, podpeople hair, mushpeople caps etc. with a hair dye spray. /:cl: --- .../icemoon_underground_abandoned_village.dmm | 2 +- .../icemoon_underground_mining_site.dmm | 6 +- .../icemoon_underground_syndidome.dmm | 4 +- .../lavaland_surface_elephant_graveyard.dmm | 16 +- .../RandomRuins/SpaceRuins/caravanambush.dmm | 6 +- .../SpaceRuins/dangerous_research.dmm | 16 +- .../RandomRuins/SpaceRuins/garbagetruck1.dmm | 6 +- .../RandomRuins/SpaceRuins/garbagetruck2.dmm | 18 +-- .../RandomRuins/SpaceRuins/garbagetruck3.dmm | 2 +- .../SpaceRuins/hauntedtradingpost.dmm | 2 +- .../SpaceRuins/mrow_thats_right.dmm | 28 ++-- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- _maps/RandomRuins/SpaceRuins/the_outlet.dmm | 14 +- _maps/RandomZLevels/caves.dmm | 6 +- _maps/deathmatch/sunrise.dmm | 2 +- .../map_files/Basketball/lusty_xenomorphs.dmm | 4 +- _maps/map_files/Birdshot/birdshot.dmm | 62 ++++---- .../map_files/IceBoxStation/IceBoxStation.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 76 ++++----- _maps/map_files/debug/runtimestation.dmm | 6 +- .../barcargoupper_cave_2.dmm | 2 +- _maps/map_files/wawastation/wawastation.dmm | 12 +- _maps/shuttles/emergency_birdshot.dmm | 4 +- _maps/shuttles/emergency_zeta.dmm | 4 +- _maps/shuttles/ruin_cyborg_mothership.dmm | 2 +- _maps/shuttles/whiteship_kilo.dmm | 2 +- _maps/templates/lazy_templates/ninja_den.dmm | 4 +- _maps/virtual_domains/abductor_ship.dmm | 6 +- code/__DEFINES/dcs/signals/signals_object.dm | 4 +- code/__DEFINES/inventory.dm | 2 +- code/__DEFINES/is_helpers.dm | 4 - code/__DEFINES/research/anomalies.dm | 34 ++-- code/__DEFINES/surgery.dm | 2 + code/__DEFINES/traits/declarations.dm | 2 +- code/__DEFINES/traits/sources.dm | 2 +- code/__HELPERS/honkerblast.dm | 6 +- code/__HELPERS/mobs.dm | 2 +- code/_globalvars/lists/quirks.dm | 4 +- code/_globalvars/phobias.dm | 16 +- code/_globalvars/traits/_traits.dm | 4 +- code/_globalvars/traits/admin_tooling.dm | 4 +- code/_onclick/hud/alert.dm | 2 +- code/_onclick/hud/human.dm | 2 +- .../dynamic/dynamic_rulesets_midround.dm | 2 +- code/datums/actions/items/toggles.dm | 2 +- code/datums/ai/monkey/monkey_controller.dm | 4 +- .../mutant_bodypart_overlay.dm | 16 +- code/datums/brain_damage/brain_trauma.dm | 2 +- code/datums/brain_damage/split_personality.dm | 2 +- .../components/crafting/entertainment.dm | 2 +- code/datums/components/crafting/equipment.dm | 2 +- .../components/crafting/melee_weapon.dm | 10 +- code/datums/components/crafting/robot.dm | 2 +- code/datums/components/crafting/tailoring.dm | 6 +- code/datums/components/cult_ritual_item.dm | 2 +- code/datums/components/food/edible.dm | 2 +- code/datums/components/ghostrole_on_revive.dm | 12 +- code/datums/components/heart_eater.dm | 8 +- code/datums/components/ling_decoy_brain.dm | 8 +- code/datums/components/manual_blinking.dm | 10 +- code/datums/components/manual_breathing.dm | 10 +- code/datums/components/manual_heart.dm | 10 +- code/datums/components/phylactery.dm | 4 +- code/datums/components/sign_language.dm | 10 +- code/datums/components/squeak.dm | 2 +- code/datums/components/supermatter_crystal.dm | 2 +- code/datums/components/tackle.dm | 12 +- code/datums/components/vision_hurting.dm | 2 +- .../diseases/advance/symptoms/deafness.dm | 2 +- .../diseases/advance/symptoms/sensory.dm | 4 +- .../diseases/advance/symptoms/vision.dm | 2 +- code/datums/diseases/gastrolisis.dm | 16 +- code/datums/diseases/parasitic_infection.dm | 2 +- code/datums/dna.dm | 2 +- code/datums/elements/corrupted_organ.dm | 4 +- code/datums/elements/earhealing.dm | 2 +- code/datums/elements/eyestab.dm | 2 +- code/datums/elements/frozen.dm | 12 +- code/datums/elements/kneejerk.dm | 2 +- code/datums/instability_meltdown.dm | 5 +- code/datums/martial/boxing.dm | 2 +- code/datums/mutations/body.dm | 6 +- code/datums/mutations/tongue_spike.dm | 2 +- code/datums/quirks/negative_quirks/addict.dm | 12 +- .../quirks/negative_quirks/photophobia.dm | 8 +- .../negative_quirks/prosthetic_organ.dm | 8 +- .../quirks/negative_quirks/scarred_eye.dm | 4 +- code/datums/quirks/negative_quirks/tin_man.dm | 8 +- .../quirks/neutral_quirks/deviant_tastes.dm | 4 +- code/datums/quirks/neutral_quirks/gamer.dm | 4 +- .../quirks/neutral_quirks/heretochromatic.dm | 4 +- .../quirks/neutral_quirks/pineapple_hater.dm | 4 +- .../quirks/neutral_quirks/pineapple_liker.dm | 4 +- .../quirks/positive_quirks/chip_connector.dm | 2 +- code/datums/quirks/positive_quirks/chipped.dm | 4 +- .../datums/quirks/positive_quirks/friendly.dm | 2 +- code/datums/saymode.dm | 2 +- code/datums/station_traits/positive_traits.dm | 74 ++++----- code/datums/status_effects/debuffs/drunk.dm | 2 +- code/datums/status_effects/neutral.dm | 2 +- code/datums/wounds/cranial_fissure.dm | 8 +- code/datums/wounds/pierce.dm | 4 +- code/game/gamemodes/objective.dm | 2 +- .../machinery/dna_infuser/dna_infusion.dm | 2 +- .../infuser_tier_one_entries.dm | 46 +++--- .../infuser_tier_two_entries.dm | 6 +- .../infuser_tier_zero_entries.dm | 36 ++--- .../dna_infuser/organ_sets/carp_organs.dm | 36 ++--- .../dna_infuser/organ_sets/fish_organs.dm | 64 ++++---- .../dna_infuser/organ_sets/fly_organs.dm | 42 ++--- .../dna_infuser/organ_sets/fox_organs.dm | 4 +- .../dna_infuser/organ_sets/goliath_organs.dm | 20 +-- .../dna_infuser/organ_sets/gondola_organs.dm | 30 ++-- .../dna_infuser/organ_sets/rat_organs.dm | 32 ++-- .../dna_infuser/organ_sets/roach_organs.dm | 38 ++--- code/game/machinery/dna_scanner.dm | 2 +- code/game/machinery/medical_kiosk.dm | 2 +- code/game/machinery/recycler.dm | 2 +- .../effects/spawners/random/medical.dm | 62 ++++---- code/game/objects/items/airlock_painter.dm | 2 +- code/game/objects/items/body_egg.dm | 22 +-- code/game/objects/items/choice_beacon.dm | 12 +- code/game/objects/items/cigarettes.dm | 2 +- code/game/objects/items/climbingrope.dm | 2 +- code/game/objects/items/defib.dm | 4 +- code/game/objects/items/devices/flashlight.dm | 6 +- .../items/devices/scanners/health_analyzer.dm | 4 +- code/game/objects/items/dualsaber.dm | 2 +- code/game/objects/items/dyespray.dm | 75 ++++++++- code/game/objects/items/food/donuts.dm | 2 +- code/game/objects/items/food/misc.dm | 2 +- code/game/objects/items/hand_items.dm | 2 +- code/game/objects/items/melee/baton.dm | 2 +- code/game/objects/items/melee/misc.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 2 +- code/game/objects/items/storage/belt.dm | 4 +- code/game/objects/structures/aliens.dm | 4 +- .../structures/beds_chairs/alien_nest.dm | 6 +- .../objects/structures/gym/punching_bag.dm | 2 +- .../objects/structures/gym/weight_machine.dm | 2 +- .../structures/icemoon/cave_entrance.dm | 2 +- code/game/objects/structures/ladders.dm | 2 +- .../objects/structures/lavaland/gulag_vent.dm | 2 +- .../objects/structures/petrified_statue.dm | 2 +- code/game/objects/structures/tables_racks.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/admin/verbs/adminfun.dm | 4 +- code/modules/admin/verbs/secrets.dm | 4 +- code/modules/admin/verbs/selectequipment.dm | 2 +- code/modules/antagonists/abductor/abductor.dm | 2 +- .../abductor/equipment/abduction_surgery.dm | 6 +- .../abductor/equipment/gear/abductor_items.dm | 4 +- .../antagonists/abductor/equipment/gland.dm | 26 +-- .../abductor/equipment/glands/access.dm | 4 +- .../abductor/equipment/glands/blood.dm | 4 +- .../abductor/equipment/glands/chem.dm | 6 +- .../abductor/equipment/glands/egg.dm | 4 +- .../abductor/equipment/glands/electric.dm | 10 +- .../abductor/equipment/glands/heal.dm | 62 ++++---- .../abductor/equipment/glands/mindshock.dm | 8 +- .../abductor/equipment/glands/plasma.dm | 6 +- .../abductor/equipment/glands/quantum.dm | 10 +- .../abductor/equipment/glands/slime.dm | 8 +- .../abductor/equipment/glands/spider.dm | 4 +- .../abductor/equipment/glands/transform.dm | 4 +- .../abductor/equipment/glands/trauma.dm | 4 +- .../abductor/equipment/glands/ventcrawl.dm | 4 +- .../abductor/equipment/glands/viral.dm | 6 +- .../abductor/equipment/orderable_gear.dm | 2 +- .../abductor/machinery/dispenser.dm | 4 +- .../abductor/machinery/experiment.dm | 4 +- .../antagonists/changeling/changeling.dm | 2 +- .../antagonists/changeling/headslug_eggs.dm | 10 +- .../changeling/powers/augmented_eyesight.dm | 10 +- .../changeling/powers/darkness_adaptation.dm | 8 +- .../antagonists/changeling/powers/headcrab.dm | 2 +- .../antagonists/changeling/powers/mmi_talk.dm | 2 +- .../changeling/powers/mutations.dm | 2 +- .../antagonists/changeling/powers/panacea.dm | 6 +- .../antagonists/changeling/powers/shriek.dm | 2 +- .../changeling/powers/tiny_prick.dm | 2 +- code/modules/antagonists/clown_ops/clownop.dm | 4 +- code/modules/antagonists/cult/runes.dm | 2 +- .../antagonists/fugitive/fugitive_outfits.dm | 2 +- .../antagonists/heretic/heretic_knowledge.dm | 18 +-- .../heretic/items/corrupted_organs.dm | 58 +++---- .../heretic/items/eldritch_painting.dm | 16 +- .../antagonists/heretic/knowledge/ash_lore.dm | 2 +- .../heretic/knowledge/flesh_lore.dm | 8 +- .../heretic/knowledge/moon_lore.dm | 2 +- .../sacrifice_knowledge/sacrifice_curse.dm | 6 +- .../sacrifice_knowledge.dm | 18 +-- .../heretic/knowledge/side_ash_moon.dm | 2 +- .../heretic/knowledge/side_cosmos_ash.dm | 2 +- .../heretic/knowledge/side_lock_moon.dm | 6 +- .../heretic/knowledge/side_rust_cosmos.dm | 2 +- .../heretic/knowledge/side_void_blade.dm | 2 +- .../heretic/knowledge/starting_lore.dm | 10 +- .../heretic/knowledge/void_lore.dm | 2 +- .../antagonists/heretic/magic/moon_smile.dm | 2 +- .../antagonists/nightmare/nightmare_organs.dm | 20 +-- .../nightmare/nightmare_species.dm | 4 +- code/modules/antagonists/obsessed/obsessed.dm | 2 +- .../antagonists/revolution/revolution.dm | 4 +- code/modules/antagonists/spy/spy_bounty.dm | 8 +- .../traitor/objectives/eyesnatching.dm | 10 +- .../voidwalker/voidwalker_organs.dm | 12 +- .../voidwalker/voidwalker_species.dm | 4 +- .../voidwalker/voidwalker_void_eater.dm | 2 +- .../antagonists/wizard/equipment/artefact.dm | 2 +- code/modules/assembly/flash.dm | 4 +- code/modules/awaymissions/pamphlet.dm | 2 +- .../bitrunning/server/obj_generation.dm | 2 +- code/modules/cargo/bounties/medical.dm | 46 +++--- code/modules/cargo/bounties/special.dm | 12 +- code/modules/cargo/exports/lavaland.dm | 6 +- code/modules/cargo/exports/organs.dm | 20 +-- code/modules/cargo/packs/medical.dm | 2 +- .../preferences/species_features/basic.dm | 2 +- .../preferences/species_features/felinid.dm | 4 +- .../preferences/species_features/lizard.dm | 4 +- .../preferences/species_features/monkey.dm | 2 +- .../species_features/mushperson.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 4 +- code/modules/clothing/gloves/special.dm | 2 +- code/modules/clothing/head/jobs.dm | 6 +- code/modules/clothing/head/tinfoilhat.dm | 2 +- code/modules/clothing/neck/_neck.dm | 8 +- code/modules/events/brain_trauma.dm | 2 +- code/modules/events/creep_awakening.dm | 2 +- code/modules/events/holiday/halloween.dm | 2 +- .../experisci/experiment/experiments.dm | 2 +- code/modules/experisci/handheld_scanner.dm | 2 +- .../exploration_events/trader.dm | 2 +- .../food_and_drinks/recipes/soup_mixtures.dm | 2 +- .../recipes/tablecraft/recipes_bread.dm | 8 +- .../recipes/tablecraft/recipes_burger.dm | 8 +- .../recipes/tablecraft/recipes_cake.dm | 6 +- .../recipes/tablecraft/recipes_drink.dm | 4 +- .../recipes/tablecraft/recipes_lizard.dm | 20 +-- .../recipes/tablecraft/recipes_meat.dm | 2 +- .../recipes/tablecraft/recipes_mexican.dm | 2 +- .../recipes/tablecraft/recipes_misc.dm | 4 +- .../recipes/tablecraft/recipes_pastry.dm | 2 +- code/modules/hydroponics/grown/banana.dm | 2 +- code/modules/jobs/job_types/_job.dm | 2 +- .../job_types/assistant/gimmick_assistants.dm | 2 +- .../job_types/chaplain/chaplain_nullrod.dm | 2 +- .../chaplain/chaplain_vorpal_scythe.dm | 6 +- .../jobs/job_types/station_trait/human_ai.dm | 2 +- .../library/skill_learning/skill_station.dm | 6 +- .../library/skill_learning/skillchip.dm | 10 +- code/modules/lost_crew/damages/decay.dm | 2 +- code/modules/lost_crew/lost_crew_manager.dm | 6 +- .../ruins/lavalandruin_code/syndicate_base.dm | 14 +- .../mapfluff/ruins/spaceruin_code/meateor.dm | 42 ++--- code/modules/meteors/meteor_types.dm | 8 +- .../equipment/monster_organs/brimdust_sac.dm | 10 +- .../equipment/monster_organs/monster_organ.dm | 36 ++--- .../monster_organs/regenerative_core.dm | 14 +- .../equipment/monster_organs/rush_gland.dm | 12 +- .../mining/lavaland/necropolis_chests.dm | 6 +- code/modules/mining/lavaland/tendril_loot.dm | 14 +- code/modules/mob/dead/observer/observer.dm | 4 +- .../mob/living/basic/bots/honkbots/honkbot.dm | 2 +- .../basic/heretic/maid_in_the_mirror.dm | 2 +- .../mob/living/basic/heretic/raw_prophet.dm | 2 +- .../basic/lavaland/brimdemon/brimdemon.dm | 2 +- .../basic/lavaland/hivelord/hivelord.dm | 2 +- .../living/basic/lavaland/legion/legion.dm | 6 +- .../basic/lavaland/legion/legion_tumour.dm | 24 +-- .../basic/lavaland/lobstrosity/lobstrosity.dm | 4 +- code/modules/mob/living/basic/pets/cat/cat.dm | 8 +- .../mob/living/basic/pets/cat/keeki.dm | 6 +- .../mob/living/basic/pets/dog/dog_subtypes.dm | 4 +- .../mob/living/basic/pets/penguin/penguin.dm | 2 +- .../living/basic/space_fauna/bear/_bear.dm | 4 +- .../living/basic/space_fauna/cat_surgeon.dm | 2 +- .../basic/space_fauna/changeling/headslug.dm | 2 +- .../basic/space_fauna/demon/demon_items.dm | 12 +- .../basic/space_fauna/demon/demon_subtypes.dm | 2 +- .../basic/space_fauna/eyeball/_eyeball.dm | 4 +- .../eyeball/eyeball_ai_behavior.dm | 4 +- .../space_fauna/eyeball/eyeball_ai_subtree.dm | 2 +- code/modules/mob/living/brain/MMI.dm | 18 +-- code/modules/mob/living/brain/brain.dm | 14 +- .../mob/living/brain/brain_cybernetic.dm | 8 +- code/modules/mob/living/brain/brain_item.dm | 90 +++++------ code/modules/mob/living/brain/death.dm | 2 +- code/modules/mob/living/brain/life.dm | 4 +- code/modules/mob/living/brain/skillchip.dm | 20 +-- .../mob/living/carbon/alien/adult/adult.dm | 4 +- .../living/carbon/alien/adult/alien_powers.dm | 6 +- .../living/carbon/alien/adult/caste/drone.dm | 8 +- .../living/carbon/alien/adult/caste/hunter.dm | 2 +- .../carbon/alien/adult/caste/praetorian.dm | 10 +- .../carbon/alien/adult/caste/sentinel.dm | 6 +- .../mob/living/carbon/alien/adult/death.dm | 2 +- .../mob/living/carbon/alien/adult/queen.dm | 10 +- code/modules/mob/living/carbon/alien/alien.dm | 18 +-- .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../mob/living/carbon/alien/alien_say.dm | 2 +- .../mob/living/carbon/alien/larva/larva.dm | 2 +- .../mob/living/carbon/alien/larva/life.dm | 2 +- .../modules/mob/living/carbon/alien/organs.dm | 64 ++++---- .../carbon/alien/special/alien_embryo.dm | 20 +-- .../living/carbon/alien/special/facehugger.dm | 10 +- code/modules/mob/living/carbon/carbon.dm | 20 +-- .../mob/living/carbon/carbon_context.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 16 +- code/modules/mob/living/carbon/carbon_say.dm | 2 +- code/modules/mob/living/carbon/death.dm | 6 +- code/modules/mob/living/carbon/examine.dm | 8 +- .../mob/living/carbon/human/_species.dm | 32 ++-- code/modules/mob/living/carbon/human/death.dm | 4 +- code/modules/mob/living/carbon/human/emote.dm | 12 +- code/modules/mob/living/carbon/human/human.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../mob/living/carbon/human/human_say.dm | 2 +- .../mob/living/carbon/human/human_suicide.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- .../carbon/human/species_types/abductors.dm | 4 +- .../carbon/human/species_types/android.dm | 8 +- .../carbon/human/species_types/dullahan.dm | 28 ++-- .../carbon/human/species_types/ethereal.dm | 12 +- .../carbon/human/species_types/felinid.dm | 40 ++--- .../carbon/human/species_types/flypeople.dm | 16 +- .../carbon/human/species_types/golems.dm | 14 +- .../carbon/human/species_types/jellypeople.dm | 10 +- .../human/species_types/lizardpeople.dm | 18 +-- .../carbon/human/species_types/monkeys.dm | 18 +-- .../carbon/human/species_types/mothmen.dm | 6 +- .../carbon/human/species_types/mushpeople.dm | 15 +- .../carbon/human/species_types/plasmamen.dm | 8 +- .../carbon/human/species_types/podpeople.dm | 4 +- .../human/species_types/shadowpeople.dm | 10 +- .../carbon/human/species_types/skeletons.dm | 6 +- .../carbon/human/species_types/snail.dm | 4 +- .../carbon/human/species_types/vampire.dm | 16 +- .../carbon/human/species_types/zombies.dm | 10 +- code/modules/mob/living/carbon/life.dm | 26 +-- code/modules/mob/living/carbon/skillchip.dm | 8 +- .../modules/mob/living/carbon/status_procs.dm | 12 +- code/modules/mob/living/damage_procs.dm | 4 +- code/modules/mob/living/emote.dm | 4 +- code/modules/mob/living/living.dm | 6 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../hostile/mining_mobs/elites/elite.dm | 4 +- code/modules/mob/living/taste.dm | 10 +- .../mob_spawn/corpses/mining_corpses.dm | 2 +- .../mob_spawn/ghost_roles/golem_roles.dm | 2 +- code/modules/mod/mod_core.dm | 8 +- code/modules/mod/modules/modules_antag.dm | 4 +- code/modules/paperwork/paperplane.dm | 4 +- code/modules/power/apc/apc_attack.dm | 8 +- code/modules/power/lighting/light.dm | 6 +- code/modules/power/power_store.dm | 6 +- .../cascade_delam_objects.dm | 2 +- .../supermatter/supermatter_hit_procs.dm | 2 +- code/modules/power/tesla/energy_ball.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- .../reagents/chemistry/holder/holder.dm | 2 +- .../reagents/chemistry/holder/mob_life.dm | 4 +- .../reagents/cat2_medicine_reagents.dm | 4 +- .../reagents/drinks/alcohol_reagents.dm | 24 +-- .../reagents/drinks/drink_reagents.dm | 10 +- .../chemistry/reagents/drug_reagents.dm | 4 +- .../chemistry/reagents/food_reagents.dm | 6 +- .../chemistry/reagents/impure_reagents.dm | 2 +- .../impure_medicine_reagents.dm | 40 ++--- .../impure_reagents/impure_toxin_reagents.dm | 4 +- .../chemistry/reagents/medicine_reagents.dm | 32 ++-- .../chemistry/reagents/other_reagents.dm | 8 +- .../chemistry/reagents/toxin_reagents.dm | 6 +- .../chemistry/reagents/unique/eigenstasium.dm | 2 +- code/modules/reagents/chemistry/recipes.dm | 4 +- .../reagent_containers/cups/glassbottle.dm | 2 +- .../reagents/withdrawal/generic_addictions.dm | 10 +- .../religion/burdened/burdened_trauma.dm | 4 +- code/modules/religion/burdened/psyker.dm | 14 +- code/modules/religion/religion_sects.dm | 2 +- code/modules/religion/rites.dm | 32 ++-- .../research/designs/limbgrower_designs.dm | 42 ++--- .../research/designs/medical_designs.dm | 86 +++++----- .../spells/spell_types/self/lichdom.dm | 2 +- code/modules/station_goals/vault_mutation.dm | 12 +- .../advanced/bioware/cortex_folding.dm | 2 +- .../advanced/bioware/cortex_imprint.dm | 2 +- code/modules/surgery/advanced/brainwashing.dm | 2 +- code/modules/surgery/advanced/lobotomy.dm | 4 +- .../surgery/advanced/necrotic_revival.dm | 4 +- code/modules/surgery/advanced/pacification.dm | 2 +- .../surgery/advanced/wingreconstruction.dm | 10 +- code/modules/surgery/bodyparts/head.dm | 12 +- .../surgery/bodyparts/head_hair_and_lips.dm | 4 +- code/modules/surgery/bodyparts/parts.dm | 4 +- .../surgery/bodyparts/robot_bodyparts.dm | 2 +- .../species_parts/lizard_bodyparts.dm | 2 +- .../bodyparts/species_parts/misc_bodyparts.dm | 6 +- .../bodyparts/species_parts/moth_bodyparts.dm | 2 +- code/modules/surgery/coronary_bypass.dm | 4 +- code/modules/surgery/ear_surgery.dm | 4 +- code/modules/surgery/eye_surgery.dm | 4 +- code/modules/surgery/gastrectomy.dm | 4 +- code/modules/surgery/hepatectomy.dm | 4 +- code/modules/surgery/lobectomy.dm | 4 +- code/modules/surgery/organ_manipulation.dm | 4 +- code/modules/surgery/organs/_organ.dm | 12 +- code/modules/surgery/organs/autosurgeon.dm | 20 +-- .../surgery/organs/external/_visual_organs.dm | 38 +++-- .../modules/surgery/organs/external/spines.dm | 18 ++- code/modules/surgery/organs/external/tails.dm | 40 +++-- .../organs/external/wings/functional_wings.dm | 48 +++--- .../organs/external/wings/moth_wings.dm | 24 +-- .../surgery/organs/external/wings/wings.dm | 8 +- .../organs/internal/_internal_organ.dm | 20 +-- .../organs/internal/appendix/_appendix.dm | 20 +-- .../internal/appendix/appendix_golem.dm | 12 +- .../organs/internal/cyberimp/augments_arms.dm | 88 +++++------ .../internal/cyberimp/augments_chest.dm | 58 +++---- .../organs/internal/cyberimp/augments_eyes.dm | 18 +-- .../internal/cyberimp/augments_internal.dm | 66 ++++---- .../surgery/organs/internal/ears/_ears.dm | 49 +++--- .../surgery/organs/internal/eyes/_eyes.dm | 148 +++++++++--------- .../surgery/organs/internal/heart/_heart.dm | 56 +++---- .../organs/internal/heart/heart_anomalock.dm | 32 ++-- .../organs/internal/heart/heart_ethereal.dm | 30 ++-- .../surgery/organs/internal/liver/_liver.dm | 42 ++--- .../organs/internal/liver/liver_golem.dm | 6 +- .../organs/internal/liver/liver_plasmaman.dm | 4 +- .../organs/internal/liver/liver_skeleton.dm | 4 +- .../surgery/organs/internal/lungs/_lungs.dm | 114 +++++++------- .../organs/internal/stomach/_stomach.dm | 36 ++--- .../internal/stomach/stomach_ethereal.dm | 24 +-- .../organs/internal/stomach/stomach_golem.dm | 12 +- .../surgery/organs/internal/tongue/_tongue.dm | 108 ++++++------- .../internal/vocal_cords/_vocal_cords.dm | 24 +-- code/modules/surgery/revival.dm | 2 +- code/modules/surgery/sleeper_protocol.dm | 2 +- code/modules/surgery/stomachpump.dm | 2 +- code/modules/surgery/tools.dm | 2 +- code/modules/unit_tests/blindness.dm | 2 +- code/modules/unit_tests/fish_unit_tests.dm | 2 +- code/modules/unit_tests/full_heal.dm | 6 +- code/modules/unit_tests/ling_decap.dm | 10 +- code/modules/unit_tests/liver.dm | 4 +- code/modules/unit_tests/lungs.dm | 22 +-- code/modules/unit_tests/metabolizing.dm | 2 +- code/modules/unit_tests/organs.dm | 26 +-- .../screenshot_high_luminosity_eyes.dm | 4 +- .../unit_tests/species_change_organs.dm | 6 +- code/modules/unit_tests/stomach.dm | 2 +- code/modules/unit_tests/tail_wag.dm | 2 +- code/modules/unit_tests/unit_test.dm | 5 +- .../mecha/equipment/weapons/weapons.dm | 2 +- code/modules/vending/wardrobes.dm | 2 +- .../components/action/equpiment_action.dm | 2 +- .../wiremod/components/atom/remotecam.dm | 8 +- .../components/bci/hud/counter_overlay.dm | 6 +- .../components/bci/hud/object_overlay.dm | 6 +- .../components/bci/hud/target_intercept.dm | 6 +- .../components/bci/install_detector.dm | 6 +- .../components/bci/reagent_injector.dm | 6 +- .../components/bci/thought_listener.dm | 6 +- code/modules/wiremod/components/bci/vox.dm | 6 +- .../wiremod/shell/brain_computer_interface.dm | 26 +-- code/modules/wiremod/shell/shell_items.dm | 2 +- code/modules/zombie/items.dm | 2 +- code/modules/zombie/organs.dm | 26 +-- .../87434_internal_external_organ_death.txt | 2 + 473 files changed, 2564 insertions(+), 2445 deletions(-) create mode 100644 tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 97b4e3d53c99f..6ef2066b19156 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -467,7 +467,7 @@ pixel_y = 4 }, /obj/item/bodypart/chest, -/obj/item/organ/internal/heart, +/obj/item/organ/heart, /obj/item/multitool, /turf/open/floor/iron/freezer, /area/ruin/powered) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm index d4862ce03ee07..0ea4048d1276a 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm @@ -142,7 +142,7 @@ /turf/open/misc/ice/icemoon, /area/icemoon/underground/explored) "sp" = ( -/obj/item/organ/internal/monster_core/regenerative_core/legion{ +/obj/item/organ/monster_core/regenerative_core/legion{ time_to_decay = 0; pixel_x = 11; pixel_y = 4; @@ -273,7 +273,7 @@ /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "JP" = ( -/obj/item/organ/internal/monster_core/regenerative_core/legion{ +/obj/item/organ/monster_core/regenerative_core/legion{ time_to_decay = 0; pixel_x = -12; pixel_y = -4; @@ -365,7 +365,7 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "VT" = ( -/obj/item/organ/internal/monster_core/regenerative_core/legion{ +/obj/item/organ/monster_core/regenerative_core/legion{ time_to_decay = 0; pixel_x = 4; pixel_y = 3; diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm index a3c10d3b50899..e2b11a02964eb 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm @@ -217,8 +217,8 @@ dir = 5 }, /obj/machinery/smartfridge/organ, -/obj/item/organ/internal/alien/resinspinner, -/obj/item/organ/internal/eyes/night_vision, +/obj/item/organ/alien/resinspinner, +/obj/item/organ/eyes/night_vision, /turf/open/floor/mineral/plastitanium/red, /area/ruin/syndibiodome) "cE" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 6156174aaba56..bd900021094f3 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -235,7 +235,7 @@ "oL" = ( /obj/structure/bonfire/prelit, /obj/effect/decal/cleanable/ash, -/obj/item/organ/external/tail/lizard, +/obj/item/organ/tail/lizard, /obj/effect/decal/cleanable/blood/old, /obj/structure/stone_tile/slab/cracked, /turf/open/misc/asteroid/basalt/wasteland, @@ -313,7 +313,7 @@ /area/ruin/unpowered/elephant_graveyard) "wp" = ( /obj/item/knife/combat/bone, -/obj/item/organ/internal/tongue, +/obj/item/organ/tongue, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) @@ -386,8 +386,8 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface) "Di" = ( -/obj/item/organ/internal/lungs, -/obj/item/organ/internal/liver, +/obj/item/organ/lungs, +/obj/item/organ/liver, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) @@ -406,7 +406,7 @@ /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "Eh" = ( -/obj/item/organ/internal/brain, +/obj/item/organ/brain, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "EI" = ( @@ -468,9 +468,9 @@ /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) "Kj" = ( -/obj/item/organ/internal/heart, -/obj/item/organ/internal/eyes, -/obj/item/organ/internal/ears, +/obj/item/organ/heart, +/obj/item/organ/eyes, +/obj/item/organ/ears, /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 66e681981c706..5e8cb710e8914 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -524,9 +524,9 @@ "tL" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/secure/engineering, -/obj/item/organ/internal/cyberimp/arm/toolset, -/obj/item/organ/internal/cyberimp/eyes/hud/medical, -/obj/item/organ/internal/cyberimp/brain/anti_stun, +/obj/item/organ/cyberimp/arm/toolset, +/obj/item/organ/cyberimp/eyes/hud/medical, +/obj/item/organ/cyberimp/brain/anti_stun, /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter3) "tO" = ( diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 025a2b62e0a83..52a288e64e6d1 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -341,7 +341,7 @@ /obj/effect/decal/cleanable/blood/footprints{ dir = 8 }, -/obj/item/organ/internal/liver, +/obj/item/organ/liver, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) @@ -543,7 +543,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/bubblegum, -/obj/item/organ/internal/appendix, +/obj/item/organ/appendix, /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/mapping_helpers/burnt_floor, @@ -903,7 +903,7 @@ /area/ruin/space/has_grav/dangerous_research/dorms) "mG" = ( /obj/structure/table, -/obj/item/organ/internal/heart, +/obj/item/organ/heart, /obj/effect/decal/cleanable/blood/bubblegum, /obj/effect/spawner/random/medical/surgery_tool_advanced, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -1056,7 +1056,7 @@ dir = 1 }, /obj/effect/decal/cleanable/blood/footprints, -/obj/item/organ/internal/lungs, +/obj/item/organ/lungs, /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, @@ -1193,7 +1193,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/gibs, -/obj/item/organ/internal/brain, +/obj/item/organ/brain, /obj/item/skillchip/research_director, /obj/effect/turf_decal/tile/neutral/half{ dir = 4 @@ -1279,7 +1279,7 @@ /obj/effect/decal/cleanable/blood/footprints{ dir = 8 }, -/obj/item/organ/internal/heart, +/obj/item/organ/heart, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) @@ -3692,8 +3692,8 @@ /area/ruin/space/has_grav/dangerous_research/lab) "Wt" = ( /obj/structure/table/optable, -/obj/item/organ/internal/eyes, -/obj/item/organ/internal/liver, +/obj/item/organ/eyes, +/obj/item/organ/liver, /obj/effect/decal/cleanable/blood/bubblegum, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm index f3a4b1f75286f..05da4138d0f25 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm @@ -876,10 +876,10 @@ /obj/item/petri_dish, /obj/item/petri_dish, /obj/item/petri_dish, -/obj/item/organ/internal/tongue/rat, +/obj/item/organ/tongue/rat, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, -/obj/item/organ/internal/stomach/rat, +/obj/item/organ/stomach/rat, /obj/item/fish/ratfish, /obj/structure/closet/crate/freezer, /obj/effect/spawner/random/medical/surgery_tool, @@ -1227,7 +1227,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/item/food/deadmouse, /mob/living/basic/mouse/rat, -/obj/item/organ/internal/heart/rat, +/obj/item/organ/heart/rat, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/foodwaste) diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm index c697cd5fa00be..f1c41c3bf1708 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "bb" = ( -/obj/item/organ/external/wings/moth, +/obj/item/organ/wings/moth, /obj/structure/closet/crate/trashcart, /obj/item/bodypart/arm/left/skeleton, /obj/item/bodypart/arm/right/skeleton, /obj/item/evidencebag, -/obj/item/organ/internal/heart/cybernetic/tier2, +/obj/item/organ/heart/cybernetic/tier2, /obj/structure/broken_flooring/pile, /obj/item/stack/sheet/animalhide/human/five, /turf/open/floor/plating, @@ -183,7 +183,7 @@ /obj/item/trash/syndi_cakes, /obj/item/trash/syndi_cakes, /obj/item/poster/random_contraband, -/obj/item/organ/internal/tongue/zombie, +/obj/item/organ/tongue/zombie, /obj/structure/closet/crate/trashcart, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) @@ -298,8 +298,8 @@ /obj/item/stack/medical/gauze, /obj/item/stack/sticky_tape/surgical, /obj/structure/broken_flooring/corner, -/obj/item/organ/internal/cyberimp/arm/surgery, -/obj/item/organ/internal/cyberimp/eyes/hud/medical, +/obj/item/organ/cyberimp/arm/surgery, +/obj/item/organ/cyberimp/eyes/hud/medical, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "zu" = ( @@ -417,7 +417,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "Gp" = ( -/obj/item/organ/internal/eyes/robotic/basic, +/obj/item/organ/eyes/robotic/basic, /obj/item/kitchen/spoon, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) @@ -437,9 +437,9 @@ "IM" = ( /obj/effect/decal/cleanable/robot_debris, /obj/structure/closet/crate/freezer, -/obj/item/organ/internal/liver/roach, -/obj/item/organ/internal/stomach, -/obj/item/organ/internal/tongue/robot, +/obj/item/organ/liver/roach, +/obj/item/organ/stomach, +/obj/item/organ/tongue/robot, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "IS" = ( diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm index cdb5b4e2cec60..1bc775220c2fc 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm @@ -662,7 +662,7 @@ /obj/structure/mecha_wreckage/ripley, /obj/effect/decal/cleanable/fuel_pool, /obj/effect/decal/cleanable/molten_object, -/obj/item/organ/internal/tongue/robot, +/obj/item/organ/tongue/robot, /turf/open/floor/plating/dumpsterair, /area/ruin/space/has_grav/garbagetruck/squat) "HN" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm index 6954a5f57a20f..06451e02e8c7a 100644 --- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm @@ -5471,7 +5471,7 @@ /obj/structure/table/wood, /obj/item/toy/figure/wizard/special{ pixel_y = 9; - pixel_x = -4; + pixel_x = -4 }, /obj/item/toy/figure/warden{ name = "\improper Knight action figure"; diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 6c08525d8f2c3..729e9ddf044cd 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -312,7 +312,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/powered/cat_man) "be" = ( -/obj/item/organ/external/tail/cat, +/obj/item/organ/tail/cat, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/white/corner, /area/ruin/space/has_grav/powered/cat_man) @@ -396,7 +396,7 @@ "bt" = ( /obj/structure/table/optable, /obj/effect/mob_spawn/corpse/human/damaged, -/obj/item/organ/internal/ears/cat, +/obj/item/organ/ears/cat, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/white, /area/ruin/space/has_grav/powered/cat_man) @@ -737,12 +737,12 @@ /obj/structure/closet/crate/freezer{ name = "cat ears" }, -/obj/item/organ/internal/ears/cat, -/obj/item/organ/internal/ears/cat, -/obj/item/organ/internal/ears/cat, -/obj/item/organ/internal/ears/cat, -/obj/item/organ/internal/ears/cat, -/obj/item/organ/internal/ears/cat, +/obj/item/organ/ears/cat, +/obj/item/organ/ears/cat, +/obj/item/organ/ears/cat, +/obj/item/organ/ears/cat, +/obj/item/organ/ears/cat, +/obj/item/organ/ears/cat, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/powered/cat_man) "cv" = ( @@ -791,12 +791,12 @@ /obj/structure/closet/crate/freezer{ name = "cat tails" }, -/obj/item/organ/external/tail/cat, -/obj/item/organ/external/tail/cat, -/obj/item/organ/external/tail/cat, -/obj/item/organ/external/tail/cat, -/obj/item/organ/external/tail/cat, -/obj/item/organ/external/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, +/obj/item/organ/tail/cat, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/powered/cat_man) "jc" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 0c3c231b5f225..1f1ad0f6c4a3c 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -521,7 +521,7 @@ pixel_x = 17; pixel_y = 12 }, -/obj/item/organ/internal/cyberimp/arm/toolset{ +/obj/item/organ/cyberimp/arm/toolset{ pixel_y = 2; pixel_x = 6 }, diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index f31929b70a4e2..719088322f21e 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -251,14 +251,14 @@ /area/ruin/space/has_grav/the_outlet/researchrooms) "gU" = ( /obj/structure/closet/secure_closet/freezer/empty, -/obj/item/organ/internal/tongue/lizard, +/obj/item/organ/tongue/lizard, /obj/item/food/meat/slab/human/mutant/lizard, -/obj/item/organ/external/tail/lizard, -/obj/item/organ/internal/heart, -/obj/item/organ/internal/brain, -/obj/item/organ/internal/liver, -/obj/item/organ/internal/lungs, -/obj/item/organ/internal/stomach, +/obj/item/organ/tail/lizard, +/obj/item/organ/heart, +/obj/item/organ/brain, +/obj/item/organ/liver, +/obj/item/organ/lungs, +/obj/item/organ/stomach, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/the_outlet/researchrooms) "gX" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index a21d64d505b63..ea63bf1b7fe19 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -56,7 +56,7 @@ }, /obj/item/veilrender/honkrender, /obj/item/clothing/mask/gas/clown_hat, -/obj/item/organ/internal/heart/demon, +/obj/item/organ/heart/demon, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1252,7 +1252,7 @@ "ki" = ( /obj/structure/closet/crate/preopen, /obj/item/paper/fluff/awaymissions/caves/shipment_receipt, -/obj/item/organ/internal/eyes/robotic/thermals, +/obj/item/organ/eyes/robotic/thermals, /obj/item/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ @@ -1977,7 +1977,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_three) "YG" = ( -/obj/item/organ/internal/brain/alien, +/obj/item/organ/brain/alien, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/deathmatch/sunrise.dmm b/_maps/deathmatch/sunrise.dmm index b4de46385cd5c..d58aac39aecc3 100644 --- a/_maps/deathmatch/sunrise.dmm +++ b/_maps/deathmatch/sunrise.dmm @@ -721,7 +721,7 @@ /area/deathmatch) "Uk" = ( /obj/structure/closet/crate/coffin, -/obj/item/organ/internal/cyberimp/arm/shard/katana, +/obj/item/organ/cyberimp/arm/shard/katana, /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, diff --git a/_maps/map_files/Basketball/lusty_xenomorphs.dmm b/_maps/map_files/Basketball/lusty_xenomorphs.dmm index 534376d3f5639..f3550c0c15fad 100644 --- a/_maps/map_files/Basketball/lusty_xenomorphs.dmm +++ b/_maps/map_files/Basketball/lusty_xenomorphs.dmm @@ -135,7 +135,7 @@ /turf/open/floor/engine, /area/centcom/basketball) "kT" = ( -/obj/item/organ/internal/body_egg/alien_embryo, +/obj/item/organ/body_egg/alien_embryo, /turf/open/floor/engine, /area/centcom/basketball) "lh" = ( @@ -327,7 +327,7 @@ /area/centcom/basketball) "Bd" = ( /obj/structure/alien/weeds, -/obj/item/organ/internal/body_egg/alien_embryo, +/obj/item/organ/body_egg/alien_embryo, /turf/open/floor/iron/white, /area/centcom/basketball) "Cv" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index a82b58f2e6ca3..95fdc28f2f6ca 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -2454,12 +2454,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"aVK" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) "aVT" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior, /obj/effect/mapping_helpers/airlock/locked, @@ -2609,6 +2603,10 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/misc/sandy_dirt, /area/station/service/lawoffice) +"aZg" = ( +/obj/machinery/drone_dispenser, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "aZh" = ( /obj/machinery/modular_computer/preset/curator{ dir = 8 @@ -9465,24 +9463,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"dzi" = ( -/obj/structure/table/wood, -/obj/item/book/granter/action/spell/smoke/lesser{ - name = "mysterious old book of cloud-chasing" - }, -/obj/item/reagent_containers/cup/glass/bottle/holywater{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/nullrod{ - pixel_x = 4 - }, -/obj/item/organ/internal/heart, -/obj/item/soulstone/anybody/chaplain, -/obj/machinery/light/small/red/dim/directional/south, -/obj/item/radio/intercom/chapel/directional/east, -/turf/open/floor/iron/terracotta/diagonal, -/area/station/service/chapel/office) "dzE" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -26326,10 +26306,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"jar" = ( -/obj/machinery/drone_dispenser, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) "jat" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4 @@ -45438,6 +45414,24 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"pEQ" = ( +/obj/structure/table/wood, +/obj/item/book/granter/action/spell/smoke/lesser{ + name = "mysterious old book of cloud-chasing" + }, +/obj/item/reagent_containers/cup/glass/bottle/holywater{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/nullrod{ + pixel_x = 4 + }, +/obj/item/organ/heart, +/obj/item/soulstone/anybody/chaplain, +/obj/machinery/light/small/red/dim/directional/south, +/obj/item/radio/intercom/chapel/directional/east, +/turf/open/floor/iron/terracotta/diagonal, +/area/station/service/chapel/office) "pET" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 8 @@ -70259,6 +70253,12 @@ }, /turf/open/floor/iron/checker, /area/station/security/breakroom) +"xtv" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "xtD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -85843,7 +85843,7 @@ jte diI yea vmt -dzi +pEQ fEC wxR fEC @@ -112838,7 +112838,7 @@ tjj tjj blb ssz -jar +aZg qRO ssz vLv @@ -113095,7 +113095,7 @@ tjj blb blb ssz -aVK +xtv sPO ssz aSy diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 141895206a53a..52e73ec652281 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -52616,7 +52616,7 @@ /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "pgN" = ( -/obj/item/organ/external/tail/monkey, +/obj/item/organ/tail/monkey, /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) @@ -56829,7 +56829,7 @@ pixel_y = 4 }, /obj/item/bodypart/chest, -/obj/item/organ/internal/heart, +/obj/item/organ/heart, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "qrj" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 3c4c6f608263c..c1850a0eb3302 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -15680,14 +15680,6 @@ /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"fEV" = ( -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/supply) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28019,22 +28011,6 @@ /obj/item/kirbyplants/potty, /turf/open/floor/wood/large, /area/station/commons/lounge) -"jTy" = ( -/obj/structure/table/wood, -/obj/item/book/granter/action/spell/smoke/lesser{ - name = "mysterious old book of cloud-chasing" - }, -/obj/item/reagent_containers/cup/glass/bottle/holywater{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/nullrod{ - pixel_x = 4 - }, -/obj/item/organ/internal/heart, -/obj/item/soulstone/anybody/chaplain, -/turf/open/floor/cult, -/area/station/service/chapel/office) "jTH" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/pdapainter/security, @@ -38064,6 +38040,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison/work) +"nyu" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "nyy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59519,6 +59503,22 @@ "uXd" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) +"uXh" = ( +/obj/structure/table/wood, +/obj/item/book/granter/action/spell/smoke/lesser{ + name = "mysterious old book of cloud-chasing" + }, +/obj/item/reagent_containers/cup/glass/bottle/holywater{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/nullrod{ + pixel_x = 4 + }, +/obj/item/organ/heart, +/obj/item/soulstone/anybody/chaplain, +/turf/open/floor/cult, +/area/station/service/chapel/office) "uXt" = ( /obj/docking_port/stationary/syndicate/northwest{ dir = 8 @@ -63486,17 +63486,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) -"wme" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/supply) "wmf" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -66214,6 +66203,17 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"xma" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "xmb" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ dir = 4 @@ -89980,7 +89980,7 @@ hxd rtG oor oor -wme +xma oor xbu oor @@ -90499,7 +90499,7 @@ kDb imT gPw qNL -fEV +nyu pVK xOw uCR @@ -91335,7 +91335,7 @@ tSw tAH waD tSw -jTy +uXh vQg oCb gCA diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 280fcdfc858e7..9b9a4ebef4fc0 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2592,13 +2592,13 @@ /area/station/hallway/primary/central) "XN" = ( /obj/structure/table, -/obj/item/organ/internal/cyberimp/bci{ +/obj/item/organ/cyberimp/bci{ pixel_y = 5 }, -/obj/item/organ/internal/cyberimp/bci{ +/obj/item/organ/cyberimp/bci{ pixel_y = 5 }, -/obj/item/organ/internal/cyberimp/bci{ +/obj/item/organ/cyberimp/bci{ pixel_y = 5 }, /turf/open/floor/iron/dark, diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm index 0e8deac0a590a..893f1208686ff 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm @@ -102,7 +102,7 @@ /area/station/asteroid) "N" = ( /obj/item/instrument/trombone, -/obj/item/organ/internal/tongue/bone, +/obj/item/organ/tongue/bone, /turf/open/misc/asteroid/dug, /area/station/asteroid) "O" = ( diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index af9811526292f..07e0c9ba51acf 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -15446,7 +15446,7 @@ /obj/item/nullrod{ pixel_x = 4 }, -/obj/item/organ/internal/heart, +/obj/item/organ/heart, /obj/item/soulstone/anybody/chaplain, /turf/open/floor/cult, /area/station/service/chapel/office) @@ -66285,11 +66285,11 @@ /area/station/hallway/secondary/exit/departure_lounge) "xrt" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/item/organ/external/horns, -/obj/item/organ/external/antennae, -/obj/item/organ/external/frills, -/obj/item/organ/external/spines, -/obj/item/organ/external/tail/lizard/fake, +/obj/item/organ/horns, +/obj/item/organ/antennae, +/obj/item/organ/frills, +/obj/item/organ/spines, +/obj/item/organ/tail/lizard/fake, /obj/structure/closet/crate/freezer, /turf/open/floor/plating, /area/station/maintenance/department/science) diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm index bbcad398257f1..cdf903f034595 100644 --- a/_maps/shuttles/emergency_birdshot.dmm +++ b/_maps/shuttles/emergency_birdshot.dmm @@ -904,14 +904,14 @@ /obj/structure/closet/crate/freezer, /obj/item/bodypart/arm/left/moth, /obj/item/bodypart/arm/left/moth, -/obj/item/organ/external/tail/lizard, +/obj/item/organ/tail/lizard, /obj/item/bodypart/leg/right/digitigrade, /obj/item/bodypart/leg/right/digitigrade, /obj/item/bodypart/leg/left/fly, /obj/item/bodypart/leg/left/fly, /obj/item/bodypart/arm/right, /obj/item/bodypart/arm/right, -/obj/item/organ/external/tail/cat, +/obj/item/organ/tail/cat, /obj/effect/turf_decal/stripes/white/end{ dir = 1 }, diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index 720a906a767c8..ba22cc263016d 100644 --- a/_maps/shuttles/emergency_zeta.dmm +++ b/_maps/shuttles/emergency_zeta.dmm @@ -198,10 +198,10 @@ /area/shuttle/escape/brig) "IM" = ( /obj/structure/table/abductor, -/obj/item/organ/internal/heart/gland/access{ +/obj/item/organ/heart/gland/access{ pixel_x = 10 }, -/obj/item/organ/internal/heart/gland/egg, +/obj/item/organ/heart/gland/egg, /turf/open/floor/plating/abductor, /area/shuttle/escape) "JK" = ( diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 4e0fff656e83d..7864564eab185 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -480,7 +480,7 @@ /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) "yQ" = ( -/obj/item/organ/internal/brain, +/obj/item/organ/brain, /obj/structure/cable, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 0192f6aa1188a..b895743cab0c7 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -100,7 +100,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/item/organ/internal/stomach, +/obj/item/organ/stomach, /obj/item/trash/syndi_cakes, /obj/effect/turf_decal/tile/bar{ dir = 1 diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index f538a4e509673..324ebc3209380 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -1659,8 +1659,8 @@ /obj/item/reagent_containers/medigel/synthflesh, /obj/item/reagent_containers/medigel/synthflesh, /obj/item/reagent_containers/medigel/synthflesh, -/obj/item/organ/internal/heart/cybernetic/tier2, -/obj/item/organ/internal/heart/cybernetic/tier2, +/obj/item/organ/heart/cybernetic/tier2, +/obj/item/organ/heart/cybernetic/tier2, /obj/item/defibrillator, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) diff --git a/_maps/virtual_domains/abductor_ship.dmm b/_maps/virtual_domains/abductor_ship.dmm index b182c50ed6683..b74435a9ab158 100644 --- a/_maps/virtual_domains/abductor_ship.dmm +++ b/_maps/virtual_domains/abductor_ship.dmm @@ -63,7 +63,7 @@ /area/virtual_domain) "kl" = ( /obj/structure/table_frame/abductor, -/obj/item/organ/internal/lungs{ +/obj/item/organ/lungs{ pixel_x = 8; pixel_y = 7 }, @@ -247,7 +247,7 @@ /turf/open/floor/plating/abductor, /area/virtual_domain) "JC" = ( -/obj/item/organ/external/tail/cat, +/obj/item/organ/tail/cat, /turf/open/floor/plating/abductor, /area/virtual_domain) "JR" = ( @@ -298,7 +298,7 @@ /turf/open/floor/plating/abductor, /area/virtual_domain) "PB" = ( -/obj/item/organ/external/antennae, +/obj/item/organ/antennae, /turf/open/floor/plating/abductor, /area/virtual_domain) "Qp" = ( diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 53ac323b61cd5..2b6c1b3220679 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -358,10 +358,10 @@ //called in /obj/item/tank/jetpack/proc/turn_off() : () #define COMSIG_JETPACK_DEACTIVATED "jetpack_deactivated" -//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_ACTIVATED "jetmodule_activated" #define THRUSTER_ACTIVATION_FAILED (1<<0) -//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_DEACTIVATED "jetmodule_deactivated" // /obj/item/camera signals diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index b06bf36fdb8fa..718f9fc03fa9d 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -266,7 +266,7 @@ GLOBAL_LIST_INIT(mining_suit_allowed, list( /obj/item/kinetic_crusher, /obj/item/knife, /obj/item/mining_scanner, - /obj/item/organ/internal/monster_core, + /obj/item/organ/monster_core, /obj/item/storage/bag/ore, /obj/item/pickaxe, /obj/item/resonator, diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 954aec3235070..dc51fdd68dd4d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -257,10 +257,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define isorgan(A) (istype(A, /obj/item/organ)) -#define isinternalorgan(A) (istype(A, /obj/item/organ/internal)) - -#define isexternalorgan(A) (istype(A, /obj/item/organ/external)) - #define isclothing(A) (istype(A, /obj/item/clothing)) #define ispickedupmob(A) (istype(A, /obj/item/clothing/head/mob_holder)) // Checks if clothing item is actually a held mob diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index e04aead3464bc..c708cdf67dbd5 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -26,23 +26,23 @@ GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list( /// Blacklist of organs which should not appear when bioscrambled. /// Either will look terrible outside of intended host, give you magical powers, are irreversible, or kill you GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list ( - /obj/item/organ/external/pod_hair, - /obj/item/organ/external/spines, - /obj/item/organ/external/wings, - /obj/item/organ/external/wings/functional, - /obj/item/organ/internal/alien, - /obj/item/organ/internal/brain, - /obj/item/organ/internal/body_egg, - /obj/item/organ/internal/cyberimp, - /obj/item/organ/internal/ears/dullahan, - /obj/item/organ/internal/eyes/dullahan, - /obj/item/organ/internal/heart/cursed, - /obj/item/organ/internal/heart/demon, - /obj/item/organ/internal/lungs, - /obj/item/organ/internal/monster_core, - /obj/item/organ/internal/tongue/dullahan, - /obj/item/organ/internal/vocal_cords/colossus, - /obj/item/organ/internal/zombie_infection, + /obj/item/organ/pod_hair, + /obj/item/organ/spines, + /obj/item/organ/wings, + /obj/item/organ/wings/functional, + /obj/item/organ/alien, + /obj/item/organ/brain, + /obj/item/organ/body_egg, + /obj/item/organ/cyberimp, + /obj/item/organ/ears/dullahan, + /obj/item/organ/eyes/dullahan, + /obj/item/organ/heart/cursed, + /obj/item/organ/heart/demon, + /obj/item/organ/lungs, + /obj/item/organ/monster_core, + /obj/item/organ/tongue/dullahan, + /obj/item/organ/vocal_cords/colossus, + /obj/item/organ/zombie_infection, ))) /// List of body parts we can apply to people diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index b930c3711de34..f510d7a1a9410 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -30,6 +30,8 @@ #define ORGAN_PROMINENT (1<<11) /// An organ that is ostensibly dangerous when inside a body #define ORGAN_HAZARDOUS (1<<12) +/// This is an external organ, not an inner one. Used in several checks. +#define ORGAN_EXTERNAL (1<<13) /// Scarring on the right eye #define RIGHT_EYE_SCAR (1<<0) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index e648b1e1d99a3..08e54d92eed05 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -619,7 +619,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // example. Through years of training/abuse, their livers have taken // a liking to those substances. Steal a sec officer's liver, eat donuts good. -// These traits are applied to /obj/item/organ/internal/liver +// These traits are applied to /obj/item/organ/liver #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism" #define TRAIT_CULINARY_METABOLISM "culinary_metabolism" #define TRAIT_COMEDY_METABOLISM "comedy_metabolism" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index 04e5aaf13b316..9ee97b9f1572f 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -273,7 +273,7 @@ /** * Trait granted by [/mob/living/carbon/Initialize] and -* granted/removed by [/obj/item/organ/internal/tongue] +* granted/removed by [/obj/item/organ/tongue] * Used for ensuring that carbons without tongues cannot taste anything * so it is added in Initialize, and then removed when a tongue is inserted * and readded when a tongue is removed. diff --git a/code/__HELPERS/honkerblast.dm b/code/__HELPERS/honkerblast.dm index f49a5ca4aca29..4f1f6b71dd313 100644 --- a/code/__HELPERS/honkerblast.dm +++ b/code/__HELPERS/honkerblast.dm @@ -23,7 +23,7 @@ victim.Stun(100) victim.adjust_stutter(30 SECONDS) victim.set_jitter_if_lower(1000 SECONDS) - var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) ears?.adjustEarDamage(10, 15) to_chat(victim, "HONK") var/obj/item/clothing/shoes/victim_shoes = victim.get_item_by_slot(ITEM_SLOT_FEET) @@ -35,13 +35,13 @@ victim.Paralyze(20) victim.Stun(50) victim.set_jitter_if_lower(500 SECONDS) - var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) ears?.adjustEarDamage(7, 10) to_chat(victim, "HONK") for(var/mob/living/carbon/victim in lightly_honked) victim.Knockdown(20) victim.set_jitter_if_lower(200 SECONDS) - var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS) ears?.adjustEarDamage(4, 5) to_chat(victim, "HONK") diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 867f6f9e7649d..01d1e42013ff6 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -720,7 +720,7 @@ GLOBAL_LIST_INIT(skin_tone_names, list( mob_occupant = occupant else if(isorgan(occupant)) - var/obj/item/organ/internal/brain/brain = occupant + var/obj/item/organ/brain/brain = occupant mob_occupant = brain.brainmob return mob_occupant diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 296f1d79f8eb6..825c217d055cc 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -25,8 +25,8 @@ GLOBAL_LIST_INIT(part_choice_transhuman, list( "Right Arm" = /obj/item/bodypart/arm/right/robot, "Left Leg" = /obj/item/bodypart/leg/left/robot, "Right Leg" = /obj/item/bodypart/leg/right/robot, - "Robotic Voice Box" = /obj/item/organ/internal/tongue/robot, - "Flashlights for Eyes" = /obj/item/organ/internal/eyes/robotic/flashlight, + "Robotic Voice Box" = /obj/item/organ/tongue/robot, + "Flashlights for Eyes" = /obj/item/organ/eyes/robotic/flashlight, )) ///Hemiplegic Quirk diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index e112d376adf5d..21c95d2314dc7 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -125,8 +125,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/gun/energy/alien, /obj/item/hemostat/alien, /obj/item/melee/baton/abductor, - /obj/item/organ/internal/body_egg/alien_embryo, - /obj/item/organ/internal/heart/gland, + /obj/item/organ/body_egg/alien_embryo, + /obj/item/organ/heart/gland, /obj/item/radio/headset/abductor, /obj/item/retractor/alien, /obj/item/scalpel/alien, @@ -255,10 +255,10 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/grenade/spawnergrenade/spesscarp, /obj/item/knife/carp, /obj/item/nullrod/carp, - /obj/item/organ/internal/lungs/carp, - /obj/item/organ/internal/tongue/carp, - /obj/item/organ/internal/brain/carp, - /obj/item/organ/internal/heart/carp, + /obj/item/organ/lungs/carp, + /obj/item/organ/tongue/carp, + /obj/item/organ/brain/carp, + /obj/item/organ/heart/carp, /obj/item/storage/fancy/cigarettes/cigpack_carp, /obj/item/stack/sheet/animalhide/carp, /obj/item/toy/plush/carpplushie, @@ -430,7 +430,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/head/costume/lizard, /obj/item/clothing/shoes/cowboy/lizard, /obj/item/food/kebab/tail, - /obj/item/organ/external/tail/lizard, + /obj/item/organ/tail/lizard, /obj/item/reagent_containers/cup/glass/bottle/lizardwine, /obj/item/toy/plush/lizard_plushie, )), @@ -472,7 +472,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/effect/decal/remains/human, /obj/item/clothing/suit/armor/bone, /obj/item/food/meat/slab/human/mutant/skeleton, - /obj/item/organ/internal/tongue/bone, + /obj/item/organ/tongue/bone, /obj/item/stack/sheet/bone, )), "snakes" = typecacheof(list( diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index f08f2efde853e..b0d5e835907fd 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -671,7 +671,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART, "TRAIT_USED_ORGAN" = TRAIT_USED_ORGAN, ), - /obj/item/organ/internal/liver = list( + /obj/item/organ/liver = list( "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, @@ -684,7 +684,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, "TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM, ), - /obj/item/organ/internal/lungs = list( + /obj/item/organ/lungs = list( "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, ), /obj/machinery/modular_computer = list( diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 9745f1ac8c291..31c88b492d6eb 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -375,7 +375,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /obj/item/fishing_rod = list( "TRAIT_ROD_REMOVE_FISHING_DUD" = TRAIT_ROD_REMOVE_FISHING_DUD, ), - /obj/item/organ/internal/liver = list( + /obj/item/organ/liver = list( "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, @@ -387,7 +387,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, "TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM, ), - /obj/item/organ/internal/lungs = list( + /obj/item/organ/lungs = list( "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, ), )) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 749e630d1e74f..35014076db6b1 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -129,7 +129,7 @@ //Gas alerts // Gas alerts are continuously thrown/cleared by: -// * /obj/item/organ/internal/lungs/proc/check_breath() +// * /obj/item/organ/lungs/proc/check_breath() // * /mob/living/carbon/check_breath() // * /mob/living/carbon/human/check_breath() // * /datum/element/atmos_requirements/proc/on_non_stasis_life() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index cdf63cb68812c..922241321ab91 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -330,7 +330,7 @@ var/obj/item/bodypart/head/head = human_mob.get_bodypart(BODY_ZONE_HEAD) if(isnull(head)) blocked_slots |= ITEM_SLOT_HEAD|ITEM_SLOT_EARS|ITEM_SLOT_EYES|ITEM_SLOT_MASK - var/obj/item/organ/internal/eyes/eyes = human_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human_mob.get_organ_slot(ORGAN_SLOT_EYES) if(eyes?.no_glasses) blocked_slots |= ITEM_SLOT_EYES if(human_mob.bodyshape & BODYSHAPE_DIGITIGRADE) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index d5f8698b689a3..e50794aa6d310 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -843,7 +843,7 @@ candidates = living_players for(var/mob/living/carbon/human/candidate in candidates) if( \ - !candidate.get_organ_by_type(/obj/item/organ/internal/brain) \ + !candidate.get_organ_by_type(/obj/item/organ/brain) \ || candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \ || candidate.stat == DEAD \ || !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \ diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index 449cf11124abf..d43eb0dcd3b90 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -88,7 +88,7 @@ . = ..() if(!.) return - var/obj/item/organ/internal/cyberimp/eyes/hud/hud_implant = target + var/obj/item/organ/cyberimp/eyes/hud/hud_implant = target hud_implant.toggle_hud(owner) /datum/action/item_action/wheelys diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 71e3d5f398114..92511015a37e9 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -126,8 +126,8 @@ have ways of interacting with a specific mob and control it. /datum/ai_controller/monkey/proc/set_trip_mode(mode = TRUE) var/mob/living/carbon/regressed_monkey = pawn var/brain = regressed_monkey.get_organ_slot(ORGAN_SLOT_BRAIN) - if(istype(brain, /obj/item/organ/internal/brain/primate)) // In case we are a monkey AI in a human brain by who was previously controlled by a client but it now not by some marvel - var/obj/item/organ/internal/brain/primate/monkeybrain = brain + if(istype(brain, /obj/item/organ/brain/primate)) // In case we are a monkey AI in a human brain by who was previously controlled by a client but it now not by some marvel + var/obj/item/organ/brain/primate/monkeybrain = brain monkeybrain.tripping = mode ///re-used behavior pattern by monkeys for finding a weapon diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index c5d08591da900..a96a13f991ae1 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -8,6 +8,11 @@ ///The color this organ draws with. Updated by bodypart/inherit_color() var/draw_color + ///Override of the color of the organ, from dye sprays + var/dye_color + ///Can this bodypart overlay be dyed? + var/dyable = FALSE + ///Where does this organ inherit its color from? var/color_source = ORGAN_COLOR_INHERIT ///Take on the dna/preference from whoever we're gonna be inserted in @@ -85,7 +90,7 @@ return appearance /datum/bodypart_overlay/mutant/color_image(image/overlay, layer, obj/item/bodypart/limb) - overlay.color = sprite_datum.color_src ? draw_color : null + overlay.color = sprite_datum.color_src ? (dye_color || draw_color) : null /datum/bodypart_overlay/mutant/added_to_limb(obj/item/bodypart/limb) inherit_color(limb) @@ -105,7 +110,7 @@ . = list() . += "[get_base_icon_state()]" . += "[feature_key]" - . += "[draw_color]" + . += "[dye_color || draw_color]" return . ///Return a dumb glob list for this specific feature (called from parse_sprite) @@ -163,3 +168,10 @@ else CRASH("External organ [type] had fetch_sprite_datum called with a null accessory name!") +///From dye sprays. Set the dye_color (draw_color override) of this organ to a new value. +/datum/bodypart_overlay/mutant/proc/set_dye_color(new_color, obj/item/organ/organ) + dye_color = new_color + if(organ.owner) + organ.owner.update_body_parts() + else + organ.bodypart_owner?.update_icon_dropped() diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 8f0f8cfb04893..422ad075ea075 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -8,7 +8,7 @@ var/desc = "A trauma caused by brain damage, which causes issues to the patient." var/scan_desc = "generic brain trauma" //description when detected by a health scanner var/mob/living/carbon/owner //the poor bastard - var/obj/item/organ/internal/brain/brain //the poor bastard's brain + var/obj/item/organ/brain/brain //the poor bastard's brain var/gain_text = span_notice("You feel traumatized.") var/lose_text = span_notice("You no longer feel traumatized.") var/can_gain = TRUE diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 198b674631750..195d33c4b4b8d 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -191,7 +191,7 @@ var/codeword var/objective -/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/internal/brain/B, _permanent, _codeword, _objective) +/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/brain/B, _permanent, _codeword, _objective) ..() if(_codeword) codeword = _codeword diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index f1aa865e0cbc1..0602624dbb84f 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -22,7 +22,7 @@ result = /obj/item/toy/plush/moth reqs = list( /obj/item/stack/sheet/animalhide/mothroach = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/heart = 1, /obj/item/stack/sheet/cloth = 3, ) category = CAT_ENTERTAINMENT diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 2546106d40327..ef8f1b247873f 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -156,7 +156,7 @@ /datum/crafting_recipe/flashlight_eyes name = "Flashlight Eyes" - result = /obj/item/organ/internal/eyes/robotic/flashlight + result = /obj/item/organ/eyes/robotic/flashlight time = 10 reqs = list( /obj/item/flashlight = 2, diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index b8771257cfa15..a8805c56577c4 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -37,10 +37,10 @@ name = "Tail Club" result = /obj/item/tailclub reqs = list( - /obj/item/organ/external/tail/lizard = 1, + /obj/item/organ/tail/lizard = 1, /obj/item/stack/sheet/iron = 1, ) - blacklist = list(/obj/item/organ/external/tail/lizard/fake) + blacklist = list(/obj/item/organ/tail/lizard/fake) time = 4 SECONDS category = CAT_WEAPON_MELEE @@ -63,10 +63,10 @@ name = "Liz O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip reqs = list( - /obj/item/organ/external/tail/lizard = 1, + /obj/item/organ/tail/lizard = 1, /obj/item/stack/cable_coil = 1, ) - blacklist = list(/obj/item/organ/external/tail/lizard/fake) + blacklist = list(/obj/item/organ/tail/lizard/fake) time = 4 SECONDS category = CAT_WEAPON_MELEE @@ -74,7 +74,7 @@ name = "Cat O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip/kitty reqs = list( - /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/tail/cat = 1, /obj/item/stack/cable_coil = 1, ) time = 4 SECONDS diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm index 09c8455a77b39..21abedb8b47f8 100644 --- a/code/datums/components/crafting/robot.dm +++ b/code/datums/components/crafting/robot.dm @@ -184,7 +184,7 @@ /obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, /obj/item/stack/sheet/glass = 1, - /obj/item/organ/internal/heart/ethereal = 1, + /obj/item/organ/heart/ethereal = 1, ) category = CAT_ROBOT diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 2196a88325ac2..45c021aca6ce3 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -253,7 +253,7 @@ name = "Lizard Cloche Hat" result = /obj/item/clothing/head/costume/lizard time = 1 SECONDS - reqs = list(/obj/item/organ/external/tail/lizard = 1) + reqs = list(/obj/item/organ/tail/lizard = 1) category = CAT_CLOTHING /datum/crafting_recipe/lizardhat_alternate @@ -268,8 +268,8 @@ result = /obj/item/clothing/head/costume/kitty/genuine time = 1 SECONDS reqs = list( - /obj/item/organ/external/tail/cat = 1, - /obj/item/organ/internal/ears/cat = 1, + /obj/item/organ/tail/cat = 1, + /obj/item/organ/ears/cat = 1, ) category = CAT_CLOTHING diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 554e3d611ba2d..053782f6ed633 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -162,7 +162,7 @@ // For carbonss we also want to clear out the stomach of any holywater if(iscarbon(target)) var/mob/living/carbon/carbon_target = target - var/obj/item/organ/internal/stomach/belly = carbon_target.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = carbon_target.get_organ_slot(ORGAN_SLOT_STOMACH) if(belly) holy_to_unholy += belly.reagents.get_reagent_amount(/datum/reagent/water/holywater) belly.reagents.del_reagent(/datum/reagent/water/holywater) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index cfd04fc3ac2b7..6ad197b7c00cd 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -499,7 +499,7 @@ Behavior that's still missing from this component that original food items had t //Invoke the eater's stomach's after_eat callback if valid if(iscarbon(eater)) var/mob/living/carbon/carbon_eater = eater - var/obj/item/organ/internal/stomach/stomach = carbon_eater.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/stomach = carbon_eater.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.after_eat(owner) diff --git a/code/datums/components/ghostrole_on_revive.dm b/code/datums/components/ghostrole_on_revive.dm index cc09d99643bab..d9638b2d46a6f 100644 --- a/code/datums/components/ghostrole_on_revive.dm +++ b/code/datums/components/ghostrole_on_revive.dm @@ -17,10 +17,10 @@ prepare_mob(parent) return - if(!istype(parent, /obj/item/organ/internal/brain)) + if(!istype(parent, /obj/item/organ/brain)) return COMPONENT_INCOMPATIBLE - var/obj/item/organ/internal/brain/brein = parent + var/obj/item/organ/brain/brein = parent if(brein.owner) prepare_mob(brein.owner) else @@ -34,7 +34,7 @@ if(iscarbon(liver)) var/mob/living/carbon/carbon = liver - var/obj/item/organ/brain = carbon.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain = carbon.get_organ_by_type(/obj/item/organ/brain) if(brain) RegisterSignal(brain, COMSIG_ORGAN_REMOVED, PROC_REF(on_remove)) @@ -57,7 +57,7 @@ RegisterSignal(brein, COMSIG_ORGAN_IMPLANTED, PROC_REF(prepare_mob_from_brain)) UnregisterSignal(brein, COMSIG_ORGAN_REMOVED) -/datum/component/ghostrole_on_revive/proc/prepare_mob_from_brain(obj/item/organ/internal/brain/brein, mob/living/owner) +/datum/component/ghostrole_on_revive/proc/prepare_mob_from_brain(obj/item/organ/brain/brein, mob/living/owner) SIGNAL_HANDLER UnregisterSignal(brein, COMSIG_ORGAN_IMPLANTED) @@ -111,8 +111,8 @@ var/mob/living/living if(isliving(parent)) living = parent - else if(istype(parent, /obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/brain = parent + else if(istype(parent, /obj/item/organ/brain)) + var/obj/item/organ/brain/brain = parent living = brain.owner living?.med_hud_set_status() diff --git a/code/datums/components/heart_eater.dm b/code/datums/components/heart_eater.dm index 722c4b1636d79..122716b3be5b9 100644 --- a/code/datums/components/heart_eater.dm +++ b/code/datums/components/heart_eater.dm @@ -44,7 +44,7 @@ /datum/component/heart_eater/proc/prepare_species(mob/living/carbon/human/eater) if(eater.get_liked_foodtypes() & GORE) return - var/obj/item/organ/internal/tongue/eater_tongue = eater.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/eater_tongue = eater.get_organ_slot(ORGAN_SLOT_TONGUE) if(!eater_tongue) return eater_tongue.disliked_foodtypes &= ~GORE @@ -62,10 +62,10 @@ if(get_area(eater) == GLOB.areas_by_type[/area/centcom/wizard_station]) return - if(!istype(what_we_ate, /obj/item/organ/internal/heart)) + if(!istype(what_we_ate, /obj/item/organ/heart)) return - var/obj/item/organ/internal/heart/we_ate_heart = what_we_ate - var/obj/item/organ/internal/heart/previous_heart = last_heart_we_ate?.resolve() + var/obj/item/organ/heart/we_ate_heart = what_we_ate + var/obj/item/organ/heart/previous_heart = last_heart_we_ate?.resolve() if(we_ate_heart == previous_heart) return if (!HAS_TRAIT(we_ate_heart, TRAIT_USED_ORGAN)) diff --git a/code/datums/components/ling_decoy_brain.dm b/code/datums/components/ling_decoy_brain.dm index 917e8f2fbbd7c..d6368aeee0e71 100644 --- a/code/datums/components/ling_decoy_brain.dm +++ b/code/datums/components/ling_decoy_brain.dm @@ -6,7 +6,7 @@ VAR_FINAL/datum/action/changeling/mmi_talk/talk_action /datum/component/ling_decoy_brain/Initialize(datum/antagonist/changeling/ling) - if(!istype(parent, /obj/item/organ/internal/brain)) + if(!istype(parent, /obj/item/organ/brain)) return COMPONENT_INCOMPATIBLE if(isnull(ling)) stack_trace("[type] instantiated without a changeling to link to.") @@ -22,13 +22,13 @@ return ..() /datum/component/ling_decoy_brain/RegisterWithParent() - var/obj/item/organ/internal/brain/ling_brain = parent + var/obj/item/organ/brain/ling_brain = parent ling_brain.organ_flags &= ~ORGAN_VITAL ling_brain.decoy_override = TRUE RegisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi)) /datum/component/ling_decoy_brain/UnregisterFromParent() - var/obj/item/organ/internal/brain/ling_brain = parent + var/obj/item/organ/brain/ling_brain = parent ling_brain.organ_flags |= ORGAN_VITAL ling_brain.decoy_override = FALSE UnregisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi)) @@ -38,7 +38,7 @@ * * Unfortunately this is hooked on Entering rather than its own dedicated MMI signal becuase MMI code is a fuck */ -/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/internal/brain/source, atom/entering, atom/old_loc, ...) +/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/brain/source, atom/entering, atom/old_loc, ...) SIGNAL_HANDLER var/mob/living/the_real_ling = parent_ling.owner.current diff --git a/code/datums/components/manual_blinking.dm b/code/datums/components/manual_blinking.dm index 67229a8b85f5f..f7d7d65e5d144 100644 --- a/code/datums/components/manual_blinking.dm +++ b/code/datums/components/manual_blinking.dm @@ -1,7 +1,7 @@ /datum/component/manual_blinking dupe_mode = COMPONENT_DUPE_UNIQUE - var/obj/item/organ/internal/eyes/E + var/obj/item/organ/eyes/E var/warn_grace = FALSE var/warn_dying = FALSE var/last_blink @@ -69,18 +69,18 @@ /datum/component/manual_blinking/proc/check_added_organ(mob/who_cares, obj/item/organ/O) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/new_eyes = O + var/obj/item/organ/eyes/new_eyes = O - if(istype(new_eyes,/obj/item/organ/internal/eyes)) + if(istype(new_eyes,/obj/item/organ/eyes)) E = new_eyes START_PROCESSING(SSdcs, src) /datum/component/manual_blinking/proc/check_removed_organ(mob/who_cares, obj/item/organ/O) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/bye_beyes = O // oh come on, that's pretty good + var/obj/item/organ/eyes/bye_beyes = O // oh come on, that's pretty good - if(istype(bye_beyes, /obj/item/organ/internal/eyes)) + if(istype(bye_beyes, /obj/item/organ/eyes)) E = null STOP_PROCESSING(SSdcs, src) diff --git a/code/datums/components/manual_breathing.dm b/code/datums/components/manual_breathing.dm index d8d4fea07d9ec..8e5f096766a92 100644 --- a/code/datums/components/manual_breathing.dm +++ b/code/datums/components/manual_breathing.dm @@ -1,7 +1,7 @@ /datum/component/manual_breathing dupe_mode = COMPONENT_DUPE_UNIQUE - var/obj/item/organ/internal/lungs/L + var/obj/item/organ/lungs/L var/warn_grace = FALSE var/warn_dying = FALSE var/last_breath @@ -71,18 +71,18 @@ /datum/component/manual_breathing/proc/check_added_organ(mob/who_cares, obj/item/organ/O) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/new_lungs = O + var/obj/item/organ/eyes/new_lungs = O - if(istype(new_lungs,/obj/item/organ/internal/lungs)) + if(istype(new_lungs,/obj/item/organ/lungs)) L = new_lungs START_PROCESSING(SSdcs, src) /datum/component/manual_breathing/proc/check_removed_organ(mob/who_cares, obj/item/organ/O) SIGNAL_HANDLER - var/obj/item/organ/internal/lungs/old_lungs = O + var/obj/item/organ/lungs/old_lungs = O - if(istype(old_lungs, /obj/item/organ/internal/lungs)) + if(istype(old_lungs, /obj/item/organ/lungs)) L = null STOP_PROCESSING(SSdcs, src) diff --git a/code/datums/components/manual_heart.dm b/code/datums/components/manual_heart.dm index 09448acfc6722..d8d7485490029 100644 --- a/code/datums/components/manual_heart.dm +++ b/code/datums/components/manual_heart.dm @@ -56,7 +56,7 @@ pump_action.Grant(parent) var/mob/living/carbon/carbon_parent = parent - var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) if(parent_heart && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD) START_PROCESSING(SSdcs, src) COOLDOWN_START(src, heart_timer, pump_delay) @@ -126,7 +126,7 @@ /datum/component/manual_heart/proc/check_added_organ(mob/organ_owner, obj/item/organ/new_organ) SIGNAL_HANDLER - var/obj/item/organ/internal/heart/new_heart = new_organ + var/obj/item/organ/heart/new_heart = new_organ if(!istype(new_heart) || !check_valid()) return @@ -141,7 +141,7 @@ /datum/component/manual_heart/proc/check_removed_organ(mob/organ_owner, obj/item/organ/removed_organ) SIGNAL_HANDLER - var/obj/item/organ/internal/heart/removed_heart = removed_organ + var/obj/item/organ/heart/removed_heart = removed_organ if(istype(removed_heart)) pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS) @@ -150,7 +150,7 @@ ///Helper proc to check if processing can be restarted. /datum/component/manual_heart/proc/check_valid() var/mob/living/carbon/carbon_parent = parent - var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART) return !isnull(parent_heart) && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD ///Action to pump your heart. Cooldown will always be set to 1 second less than the pump delay. @@ -171,7 +171,7 @@ var/mob/living/carbon/heart_haver = owner if(!istype(heart_haver) || HAS_TRAIT(heart_haver, TRAIT_NOBLOOD) || heart_haver.stat == DEAD) return FALSE - var/obj/item/organ/internal/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART) if(isnull(heart_havers_heart)) return FALSE return ..() diff --git a/code/datums/components/phylactery.dm b/code/datums/components/phylactery.dm index 572f816b5ad22..9c96416f8002c 100644 --- a/code/datums/components/phylactery.dm +++ b/code/datums/components/phylactery.dm @@ -169,7 +169,7 @@ var/mob/living/carbon/human/lich = new(parent_turf) ADD_TRAIT(lich, TRAIT_NO_SOUL, LICH_TRAIT) - var/obj/item/organ/internal/brain/new_lich_brain = lich.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/new_lich_brain = lich.get_organ_slot(ORGAN_SLOT_BRAIN) if(new_lich_brain) // Prevent MMI cheese new_lich_brain.organ_flags &= ~ORGAN_VITAL new_lich_brain.decoy_override = TRUE @@ -201,7 +201,7 @@ var/mob/living/carbon/carbon_body = corpse for(var/obj/item/organ/to_drop as anything in carbon_body.organs) // Skip the brain - it can disappear, we don't need it anymore - if(istype(to_drop, /obj/item/organ/internal/brain)) + if(istype(to_drop, /obj/item/organ/brain)) continue // For the rest, drop all the organs onto the floor (for style) diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index 054a4de4af0f0..478de762afc6c 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -75,7 +75,7 @@ SIGNAL_HANDLER var/mob/living/carbon/carbon_parent = parent - var/obj/item/organ/internal/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) tongue.temp_say_mod = "signs" //this speech relies on hands, which we have our own way of garbling speech when they're occupied, so we can have this always on @@ -102,7 +102,7 @@ SIGNAL_HANDLER var/mob/living/carbon/carbon_parent = parent - var/obj/item/organ/internal/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) tongue.temp_say_mod = "" REMOVE_TRAIT(carbon_parent, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_HANDS) @@ -128,9 +128,9 @@ /datum/component/sign_language/proc/on_added_organ(mob/living/source, obj/item/organ/new_organ) SIGNAL_HANDLER - if(!istype(new_organ, /obj/item/organ/internal/tongue)) + if(!istype(new_organ, /obj/item/organ/tongue)) return - var/obj/item/organ/internal/tongue/new_tongue = new_organ + var/obj/item/organ/tongue/new_tongue = new_organ new_tongue.temp_say_mod = "signs" /// Signal proc for [COMSIG_MOB_TRY_SPEECH] @@ -238,7 +238,7 @@ return SPELL_INVOCATION_ALWAYS_SUCCEED /// Signal proc for [COMSIG_LIVING_TREAT_MESSAGE] -/// Changes our message based on conditions that limit or alter our ability to communicate +/// Changes our message based on conditions that limit or alter our ability to communicate /datum/component/sign_language/proc/on_treat_living_message(atom/movable/source, list/message_args) SIGNAL_HANDLER diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index afd8cce49e8c7..ca1bb82ace785 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -46,7 +46,7 @@ else if(isstructure(parent)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(use_squeak)) - if(istype(parent, /obj/item/organ/internal/liver)) + if(istype(parent, /obj/item/organ/liver)) // Liver squeaking is depending on them functioning like a clown's liver RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), PROC_REF(on_comedy_metabolism_removal)) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 53a0797c2e1c0..4dac194c158b2 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -130,7 +130,7 @@ ) return - var/obj/item/organ/internal/tongue/licking_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/licking_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE) if(licking_tongue) dust_mob(source, user, span_danger("As [user] hesitantly leans in and licks [atom_source] everything goes silent before [user.p_their()] body starts to glow and burst into flames before flashing to ash!"), diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index baf1efaee1dd5..8c5e10ddd655a 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -399,13 +399,13 @@ if(HAS_TRAIT(tackle_target, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // riot armor and such defense_mod += 5 - var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(HAS_TRAIT(tackle_target, TRAIT_TACKLING_TAILED_DEFENDER) && !el_tail) defense_mod -= 1 if(el_tail && (el_tail.wag_flags & WAG_WAGGING)) // lizard tail wagging is robust and can swat away assailants! defense_mod += 1 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = tackle_target.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = tackle_target.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) defense_mod += potential_spine.strength_bonus @@ -434,14 +434,14 @@ attack_mod += 2 if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER)) - var/obj/item/organ/external/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) if(!sacker_moth_wing || sacker_moth_wing.burnt) attack_mod -= 2 - var/obj/item/organ/external/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) if(sacker_wing) attack_mod += 2 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = sacker.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = sacker.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) attack_mod += potential_spine.strength_bonus @@ -508,7 +508,7 @@ if(HAS_TRAIT(user, TRAIT_HEAD_INJURY_BLOCKED)) oopsie_mod -= 6 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) // Can't snap that spine if it's made of metal. + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) // Can't snap that spine if it's made of metal. if(istype(potential_spine)) oopsie_mod -= potential_spine.strength_bonus diff --git a/code/datums/components/vision_hurting.dm b/code/datums/components/vision_hurting.dm index acf2d186bb433..925395f3d39b6 100644 --- a/code/datums/components/vision_hurting.dm +++ b/code/datums/components/vision_hurting.dm @@ -16,7 +16,7 @@ for(var/mob/living/carbon/viewer in viewers(parent)) if(viewer.is_blind() || viewer.get_eye_protection() >= damage_per_second) continue - var/obj/item/organ/internal/eyes/burning_orbs = locate() in viewer.organs + var/obj/item/organ/eyes/burning_orbs = locate() in viewer.organs if(!burning_orbs) continue burning_orbs.apply_organ_damage(damage_per_second * seconds_per_tick) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index c93d94023df91..bf096a9fb4ad3 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -45,7 +45,7 @@ return var/mob/living/carbon/infected_mob = advanced_disease.affected_mob - var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) switch(advanced_disease.stage) if(3, 4) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 79c4909d27702..2848ec484b3cf 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -95,13 +95,13 @@ switch(advanced_disease.stage) if(4, 5) if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS)) - var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS) ears.adjustEarDamage(-4, -4) if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES)) return - var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) infected_mob.adjust_temp_blindness(-4 SECONDS) infected_mob.adjust_eye_blur(-4 SECONDS) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index e53faf5bac51e..cc9e70a24213d 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -42,7 +42,7 @@ return var/mob/living/carbon/infected_mob = source_disease.affected_mob - var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES) switch(source_disease.stage) if(1, 2) diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index aab0fcded1d67..f7348c38cb889 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -37,9 +37,9 @@ if(isopenturf(OT)) OT.MakeSlippery(TURF_WET_LUBE, 100) if(4) - var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in affected_mob.organs + var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.organs if(!eyes && SPT_PROB(2.5, seconds_per_tick)) - var/obj/item/organ/internal/eyes/snail/new_eyes = new() + var/obj/item/organ/eyes/snail/new_eyes = new() new_eyes.Insert(affected_mob) affected_mob.visible_message(span_warning("[affected_mob]'s eyes fall out, with snail eyes taking its place!"), \ span_userdanger("You scream in pain as your eyes are pushed out by your new snail eyes!")) @@ -57,9 +57,9 @@ affected_mob.emote("scream") return - var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in affected_mob.organs + var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.organs if(!tongue && SPT_PROB(2.5, seconds_per_tick)) - var/obj/item/organ/internal/tongue/snail/new_tongue = new() + var/obj/item/organ/tongue/snail/new_tongue = new() new_tongue.Insert(affected_mob) to_chat(affected_mob, span_userdanger("You feel your speech slow down...")) return @@ -84,13 +84,13 @@ . = ..() if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening var/mob/living/carbon/human/H = affected_mob - var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in H.organs + var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.organs if(tongue) - var/obj/item/organ/internal/tongue/new_tongue = new H.dna.species.mutanttongue () + var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue () new_tongue.Insert(H) - var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in H.organs + var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in H.organs if(eyes) - var/obj/item/organ/internal/eyes/new_eyes = new H.dna.species.mutanteyes () + var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes () new_eyes.Insert(H) var/obj/item/storage/backpack/bag = H.get_item_by_slot(ITEM_SLOT_BACK) if(istype(bag, /obj/item/storage/backpack/snail)) diff --git a/code/datums/diseases/parasitic_infection.dm b/code/datums/diseases/parasitic_infection.dm index 64bb59f01fd96..53b61266271fa 100644 --- a/code/datums/diseases/parasitic_infection.dm +++ b/code/datums/diseases/parasitic_infection.dm @@ -43,7 +43,7 @@ to_chat(affected_mob, span_warning("You feel much, MUCH lighter!")) affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20) // disease code already checks if the liver exists otherwise it is cured - var/obj/item/organ/internal/liver/affected_liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/affected_liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) affected_liver.Remove(affected_mob) affected_liver.forceMove(get_turf(affected_mob)) cure() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 3ccbc7b71ea25..72dc12dd0d024 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -907,7 +907,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /mob/living/carbon/human/proc/something_horrible_mindmelt() if(!is_blind()) - var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in organs + var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in organs if(!eyes) return eyes.Remove(src) diff --git a/code/datums/elements/corrupted_organ.dm b/code/datums/elements/corrupted_organ.dm index 504c6851e00c6..fda892887cacc 100644 --- a/code/datums/elements/corrupted_organ.dm +++ b/code/datums/elements/corrupted_organ.dm @@ -2,9 +2,9 @@ /// Mostly just does something spooky when it is removed /datum/element/corrupted_organ -/datum/element/corrupted_organ/Attach(datum/target) +/datum/element/corrupted_organ/Attach(obj/item/organ/target) . = ..() - if (!isinternalorgan(target)) + if (!istype(target) || (target.organ_flags & ORGAN_EXTERNAL)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_removed)) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index f1b3465205928..ac69e8cc18ed5 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -26,7 +26,7 @@ /datum/element/earhealing/process(seconds_per_tick) for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] - var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears)) continue ears.deaf = max(ears.deaf - 0.25 * seconds_per_tick, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged diff --git a/code/datums/elements/eyestab.dm b/code/datums/elements/eyestab.dm index a6757f67fb39b..7821b26fab8f2 100644 --- a/code/datums/elements/eyestab.dm +++ b/code/datums/elements/eyestab.dm @@ -77,7 +77,7 @@ target.add_mood_event("eye_stab", /datum/mood_event/eye_stab) log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])") - var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) if (!eyes) return diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm index df857cdd6efe6..b65d44096bd38 100644 --- a/code/datums/elements/frozen.dm +++ b/code/datums/elements/frozen.dm @@ -20,11 +20,11 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 target_obj.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) target_obj.alpha -= 25 - if (isinternalorgan(target)) - var/obj/item/organ/internal/organ = target + if(isorgan(target)) + var/obj/item/organ/organ = target organ.organ_flags |= ORGAN_FROZEN else if (isbodypart(target)) - for(var/obj/item/organ/internal/organ in target_obj.contents) + for(var/obj/item/organ/organ in target_obj.contents) organ.organ_flags |= ORGAN_FROZEN RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) @@ -40,11 +40,11 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 obj_source.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix) obj_source.alpha += 25 - if (isinternalorgan(source)) - var/obj/item/organ/internal/organ = source + if (isorgan(source)) + var/obj/item/organ/organ = source organ.organ_flags &= ~ORGAN_FROZEN else if (isbodypart(source)) - for(var/obj/item/organ/internal/organ in obj_source.contents) + for(var/obj/item/organ/organ in obj_source.contents) organ.organ_flags &= ~ORGAN_FROZEN return ..() diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm index 78c0ba7654d69..52b2e00e19c93 100644 --- a/code/datums/elements/kneejerk.dm +++ b/code/datums/elements/kneejerk.dm @@ -28,7 +28,7 @@ var/selected_zone = user.zone_selected var/obj/item/bodypart/leg/right = target.get_bodypart(BODY_ZONE_R_LEG) var/obj/item/bodypart/leg/left = target.get_bodypart(BODY_ZONE_L_LEG) - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!ishuman(target)) return diff --git a/code/datums/instability_meltdown.dm b/code/datums/instability_meltdown.dm index d8e6fbd77ac9e..4e3a82fd376b5 100644 --- a/code/datums/instability_meltdown.dm +++ b/code/datums/instability_meltdown.dm @@ -72,8 +72,9 @@ /datum/instability_meltdown/organ_vomit/meltdown(mob/living/carbon/human/victim) var/list/elligible_organs = list() - for(var/obj/item/organ/internal/internal_organ in victim.organs) //make sure we dont get an implant or cavity item - elligible_organs += internal_organ + for(var/obj/item/organ/organ as anything in victim.organs) //make sure we dont get an implant or cavity item + if(!(organ.organ_flags & ORGAN_EXTERNAL)) + elligible_organs += organ victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10) if(!elligible_organs.len) return diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 9d6252855d3e1..e46467327ede7 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -107,7 +107,7 @@ if(honor_check(defender)) var/strength_bonus = HAS_TRAIT(attacker, TRAIT_STRENGTH) ? 2 : 0 //Investing into genetic strength improvements makes you a better boxer - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat + var/obj/item/organ/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat if(istype(potential_spine)) strength_bonus *= potential_spine.strength_bonus diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index e09a8337b72a4..bbfdc8b3fa5f4 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -560,7 +560,7 @@ explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) for(var/mob/living/carbon/human/splashed in view(2, owner)) - var/obj/item/organ/internal/eyes/eyes = splashed.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = splashed.get_organ_slot(ORGAN_SLOT_EYES) if(eyes) to_chat(splashed, span_userdanger("You are blinded by a shower of blood!")) eyes.apply_organ_damage(5) @@ -588,7 +588,7 @@ if(.)//cant add return TRUE - var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) if(brain) brain.Remove(owner, special = TRUE, movement_flags = NO_ID_TRANSFER) brain.zone = BODY_ZONE_CHEST @@ -613,7 +613,7 @@ if(!successful) stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)") return TRUE - var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) if(brain) brain.Remove(owner, special = TRUE, movement_flags = NO_ID_TRANSFER) brain.zone = initial(brain.zone) diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm index d5db738213fec..c6a48a32a144d 100644 --- a/code/datums/mutations/tongue_spike.dm +++ b/code/datums/mutations/tongue_spike.dm @@ -30,7 +30,7 @@ to_chat(cast_on, span_notice("You concentrate really hard, but nothing happens.")) return - var/obj/item/organ/internal/tongue/to_fire = locate() in cast_on.organs + var/obj/item/organ/tongue/to_fire = locate() in cast_on.organs if(!to_fire) to_chat(cast_on, span_notice("You don't have a tongue to shoot!")) return diff --git a/code/datums/quirks/negative_quirks/addict.dm b/code/datums/quirks/negative_quirks/addict.dm index 5eb88795bdc6c..62262dc3bf7e4 100644 --- a/code/datums/quirks/negative_quirks/addict.dm +++ b/code/datums/quirks/negative_quirks/addict.dm @@ -145,15 +145,15 @@ quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name)) // smoker lungs have 25% less health and healing var/mob/living/carbon/carbon_holder = quirk_holder - var/obj/item/organ/internal/lungs/smoker_lungs = null - var/obj/item/organ/internal/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/smoker_lungs = null + var/obj/item/organ/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS) if(old_lungs && IS_ORGANIC_ORGAN(old_lungs)) if(isplasmaman(carbon_holder)) - smoker_lungs = /obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker + smoker_lungs = /obj/item/organ/lungs/plasmaman/plasmaman_smoker else if(isethereal(carbon_holder)) - smoker_lungs = /obj/item/organ/internal/lungs/ethereal/ethereal_smoker + smoker_lungs = /obj/item/organ/lungs/ethereal/ethereal_smoker else - smoker_lungs = /obj/item/organ/internal/lungs/smoker_lungs + smoker_lungs = /obj/item/organ/lungs/smoker_lungs if(!isnull(smoker_lungs)) smoker_lungs = new smoker_lungs smoker_lungs.Insert(carbon_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -217,7 +217,7 @@ quirk_holder.add_mob_memory(/datum/memory/key/quirk_alcoholic, protagonist = quirk_holder, preferred_brandy = initial(favorite_alcohol.name)) // alcoholic livers have 25% less health and healing - var/obj/item/organ/internal/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER) if(alcohol_liver && IS_ORGANIC_ORGAN(alcohol_liver)) // robotic livers aren't affected alcohol_liver.maxHealth = alcohol_liver.maxHealth * 0.75 alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75 diff --git a/code/datums/quirks/negative_quirks/photophobia.dm b/code/datums/quirks/negative_quirks/photophobia.dm index b543aeda07631..987b43fdcf37d 100644 --- a/code/datums/quirks/negative_quirks/photophobia.dm +++ b/code/datums/quirks/negative_quirks/photophobia.dm @@ -27,22 +27,22 @@ COMSIG_CARBON_LOSE_ORGAN, COMSIG_MOVABLE_MOVED,)) quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA) - var/obj/item/organ/internal/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES) if(istype(normal_eyes)) normal_eyes.flash_protect = initial(normal_eyes.flash_protect) -/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/internal/eyes/sensitive_eyes) +/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/eyes/sensitive_eyes) SIGNAL_HANDLER if(!istype(sensitive_eyes)) return update_eyes(sensitive_eyes) -/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/internal/eyes/target_eyes) +/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/eyes/target_eyes) if(!istype(target_eyes)) return target_eyes.flash_protect = max(target_eyes.flash_protect - 1, FLASH_PROTECTION_HYPER_SENSITIVE) -/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/internal/eyes/normal_eyes) +/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/eyes/normal_eyes) SIGNAL_HANDLER if(!istype(normal_eyes)) return diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm index 4a377699b40ac..2b0f20b0d9f84 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_organ.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm @@ -46,16 +46,16 @@ var/obj/item/organ/prosthetic switch(organ_slot) if(ORGAN_SLOT_HEART) - prosthetic = new /obj/item/organ/internal/heart/cybernetic/surplus + prosthetic = new /obj/item/organ/heart/cybernetic/surplus slot_string = "heart" if(ORGAN_SLOT_LUNGS) - prosthetic = new /obj/item/organ/internal/lungs/cybernetic/surplus + prosthetic = new /obj/item/organ/lungs/cybernetic/surplus slot_string = "lungs" if(ORGAN_SLOT_LIVER) - prosthetic = new /obj/item/organ/internal/liver/cybernetic/surplus + prosthetic = new /obj/item/organ/liver/cybernetic/surplus slot_string = "liver" if(ORGAN_SLOT_STOMACH) - prosthetic = new /obj/item/organ/internal/stomach/cybernetic/surplus + prosthetic = new /obj/item/organ/stomach/cybernetic/surplus slot_string = "stomach" medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \ Removal of these organs is known to be dangerous to the patient as well as the practitioner." diff --git a/code/datums/quirks/negative_quirks/scarred_eye.dm b/code/datums/quirks/negative_quirks/scarred_eye.dm index 49628545cfa0d..11b3f16f8aae5 100644 --- a/code/datums/quirks/negative_quirks/scarred_eye.dm +++ b/code/datums/quirks/negative_quirks/scarred_eye.dm @@ -35,7 +35,7 @@ /datum/quirk/item_quirk/scarred_eye/add(client/client_source) var/mob/living/carbon/human/human_owner = quirk_holder - var/obj/item/organ/internal/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES) if (isnull(eyes)) return @@ -57,7 +57,7 @@ /datum/quirk/item_quirk/scarred_eye/remove() var/mob/living/carbon/human/human_owner = quirk_holder - var/obj/item/organ/internal/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES) if (!isnull(eyes)) eyes.fix_scar(RIGHT_EYE_SCAR) eyes.fix_scar(LEFT_EYE_SCAR) diff --git a/code/datums/quirks/negative_quirks/tin_man.dm b/code/datums/quirks/negative_quirks/tin_man.dm index e6d411bc772f1..0afd8874bed49 100644 --- a/code/datums/quirks/negative_quirks/tin_man.dm +++ b/code/datums/quirks/negative_quirks/tin_man.dm @@ -11,10 +11,10 @@ /datum/quirk/tin_man/add_unique(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder var/static/list/organ_slots = list( - ORGAN_SLOT_HEART = /obj/item/organ/internal/heart/cybernetic/surplus, - ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs/cybernetic/surplus, - ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver/cybernetic/surplus, - ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach/cybernetic/surplus, + ORGAN_SLOT_HEART = /obj/item/organ/heart/cybernetic/surplus, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/cybernetic/surplus, + ORGAN_SLOT_LIVER = /obj/item/organ/liver/cybernetic/surplus, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/cybernetic/surplus, ) var/list/possible_organ_slots = organ_slots.Copy() if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD)) diff --git a/code/datums/quirks/neutral_quirks/deviant_tastes.dm b/code/datums/quirks/neutral_quirks/deviant_tastes.dm index 566b469c7a77d..5be181f96b5a8 100644 --- a/code/datums/quirks/neutral_quirks/deviant_tastes.dm +++ b/code/datums/quirks/neutral_quirks/deviant_tastes.dm @@ -9,7 +9,7 @@ mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy /datum/quirk/deviant_tastes/add(client/client_source) - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return var/liked_foodtypes = tongue.liked_foodtypes @@ -17,7 +17,7 @@ tongue.disliked_foodtypes = liked_foodtypes /datum/quirk/deviant_tastes/remove() - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.liked_foodtypes = initial(tongue.liked_foodtypes) diff --git a/code/datums/quirks/neutral_quirks/gamer.dm b/code/datums/quirks/neutral_quirks/gamer.dm index 0ab2e780480ee..9055b09ce7fe6 100644 --- a/code/datums/quirks/neutral_quirks/gamer.dm +++ b/code/datums/quirks/neutral_quirks/gamer.dm @@ -13,7 +13,7 @@ var/gaming_withdrawal_timer = TIMER_ID_NULL /datum/quirk/gamer/add(client/client_source) - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) // Gamer diet tongue.liked_foodtypes = JUNKFOOD @@ -26,7 +26,7 @@ gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE) /datum/quirk/gamer/remove() - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) tongue.liked_foodtypes = initial(tongue.liked_foodtypes) UnregisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME) diff --git a/code/datums/quirks/neutral_quirks/heretochromatic.dm b/code/datums/quirks/neutral_quirks/heretochromatic.dm index 311cbf66868f0..daa018726ad89 100644 --- a/code/datums/quirks/neutral_quirks/heretochromatic.dm +++ b/code/datums/quirks/neutral_quirks/heretochromatic.dm @@ -22,7 +22,7 @@ human_holder.eye_color_right = color human_holder.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK) - var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/eyes) if(!eyes_of_the_holder) return @@ -39,7 +39,7 @@ human_holder.eye_color_right = human_holder.eye_color_left UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN) -/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) +/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed) SIGNAL_HANDLER if(!istype(removed)) diff --git a/code/datums/quirks/neutral_quirks/pineapple_hater.dm b/code/datums/quirks/neutral_quirks/pineapple_hater.dm index f17eb4224ec4c..858963e0a36e0 100644 --- a/code/datums/quirks/neutral_quirks/pineapple_hater.dm +++ b/code/datums/quirks/neutral_quirks/pineapple_hater.dm @@ -15,13 +15,13 @@ ) /datum/quirk/pineapple_hater/add(client/client_source) - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.disliked_foodtypes |= PINEAPPLE /datum/quirk/pineapple_hater/remove() - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) diff --git a/code/datums/quirks/neutral_quirks/pineapple_liker.dm b/code/datums/quirks/neutral_quirks/pineapple_liker.dm index c342e14769cf8..d2de14a0e8163 100644 --- a/code/datums/quirks/neutral_quirks/pineapple_liker.dm +++ b/code/datums/quirks/neutral_quirks/pineapple_liker.dm @@ -9,13 +9,13 @@ mail_goodies = list(/obj/item/food/pizzaslice/pineapple) /datum/quirk/pineapple_liker/add(client/client_source) - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.liked_foodtypes |= PINEAPPLE /datum/quirk/pineapple_liker/remove() - var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.liked_foodtypes = initial(tongue.liked_foodtypes) diff --git a/code/datums/quirks/positive_quirks/chip_connector.dm b/code/datums/quirks/positive_quirks/chip_connector.dm index c12809bbfd2ef..6fcc5bf9d31be 100644 --- a/code/datums/quirks/positive_quirks/chip_connector.dm +++ b/code/datums/quirks/positive_quirks/chip_connector.dm @@ -7,7 +7,7 @@ lose_text = span_danger("You don't feel so CONNECTED anymore.") medical_record_text = "Patient has a cybernetic implant on their back of their head that lets them install and remove skillchips at will. Gross." mail_goodies = list() - var/obj/item/organ/internal/cyberimp/brain/connector/connector + var/obj/item/organ/cyberimp/brain/connector/connector /datum/quirk/chip_connector/New() . = ..() diff --git a/code/datums/quirks/positive_quirks/chipped.dm b/code/datums/quirks/positive_quirks/chipped.dm index 30c226c130031..7f43fc07b5bbc 100644 --- a/code/datums/quirks/positive_quirks/chipped.dm +++ b/code/datums/quirks/positive_quirks/chipped.dm @@ -42,7 +42,7 @@ quirk_holder_carbon.implant_skillchip(installed_chip, force = TRUE) installed_chip.try_activate_skillchip(silent = FALSE, force = TRUE) - var/obj/item/organ/internal/brain/itchy_brain = quirk_holder.get_organ_by_type(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/itchy_brain = quirk_holder.get_organ_by_type(ORGAN_SLOT_BRAIN) itchy_timer = addtimer(CALLBACK(src, PROC_REF(cause_itchy), itchy_brain), rand(5 SECONDS, 10 MINUTES)) // they get The Itch from a poor quality install every so often /datum/quirk/chipped/remove() @@ -50,7 +50,7 @@ deltimer(itchy_timer) . = ..() -/datum/quirk/chipped/proc/cause_itchy(obj/item/organ/internal/brain/itchy_brain) +/datum/quirk/chipped/proc/cause_itchy(obj/item/organ/brain/itchy_brain) itchy_brain.apply_organ_damage(rand(1, 5), maximum = itchy_brain.maxHealth * 0.3) to_chat(itchy_brain.owner, span_warning("Your [itchy_brain] itches.")) diff --git a/code/datums/quirks/positive_quirks/friendly.dm b/code/datums/quirks/positive_quirks/friendly.dm index 943bc2c4b8457..ef030530169f8 100644 --- a/code/datums/quirks/positive_quirks/friendly.dm +++ b/code/datums/quirks/positive_quirks/friendly.dm @@ -12,7 +12,7 @@ /datum/quirk/friendly/add_unique(client/client_source) var/mob/living/carbon/human/human_quirkholder = quirk_holder - var/obj/item/organ/internal/heart/holder_heart = human_quirkholder.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/holder_heart = human_quirkholder.get_organ_slot(ORGAN_SLOT_HEART) if(isnull(holder_heart) || isnull(holder_heart.reagents)) return holder_heart.reagents.maximum_volume = 20 diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 3598bd764cac7..fadcbb8570946 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -64,7 +64,7 @@ /datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language) if(iscarbon(user)) var/mob/living/carbon/C = user - var/obj/item/organ/internal/vocal_cords/V = C.get_organ_slot(ORGAN_SLOT_VOICE) + var/obj/item/organ/vocal_cords/V = C.get_organ_slot(ORGAN_SLOT_VOICE) if(V?.can_speak_with()) V.handle_speech(message) //message V.speak_with(message) //action diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index c7f8869c405a3..07edc617cbd9c 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -258,42 +258,42 @@ trait_to_give = STATION_TRAIT_CYBERNETIC_REVOLUTION /// List of all job types with the cybernetics they should receive. var/static/list/job_to_cybernetic = list( - /datum/job/assistant = /obj/item/organ/internal/heart/cybernetic, //real cardiac - /datum/job/atmospheric_technician = /obj/item/organ/internal/cyberimp/mouth/breathing_tube, - /datum/job/bartender = /obj/item/organ/internal/liver/cybernetic/tier3, - /datum/job/bitrunner = /obj/item/organ/internal/eyes/robotic/thermals, - /datum/job/botanist = /obj/item/organ/internal/cyberimp/chest/nutriment, - /datum/job/captain = /obj/item/organ/internal/heart/cybernetic/tier3, - /datum/job/cargo_technician = /obj/item/organ/internal/stomach/cybernetic/tier2, - /datum/job/chaplain = /obj/item/organ/internal/cyberimp/brain/anti_drop, - /datum/job/chemist = /obj/item/organ/internal/liver/cybernetic/tier2, - /datum/job/chief_engineer = /obj/item/organ/internal/cyberimp/chest/thrusters, - /datum/job/chief_medical_officer = /obj/item/organ/internal/cyberimp/chest/reviver, - /datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK! - /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, - /datum/job/coroner = /obj/item/organ/internal/tongue/bone, //hes got a bone to pick with you - /datum/job/curator = /obj/item/organ/internal/cyberimp/brain/connector, - /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3, - /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery, - /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer. - /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic, - /datum/job/head_of_security = /obj/item/organ/internal/eyes/robotic/thermals, - /datum/job/human_ai = /obj/item/organ/internal/brain/cybernetic, - /datum/job/janitor = /obj/item/organ/internal/eyes/robotic/xray, - /datum/job/lawyer = /obj/item/organ/internal/heart/cybernetic/tier2, - /datum/job/mime = /obj/item/organ/internal/tongue/robot, //... - /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical, - /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, - /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/whisper, - /datum/job/pun_pun = /obj/item/organ/internal/cyberimp/arm/strongarm, - /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3, - /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, - /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, - /datum/job/scientist = /obj/item/organ/internal/ears/cybernetic, - /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/flash, - /datum/job/shaft_miner = /obj/item/organ/internal/monster_core/rush_gland, - /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/toolset, - /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security, + /datum/job/assistant = /obj/item/organ/heart/cybernetic, //real cardiac + /datum/job/atmospheric_technician = /obj/item/organ/cyberimp/mouth/breathing_tube, + /datum/job/bartender = /obj/item/organ/liver/cybernetic/tier3, + /datum/job/bitrunner = /obj/item/organ/eyes/robotic/thermals, + /datum/job/botanist = /obj/item/organ/cyberimp/chest/nutriment, + /datum/job/captain = /obj/item/organ/heart/cybernetic/tier3, + /datum/job/cargo_technician = /obj/item/organ/stomach/cybernetic/tier2, + /datum/job/chaplain = /obj/item/organ/cyberimp/brain/anti_drop, + /datum/job/chemist = /obj/item/organ/liver/cybernetic/tier2, + /datum/job/chief_engineer = /obj/item/organ/cyberimp/chest/thrusters, + /datum/job/chief_medical_officer = /obj/item/organ/cyberimp/chest/reviver, + /datum/job/clown = /obj/item/organ/cyberimp/brain/anti_stun, //HONK! + /datum/job/cook = /obj/item/organ/cyberimp/chest/nutriment/plus, + /datum/job/coroner = /obj/item/organ/tongue/bone, //hes got a bone to pick with you + /datum/job/curator = /obj/item/organ/cyberimp/brain/connector, + /datum/job/detective = /obj/item/organ/lungs/cybernetic/tier3, + /datum/job/doctor = /obj/item/organ/cyberimp/arm/surgery, + /datum/job/geneticist = /obj/item/organ/fly, //we don't care about implants, we have cancer. + /datum/job/head_of_personnel = /obj/item/organ/eyes/robotic, + /datum/job/head_of_security = /obj/item/organ/eyes/robotic/thermals, + /datum/job/human_ai = /obj/item/organ/brain/cybernetic, + /datum/job/janitor = /obj/item/organ/eyes/robotic/xray, + /datum/job/lawyer = /obj/item/organ/heart/cybernetic/tier2, + /datum/job/mime = /obj/item/organ/tongue/robot, //... + /datum/job/paramedic = /obj/item/organ/cyberimp/eyes/hud/medical, + /datum/job/prisoner = /obj/item/organ/eyes/robotic/shield, + /datum/job/psychologist = /obj/item/organ/ears/cybernetic/whisper, + /datum/job/pun_pun = /obj/item/organ/cyberimp/arm/strongarm, + /datum/job/quartermaster = /obj/item/organ/stomach/cybernetic/tier3, + /datum/job/research_director = /obj/item/organ/cyberimp/bci, + /datum/job/roboticist = /obj/item/organ/cyberimp/eyes/hud/diagnostic, + /datum/job/scientist = /obj/item/organ/ears/cybernetic, + /datum/job/security_officer = /obj/item/organ/cyberimp/arm/flash, + /datum/job/shaft_miner = /obj/item/organ/monster_core/rush_gland, + /datum/job/station_engineer = /obj/item/organ/cyberimp/arm/toolset, + /datum/job/warden = /obj/item/organ/cyberimp/eyes/hud/security, ) /datum/station_trait/cybernetic_revolution/New() @@ -312,7 +312,7 @@ var/mob/living/silicon/ai/ai = spawned ai.eyeobj.relay_speech = TRUE //surveillance upgrade. the ai gets cybernetics too. return - var/obj/item/organ/internal/cybernetic = new cybernetic_type() + var/obj/item/organ/cybernetic = new cybernetic_type() cybernetic.Insert(spawned, special = TRUE, movement_flags = DELETE_IF_REPLACED) /datum/station_trait/luxury_escape_pods diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index 2664bbb4214de..a1ff3c7fb4eaf 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -136,7 +136,7 @@ // Handle the Ballmer Peak. // If our owner is a scientist (has the trait "TRAIT_BALLMER_SCIENTIST"), there's a 5% chance // that they'll say one of the special "ballmer message" lines, depending their drunk-ness level. - var/obj/item/organ/internal/liver/liver_organ = owner.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver_organ = owner.get_organ_slot(ORGAN_SLOT_LIVER) if(liver_organ && HAS_TRAIT(liver_organ, TRAIT_BALLMER_SCIENTIST) && prob(5)) if(drunk_value >= BALLMER_PEAK_LOW_END && drunk_value <= BALLMER_PEAK_HIGH_END) owner.say(pick_list_replacements(VISTA_FILE, "ballmer_good_msg"), forced = "ballmer") diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index a6607cd7797e2..0056c55a7f6d4 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -547,7 +547,7 @@ if(QDELETED(human_mob)) return if(prob(1))//low chance of the alternative reality returning to monkey - var/obj/item/organ/external/tail/monkey/monkey_tail = new () + var/obj/item/organ/tail/monkey/monkey_tail = new () monkey_tail.Insert(human_mob, movement_flags = DELETE_IF_REPLACED) var/datum/species/human_species = human_mob.dna?.species if(human_species) diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index 8feebe8d2b624..615d0d10eb0e6 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -66,7 +66,7 @@ if (source.stat == DEAD) return - var/obj/item/organ/internal/brain/brain = source.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/brain = source.get_organ_by_type(/obj/item/organ/brain) if (isnull(brain)) return @@ -91,7 +91,7 @@ if (victim.body_position != LYING_DOWN) return FALSE - var/obj/item/organ/internal/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/eyes) if (isnull(eyes)) victim.balloon_alert(user, "no eyes to take!") return TRUE @@ -131,9 +131,9 @@ return TRUE -/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/internal/eyes/eyes) +/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/eyes/eyes) PRIVATE_PROC(TRUE) - return victim?.get_organ_by_type(/obj/item/organ/internal/eyes) == eyes + return victim?.get_organ_by_type(/obj/item/organ/eyes) == eyes #undef CRANIAL_FISSURE_FILTER_DISPLACEMENT diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 7a0fa12f4473e..01af1fa44d1fd 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -263,7 +263,7 @@ var/right_side = FALSE /datum/wound/pierce/bleed/severe/eye/apply_wound(obj/item/bodypart/limb, silent, datum/wound/old_wound, smited, attack_direction, wound_source, replacing, right_side) - var/obj/item/organ/internal/eyes/eyes = locate() in limb + var/obj/item/organ/eyes/eyes = locate() in limb if (!istype(eyes)) return FALSE . = ..() @@ -295,7 +295,7 @@ can_be_randomly_generated = FALSE /datum/wound_pregen_data/flesh_pierce/open_puncture/eye/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types, datum/wound/old_wound, random_roll, duplicates_allowed, care_about_existing_wounds) - if (isnull(locate(/obj/item/organ/internal/eyes) in limb)) + if (isnull(locate(/obj/item/organ/eyes) in limb)) return FALSE return ..() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b2df8d7416dde..f93a4e2fac65e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -348,7 +348,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list var/human_check = TRUE /datum/objective/protect/check_completion() - var/obj/item/organ/internal/brain/brain_target + var/obj/item/organ/brain/brain_target if(isnull(target)) return FALSE if(human_check) diff --git a/code/game/machinery/dna_infuser/dna_infusion.dm b/code/game/machinery/dna_infuser/dna_infusion.dm index e2b86f0e8894d..68b3bfe351565 100644 --- a/code/game/machinery/dna_infuser/dna_infusion.dm +++ b/code/game/machinery/dna_infuser/dna_infusion.dm @@ -65,7 +65,7 @@ if(old_organ) if((old_organ.type != new_organ) && !IS_ROBOTIC_ORGAN(old_organ)) continue // Old organ can be mutated! - else if(ispath(new_organ, /obj/item/organ/external)) + else if(new_organ::organ_flags & ORGAN_EXTERNAL) continue // External organ can be grown! // Internal organ is either missing, or is non-organic. potential_new_organs -= new_organ diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm index ff951c587c0c2..e69a78f132dfb 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm @@ -19,10 +19,10 @@ /mob/living/basic/mining/goliath, ) output_organs = list( - /obj/item/organ/internal/brain/goliath, - /obj/item/organ/internal/eyes/night_vision/goliath, - /obj/item/organ/internal/heart/goliath, - /obj/item/organ/internal/lungs/lavaland/goliath, + /obj/item/organ/brain/goliath, + /obj/item/organ/eyes/night_vision/goliath, + /obj/item/organ/heart/goliath, + /obj/item/organ/lungs/lavaland/goliath, ) infusion_desc = "armored tendril-like" tier = DNA_MUTANT_TIER_ONE @@ -43,10 +43,10 @@ /mob/living/basic/carp, ) output_organs = list( - /obj/item/organ/internal/brain/carp, - /obj/item/organ/internal/heart/carp, - /obj/item/organ/internal/lungs/carp, - /obj/item/organ/internal/tongue/carp, + /obj/item/organ/brain/carp, + /obj/item/organ/heart/carp, + /obj/item/organ/lungs/carp, + /obj/item/organ/tongue/carp, ) infusion_desc = "nomadic" tier = DNA_MUTANT_TIER_ONE @@ -67,10 +67,10 @@ /obj/item/food/deadmouse, ) output_organs = list( - /obj/item/organ/internal/eyes/night_vision/rat, - /obj/item/organ/internal/heart/rat, - /obj/item/organ/internal/stomach/rat, - /obj/item/organ/internal/tongue/rat, + /obj/item/organ/eyes/night_vision/rat, + /obj/item/organ/heart/rat, + /obj/item/organ/stomach/rat, + /obj/item/organ/tongue/rat, ) infusion_desc = "skittish" tier = DNA_MUTANT_TIER_ONE @@ -97,10 +97,10 @@ /mob/living/basic/cockroach, ) output_organs = list( - /obj/item/organ/internal/heart/roach, - /obj/item/organ/internal/stomach/roach, - /obj/item/organ/internal/liver/roach, - /obj/item/organ/internal/appendix/roach, + /obj/item/organ/heart/roach, + /obj/item/organ/stomach/roach, + /obj/item/organ/liver/roach, + /obj/item/organ/appendix/roach, ) infusion_desc = "kafkaesque" // Gregor Samsa !! tier = DNA_MUTANT_TIER_ONE @@ -128,9 +128,9 @@ /obj/item/fish, ) output_organs = list( - /obj/item/organ/internal/lungs/fish, - /obj/item/organ/internal/stomach/fish, - /obj/item/organ/external/tail/fish, + /obj/item/organ/lungs/fish, + /obj/item/organ/stomach/fish, + /obj/item/organ/tail/fish, ) infusion_desc = "piscine" tier = DNA_MUTANT_TIER_ONE @@ -158,7 +158,7 @@ var/list/organs = ..() if(infused_from.required_fluid_type == AQUARIUM_FLUID_AIR || HAS_TRAIT(infused_from, TRAIT_FISH_AMPHIBIOUS)) - organs -= /obj/item/organ/internal/lungs/fish + organs -= /obj/item/organ/lungs/fish return organs @@ -172,7 +172,7 @@ "spit ink to blind foes", ) output_organs = list( - /obj/item/organ/internal/tongue/inky + /obj/item/organ/tongue/inky ) tier = DNA_MUTANT_TIER_ONE @@ -187,7 +187,7 @@ "drink like a fish", ) output_organs = list( - /obj/item/organ/internal/liver/fish + /obj/item/organ/liver/fish ) tier = DNA_MUTANT_TIER_ONE unreachable_effect = TRUE @@ -208,7 +208,7 @@ /mob/living/basic/crab, ) output_organs = list( - /obj/item/organ/internal/lungs/fish/amphibious, + /obj/item/organ/lungs/fish/amphibious, ) infusion_desc = "semi-aquatic" tier = DNA_MUTANT_TIER_ONE diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm index 1620607d5f09c..045fa669c4f96 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm @@ -22,9 +22,9 @@ /obj/item/food/meat/slab/gondola, ) output_organs = list( - /obj/item/organ/internal/heart/gondola, - /obj/item/organ/internal/tongue/gondola, - /obj/item/organ/internal/liver/gondola, + /obj/item/organ/heart/gondola, + /obj/item/organ/tongue/gondola, + /obj/item/organ/liver/gondola, ) infusion_desc = "observant" tier = DNA_MUTANT_TIER_TWO diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm index e93cffd51437b..e4d93a587f8f5 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm @@ -17,12 +17,12 @@ "this is a bad idea", ) output_organs = list( - /obj/item/organ/internal/appendix/fly, - /obj/item/organ/internal/eyes/fly, - /obj/item/organ/internal/heart/fly, - /obj/item/organ/internal/lungs/fly, - /obj/item/organ/internal/stomach/fly, - /obj/item/organ/internal/tongue/fly, + /obj/item/organ/appendix/fly, + /obj/item/organ/eyes/fly, + /obj/item/organ/heart/fly, + /obj/item/organ/lungs/fly, + /obj/item/organ/stomach/fly, + /obj/item/organ/tongue/fly, ) infusion_desc = "fly-like" tier = DNA_MUTANT_TIER_ZERO @@ -41,7 +41,7 @@ /mob/living/basic/pet/fox, ) output_organs = list( - /obj/item/organ/internal/ears/fox, + /obj/item/organ/ears/fox, ) infusion_desc = "inexcusable" tier = DNA_MUTANT_TIER_ZERO @@ -61,10 +61,10 @@ /mob/living/basic/mothroach, ) output_organs = list( - /obj/item/organ/external/antennae, - /obj/item/organ/external/wings/moth, - /obj/item/organ/internal/eyes/moth, - /obj/item/organ/internal/tongue/moth, + /obj/item/organ/antennae, + /obj/item/organ/wings/moth, + /obj/item/organ/eyes/moth, + /obj/item/organ/tongue/moth, ) infusion_desc = "fluffy" tier = DNA_MUTANT_TIER_ZERO @@ -84,11 +84,11 @@ /mob/living/basic/lizard, ) output_organs = list( - /obj/item/organ/external/horns, - /obj/item/organ/external/frills, - /obj/item/organ/external/snout, - /obj/item/organ/external/tail/lizard, - /obj/item/organ/internal/tongue/lizard, + /obj/item/organ/horns, + /obj/item/organ/frills, + /obj/item/organ/snout, + /obj/item/organ/tail/lizard, + /obj/item/organ/tongue/lizard, ) infusion_desc = "scaly" tier = DNA_MUTANT_TIER_ZERO @@ -105,8 +105,8 @@ /mob/living/basic/pet/cat, ) output_organs = list( - /obj/item/organ/internal/ears/cat, - /obj/item/organ/external/tail/cat, + /obj/item/organ/ears/cat, + /obj/item/organ/tail/cat, ) infusion_desc = "domestic" tier = DNA_MUTANT_TIER_ZERO diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index 622cafaa7bfde..1e4bc41ae415b 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -15,7 +15,7 @@ ///Carp lungs! You can breathe in space! Oh... you can't breathe on the station, you need low oxygen environments. /// Inverts behavior of lungs. Bypasses suffocation due to space / lack of gas, but also allows Oxygen to suffocate. -/obj/item/organ/internal/lungs/carp +/obj/item/organ/lungs/carp name = "mutated carp-lungs" desc = "Carp DNA infused into what was once some normal lungs." // Oxygen causes suffocation. @@ -27,14 +27,14 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = CARP_COLORS -/obj/item/organ/internal/lungs/carp/Initialize(mapload) +/obj/item/organ/lungs/carp/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their neck has odd gills.", BODY_ZONE_HEAD) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp) ADD_TRAIT(src, TRAIT_SPACEBREATHING, REF(src)) ///occasionally sheds carp teeth, stronger melee (bite) attacks, but you can't cover your mouth anymore. -/obj/item/organ/internal/tongue/carp +/obj/item/organ/tongue/carp name = "mutated carp-jaws" desc = "Carp DNA infused into what was once some normal teeth." @@ -45,12 +45,12 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = CARP_COLORS -/obj/item/organ/internal/tongue/carp/Initialize(mapload) +/obj/item/organ/tongue/carp/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are big and sharp.", BODY_ZONE_PRECISE_MOUTH) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp) -/obj/item/organ/internal/tongue/carp/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/tongue/carp/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) . = ..() if(!ishuman(tongue_owner)) return @@ -60,14 +60,14 @@ var/datum/species/rec_species = human_receiver.dna.species rec_species.update_no_equip_flags(tongue_owner, rec_species.no_equip_flags | ITEM_SLOT_MASK) -/obj/item/organ/internal/tongue/carp/on_bodypart_insert(obj/item/bodypart/head) +/obj/item/organ/tongue/carp/on_bodypart_insert(obj/item/bodypart/head) . = ..() head.unarmed_damage_low = 10 head.unarmed_damage_high = 15 head.unarmed_effectiveness = 15 head.unarmed_attack_effect = ATTACK_EFFECT_BITE -/obj/item/organ/internal/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner) +/obj/item/organ/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner) . = ..() if(!ishuman(tongue_owner)) return @@ -77,14 +77,14 @@ var/datum/species/rec_species = human_receiver.dna.species rec_species.update_no_equip_flags(tongue_owner, initial(rec_species.no_equip_flags)) -/obj/item/organ/internal/tongue/carp/on_bodypart_remove(obj/item/bodypart/head) +/obj/item/organ/tongue/carp/on_bodypart_remove(obj/item/bodypart/head) . = ..() head.unarmed_damage_low = initial(head.unarmed_damage_low) head.unarmed_damage_high = initial(head.unarmed_damage_high) head.unarmed_effectiveness = initial(head.unarmed_effectiveness) head.unarmed_attack_effect = initial(head.unarmed_attack_effect) -/obj/item/organ/internal/tongue/carp/on_life(seconds_per_tick, times_fired) +/obj/item/organ/tongue/carp/on_life(seconds_per_tick, times_fired) . = ..() if(owner.stat != CONSCIOUS || !prob(0.1)) return @@ -99,7 +99,7 @@ icon_state = "carptooth" ///carp brain. you need to occasionally go to a new zlevel. think of it as... walking your dog! -/obj/item/organ/internal/brain/carp +/obj/item/organ/brain/carp name = "mutated carp-brain" desc = "Carp DNA infused into what was once a normal brain." @@ -114,35 +114,35 @@ ///how much time the timer is given var/cooldown_time = 10 MINUTES -/obj/item/organ/internal/brain/carp/Initialize(mapload) +/obj/item/organ/brain/carp/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp) AddElement(/datum/element/noticable_organ, "%PRONOUN_They seem%PRONOUN_s unable to stay still.") -/obj/item/organ/internal/brain/carp/on_mob_insert(mob/living/carbon/brain_owner) +/obj/item/organ/brain/carp/on_mob_insert(mob/living/carbon/brain_owner) . = ..() cooldown_timer = addtimer(CALLBACK(src, PROC_REF(unsatisfied_nomad)), cooldown_time, TIMER_STOPPABLE|TIMER_OVERRIDE|TIMER_UNIQUE) RegisterSignal(brain_owner, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(satisfied_nomad)) //technically you could get around the mood issue by extracting and reimplanting the brain but it will be far easier to just go one z there and back -/obj/item/organ/internal/brain/carp/on_mob_remove(mob/living/carbon/brain_owner) +/obj/item/organ/brain/carp/on_mob_remove(mob/living/carbon/brain_owner) . = ..() UnregisterSignal(brain_owner, COMSIG_MOVABLE_Z_CHANGED) deltimer(cooldown_timer) -/obj/item/organ/internal/brain/carp/get_attacking_limb(mob/living/carbon/human/target) +/obj/item/organ/brain/carp/get_attacking_limb(mob/living/carbon/human/target) return owner.get_bodypart(BODY_ZONE_HEAD) -/obj/item/organ/internal/brain/carp/proc/unsatisfied_nomad() +/obj/item/organ/brain/carp/proc/unsatisfied_nomad() owner.add_mood_event("nomad", /datum/mood_event/unsatisfied_nomad) -/obj/item/organ/internal/brain/carp/proc/satisfied_nomad() +/obj/item/organ/brain/carp/proc/satisfied_nomad() SIGNAL_HANDLER owner.clear_mood_event("nomad") cooldown_timer = addtimer(CALLBACK(src, PROC_REF(unsatisfied_nomad)), cooldown_time, TIMER_STOPPABLE|TIMER_OVERRIDE|TIMER_UNIQUE) /// makes you cold resistant, but heat-weak. -/obj/item/organ/internal/heart/carp +/obj/item/organ/heart/carp name = "mutated carp-heart" desc = "Carp DNA infused into what was once a normal heart." @@ -153,7 +153,7 @@ organ_traits = list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE) -/obj/item/organ/internal/heart/carp/Initialize(mapload) +/obj/item/organ/heart/carp/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their skin has small patches of scales growing on it.", BODY_ZONE_CHEST) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp) diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 7ac41ab28c024..8f19a70cdbf7f 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -40,7 +40,7 @@ else ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src)) owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_water) - if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish)) + if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) add_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, SKILL_EXP_JOURNEYMAN, silent = TRUE) @@ -62,7 +62,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/human = owner human.physiology.damage_resistance -= 8 - if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish)) + if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) remove_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE) @@ -86,11 +86,11 @@ SIGNAL_HANDLER if(HAS_TRAIT(owner, TRAIT_IS_WET)) //remove the debuffs from being dry remove_debuff() - if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish)) + if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) add_speed_buff() return apply_debuff() - if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish)) + if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) remove_speed_buff() /datum/status_effect/organ_set_bonus/fish/proc/apply_debuff() @@ -125,7 +125,7 @@ /datum/status_effect/organ_set_bonus/fish/proc/check_tail(mob/living/carbon/source, obj/item/organ/organ, special) SIGNAL_HANDLER - if(!HAS_TRAIT(owner, TRAIT_IS_WET) || !istype(organ, /obj/item/organ/external/tail/fish)) + if(!HAS_TRAIT(owner, TRAIT_IS_WET) || !istype(organ, /obj/item/organ/tail/fish)) return var/obj/item/organ/tail = owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(tail != organ) @@ -152,7 +152,7 @@ ///Tail for fish DNA-infused spacemen. It provides a speed buff while in water. It's also needed for the crawl speed bonus once the threshold is reached. -/obj/item/organ/external/tail/fish +/obj/item/organ/tail/fish name = "fish tail" desc = "A severed tail from some sort of marine creature... or a fish-infused spaceman. It's smooth, faintly wet and definitely not flopping." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -180,29 +180,29 @@ /// The amount of fillets this gets processed into var/fillet_amount = 5 -/obj/item/organ/external/tail/fish/Initialize(mapload) +/obj/item/organ/tail/fish/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish) var/time_to_fillet = fillet_amount * 0.5 SECONDS AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, fillet_amount, time_to_fillet, screentip_verb = "Cut") -/obj/item/organ/external/tail/fish/on_mob_insert(mob/living/carbon/owner) +/obj/item/organ/tail/fish/on_mob_insert(mob/living/carbon/owner) . = ..() owner.AddElementTrait(TRAIT_WADDLING, type, /datum/element/waddling) RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_location)) check_location(owner, null) -/obj/item/organ/external/tail/fish/on_mob_remove(mob/living/carbon/owner) +/obj/item/organ/tail/fish/on_mob_remove(mob/living/carbon/owner) . = ..() owner.remove_traits(list(TRAIT_WADDLING, TRAIT_NO_STAGGER), type) owner.remove_movespeed_modifier(/datum/movespeed_modifier/fish_on_water) owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/fish_on_water) UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) -/obj/item/organ/external/tail/fish/get_greyscale_color_from_draw_color() +/obj/item/organ/tail/fish/get_greyscale_color_from_draw_color() set_greyscale(bodypart_overlay.draw_color) -/obj/item/organ/external/tail/fish/proc/check_location(mob/living/carbon/source, atom/movable/old_loc, dir, forced) +/obj/item/organ/tail/fish/proc/check_location(mob/living/carbon/source, atom/movable/old_loc, dir, forced) SIGNAL_HANDLER var/was_water = istype(old_loc, /turf/open/water) var/is_water = istype(source.loc, /turf/open/water) && !HAS_TRAIT(source.loc, TRAIT_TURF_IGNORE_SLOWDOWN) @@ -240,7 +240,7 @@ ///Lungs that replace the need of oxygen with water vapor or being wet -/obj/item/organ/internal/lungs/fish +/obj/item/organ/lungs/fish name = "mutated gills" desc = "Fish DNA infused on what once was a normal pair of lungs that now require spacemen to breathe water vapor, or keep themselves covered in water." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -258,7 +258,7 @@ var/has_gills = TRUE -/obj/item/organ/internal/lungs/fish/Initialize(mapload) +/obj/item/organ/lungs/fish/Initialize(mapload) . = ..() add_gas_reaction(/datum/gas/water_vapor, always = PROC_REF(breathe_water)) respiration_type |= RESPIRATION_OXYGEN //after all, we get oxygen from water @@ -269,26 +269,26 @@ AddComponent(/datum/component/bubble_icon_override, "fish", BUBBLE_ICON_PRIORITY_ORGAN) AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean")) -/obj/item/organ/internal/lungs/fish/Destroy() +/obj/item/organ/lungs/fish/Destroy() QDEL_NULL(gills) return ..() -/obj/item/organ/internal/lungs/fish/on_bodypart_insert(obj/item/bodypart/limb) +/obj/item/organ/lungs/fish/on_bodypart_insert(obj/item/bodypart/limb) . = ..() if(gills) limb.add_bodypart_overlay(gills) -/obj/item/organ/internal/lungs/fish/on_bodypart_remove(obj/item/bodypart/limb) +/obj/item/organ/lungs/fish/on_bodypart_remove(obj/item/bodypart/limb) . = ..() if(gills) limb.remove_bodypart_overlay(gills) -/obj/item/organ/internal/lungs/fish/on_mob_remove(mob/living/carbon/owner) +/obj/item/organ/lungs/fish/on_mob_remove(mob/living/carbon/owner) . = ..() owner.clear_alert(ALERT_NOT_ENOUGH_WATER) /// Requires the spaceman to have either water vapor or be wet. -/obj/item/organ/internal/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp) +/obj/item/organ/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp) var/need_to_breathe = !HAS_TRAIT(src, TRAIT_SPACEBREATHING) && !HAS_TRAIT(breather, TRAIT_IS_WET) if(water_pp < safe_water_level && need_to_breathe) on_low_water(breather, breath, water_pp) @@ -305,7 +305,7 @@ breather.adjustOxyLoss(-5) /// Called when there isn't enough water to breath -/obj/item/organ/internal/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) +/obj/item/organ/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) breather.throw_alert(ALERT_NOT_ENOUGH_WATER, /atom/movable/screen/alert/not_enough_water) var/gas_breathed = handle_suffocation(breather, water_pp, safe_water_level, breath.gases[/datum/gas/water_vapor][MOLES]) if(water_pp) @@ -325,10 +325,10 @@ ) /// Subtype of gills that allow the mob to optionally breathe water. -/obj/item/organ/internal/lungs/fish/amphibious +/obj/item/organ/lungs/fish/amphibious name = "mutated semi-aquatic lungs" desc = "DNA from an amphibious or semi-aquatic creature infused on a pair lungs. Enjoy breathing underwater without drowning outside water." - safe_oxygen_min = /obj/item/organ/internal/lungs::safe_oxygen_min + safe_oxygen_min = /obj/item/organ/lungs::safe_oxygen_min has_gills = FALSE /** * If false, we don't breathe air since we've got water instead. @@ -336,7 +336,7 @@ */ var/should_breathe_oxygen = FALSE -/obj/item/organ/internal/lungs/fish/amphibious/Initialize(mapload) +/obj/item/organ/lungs/fish/amphibious/Initialize(mapload) . = ..() /** * We're setting the gas reaction for breathing oxygen here, @@ -344,18 +344,18 @@ * and we want breathe_water() to run before breathe_oxygen, * so that if we're breathing water vapor (or are wet), we won't have to breathe oxygen. */ - safe_oxygen_min = /obj/item/organ/internal/lungs::safe_oxygen_min + safe_oxygen_min = /obj/item/organ/lungs::safe_oxygen_min add_gas_reaction(/datum/gas/oxygen, always = PROC_REF(breathe_oxygen)) -/obj/item/organ/internal/lungs/fish/amphibious/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) +/obj/item/organ/lungs/fish/amphibious/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) should_breathe_oxygen = FALSE //assume we don't have to breathe oxygen until we fail to breathe water return ..() -/obj/item/organ/internal/lungs/fish/amphibious/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) +/obj/item/organ/lungs/fish/amphibious/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) should_breathe_oxygen = TRUE return -/obj/item/organ/internal/lungs/fish/amphibious/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) +/obj/item/organ/lungs/fish/amphibious/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) if(!should_breathe_oxygen) if(breather.failed_last_breath) //in case we had neither oxygen nor water last tick. breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) @@ -363,7 +363,7 @@ return ..() ///Fish infuser organ, allows mobs to safely eat raw fish. -/obj/item/organ/internal/stomach/fish +/obj/item/organ/stomach/fish name = "mutated fish-stomach" desc = "Fish DNA infused into a stomach now permeated by the faint smell of salt and slightly putrefied fish." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -382,13 +382,13 @@ "putrid fish" = 1, ) -/obj/item/organ/internal/stomach/fish/Initialize(mapload) +/obj/item/organ/stomach/fish/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish) ///Organ from fish with the ink production trait. Doesn't count toward the organ set bonus but is buffed once it's active. -/obj/item/organ/internal/tongue/inky +/obj/item/organ/tongue/inky name = "ink-secreting tongue" desc = "A black tongue linked to two swollen black sacs underneath the palate." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -403,12 +403,12 @@ "the sea" = 0.2, ) -/obj/item/organ/internal/tongue/inky/Initialize(mapload) +/obj/item/organ/tongue/inky/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "Slick black ink seldom rivulets from %PRONOUN_their mouth.", BODY_ZONE_PRECISE_MOUTH) ///Organ from fish with the toxic trait. Allows the user to use tetrodotoxin as a healing chem instead of a toxin. -/obj/item/organ/internal/liver/fish +/obj/item/organ/liver/fish name = "mutated fish-liver" desc = "Fish DNA infused into a stomach that now uses tetrodotoxin as regenerative material. It also processes alcohol quite well." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -426,7 +426,7 @@ // Just fish, the toxin isn't obvious food_tastes = list("fish" = 1) -/obj/item/organ/internal/liver/fish/Initialize(mapload) +/obj/item/organ/liver/fish/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish) diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index 4786bf5753c9f..0ca652c3ab92c 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -19,7 +19,7 @@ to_chat(new_fly, span_danger("Too much fly DNA! Your skin begins to discolor into a horrible black as you become more fly than person!")) new_fly.set_species(/datum/species/fly) -/obj/item/organ/internal/eyes/fly +/obj/item/organ/eyes/fly name = "fly eyes" desc = "These eyes seem to stare back no matter the direction you look at it from." eye_icon_state = "flyeyes" @@ -27,11 +27,11 @@ flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE native_fov = NONE //flies can see all around themselves. -/obj/item/organ/internal/eyes/fly/Initialize(mapload) +/obj/item/organ/eyes/fly/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/tongue/fly +/obj/item/organ/tongue/fly name = "proboscis" desc = "A freakish looking meat tube that apparently can take in liquids." icon = 'icons/obj/medical/organs/fly_organs.dmi' @@ -49,56 +49,56 @@ "S" = "Z", ) -/obj/item/organ/internal/tongue/fly/New(class, timer, datum/mutation/human/copymut) +/obj/item/organ/tongue/fly/New(class, timer, datum/mutation/human/copymut) . = ..() AddComponent(/datum/component/speechmod, replacements = speech_replacements, should_modify_speech = CALLBACK(src, PROC_REF(should_modify_speech))) -/obj/item/organ/internal/tongue/fly/Initialize(mapload) +/obj/item/organ/tongue/fly/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/tongue/fly/get_possible_languages() +/obj/item/organ/tongue/fly/get_possible_languages() return ..() + /datum/language/buzzwords -/obj/item/organ/internal/heart/fly +/obj/item/organ/heart/fly desc = FLY_INFUSED_ORGAN_DESC -/obj/item/organ/internal/heart/fly/Initialize(mapload) +/obj/item/organ/heart/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/internal/lungs/fly +/obj/item/organ/lungs/fly desc = FLY_INFUSED_ORGAN_DESC -/obj/item/organ/internal/lungs/fly/Initialize(mapload) +/obj/item/organ/lungs/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/liver/fly +/obj/item/organ/liver/fly desc = FLY_INFUSED_ORGAN_DESC alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect! -/obj/item/organ/internal/liver/fly/Initialize(mapload) +/obj/item/organ/liver/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/stomach/fly +/obj/item/organ/stomach/fly desc = FLY_INFUSED_ORGAN_DESC -/obj/item/organ/internal/stomach/fly/Initialize(mapload) +/obj/item/organ/stomach/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/stomach/fly/after_eat(edible) +/obj/item/organ/stomach/fly/after_eat(edible) var/mob/living/carbon/body = owner ASSERT(istype(body)) // we do not lose any nutrition as a fly when vomiting out food @@ -110,28 +110,28 @@ ) return ..() -/obj/item/organ/internal/appendix/fly +/obj/item/organ/appendix/fly desc = FLY_INFUSED_ORGAN_DESC -/obj/item/organ/internal/appendix/fly/Initialize(mapload) +/obj/item/organ/appendix/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly) -/obj/item/organ/internal/appendix/fly/update_appearance(updates=ALL) +/obj/item/organ/appendix/fly/update_appearance(updates=ALL) return ..(updates & ~(UPDATE_NAME|UPDATE_ICON)) //don't set name or icon thank you //useless organs we throw in just to fuck with surgeons a bit more. they aren't part of a bonus, just the (absolute) state of flies -/obj/item/organ/internal/fly +/obj/item/organ/fly desc = FLY_INFUSED_ORGAN_DESC -/obj/item/organ/internal/fly/Initialize(mapload) +/obj/item/organ/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = FLY_INFUSED_ORGAN_ICON -/obj/item/organ/internal/fly/groin //appendix is the only groin organ so we gotta have one of these too lol +/obj/item/organ/fly/groin //appendix is the only groin organ so we gotta have one of these too lol zone = BODY_ZONE_PRECISE_GROIN #undef FLY_INFUSED_ORGAN_DESC diff --git a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm index 3fecac3bb6dbf..7591643f84663 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/ears/fox +/obj/item/organ/ears/fox name = "fox ears" icon = 'icons/obj/clothing/head/costume.dmi' worn_icon = 'icons/mob/clothing/head/costume.dmi' @@ -6,4 +6,6 @@ visual = TRUE damage_multiplier = 2 + dna_block = DNA_EARS_BLOCK + bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears sprite_accessory_override = /datum/sprite_accessory/ears/fox diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm index 385878cb255a4..4940f6dae6e66 100644 --- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm @@ -12,7 +12,7 @@ bonus_traits = list(TRAIT_LAVA_IMMUNE) ///goliath eyes, simple night vision -/obj/item/organ/internal/eyes/night_vision/goliath +/obj/item/organ/eyes/night_vision/goliath name = "goliath eyes" desc = "goliath DNA infused into what was once some normal eyes." @@ -29,13 +29,13 @@ high_light_cutoff = list(50, 10, 40) organ_traits = list(TRAIT_UNNATURAL_RED_GLOWY_EYES) -/obj/item/organ/internal/eyes/night_vision/goliath/Initialize(mapload) +/obj/item/organ/eyes/night_vision/goliath/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes are blood red and stone-like.", BODY_ZONE_PRECISE_EYES) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath) ///goliath lungs! You can breathe lavaland air mix but can't breath pure O2 from a tank anymore. -/obj/item/organ/internal/lungs/lavaland/goliath +/obj/item/organ/lungs/lavaland/goliath name = "mutated goliath-lungs" desc = "goliath DNA infused into what was once some normal lungs." @@ -44,13 +44,13 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = GOLIATH_COLORS -/obj/item/organ/internal/lungs/lavaland/goliath/Initialize(mapload) +/obj/item/organ/lungs/lavaland/goliath/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their back is covered in small tendrils.", BODY_ZONE_CHEST) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath) ///goliath brain. you can't use gloves but one of your arms becomes a tendril hammer that can be used to mine! -/obj/item/organ/internal/brain/goliath +/obj/item/organ/brain/goliath name = "mutated goliath-brain" desc = "goliath DNA infused into what was once a normal brain." @@ -62,12 +62,12 @@ var/obj/item/goliath_infuser_hammer/hammer -/obj/item/organ/internal/brain/goliath/Initialize(mapload) +/obj/item/organ/brain/goliath/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their arm is just a mass of plate and tendrils.", BODY_ZONE_CHEST) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath) -/obj/item/organ/internal/brain/goliath/on_mob_insert(mob/living/carbon/brain_owner) +/obj/item/organ/brain/goliath/on_mob_insert(mob/living/carbon/brain_owner) . = ..() if(!ishuman(brain_owner)) return @@ -79,7 +79,7 @@ hammer = new/obj/item/goliath_infuser_hammer brain_owner.put_in_hands(hammer) -/obj/item/organ/internal/brain/goliath/on_mob_remove(mob/living/carbon/brain_owner) +/obj/item/organ/brain/goliath/on_mob_remove(mob/living/carbon/brain_owner) . = ..() UnregisterSignal(brain_owner) if(!ishuman(brain_owner)) @@ -158,7 +158,7 @@ target.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), rand(1, 2), prob(60) ? 1 : 4, user) /// goliath heart gives you the ability to survive ash storms. -/obj/item/organ/internal/heart/goliath +/obj/item/organ/heart/goliath name = "mutated goliath-heart" desc = "goliath DNA infused into what was once a normal heart." @@ -169,7 +169,7 @@ organ_traits = list(TRAIT_ASHSTORM_IMMUNE) -/obj/item/organ/internal/heart/goliath/Initialize(mapload) +/obj/item/organ/heart/goliath/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their skin has visible hard plates growing from within.", BODY_ZONE_CHEST) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath) diff --git a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm index 9fcf7e483bba9..82c9c9fc8e8be 100644 --- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm @@ -16,7 +16,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... bonus_traits = list(TRAIT_RESISTHEAT, TRAIT_RESISTCOLD, TRAIT_NOBREATH, TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE) /// makes you a pacifist and turns most mobs neutral towards you -/obj/item/organ/internal/heart/gondola +/obj/item/organ/heart/gondola name = "mutated gondola-heart" desc = "Gondola DNA infused into what was once a normal heart." @@ -28,13 +28,13 @@ Fluoride Stare: After someone says 5 words, blah blah blah... ///keeps track of whether the receiver actually gained factions var/list/factions_to_remove = list() -/obj/item/organ/internal/heart/gondola/Initialize(mapload) +/obj/item/organ/heart/gondola/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) AddElement(/datum/element/noticable_organ, "%PRONOUN_They radiate%PRONOUN_s an aura of serenity.") AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/internal/heart/gondola/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/heart/gondola/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(!(FACTION_HOSTILE in receiver.faction)) factions_to_remove += FACTION_HOSTILE @@ -42,7 +42,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... factions_to_remove += FACTION_MINING receiver.faction |= list(FACTION_HOSTILE, FACTION_MINING) -/obj/item/organ/internal/heart/gondola/mob_remove(mob/living/carbon/heartless, special, movement_flags) +/obj/item/organ/heart/gondola/mob_remove(mob/living/carbon/heartless, special, movement_flags) . = ..() for(var/faction in factions_to_remove) heartless.faction -= faction @@ -50,7 +50,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... factions_to_remove = list() /// Zen (tounge): You can no longer speak, but get a powerful positive moodlet -/obj/item/organ/internal/tongue/gondola +/obj/item/organ/tongue/gondola name = "mutated gondola-tongue" desc = "Gondola DNA infused into what was once a normal tongue." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -59,21 +59,21 @@ Fluoride Stare: After someone says 5 words, blah blah blah... greyscale_colors = GONDOLA_COLORS organ_traits = list(TRAIT_MUTE) -/obj/item/organ/internal/tongue/gondola/Initialize(mapload) +/obj/item/organ/tongue/gondola/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their mouth is permanently affixed into a relaxed smile.", BODY_ZONE_PRECISE_MOUTH) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) -/obj/item/organ/internal/tongue/gondola/mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/tongue/gondola/mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) . = ..() tongue_owner.add_mood_event("gondola_zen", /datum/mood_event/gondola_serenity) -/obj/item/organ/internal/tongue/gondola/mob_remove(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/tongue/gondola/mob_remove(mob/living/carbon/tongue_owner, special, movement_flags) tongue_owner.clear_mood_event("gondola_zen") return ..() /// Loving arms: your hands become unable to hold much of anything but your hugs now infuse the subject with pax. -/obj/item/organ/internal/liver/gondola +/obj/item/organ/liver/gondola name = "mutated gondola-liver" desc = "Gondola DNA infused into what was once a normal liver." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -81,13 +81,13 @@ Fluoride Stare: After someone says 5 words, blah blah blah... greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = GONDOLA_COLORS -/obj/item/organ/internal/liver/gondola/Initialize(mapload) +/obj/item/organ/liver/gondola/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their left arm has small needles breaching the skin all over it.", BODY_ZONE_L_ARM) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their right arm has small needles breaching the skin all over it.", BODY_ZONE_R_ARM) -/obj/item/organ/internal/liver/gondola/mob_insert(mob/living/carbon/liver_owner, special, movement_flags) +/obj/item/organ/liver/gondola/mob_insert(mob/living/carbon/liver_owner, special, movement_flags) . = ..() var/has_left = liver_owner.has_left_hand(check_disabled = FALSE) var/has_right = liver_owner.has_right_hand(check_disabled = FALSE) @@ -102,19 +102,19 @@ Fluoride Stare: After someone says 5 words, blah blah blah... RegisterSignal(liver_owner, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull)) RegisterSignal(liver_owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug)) -/obj/item/organ/internal/liver/gondola/mob_remove(mob/living/carbon/liver_owner, special, movement_flags) +/obj/item/organ/liver/gondola/mob_remove(mob/living/carbon/liver_owner, special, movement_flags) . = ..() UnregisterSignal(liver_owner, list(COMSIG_HUMAN_EQUIPPING_ITEM, COMSIG_LIVING_TRY_PULL, COMSIG_CARBON_HELPED)) /// signal sent when prompting if an item can be equipped -/obj/item/organ/internal/liver/gondola/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/equip_target, slot) +/obj/item/organ/liver/gondola/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/equip_target, slot) SIGNAL_HANDLER if(equip_target.w_class > WEIGHT_CLASS_TINY) equip_target.balloon_alert(owner, "too weak to hold this!") return COMPONENT_BLOCK_EQUIP /// signal sent when owner tries to pull an item -/obj/item/organ/internal/liver/gondola/proc/on_owner_try_pull(mob/living/carbon/owner, atom/movable/target, force) +/obj/item/organ/liver/gondola/proc/on_owner_try_pull(mob/living/carbon/owner, atom/movable/target, force) SIGNAL_HANDLER if(isliving(target)) var/mob/living/living_target = target @@ -127,7 +127,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... item_target.balloon_alert(owner, "too weak to pull this!") return COMSIG_LIVING_CANCEL_PULL -/obj/item/organ/internal/liver/gondola/proc/on_hug(mob/living/carbon/human/source, mob/living/carbon/hugged) +/obj/item/organ/liver/gondola/proc/on_hug(mob/living/carbon/human/source, mob/living/carbon/hugged) SIGNAL_HANDLER var/list/covered_body_zones = source.get_covered_body_zones() diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 4f8d38aa99971..f10dcefb0d5c5 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -12,7 +12,7 @@ bonus_traits = list(TRAIT_VENTCRAWLER_NUDE) ///way better night vision, super sensitive. lotta things work like this, huh? -/obj/item/organ/internal/eyes/night_vision/rat +/obj/item/organ/eyes/night_vision/rat name = "mutated rat-eyes" desc = "Rat DNA infused into what was once a normal pair of eyes." flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE @@ -27,13 +27,13 @@ medium_light_cutoff = list(30, 20, 5) high_light_cutoff = list(45, 35, 10) -/obj/item/organ/internal/eyes/night_vision/rat/Initialize(mapload) +/obj/item/organ/eyes/night_vision/rat/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes have deep, shifty black pupils, surrounded by a sickening yellow sclera.", BODY_ZONE_PRECISE_EYES) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) ///increases hunger, disgust recovers quicker, expands what is defined as "food" -/obj/item/organ/internal/stomach/rat +/obj/item/organ/stomach/rat name = "mutated rat-stomach" desc = "Rat DNA infused into what was once a normal stomach." disgust_metabolism = 3 @@ -44,13 +44,13 @@ greyscale_colors = RAT_COLORS hunger_modifier = 10 -/obj/item/organ/internal/stomach/rat/Initialize(mapload) +/obj/item/organ/stomach/rat/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their mouth is drooling excessively.", BODY_ZONE_PRECISE_MOUTH) /// makes you smaller, walk over tables, and take 1.5x damage -/obj/item/organ/internal/heart/rat +/obj/item/organ/heart/rat name = "mutated rat-heart" desc = "Rat DNA infused into what was once a normal heart." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -58,13 +58,13 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = RAT_COLORS -/obj/item/organ/internal/heart/rat/Initialize(mapload) +/obj/item/organ/heart/rat/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) AddElement(/datum/element/noticable_organ, "%PRONOUN_They hunch%PRONOUN_es over unnaturally!") AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/internal/heart/rat/on_mob_insert(mob/living/carbon/receiver) +/obj/item/organ/heart/rat/on_mob_insert(mob/living/carbon/receiver) . = ..() if(!ishuman(receiver)) return @@ -74,7 +74,7 @@ //but 1.5 damage human_receiver.physiology?.damage_resistance -= 50 -/obj/item/organ/internal/heart/rat/on_mob_remove(mob/living/carbon/heartless, special) +/obj/item/organ/heart/rat/on_mob_remove(mob/living/carbon/heartless, special) . = ..() if(!ishuman(heartless)) return @@ -84,7 +84,7 @@ human_heartless.physiology?.damage_resistance += 50 /// you occasionally squeak, and have some rat related verbal tics -/obj/item/organ/internal/tongue/rat +/obj/item/organ/tongue/rat name = "mutated rat-tongue" desc = "Rat DNA infused into what was once a normal tongue." icon = 'icons/obj/medical/organs/infuser_organs.dmi' @@ -97,12 +97,12 @@ disliked_foodtypes = NONE //but a rat can eat anything without issue toxic_foodtypes = NONE -/obj/item/organ/internal/tongue/rat/Initialize(mapload) +/obj/item/organ/tongue/rat/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are oddly shaped and yellowing.", BODY_ZONE_PRECISE_MOUTH) AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) -/obj/item/organ/internal/tongue/rat/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/rat/modify_speech(datum/source, list/speech_args) . = ..() var/message = LOWER_TEXT(speech_args[SPEECH_MESSAGE]) if(message == "hi" || message == "hi.") @@ -110,23 +110,23 @@ if(message == "hi?") speech_args[SPEECH_MESSAGE] = "Um... cheesed to meet you?" -/obj/item/organ/internal/tongue/rat/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) +/obj/item/organ/tongue/rat/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags) . = ..() RegisterSignal(tongue_owner, COMSIG_CARBON_ITEM_GIVEN, PROC_REF(its_on_the_mouse)) -/obj/item/organ/internal/tongue/rat/on_mob_remove(mob/living/carbon/tongue_owner) +/obj/item/organ/tongue/rat/on_mob_remove(mob/living/carbon/tongue_owner) . = ..() UnregisterSignal(tongue_owner, COMSIG_CARBON_ITEM_GIVEN) -/obj/item/organ/internal/tongue/rat/proc/on_item_given(mob/living/carbon/offerer, mob/living/taker, obj/item/given) +/obj/item/organ/tongue/rat/proc/on_item_given(mob/living/carbon/offerer, mob/living/taker, obj/item/given) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(its_on_the_mouse), offerer, taker) -/obj/item/organ/internal/tongue/rat/proc/its_on_the_mouse(mob/living/carbon/offerer, mob/living/taker) +/obj/item/organ/tongue/rat/proc/its_on_the_mouse(mob/living/carbon/offerer, mob/living/taker) offerer.say("For you, it's on the mouse.") taker.add_mood_event("it_was_on_the_mouse", /datum/mood_event/it_was_on_the_mouse) -/obj/item/organ/internal/tongue/rat/on_life(seconds_per_tick, times_fired) +/obj/item/organ/tongue/rat/on_life(seconds_per_tick, times_fired) . = ..() if(prob(5)) owner.emote("squeaks") diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm index b31a64d9bb87c..2b32ad8570223 100644 --- a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm @@ -46,7 +46,7 @@ /// Roach heart: /// Reduces damage taken from brute attacks from behind, /// but increases duration of knockdowns -/obj/item/organ/internal/heart/roach +/obj/item/organ/heart/roach name = "mutated roach-heart" desc = "Roach DNA infused into what was once a normal heart." maxHealth = 2 * STANDARD_ORGAN_THRESHOLD @@ -61,18 +61,18 @@ COOLDOWN_DECLARE(harden_effect_cd) -/obj/item/organ/internal/heart/roach/Initialize(mapload) +/obj/item/organ/heart/roach/Initialize(mapload) . = ..() AddElement(/datum/element/noticable_organ, "%PRONOUN_They %PRONOUN_have hardened, somewhat translucent skin.") AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) AddElement(/datum/element/update_icon_blocker) roach_shell = new() -/obj/item/organ/internal/heart/roach/Destroy() +/obj/item/organ/heart/roach/Destroy() QDEL_NULL(roach_shell) return ..() -/obj/item/organ/internal/heart/roach/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/heart/roach/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() if(!ishuman(organ_owner)) return @@ -83,11 +83,11 @@ RegisterSignal(human_owner, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(do_block_effect)) human_owner.physiology.knockdown_mod *= 3 -/obj/item/organ/internal/heart/roach/on_bodypart_insert(obj/item/bodypart/limb) +/obj/item/organ/heart/roach/on_bodypart_insert(obj/item/bodypart/limb) . = ..() limb.add_bodypart_overlay(roach_shell) -/obj/item/organ/internal/heart/roach/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/heart/roach/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if(!ishuman(organ_owner) || QDELETED(organ_owner)) return @@ -97,7 +97,7 @@ UnregisterSignal(human_owner, list(COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, COMSIG_MOB_AFTER_APPLY_DAMAGE)) human_owner.physiology.knockdown_mod /= 3 -/obj/item/organ/internal/heart/roach/on_bodypart_remove(obj/item/bodypart/limb) +/obj/item/organ/heart/roach/on_bodypart_remove(obj/item/bodypart/limb) . = ..() limb.remove_bodypart_overlay(roach_shell) @@ -107,7 +107,7 @@ * * Adds a 0.5 modifier to attacks from the back */ -/obj/item/organ/internal/heart/roach/proc/modify_damage(mob/living/carbon/human/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) +/obj/item/organ/heart/roach/proc/modify_damage(mob/living/carbon/human/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) SIGNAL_HANDLER if(!is_blocking(source, damage_amount, damagetype, attack_direction)) @@ -120,7 +120,7 @@ * * Does a special effect if we blocked damage with our back */ -/obj/item/organ/internal/heart/roach/proc/do_block_effect(mob/living/carbon/human/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item) +/obj/item/organ/heart/roach/proc/do_block_effect(mob/living/carbon/human/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item) SIGNAL_HANDLER if(!is_blocking(source, damage_dealt, damagetype, attack_direction)) @@ -133,7 +133,7 @@ COOLDOWN_START(src, harden_effect_cd, 5 SECONDS) // Cooldown resets EVERY time we get hit /// Checks if the passed mob is in a valid state to be blocking damage with the roach shell -/obj/item/organ/internal/heart/roach/proc/is_blocking(mob/living/carbon/human/blocker, damage_amount, damagetype, attack_direction) +/obj/item/organ/heart/roach/proc/is_blocking(mob/living/carbon/human/blocker, damage_amount, damagetype, attack_direction) if(damage_amount < 5 || damagetype != BRUTE || !attack_direction) return if(!ishuman(blocker) || blocker.stat >= UNCONSCIOUS) @@ -160,7 +160,7 @@ /// Roach stomach: /// Makes disgust a non-issue, very slightly worse at passing off reagents /// Also makes you more hungry -/obj/item/organ/internal/stomach/roach +/obj/item/organ/stomach/roach name = "mutated roach-stomach" desc = "Roach DNA infused into what was once a normal stomach." maxHealth = 2 * STANDARD_ORGAN_THRESHOLD @@ -173,13 +173,13 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = ROACH_COLORS -/obj/item/organ/internal/stomach/roach/Initialize(mapload) +/obj/item/organ/stomach/roach/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) /// Roach liver: /// Purges toxins at a higher threshold, but takes more damage from them if not purged -/obj/item/organ/internal/liver/roach +/obj/item/organ/liver/roach name = "mutated roach-liver" desc = "Roach DNA infused into what was once a normal liver." maxHealth = 2 * STANDARD_ORGAN_THRESHOLD @@ -191,11 +191,11 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = ROACH_COLORS -/obj/item/organ/internal/liver/roach/Initialize(mapload) +/obj/item/organ/liver/roach/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) -/obj/item/organ/internal/liver/roach/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/roach/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() if(!ishuman(organ_owner)) return @@ -203,7 +203,7 @@ var/mob/living/carbon/human/human_owner = owner human_owner.physiology.tox_mod *= 2 -/obj/item/organ/internal/liver/roach/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/roach/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if(!ishuman(organ_owner) || QDELETED(organ_owner)) return @@ -213,7 +213,7 @@ /// Roach appendix: /// No appendicitus! weee! -/obj/item/organ/internal/appendix/roach +/obj/item/organ/appendix/roach name = "mutated roach-appendix" desc = "Roach DNA infused into what was once a normal appendix. It could get worse?" maxHealth = 2 * STANDARD_ORGAN_THRESHOLD @@ -223,11 +223,11 @@ greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = ROACH_COLORS -/obj/item/organ/internal/appendix/roach/Initialize(mapload) +/obj/item/organ/appendix/roach/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach) -/obj/item/organ/internal/appendix/roach/become_inflamed() +/obj/item/organ/appendix/roach/become_inflamed() return #undef ROACH_ORGAN_COLOR diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index cb0ab9900d5cc..0ed9bd4a0103c 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -7,7 +7,7 @@ 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) + occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain) circuit = /obj/item/circuitboard/machine/dnascanner var/locked = FALSE diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 13126a0436b9f..882d3bebc90cb 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -288,7 +288,7 @@ chemical_list += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) if(reagent.overdosed) overdose_list += list(list("name" = reagent.name)) - var/obj/item/organ/internal/stomach/belly = patient.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = patient.get_organ_slot(ORGAN_SLOT_STOMACH) if(belly?.reagents.reagent_list.len) //include the stomach contents if it exists for(var/bile in belly.reagents.reagent_list) var/datum/reagent/bit = bile diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 166410cfccf56..134fa7731d028 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -171,7 +171,7 @@ not_eaten += 1 continue - if (istype(thing, /obj/item/organ/internal/brain) || istype(thing, /obj/item/dullahan_relay)) + if (istype(thing, /obj/item/organ/brain) || istype(thing, /obj/item/dullahan_relay)) living_detected = TRUE if (istype(thing, /obj/item/mmi)) diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index 050223525e6e8..2998e9dc6705f 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -25,20 +25,20 @@ icon_state = "eyes" spawn_loot_count = 3 loot = list( - /obj/item/organ/internal/heart/gland/egg = 7, - /obj/item/organ/internal/heart/gland/plasma = 7, - /obj/item/organ/internal/heart/gland/chem = 5, - /obj/item/organ/internal/heart/gland/mindshock = 5, - /obj/item/organ/internal/heart/gland/transform = 5, - /obj/item/organ/internal/heart/gland/spiderman = 5, - /obj/item/organ/internal/heart/gland/slime = 4, - /obj/item/organ/internal/heart/gland/trauma = 4, - /obj/item/organ/internal/heart/gland/electric = 3, - /obj/item/organ/internal/monster_core/regenerative_core = 2, - /obj/item/organ/internal/monster_core/rush_gland = 2, - /obj/item/organ/internal/monster_core/brimdust_sac = 2, - /obj/item/organ/internal/heart/gland/ventcrawling = 1, - /obj/item/organ/internal/body_egg/alien_embryo = 1, + /obj/item/organ/heart/gland/egg = 7, + /obj/item/organ/heart/gland/plasma = 7, + /obj/item/organ/heart/gland/chem = 5, + /obj/item/organ/heart/gland/mindshock = 5, + /obj/item/organ/heart/gland/transform = 5, + /obj/item/organ/heart/gland/spiderman = 5, + /obj/item/organ/heart/gland/slime = 4, + /obj/item/organ/heart/gland/trauma = 4, + /obj/item/organ/heart/gland/electric = 3, + /obj/item/organ/monster_core/regenerative_core = 2, + /obj/item/organ/monster_core/rush_gland = 2, + /obj/item/organ/monster_core/brimdust_sac = 2, + /obj/item/organ/heart/gland/ventcrawling = 1, + /obj/item/organ/body_egg/alien_embryo = 1, ) /obj/effect/spawner/random/medical/memeorgans @@ -46,23 +46,23 @@ icon_state = "eyes" spawn_loot_count = 5 loot = list( - /obj/item/organ/internal/ears/penguin, - /obj/item/organ/internal/ears/cat, - /obj/item/organ/internal/eyes/moth, - /obj/item/organ/internal/eyes/snail, - /obj/item/organ/internal/tongue/bone, - /obj/item/organ/internal/tongue/fly, - /obj/item/organ/internal/tongue/snail, - /obj/item/organ/internal/tongue/lizard, - /obj/item/organ/internal/tongue/alien, - /obj/item/organ/internal/tongue/ethereal, - /obj/item/organ/internal/tongue/robot, - /obj/item/organ/internal/tongue/zombie, - /obj/item/organ/internal/appendix, - /obj/item/organ/internal/liver/fly, - /obj/item/organ/internal/lungs/plasmaman, - /obj/item/organ/external/tail/cat, - /obj/item/organ/external/tail/lizard, + /obj/item/organ/ears/penguin, + /obj/item/organ/ears/cat, + /obj/item/organ/eyes/moth, + /obj/item/organ/eyes/snail, + /obj/item/organ/tongue/bone, + /obj/item/organ/tongue/fly, + /obj/item/organ/tongue/snail, + /obj/item/organ/tongue/lizard, + /obj/item/organ/tongue/alien, + /obj/item/organ/tongue/ethereal, + /obj/item/organ/tongue/robot, + /obj/item/organ/tongue/zombie, + /obj/item/organ/appendix, + /obj/item/organ/liver/fly, + /obj/item/organ/lungs/plasmaman, + /obj/item/organ/tail/cat, + /obj/item/organ/tail/lizard, ) /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 3124ba9c39196..2e7e6c39b6cc0 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -73,7 +73,7 @@ return TRUE /obj/item/airlock_painter/suicide_act(mob/living/user) - var/obj/item/organ/internal/lungs/L = user.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/L = user.get_organ_slot(ORGAN_SLOT_LUNGS) if(can_use(user) && L) user.visible_message(span_suicide("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index d8b48e0789b21..d5769ceb8d798 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/body_egg +/obj/item/organ/body_egg name = "body egg" desc = "All slimy and yuck." icon_state = "innards" @@ -6,47 +6,47 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_PARASITE_EGG -/obj/item/organ/internal/body_egg/on_find(mob/living/finder) +/obj/item/organ/body_egg/on_find(mob/living/finder) ..() to_chat(finder, span_warning("You found an unknown alien organism in [owner]'s [zone]!")) -/obj/item/organ/internal/body_egg/Initialize(mapload) +/obj/item/organ/body_egg/Initialize(mapload) . = ..() if(iscarbon(loc)) Insert(loc) -/obj/item/organ/internal/body_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) +/obj/item/organ/body_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) . = ..() egg_owner.add_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT) egg_owner.med_hud_set_status() INVOKE_ASYNC(src, PROC_REF(AddInfectionImages), egg_owner) -/obj/item/organ/internal/body_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags) +/obj/item/organ/body_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags) . = ..() egg_owner.remove_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT) egg_owner.med_hud_set_status() INVOKE_ASYNC(src, PROC_REF(RemoveInfectionImages), egg_owner) -/obj/item/organ/internal/body_egg/on_death(seconds_per_tick, times_fired) +/obj/item/organ/body_egg/on_death(seconds_per_tick, times_fired) . = ..() if(!owner) return egg_process(seconds_per_tick, times_fired) -/obj/item/organ/internal/body_egg/on_life(seconds_per_tick, times_fired) +/obj/item/organ/body_egg/on_life(seconds_per_tick, times_fired) . = ..() egg_process(seconds_per_tick, times_fired) -/obj/item/organ/internal/body_egg/proc/egg_process(seconds_per_tick, times_fired) +/obj/item/organ/body_egg/proc/egg_process(seconds_per_tick, times_fired) return -/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage() +/obj/item/organ/body_egg/proc/RefreshInfectionImage() RemoveInfectionImages() AddInfectionImages() -/obj/item/organ/internal/body_egg/proc/AddInfectionImages() +/obj/item/organ/body_egg/proc/AddInfectionImages() return -/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages() +/obj/item/organ/body_egg/proc/RemoveInfectionImages() return diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm index aa51d71c5eda4..e99ed4b3320a3 100644 --- a/code/game/objects/items/choice_beacon.dm +++ b/code/game/objects/items/choice_beacon.dm @@ -147,12 +147,12 @@ augment_list = list() // cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof var/list/selectable_types = list( - /obj/item/organ/internal/cyberimp/brain/anti_drop, - /obj/item/organ/internal/cyberimp/arm/toolset, - /obj/item/organ/internal/cyberimp/arm/surgery, - /obj/item/organ/internal/cyberimp/chest/thrusters, - /obj/item/organ/internal/lungs/cybernetic/tier3, - /obj/item/organ/internal/liver/cybernetic/tier3, + /obj/item/organ/cyberimp/brain/anti_drop, + /obj/item/organ/cyberimp/arm/toolset, + /obj/item/organ/cyberimp/arm/surgery, + /obj/item/organ/cyberimp/chest/thrusters, + /obj/item/organ/lungs/cybernetic/tier3, + /obj/item/organ/liver/cybernetic/tier3, ) for(var/obj/item/organ/organ as anything in selectable_types) augment_list[initial(organ.name)] = organ diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 69b65149775ba..74f2ae417c853 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -445,7 +445,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM how_long_have_we_been_smokin += seconds_per_tick * (1 SECONDS) reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) - var/obj/item/organ/internal/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) if(lungs && IS_ORGANIC_ORGAN(lungs)) var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1 smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance) diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm index f10a9db76704c..eae46e698d105 100644 --- a/code/game/objects/items/climbingrope.dm +++ b/code/game/objects/items/climbingrope.dm @@ -58,7 +58,7 @@ // Misc bonuses to the climb speed. var/misc_multiplier = 1 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) misc_multiplier *= potential_spine.athletics_boost_multiplier diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 9133068cb0027..dd5d78fce0d61 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -583,7 +583,7 @@ if(do_after(user, 3 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process user.visible_message(span_notice("[user] places [src] on [H]'s chest."), span_warning("You place [src] on [H]'s chest.")) playsound(src, 'sound/machines/defib/defib_charge.ogg', 75, FALSE) - var/obj/item/organ/internal/heart = H.get_organ_by_type(/obj/item/organ/internal/heart) + var/obj/item/organ/heart = H.get_organ_by_type(/obj/item/organ/heart) if(do_after(user, 2 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total if((!combat && !req_defib) || (req_defib && !defib.combat)) for(var/obj/item/clothing/C in H.get_equipped_items()) @@ -660,7 +660,7 @@ log_combat(user, H, "revived", defib) do_success() return - else if (!H.get_organ_by_type(/obj/item/organ/internal/heart)) + else if (!H.get_organ_by_type(/obj/item/organ/heart)) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's heart is missing. Operation aborted.")) playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE) else if(H.undergoing_cardiac_arrest()) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 657d054f11cc8..94b7e14fe80fb 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -112,8 +112,8 @@ to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first!")) return - var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES) - var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN) if(!E) to_chat(user, span_warning("[M] doesn't have any eyes!")) return @@ -889,7 +889,7 @@ if(!fuel) user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but it's empty!")) return SHAME - var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but [user.p_they()] don't have any!")) return SHAME diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 5b7ee4f7026b8..aedffb566b276 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -326,7 +326,7 @@ // Cybernetics var/list/cyberimps - for(var/obj/item/organ/internal/cyberimp/cyberimp in humantarget.organs) + for(var/obj/item/organ/cyberimp/cyberimp in humantarget.organs) if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) LAZYADD(cyberimps, cyberimp.examine_title(user)) if(LAZYLEN(cyberimps)) @@ -468,7 +468,7 @@ render_block.Cut() // Stomach reagents - var/obj/item/organ/internal/stomach/belly = target.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = target.get_organ_slot(ORGAN_SLOT_STOMACH) if(belly) if(belly.reagents.reagent_list.len) for(var/bile in belly.reagents.reagent_list) diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index b25765a302443..7f2e54984cae9 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -84,7 +84,7 @@ user.visible_message(span_suicide("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!")) var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code - var/obj/item/organ/internal/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN) B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea var/randdir for(var/i in 1 to 24)//like a headless chicken! diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm index b64f15fe69073..fc6685aaf6b2a 100644 --- a/code/game/objects/items/dyespray.dm +++ b/code/game/objects/items/dyespray.dm @@ -23,11 +23,34 @@ if(!ishuman(target)) return var/mob/living/carbon/human/human_target = target - var/beard_or_hair = tgui_alert(user, "What do you want to dye?", "Character Preference", list("Hair", "Facial Hair")) - if(!beard_or_hair || !user.can_perform_action(src, NEED_DEXTERITY)) + var/list/dyables = list("Hair", "Facial Hair") + for(var/obj/item/organ/organ as anything in human_target.organs) + if(!istype(organ.bodypart_overlay, /datum/bodypart_overlay/mutant)) + continue + var/datum/bodypart_overlay/mutant/overlay = organ.bodypart_overlay + if(overlay.dyable && overlay.sprite_datum.color_src) + dyables += list("External Body Parts") + break + var/obj/item/bodypart/head/head = human_target.get_bodypart(BODY_ZONE_HEAD) + if(!head || !(head.head_flags & HEAD_HAIR) || HAS_TRAIT(human_target, TRAIT_BALD)) + dyables -= "Hair" + if(!head || !(head.head_flags & HEAD_FACIAL_HAIR) || HAS_TRAIT(human_target, TRAIT_SHAVED)) + dyables -= "Facial Hair" + if(!length(dyables)) + if(target != user) + to_chat(user, span_warning("[human_target] doesn't have anything that can be dyed.")) + else + to_chat(user, span_warning("You have nothing to dye.")) + return + var/what_to_dye = tgui_alert(user, "What do you want to dye?", "Character Preference", dyables) + if(!what_to_dye || !user.can_perform_action(src, NEED_DEXTERITY)) + return + + if(what_to_dye == "External Bodyparts/Organs") + dye_organ(target, user) return - var/list/choices = beard_or_hair == "Hair" ? SSaccessories.hair_gradients_list : SSaccessories.facial_hair_gradients_list + var/list/choices = what_to_dye == "Hair" ? SSaccessories.hair_gradients_list : SSaccessories.facial_hair_gradients_list var/new_grad_style = tgui_input_list(user, "Choose a color pattern", "Character Preference", choices) if(isnull(new_grad_style)) return @@ -41,10 +64,54 @@ to_chat(user, span_notice("You start applying the hair dye...")) if(!do_after(user, 3 SECONDS, target)) return - if(beard_or_hair == "Hair") + if(what_to_dye == "Hair") human_target.set_hair_gradient_style(new_grad_style, update = FALSE) human_target.set_hair_gradient_color(new_grad_color, update = TRUE) else human_target.set_facial_hair_gradient_style(new_grad_style, update = FALSE) human_target.set_facial_hair_gradient_color(new_grad_color, update = TRUE) playsound(src, 'sound/effects/spray.ogg', 10, vary = TRUE) + +/obj/item/dyespray/proc/dye_organ(mob/living/carbon/human/target, mob/user) + var/list/dyables = list() + var/list/choices = list() + for(var/obj/item/organ/organ as anything in target.organs) + if(!istype(organ.bodypart_overlay, /datum/bodypart_overlay/mutant)) + continue + var/datum/bodypart_overlay/mutant/overlay = organ.bodypart_overlay + if(overlay.dyable && overlay.sprite_datum.color_src) + var/choice_name = full_capitalize(organ.name) + dyables[choice_name] = organ + choices += choice_name + if(!length(choices)) + return + var/what_to_dye = tgui_alert(user, "What do you want to dye?", "Character Preference", choices) + if(!what_to_dye || !user.can_perform_action(src, NEED_DEXTERITY)) + return + + var/obj/item/organ/selected = dyables[what_to_dye] + if(QDELETED(selected) || !(selected in target.organs)) + return + + var/datum/bodypart_overlay/mutant/overlay = selected.bodypart_overlay + if(overlay.dye_color) + var/remove_dye = tgui_alert(user, "Do you want to un-dye [selected]?", "Character Preference", list("Yes", "No")) + if(isnull(remove_dye) || !user.can_perform_action(src, NEED_DEXTERITY)) + return + if(QDELETED(selected) || !(selected in target.organs)) + return + if(remove_dye == "Yes") + overlay.set_dye_color(null, selected) + return + + var/default_color = overlay.dye_color || overlay.draw_color + var/new_color = input(user, "Choose a color for [selected]:", "Character Preference", default_color) as color|null + if(isnull(new_color) || new_color == default_color || !user.can_perform_action(src, NEED_DEXTERITY)) + return + if(QDELETED(selected) || !(selected in target.organs)) + return + if(!do_after(user, 4.5 SECONDS, target)) + return + if(QDELETED(selected) || !(selected in target.organs)) + return + overlay.set_dye_color(new_color, selected) diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 922ed2eaa6674..993ada424adab 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -45,7 +45,7 @@ ///Override for checkliked in edible component, because all cops LOVE donuts /obj/item/food/donut/proc/check_liked(mob/living/carbon/human/consumer) - var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) return FOOD_LIKED diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index bfd26f534de23..6da965e47578d 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -611,7 +611,7 @@ AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) /obj/item/food/pickle/proc/check_liked(mob/living/carbon/human/consumer) - var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) return FOOD_LIKED diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index eb38b5a97836e..9674a7f6d9973 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -635,7 +635,7 @@ if(!iscarbon(target)) return var/mob/living/carbon/heartbreakee = target - var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot(ORGAN_SLOT_HEART) dont_go_breakin_my_heart.apply_organ_damage(999) // Based on energy gun characteristics diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 01e5983b7d7aa..775612026b192 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -351,7 +351,7 @@ /obj/item/melee/baton/telescopic/suicide_act(mob/living/user) var/mob/living/carbon/human/human_user = user - var/obj/item/organ/internal/brain/our_brain = human_user.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/our_brain = human_user.get_organ_by_type(/obj/item/organ/brain) user.visible_message(span_suicide("[user] stuffs [src] up [user.p_their()] nose and presses the 'extend' button! It looks like [user.p_theyre()] trying to clear [user.p_their()] mind.")) if(active) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 9a1b8bed101f0..7ea8a663caf56 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -95,7 +95,7 @@ */ /obj/item/melee/sabre/proc/attempt_bane(element_owner, mob/living/carbon/criminal) SIGNAL_HANDLER - var/obj/item/organ/internal/liver/liver = criminal.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = criminal.get_organ_slot(ORGAN_SLOT_LIVER) if(isnull(liver) || !HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) return COMPONENT_CANCEL_BANING diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ce350ecb788f8..24b8fc7f73df2 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -239,7 +239,7 @@ else if(istype(W, /obj/item/bodypart/head/robot)) var/obj/item/bodypart/head/robot/HD = W - if(locate(/obj/item/organ/internal) in HD) + if(locate(/obj/item/organ) in HD) to_chat(user, span_warning("There are organs inside [HD]!")) return if(head) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index f410eafcd484e..4fdf903fb5d78 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -427,7 +427,7 @@ /obj/item/lighter, /obj/item/mining_scanner, /obj/item/multitool, - /obj/item/organ/internal/monster_core, + /obj/item/organ/monster_core, /obj/item/pickaxe, /obj/item/radio, /obj/item/reagent_containers/cup/glass, @@ -471,7 +471,7 @@ for(var/i in 1 to 2) new /obj/item/reagent_containers/hypospray/medipen/survival(src) for(var/i in 1 to 2) - var/obj/item/organ/internal/monster_core/core = new /obj/item/organ/internal/monster_core/regenerative_core/legion(src) + var/obj/item/organ/monster_core/core = new /obj/item/organ/monster_core/regenerative_core/legion(src) core.preserve() /obj/item/storage/belt/mining/primitive diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 120b91a40ffbc..e6dad759c83ed 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -385,7 +385,7 @@ . = ..() if(.) return - if(user.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)) + if(user.get_organ_by_type(/obj/item/organ/alien/plasmavessel)) switch(status) if(BURSTING) to_chat(user, span_notice("The child is hatching out.")) @@ -457,7 +457,7 @@ return var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) + if(C.stat == CONSCIOUS && C.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) return Burst(kill=FALSE) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 131e08808fbdb..3a6d6d3ee4a81 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -26,7 +26,7 @@ if(!length(buckled_mobs)) return - if(hero.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)) + if(hero.get_organ_by_type(/obj/item/organ/alien/plasmavessel)) unbuckle_mob(captive) add_fingerprint(hero) return @@ -59,9 +59,9 @@ if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated || M.buckled ) return - if(M.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)) + if(M.get_organ_by_type(/obj/item/organ/alien/plasmavessel)) return - if(!user.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)) + if(!user.get_organ_by_type(/obj/item/organ/alien/plasmavessel)) return if(has_buckled_mobs()) diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm index bba9e4f715c2a..bea51bc1d8c6c 100644 --- a/code/game/objects/structures/gym/punching_bag.dm +++ b/code/game/objects/structures/gym/punching_bag.dm @@ -58,7 +58,7 @@ if (is_heavy_gravity) stamina_exhaustion *= 1.5 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) stamina_exhaustion *= potential_spine.athletics_boost_multiplier diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index 352ef65ff0050..b36e35245c202 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -172,7 +172,7 @@ // total stamina drain of 1 workout calculated based on the workout length var/stamina_exhaustion = FLOOR(user.maxHealth / workout_reps / WORKOUT_LENGTH, 0.1) - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) stamina_exhaustion *= potential_spine.athletics_boost_multiplier diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index fb082b72456dc..f9d490a29b2e9 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(3) new /obj/item/reagent_containers/cup/bottle/potion/flight(loc) if(4) - new /obj/item/organ/internal/heart/cursed/wizard(loc) + new /obj/item/organ/heart/cursed/wizard(loc) if(5) new /obj/item/jacobs_ladder(loc) if(6) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 17f81eb242820..0d4c5b490b9ae 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -112,7 +112,7 @@ // Misc bonuses to the climb speed. var/misc_multiplier = 1 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) misc_multiplier *= potential_spine.athletics_boost_multiplier diff --git a/code/game/objects/structures/lavaland/gulag_vent.dm b/code/game/objects/structures/lavaland/gulag_vent.dm index 8cb530e31b18a..d6e30cf1fe3cb 100644 --- a/code/game/objects/structures/lavaland/gulag_vent.dm +++ b/code/game/objects/structures/lavaland/gulag_vent.dm @@ -33,7 +33,7 @@ var/boulder_lift_speed = 8 SECONDS - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = living_user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = living_user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) boulder_lift_speed *= potential_spine.athletics_boost_multiplier diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index d27a2e8e1cd8d..895602bb017c7 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -77,7 +77,7 @@ petrified_mob.investigate_log("has been dusted by statue deconstruction.", INVESTIGATE_DEATHS) if(iscarbon(petrified_mob) && brain) var/mob/living/carbon/petrified_carbon = petrified_mob - var/obj/item/organ/internal/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN) carbon_brain.Remove(petrified_carbon) carbon_brain.forceMove(get_turf(src)) carbon_brain.name = "petrified [carbon_brain.name]" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index ac7282f9386b6..c57ce3bcecfbf 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -288,7 +288,7 @@ tableplace_delay = 2.75 SECONDS skills_space = " quickly" - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) tableplace_delay *= potential_spine.athletics_boost_multiplier diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 5b39caf571faa..8b30634ac9f22 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -668,7 +668,7 @@ GLOBAL_LIST_EMPTY(station_turfs) clear_reagents_to_vomit_pool(vomiter, throw_up, purge_ratio) /proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1) - var/obj/item/organ/internal/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH) if(!belly?.reagents.total_volume) return var/chemicals_lost = belly.reagents.total_volume * purge_ratio diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index c58d63581bd34..93b398397c284 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -110,7 +110,7 @@ ADMIN_VERB(mass_zombie_infection, R_ADMIN, "Mass Zombie Infection", "Infects all for(var/i in GLOB.human_list) var/mob/living/carbon/human/H = i - new /obj/item/organ/internal/zombie_infection/nodamage(H) + new /obj/item/organ/zombie_infection/nodamage(H) message_admins("[key_name_admin(user)] added a latent zombie infection to all humans.") log_admin("[key_name(user)] added a latent zombie infection to all humans.") @@ -121,7 +121,7 @@ ADMIN_VERB(mass_zombie_cure, R_ADMIN, "Mass Zombie Cure", "Removes the zombie in if(confirm != "Yes") return - for(var/obj/item/organ/internal/zombie_infection/nodamage/I in GLOB.zombie_infection_list) + for(var/obj/item/organ/zombie_infection/nodamage/I in GLOB.zombie_infection_list) qdel(I) message_admins("[key_name_admin(user)] cured all zombies.") diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 368f6f4d6f45e..26cf122211305 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -517,8 +517,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w if(H.dna.species.id == SPECIES_HUMAN) if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") - var/obj/item/organ/internal/ears/cat/ears = new - var/obj/item/organ/external/tail/cat/tail = new + var/obj/item/organ/ears/cat/ears = new + var/obj/item/organ/tail/cat/tail = new ears.Insert(H, movement_flags = DELETE_IF_REPLACED) tail.Insert(H, movement_flags = DELETE_IF_REPLACED) var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 415130fa1b727..96534967702b7 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -213,7 +213,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta for(var/obj/item/item in human_target.get_equipped_items(includes_flags)) qdel(item) - var/obj/item/organ/internal/brain/human_brain = human_target.get_organ_slot(BRAIN) + var/obj/item/organ/brain/human_brain = human_target.get_organ_slot(BRAIN) human_brain.destroy_all_skillchips() // get rid of skillchips to prevent runtimes if(dresscode != "Naked") diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 2ca46499a7db0..9b8dca4a0e2b0 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -93,7 +93,7 @@ //Equip var/mob/living/carbon/human/new_abductor = owner.current new_abductor.set_species(/datum/species/abductor) - var/obj/item/organ/internal/tongue/abductor/abductor_tongue = new_abductor.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/abductor/abductor_tongue = new_abductor.get_organ_slot(ORGAN_SLOT_TONGUE) abductor_tongue.mothership = "[team.name]" new_abductor.real_name = "[team.name] [sub_role]" diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index a02d89e6b1d47..296eef07e8141 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -29,7 +29,7 @@ accept_hand = 1 time = 32 var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/internal/heart) + var/list/organ_types = list(/obj/item/organ/heart) /datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) for(var/atom/A in target.organs) @@ -50,7 +50,7 @@ /datum/surgery_step/gland_insert name = "insert gland" - implements = list(/obj/item/organ/internal/heart/gland = 100) + implements = list(/obj/item/organ/heart/gland = 100) time = 32 /datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -59,6 +59,6 @@ /datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("You insert [tool] into [target].")) user.temporarilyRemoveItemFromInventory(tool, TRUE) - var/obj/item/organ/internal/heart/gland/gland = tool + var/obj/item/organ/heart/gland/gland = tool gland.Insert(target, 2) return 1 diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 9f6d10677d198..d70dc3f0e6723 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -178,7 +178,7 @@ /obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) if(iscarbon(target)) var/mob/living/carbon/carbon_target = target - var/obj/item/organ/internal/heart/gland/target_gland = carbon_target.get_organ_slot("heart") + var/obj/item/organ/heart/gland/target_gland = carbon_target.get_organ_slot("heart") if(!istype(target_gland)) to_chat(user, span_warning("Your target does not have an experimental gland!")) return @@ -448,7 +448,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} species = span_notice("[human_victim.dna.species.name]") if(IS_CHANGELING(human_victim)) species = span_warning("Changeling lifeform") - var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs + var/obj/item/organ/heart/gland/temp = locate() in human_victim.organs if(temp) helptext = span_warning("Experimental gland detected!") else diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index d1f240b7f6821..b991a16b8318d 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland +/obj/item/organ/heart/gland name = "fleshy mass" desc = "A nausea-inducing hunk of twisting flesh and metal." icon = 'icons/obj/antags/abductor.dmi' @@ -22,31 +22,31 @@ var/mind_control_duration = 1800 var/active_mind_control = FALSE -/obj/item/organ/internal/heart/gland/Initialize(mapload) +/obj/item/organ/heart/gland/Initialize(mapload) . = ..() icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral")) AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/internal/heart/gland/examine(mob/user) +/obj/item/organ/heart/gland/examine(mob/user) . = ..() if(HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || isobserver(user)) . += span_notice("It is \a [abductor_hint]") -/obj/item/organ/internal/heart/gland/Stop() +/obj/item/organ/heart/gland/Stop() return FALSE -/obj/item/organ/internal/heart/gland/proc/ownerCheck() +/obj/item/organ/heart/gland/proc/ownerCheck() if(ishuman(owner)) return TRUE if(!human_only && iscarbon(owner)) return TRUE return FALSE -/obj/item/organ/internal/heart/gland/proc/Start() +/obj/item/organ/heart/gland/proc/Start() active = 1 COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high)) -/obj/item/organ/internal/heart/gland/proc/update_gland_hud() +/obj/item/organ/heart/gland/proc/update_gland_hud() if(!owner) return var/image/holder = owner.hud_list[GLAND_HUD] @@ -59,7 +59,7 @@ else holder.icon_state = "hudgland_spent" -/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user) +/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) if(!ownerCheck() || !mind_control_uses || active_mind_control) return FALSE mind_control_uses-- @@ -75,7 +75,7 @@ addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration) return TRUE -/obj/item/organ/internal/heart/gland/proc/clear_mind_control() +/obj/item/organ/heart/gland/proc/clear_mind_control() if(!ownerCheck() || !active_mind_control) return FALSE owner.balloon_alert(owner, "compulsion forgotten") @@ -84,7 +84,7 @@ active_mind_control = FALSE return TRUE -/obj/item/organ/internal/heart/gland/mob_remove(mob/living/carbon/gland_owner, special, movement_flags) +/obj/item/organ/heart/gland/mob_remove(mob/living/carbon/gland_owner, special, movement_flags) . = ..() active = FALSE if(initial(uses) == 1) @@ -93,7 +93,7 @@ hud.remove_atom_from_hud(gland_owner) clear_mind_control() -/obj/item/organ/internal/heart/gland/mob_insert(mob/living/carbon/gland_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) +/obj/item/organ/heart/gland/mob_insert(mob/living/carbon/gland_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) . = ..() if(special != 2 && uses) // Special 2 means abductor surgery @@ -102,7 +102,7 @@ hud.add_atom_to_hud(gland_owner) update_gland_hud() -/obj/item/organ/internal/heart/gland/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/gland/on_life(seconds_per_tick, times_fired) if(!active) return if(!ownerCheck()) @@ -115,5 +115,5 @@ if(!uses) active = FALSE -/obj/item/organ/internal/heart/gland/proc/activate() +/obj/item/organ/heart/gland/proc/activate() return diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm index 8e8ff9a7ef9c9..29be30c0cfcff 100644 --- a/code/modules/antagonists/abductor/equipment/glands/access.dm +++ b/code/modules/antagonists/abductor/equipment/glands/access.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/access +/obj/item/organ/heart/gland/access abductor_hint = "anagraphic electro-scrambler. After it activates, grants the abductee intrinsic all access." cooldown_low = 600 cooldown_high = 1200 @@ -7,6 +7,6 @@ mind_control_uses = 3 mind_control_duration = 900 -/obj/item/organ/internal/heart/gland/access/activate() +/obj/item/organ/heart/gland/access/activate() to_chat(owner, span_notice("You feel like a VIP for some reason.")) owner.AddComponent(/datum/component/simple_access, SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)), src) diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm index 522354fac3ac5..b1d408526733f 100644 --- a/code/modules/antagonists/abductor/equipment/glands/blood.dm +++ b/code/modules/antagonists/abductor/equipment/glands/blood.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/blood +/obj/item/organ/heart/gland/blood abductor_hint = "pseudonuclear hemo-destabilizer. Periodically randomizes the abductee's bloodtype into a random reagent." cooldown_low = 1200 cooldown_high = 1800 @@ -9,7 +9,7 @@ mind_control_uses = 3 mind_control_duration = 1500 -/obj/item/organ/internal/heart/gland/blood/activate() +/obj/item/organ/heart/gland/blood/activate() if(!ishuman(owner) || !owner.dna.species) return var/mob/living/carbon/human/H = owner diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm index 965d8f2fc201a..54644bd8e9f3d 100644 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/chem +/obj/item/organ/heart/gland/chem abductor_hint = "intrinsic pharma-provider. The abductee constantly produces random chemicals inside their bloodstream. They also quickly regenerate toxin damage." cooldown_low = 50 cooldown_high = 50 @@ -8,12 +8,12 @@ mind_control_duration = 1200 var/list/possible_reagents = list() -/obj/item/organ/internal/heart/gland/chem/Initialize(mapload) +/obj/item/organ/heart/gland/chem/Initialize(mapload) . = ..() for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) possible_reagents += R -/obj/item/organ/internal/heart/gland/chem/activate() +/obj/item/organ/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) owner.adjustToxLoss(-5, forced = TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm index 938caeeb36126..67c3efd42cbef 100644 --- a/code/modules/antagonists/abductor/equipment/glands/egg.dm +++ b/code/modules/antagonists/abductor/equipment/glands/egg.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/egg +/obj/item/organ/heart/gland/egg abductor_hint = "roe/enzymatic synthesizer. The abductee will periodically lay eggs filled with random reagents." cooldown_low = 300 cooldown_high = 400 @@ -9,7 +9,7 @@ mind_control_uses = 2 mind_control_duration = 1800 -/obj/item/organ/internal/heart/gland/egg/activate() +/obj/item/organ/heart/gland/egg/activate() owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]")) var/turf/T = owner.drop_location() new /obj/item/food/egg/gland(T) diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index e0b3df0f19c32..77c6cfdfeec25 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/electric +/obj/item/organ/heart/gland/electric abductor_hint = "electron accumulator/discharger. The abductee becomes fully immune to electric shocks. Additionally, they will randomly discharge electric bolts." cooldown_low = 800 cooldown_high = 1200 @@ -7,20 +7,20 @@ mind_control_uses = 2 mind_control_duration = 900 -/obj/item/organ/internal/heart/gland/electric/on_mob_insert(mob/living/carbon/gland_owner) +/obj/item/organ/heart/gland/electric/on_mob_insert(mob/living/carbon/gland_owner) . = ..() ADD_TRAIT(gland_owner, TRAIT_SHOCKIMMUNE, ABDUCTOR_GLAND_TRAIT) -/obj/item/organ/internal/heart/gland/electric/on_mob_remove(mob/living/carbon/gland_owner) +/obj/item/organ/heart/gland/electric/on_mob_remove(mob/living/carbon/gland_owner) . = ..() REMOVE_TRAIT(gland_owner, TRAIT_SHOCKIMMUNE, ABDUCTOR_GLAND_TRAIT) -/obj/item/organ/internal/heart/gland/electric/activate() +/obj/item/organ/heart/gland/electric/activate() owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\ span_warning("You feel electric energy building up inside you!")) playsound(get_turf(owner), SFX_SPARKS, 100, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE) addtimer(CALLBACK(src, PROC_REF(zap)), rand(3 SECONDS, 10 SECONDS)) -/obj/item/organ/internal/heart/gland/electric/proc/zap() +/obj/item/organ/heart/gland/electric/proc/zap() tesla_zap(source = owner, zap_range = 4, power = 8e3, cutoff = 1e3, zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/effects/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 83ba7a7ffbdf2..13761ba0cdba3 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -1,6 +1,6 @@ #define REJECTION_VOMIT_FLAGS (MOB_VOMIT_BLOOD | MOB_VOMIT_STUN | MOB_VOMIT_KNOCKDOWN | MOB_VOMIT_FORCE) -/obj/item/organ/internal/heart/gland/heal +/obj/item/organ/heart/gland/heal abductor_hint = "organic replicator. Forcibly ejects damaged and robotic organs from the abductee and regenerates them. Additionally, forcibly removes reagents (via vomit) from the abductee if they have moderate toxin damage or poison within the bloodstream, and regenerates blood to a healthy threshold if too low. The abductee will also reject implants such as mindshields." cooldown_low = 200 cooldown_high = 400 @@ -10,7 +10,7 @@ mind_control_uses = 3 mind_control_duration = 3000 -/obj/item/organ/internal/heart/gland/heal/activate() +/obj/item/organ/heart/gland/heal/activate() if(!(owner.mob_biotypes & MOB_ORGANIC)) return @@ -19,31 +19,31 @@ return for(var/organ in owner.organs) - if(istype(organ, /obj/item/organ/internal/cyberimp)) + if(istype(organ, /obj/item/organ/cyberimp)) reject_cyberimp(organ) return - var/obj/item/organ/internal/appendix/appendix = owner.get_organ_slot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/appendix/appendix = owner.get_organ_slot(ORGAN_SLOT_APPENDIX) if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(appendix)))) replace_appendix(appendix) return - var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER) if((!liver && !HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || IS_ROBOTIC_ORGAN(liver)))) replace_liver(liver) return - var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || IS_ROBOTIC_ORGAN(lungs)))) replace_lungs(lungs) return - var/obj/item/organ/internal/stomach/stomach = owner.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/stomach = owner.get_organ_slot(ORGAN_SLOT_STOMACH) if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || IS_ROBOTIC_ORGAN(stomach)))) replace_stomach(stomach) return - var/obj/item/organ/internal/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || IS_ROBOTIC_ORGAN(eyes)))) replace_eyes(eyes) return @@ -78,19 +78,19 @@ replace_chest(chest) return -/obj/item/organ/internal/heart/gland/heal/proc/reject_implant(obj/item/implant/implant) +/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/implant/implant) owner.visible_message(span_warning("[owner] vomits up a tiny mangled implant!"), span_userdanger("You suddenly vomit up a tiny mangled implant!")) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) implant.removed(owner) qdel(implant) -/obj/item/organ/internal/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/internal/cyberimp/implant) +/obj/item/organ/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/cyberimp/implant) owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_userdanger("You suddenly vomit up your [implant.name]!")) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) implant.Remove(owner) implant.forceMove(owner.drop_location()) -/obj/item/organ/internal/heart/gland/heal/proc/replace_appendix(obj/item/organ/internal/appendix/appendix) +/obj/item/organ/heart/gland/heal/proc/replace_appendix(obj/item/organ/appendix/appendix) if(appendix) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) appendix.Remove(owner) @@ -99,13 +99,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/appendix_type = /obj/item/organ/internal/appendix + var/appendix_type = /obj/item/organ/appendix if(owner?.dna?.species?.mutantappendix) appendix_type = owner.dna.species.mutantappendix - var/obj/item/organ/internal/appendix/new_appendix = new appendix_type() + var/obj/item/organ/appendix/new_appendix = new appendix_type() new_appendix.Insert(owner) -/obj/item/organ/internal/heart/gland/heal/proc/replace_liver(obj/item/organ/internal/liver/liver) +/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver) if(liver) owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_userdanger("You suddenly vomit up your [liver.name]!")) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) @@ -114,13 +114,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/liver_type = /obj/item/organ/internal/liver + var/liver_type = /obj/item/organ/liver if(owner?.dna?.species?.mutantliver) liver_type = owner.dna.species.mutantliver - var/obj/item/organ/internal/liver/new_liver = new liver_type() + var/obj/item/organ/liver/new_liver = new liver_type() new_liver.Insert(owner) -/obj/item/organ/internal/heart/gland/heal/proc/replace_lungs(obj/item/organ/internal/lungs/lungs) +/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs) if(lungs) owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_userdanger("You suddenly vomit up your [lungs.name]!")) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) @@ -129,13 +129,13 @@ else to_chat(owner, span_warning("You feel a weird rumble inside your chest...")) - var/lung_type = /obj/item/organ/internal/lungs + var/lung_type = /obj/item/organ/lungs if(owner.dna.species && owner.dna.species.mutantlungs) lung_type = owner.dna.species.mutantlungs - var/obj/item/organ/internal/lungs/new_lungs = new lung_type() + var/obj/item/organ/lungs/new_lungs = new lung_type() new_lungs.Insert(owner) -/obj/item/organ/internal/heart/gland/heal/proc/replace_stomach(obj/item/organ/internal/stomach/stomach) +/obj/item/organ/heart/gland/heal/proc/replace_stomach(obj/item/organ/stomach/stomach) if(stomach) owner.visible_message(span_warning("[owner] vomits up his [stomach.name]!"), span_userdanger("You suddenly vomit up your [stomach.name]!")) owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0) @@ -144,13 +144,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/stomach_type = /obj/item/organ/internal/stomach + var/stomach_type = /obj/item/organ/stomach if(owner?.dna?.species?.mutantstomach) stomach_type = owner.dna.species.mutantstomach - var/obj/item/organ/internal/stomach/new_stomach = new stomach_type() + var/obj/item/organ/stomach/new_stomach = new stomach_type() new_stomach.Insert(owner) -/obj/item/organ/internal/heart/gland/heal/proc/replace_eyes(obj/item/organ/internal/eyes/eyes) +/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes) if(eyes) owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_userdanger("Your [eyes.name] fall out of their sockets!")) playsound(owner, 'sound/effects/splat.ogg', 50, TRUE) @@ -161,15 +161,15 @@ addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(10 SECONDS, 20 SECONDS)) -/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_eyes() - var/eye_type = /obj/item/organ/internal/eyes +/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() + var/eye_type = /obj/item/organ/eyes if(owner.dna.species && owner.dna.species.mutanteyes) eye_type = owner.dna.species.mutanteyes - var/obj/item/organ/internal/eyes/new_eyes = new eye_type() + var/obj/item/organ/eyes/new_eyes = new eye_type() new_eyes.Insert(owner) owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_userdanger("A pair of new eyes suddenly inflates into your eye sockets!")) -/obj/item/organ/internal/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) +/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) if(limb) owner.visible_message(span_warning("[owner]'s [limb.plaintext_zone] suddenly detaches from [owner.p_their()] body!"), span_userdanger("Your [limb.plaintext_zone] suddenly detaches from your body!")) playsound(owner, SFX_DESECRATION, 50, TRUE, -1) @@ -179,18 +179,18 @@ addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(15 SECONDS, 30 SECONDS)) -/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_limb(body_zone) +/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone) owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"), span_userdanger("With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!"), span_warning("Your hear a loud snap.")) playsound(owner, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) owner.regenerate_limb(body_zone) -/obj/item/organ/internal/heart/gland/heal/proc/replace_blood() +/obj/item/organ/heart/gland/heal/proc/replace_blood() owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_userdanger("You suddenly start vomiting huge amounts of blood!")) keep_replacing_blood() -/obj/item/organ/internal/heart/gland/heal/proc/keep_replacing_blood() +/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood() var/keep_going = FALSE owner.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_FORCE), lost_nutrition = 0, distance = 3) owner.Stun(15) @@ -209,7 +209,7 @@ if(keep_going) addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 3 SECONDS) -/obj/item/organ/internal/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) +/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) if(!IS_ORGANIC_LIMB(chest)) owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_userdanger("Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!")) playsound(owner, 'sound/effects/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm index 1a3f140c3415d..a4aa88b8da974 100644 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/mindshock +/obj/item/organ/heart/gland/mindshock abductor_hint = "neural crosstalk uninhibitor. The abductee emits a disrupting psychic wave every so often. This will either stun, cause hallucinations or deal random brain damage to people nearby." cooldown_low = 40 SECONDS cooldown_high = 70 SECONDS @@ -8,7 +8,7 @@ mind_control_duration = 120 SECONDS var/list/mob/living/carbon/human/broadcasted_mobs = list() -/obj/item/organ/internal/heart/gland/mindshock/activate() +/obj/item/organ/heart/gland/mindshock/activate() to_chat(owner, span_notice("You get a headache.")) var/turf/owner_turf = get_turf(owner) @@ -30,7 +30,7 @@ if(3) target.adjust_hallucinations(120 SECONDS) -/obj/item/organ/internal/heart/gland/mindshock/mind_control(command, mob/living/user) +/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) if(!ownerCheck() || !mind_control_uses || active_mind_control) return FALSE mind_control_uses-- @@ -62,7 +62,7 @@ update_gland_hud() return TRUE -/obj/item/organ/internal/heart/gland/mindshock/clear_mind_control() +/obj/item/organ/heart/gland/mindshock/clear_mind_control() if(!active_mind_control || !LAZYLEN(broadcasted_mobs)) return FALSE for(var/target_mob in broadcasted_mobs) diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm index 76cd806bb42b8..6b4a6150f748b 100644 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/plasma +/obj/item/organ/heart/gland/plasma abductor_hint = "effluvium sanguine-synonym emitter. The abductee randomly emits clouds of plasma." cooldown_low = 1200 cooldown_high = 1800 @@ -7,12 +7,12 @@ mind_control_uses = 1 mind_control_duration = 800 -/obj/item/organ/internal/heart/gland/plasma/activate() +/obj/item/organ/heart/gland/plasma/activate() to_chat(owner, span_warning("You feel bloated.")) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_userdanger("A massive stomachache overcomes you.")), 15 SECONDS) addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 20 SECONDS) -/obj/item/organ/internal/heart/gland/plasma/proc/vomit_plasma() +/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() if(!owner) return owner.visible_message(span_danger("[owner] vomits a cloud of plasma!")) diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm index a2a4a9149e741..1991287981c0d 100644 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/quantum +/obj/item/organ/heart/gland/quantum abductor_hint = "quantic de-observation matrix. Periodically links with a random person in view, then the abductee later swaps positions with that person." cooldown_low = 150 cooldown_high = 150 @@ -8,7 +8,7 @@ mind_control_duration = 1200 var/mob/living/carbon/entangled_mob -/obj/item/organ/internal/heart/gland/quantum/activate() +/obj/item/organ/heart/gland/quantum/activate() if(entangled_mob) return for(var/mob/M in oview(owner, 7)) @@ -18,7 +18,7 @@ addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(1 MINUTES, 4 MINUTES)) return -/obj/item/organ/internal/heart/gland/quantum/proc/quantum_swap() +/obj/item/organ/heart/gland/quantum/proc/quantum_swap() if(QDELETED(entangled_mob)) entangled_mob = null return @@ -30,7 +30,7 @@ if(!active_mind_control) //Do not reset entangled mob while mind control is active entangled_mob = null -/obj/item/organ/internal/heart/gland/quantum/mind_control(command, mob/living/user) +/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user) if(..()) if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) to_chat(entangled_mob, span_userdanger("You suddenly feel an irresistible compulsion to follow an order...")) @@ -41,7 +41,7 @@ user.log_message("mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]", LOG_GAME) update_gland_hud() -/obj/item/organ/internal/heart/gland/quantum/clear_mind_control() +/obj/item/organ/heart/gland/quantum/clear_mind_control() if(active_mind_control) to_chat(entangled_mob, span_userdanger("You feel the compulsion fade, and you completely forget about your previous orders.")) entangled_mob.clear_alert(ALERT_MIND_CONTROL) diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 6d3287ecae632..252afdaa45efa 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/slime +/obj/item/organ/heart/gland/slime abductor_hint = "gastric animation galvanizer. The abductee occasionally vomits slimes. Slimes will no longer attack the abductee." cooldown_low = 600 cooldown_high = 1200 @@ -7,17 +7,17 @@ mind_control_uses = 1 mind_control_duration = 2400 -/obj/item/organ/internal/heart/gland/slime/on_mob_insert(mob/living/carbon/gland_owner) +/obj/item/organ/heart/gland/slime/on_mob_insert(mob/living/carbon/gland_owner) . = ..() gland_owner.faction |= FACTION_SLIME gland_owner.grant_language(/datum/language/slime, source = LANGUAGE_GLAND) -/obj/item/organ/internal/heart/gland/slime/on_mob_remove(mob/living/carbon/gland_owner) +/obj/item/organ/heart/gland/slime/on_mob_remove(mob/living/carbon/gland_owner) . = ..() gland_owner.faction -= FACTION_SLIME gland_owner.remove_language(/datum/language/slime, source = LANGUAGE_GLAND) -/obj/item/organ/internal/heart/gland/slime/activate() +/obj/item/organ/heart/gland/slime/activate() to_chat(owner, span_warning("You feel nauseated!")) owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20) diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index 52ff520a876ad..44150d9ed8076 100644 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/spiderman +/obj/item/organ/heart/gland/spiderman abductor_hint = "araneae cloister accelerator. The abductee occasionally exhales spider pheromones and will spawn spiderlings." cooldown_low = 450 cooldown_high = 900 @@ -7,7 +7,7 @@ mind_control_uses = 2 mind_control_duration = 2400 -/obj/item/organ/internal/heart/gland/spiderman/activate() +/obj/item/organ/heart/gland/spiderman/activate() to_chat(owner, span_warning("You feel something crawling in your skin.")) owner.faction |= FACTION_SPIDER var/mob/living/basic/spider/growing/spiderling/spider = new(owner.drop_location()) diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm index 3ea10c7725579..f13418a9082a1 100644 --- a/code/modules/antagonists/abductor/equipment/glands/transform.dm +++ b/code/modules/antagonists/abductor/equipment/glands/transform.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/transform +/obj/item/organ/heart/gland/transform abductor_hint = "anthropmorphic transmorphosizer. The abductee will occasionally change appearance and species." cooldown_low = 900 cooldown_high = 1800 @@ -8,7 +8,7 @@ mind_control_uses = 7 mind_control_duration = 300 -/obj/item/organ/internal/heart/gland/transform/activate() +/obj/item/organ/heart/gland/transform/activate() to_chat(owner, span_notice("You feel unlike yourself.")) randomize_human(owner) var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly)) diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm index 5fab30332ef57..844cc795a944a 100644 --- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm +++ b/code/modules/antagonists/abductor/equipment/glands/trauma.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/trauma +/obj/item/organ/heart/gland/trauma abductor_hint = "white matter randomiser. The abductee occasionally gains a random brain trauma, up to five times. The traumas can range from basic to deep-rooted." cooldown_low = 800 cooldown_high = 1200 @@ -7,7 +7,7 @@ mind_control_uses = 3 mind_control_duration = 1800 -/obj/item/organ/internal/heart/gland/trauma/activate() +/obj/item/organ/heart/gland/trauma/activate() to_chat(owner, span_warning("You feel a spike of pain in your head.")) if(prob(33)) owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm index c7e3a74e4f99e..ed0cc5bbed2d8 100644 --- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm +++ b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/ventcrawling +/obj/item/organ/heart/gland/ventcrawling abductor_hint = "pliant cartilage enabler. The abductee can crawl through vents without trouble." cooldown_low = 1800 cooldown_high = 2400 @@ -7,6 +7,6 @@ mind_control_uses = 4 mind_control_duration = 1800 -/obj/item/organ/internal/heart/gland/ventcrawling/activate() +/obj/item/organ/heart/gland/ventcrawling/activate() to_chat(owner, span_notice("You feel very stretchy.")) ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, type) diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm index c3d82af967403..9aa4a26e549e5 100644 --- a/code/modules/antagonists/abductor/equipment/glands/viral.dm +++ b/code/modules/antagonists/abductor/equipment/glands/viral.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/gland/viral +/obj/item/organ/heart/gland/viral abductor_hint = "contamination incubator. The abductee becomes a carrier of a random advanced disease - of which they are unaffected by." cooldown_low = 1800 cooldown_high = 2400 @@ -7,13 +7,13 @@ mind_control_uses = 1 mind_control_duration = 1800 -/obj/item/organ/internal/heart/gland/viral/activate() +/obj/item/organ/heart/gland/viral/activate() to_chat(owner, span_warning("You feel sick.")) var/datum/disease/advance/A = random_virus(pick(2,6),6) A.carrier = TRUE owner.ForceContractDisease(A, FALSE, TRUE) -/obj/item/organ/internal/heart/gland/viral/proc/random_virus(max_symptoms, max_level) +/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) if(max_symptoms > VIRUS_SYMPTOM_LIMIT) max_symptoms = VIRUS_SYMPTOM_LIMIT var/datum/disease/advance/A = new /datum/disease/advance() diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm index b133bf3f8a5ec..aa6ef608f6c8f 100644 --- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) name = "Superlingual Matrix" description = "A mysterious structure that allows for instant communication between users. Using it inhand will attune it to your mothership's channel. Pretty impressive until you need to eat something." id = "superlingual_matrix" - build_path = list(/obj/item/organ/internal/tongue/abductor = 1) + build_path = list(/obj/item/organ/tongue/abductor = 1) category = CATEGORY_MISC_GEAR /datum/abductor_gear/mental_interface diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index 416153c50e58f..8254247f9dd99 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -14,7 +14,7 @@ /obj/machinery/abductor/gland_dispenser/Initialize(mapload) . = ..() - gland_types = subtypesof(/obj/item/organ/internal/heart/gland) + gland_types = subtypesof(/obj/item/organ/heart/gland) gland_types = shuffle(gland_types) gland_colors = new/list(gland_types.len) amounts = new/list(gland_types.len) @@ -62,7 +62,7 @@ return TRUE /obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/organ/internal/heart/gland)) + if(istype(W, /obj/item/organ/heart/gland)) if(!user.transferItemToLoc(W, src)) return for(var/i in 1 to gland_colors.len) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index c4e59c505bf04..324ec4381e17f 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -137,7 +137,7 @@ if(occupant.stat == DEAD) say("Specimen deceased - please provide fresh sample.") return "Specimen deceased." - var/obj/item/organ/internal/heart/gland/GlandTest = locate() in occupant.organs + var/obj/item/organ/heart/gland/GlandTest = locate() in occupant.organs if(!GlandTest) say("Experimental dissection not detected!") return "No glands detected!" @@ -158,7 +158,7 @@ user_abductor.team.abductees += occupant.mind occupant.mind.add_antag_datum(/datum/antagonist/abductee) - for(var/obj/item/organ/internal/heart/gland/G in occupant.organs) + for(var/obj/item/organ/heart/gland/G in occupant.organs) G.Start() point_reward++ if(point_reward > 0) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a999b13cff6a4..70c9081c52ea9 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -161,7 +161,7 @@ make_brain_decoy(living_mob) /datum/antagonist/changeling/proc/make_brain_decoy(mob/living/ling) - var/obj/item/organ/internal/brain/our_ling_brain = ling.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/our_ling_brain = ling.get_organ_slot(ORGAN_SLOT_BRAIN) if(isnull(our_ling_brain) || our_ling_brain.decoy_override) return diff --git a/code/modules/antagonists/changeling/headslug_eggs.dm b/code/modules/antagonists/changeling/headslug_eggs.dm index 75c0881c55167..e2238d9d7e703 100644 --- a/code/modules/antagonists/changeling/headslug_eggs.dm +++ b/code/modules/antagonists/changeling/headslug_eggs.dm @@ -1,7 +1,7 @@ #define EGG_INCUBATION_TIME (4 MINUTES) /// The actual organ that the changeling headslug implants into a dead host. -/obj/item/organ/internal/body_egg/changeling_egg +/obj/item/organ/body_egg/changeling_egg name = "changeling egg" desc = "Twitching and disgusting." /// The mind of the original changeling that gave forth to the headslug mob. @@ -11,20 +11,20 @@ /// When this egg last got removed from a body. If -1, the egg hasn't been removed from a body. var/removal_time = -1 -/obj/item/organ/internal/body_egg/changeling_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) +/obj/item/organ/body_egg/changeling_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) . = ..() hatch_time = world.time + (removal_time == -1 ? EGG_INCUBATION_TIME : (hatch_time - removal_time)) -/obj/item/organ/internal/body_egg/changeling_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags) +/obj/item/organ/body_egg/changeling_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags) . = ..() removal_time = world.time -/obj/item/organ/internal/body_egg/changeling_egg/egg_process(seconds_per_tick, times_fired) +/obj/item/organ/body_egg/changeling_egg/egg_process(seconds_per_tick, times_fired) if(owner && hatch_time <= world.time) pop() /// Once the egg is fully grown, we gib the host and spawn a monkey (with the changeling's player controlling it). Very descriptive proc name. -/obj/item/organ/internal/body_egg/changeling_egg/proc/pop() +/obj/item/organ/body_egg/changeling_egg/proc/pop() var/mob/living/carbon/human/spawned_monkey = new(owner) spawned_monkey.set_species(/datum/species/monkey) diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index dec2fa6a76e16..52a5d371cf005 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -16,7 +16,7 @@ /datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. . = ..() - var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) RegisterSignal(user, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(eye_implanted)) RegisterSignal(user, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(eye_removed)) if(!isnull(ling_eyes)) @@ -27,7 +27,7 @@ if(!istype(user)) return FALSE - var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) if(isnull(ling_eyes)) user.balloon_alert(user, "no eyes!") return FALSE @@ -50,7 +50,7 @@ return TRUE /datum/action/changeling/augmented_eyesight/Remove(mob/user) - var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) if(!isnull(ling_eyes)) ling_eyes.flash_protect = initial(ling_eyes.flash_protect) @@ -64,7 +64,7 @@ /datum/action/changeling/augmented_eyesight/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/ling_eyes = gained + var/obj/item/organ/eyes/ling_eyes = gained if(!istype(ling_eyes)) return if(active) @@ -76,7 +76,7 @@ /datum/action/changeling/augmented_eyesight/proc/eye_removed(mob/living/source, obj/item/organ/removed, special) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/ling_eyes = removed + var/obj/item/organ/eyes/ling_eyes = removed if(!istype(ling_eyes)) return ling_eyes.flash_protect = initial(ling_eyes.flash_protect) diff --git a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm index c33b36a785f38..bd498b584820d 100644 --- a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm +++ b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm @@ -37,7 +37,7 @@ animate(cling, color = COLOR_DARK, time = 3 SECONDS) // Darkens their overall appearance var/datum/antagonist/changeling/changeling_data = cling.mind?.has_antag_datum(/datum/antagonist/changeling) changeling_data?.chem_recharge_slowdown -= recharge_slowdown //Slows down chem regeneration - var/obj/item/organ/internal/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/eyes) if(!istype(eyes)) return eyes.lighting_cutoff = LIGHTING_CUTOFF_MEDIUM // Adds barely usable, kinda shit night vision @@ -53,7 +53,7 @@ animate(cling, color = null, time = 3 SECONDS) var/datum/antagonist/changeling/changeling_data = cling.mind?.has_antag_datum(/datum/antagonist/changeling) changeling_data?.chem_recharge_slowdown += recharge_slowdown - var/obj/item/organ/internal/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/eyes) if(!istype(eyes)) return eyes.lighting_cutoff = LIGHTING_CUTOFF_VISIBLE @@ -64,7 +64,7 @@ /datum/action/changeling/darkness_adaptation/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/eyes = gained + var/obj/item/organ/eyes/eyes = gained if(!istype(eyes)) return if(is_active) @@ -76,7 +76,7 @@ /datum/action/changeling/darkness_adaptation/proc/eye_removed(mob/living/source, obj/item/organ/removed, special) SIGNAL_HANDLER - var/obj/item/organ/internal/eyes/eyes = removed + var/obj/item/organ/eyes/eyes = removed if(!istype(eyes)) return eyes.flash_protect = initial(eyes.flash_protect) diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index c4f2376f755a0..1af11d3ad15ef 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -22,7 +22,7 @@ explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) for(var/mob/living/carbon/human/blinded_human in range(2, user)) - var/obj/item/organ/internal/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes || blinded_human.is_blind()) continue to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) diff --git a/code/modules/antagonists/changeling/powers/mmi_talk.dm b/code/modules/antagonists/changeling/powers/mmi_talk.dm index 2fe90d0831816..ecd64890c422b 100644 --- a/code/modules/antagonists/changeling/powers/mmi_talk.dm +++ b/code/modules/antagonists/changeling/powers/mmi_talk.dm @@ -15,7 +15,7 @@ * Set when created via the ling decoy component. * If the brain ends up being qdelled, this action will also be qdelled, and thus this ref is cleared. */ - VAR_FINAL/obj/item/organ/internal/brain/brain_ref + VAR_FINAL/obj/item/organ/brain/brain_ref /// A map view of the area around the MMI. VAR_FINAL/atom/movable/screen/map_view/mmi_view diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index f6b42bf19f212..158b32df216f0 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -632,7 +632,7 @@ /obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, params) . = ..() - if(!istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core/legion) || !holds_reagents) + if(!istype(attacking_item, /obj/item/organ/monster_core/regenerative_core/legion) || !holds_reagents) return visible_message(span_boldwarning("As [user] shoves [attacking_item] into [src], [src] begins to mutate.")) var/mob/living/carbon/wearer = loc diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 68689ee65d4dc..886417a61cdd2 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -12,9 +12,9 @@ to_chat(user, span_notice("We cleanse impurities from our form.")) ..() var/list/bad_organs = list( - user.get_organ_by_type(/obj/item/organ/internal/body_egg), - user.get_organ_by_type(/obj/item/organ/internal/legion_tumour), - user.get_organ_by_type(/obj/item/organ/internal/zombie_infection), + user.get_organ_by_type(/obj/item/organ/body_egg), + user.get_organ_by_type(/obj/item/organ/legion_tumour), + user.get_organ_by_type(/obj/item/organ/zombie_infection), ) for(var/o in bad_organs) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 8873ef73a49fe..b6d6f550d0522 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -18,7 +18,7 @@ if(iscarbon(M)) var/mob/living/carbon/C = M if(!IS_CHANGELING(C)) - var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) C.adjust_confusion(25 SECONDS) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 3e1cb7276b7f1..739eb3ec2eba1 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -234,7 +234,7 @@ dna_cost = 1 /datum/action/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) user.balloon_alert(user, "no eyes!") return FALSE diff --git a/code/modules/antagonists/clown_ops/clownop.dm b/code/modules/antagonists/clown_ops/clownop.dm index 8dbcb3c232d96..2fd2daa7489df 100644 --- a/code/modules/antagonists/clown_ops/clownop.dm +++ b/code/modules/antagonists/clown_ops/clownop.dm @@ -29,7 +29,7 @@ /datum/antagonist/nukeop/clownop/equip_op() . = ..() var/mob/living/current_mob = owner.current - var/obj/item/organ/internal/liver/liver = current_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = current_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver) ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT) @@ -61,7 +61,7 @@ /datum/antagonist/nukeop/leader/clownop/equip_op() . = ..() var/mob/living/L = owner.current - var/obj/item/organ/internal/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER) if(liver) ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index e334b17e3603a..af7254119ddc5 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1092,7 +1092,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) /mob/living/carbon/human/cult_ghost/get_organs_for_zone(zone, include_children) . = ..() - for(var/obj/item/organ/internal/brain/B in .) //they're not that smart, really + for(var/obj/item/organ/brain/B in .) //they're not that smart, really . -= B diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index bbd1fc9ee03a5..5b73476a3afae 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -66,7 +66,7 @@ /datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visuals_only = FALSE) if(visuals_only) return - var/obj/item/organ/internal/eyes/robotic/glow/eyes = new() + var/obj/item/organ/eyes/robotic/glow/eyes = new() eyes.Insert(H, movement_flags = DELETE_IF_REPLACED) /datum/outfit/invisible_man diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index fcdb1f1945828..79c7197df40fd 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -615,15 +615,15 @@ /datum/heretic_knowledge/knowledge_ritual/New() . = ..() var/static/list/potential_organs = list( - /obj/item/organ/internal/appendix, - /obj/item/organ/external/tail, - /obj/item/organ/internal/eyes, - /obj/item/organ/internal/tongue, - /obj/item/organ/internal/ears, - /obj/item/organ/internal/heart, - /obj/item/organ/internal/liver, - /obj/item/organ/internal/stomach, - /obj/item/organ/internal/lungs, + /obj/item/organ/appendix, + /obj/item/organ/tail, + /obj/item/organ/eyes, + /obj/item/organ/tongue, + /obj/item/organ/ears, + /obj/item/organ/heart, + /obj/item/organ/liver, + /obj/item/organ/stomach, + /obj/item/organ/lungs, ) var/static/list/potential_easy_items = list( diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm index 335279c9553a6..fec25094bb782 100644 --- a/code/modules/antagonists/heretic/items/corrupted_organs.dm +++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm @@ -1,17 +1,17 @@ /// Renders you unable to see people who were heretics at the time that this organ is gained -/obj/item/organ/internal/eyes/corrupt +/obj/item/organ/eyes/corrupt name = "corrupt orbs" desc = "These eyes have seen something they shouldn't have." organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// The override images we are applying var/list/hallucinations -/obj/item/organ/internal/eyes/corrupt/Initialize(mapload) +/obj/item/organ/eyes/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes have wide dilated pupils, and no iris. Something is moving in the darkness.", BODY_ZONE_PRECISE_EYES) -/obj/item/organ/internal/eyes/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/eyes/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() if (!organ_owner.client) return @@ -28,7 +28,7 @@ if (LAZYLEN(hallucinations)) organ_owner.client.images |= hallucinations -/obj/item/organ/internal/eyes/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/eyes/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if (!LAZYLEN(hallucinations)) return @@ -37,26 +37,26 @@ /// Sometimes speak in incomprehensible tongues -/obj/item/organ/internal/tongue/corrupt +/obj/item/organ/tongue/corrupt name = "corrupt tongue" desc = "This one tells only lies." organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS -/obj/item/organ/internal/tongue/corrupt/Initialize(mapload) +/obj/item/organ/tongue/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) AddElement(/datum/element/noticable_organ, "The inside of %PRONOUN_Their mouth is full of stars.", BODY_ZONE_PRECISE_MOUTH) -/obj/item/organ/internal/tongue/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/tongue/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() RegisterSignal(organ_owner, COMSIG_MOB_SAY, PROC_REF(on_spoken)) -/obj/item/organ/internal/tongue/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/tongue/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_MOB_SAY) /// When the mob speaks, sometimes put it in a different language -/obj/item/organ/internal/tongue/corrupt/proc/on_spoken(mob/living/organ_owner, list/speech_args) +/obj/item/organ/tongue/corrupt/proc/on_spoken(mob/living/organ_owner, list/speech_args) SIGNAL_HANDLER if (organ_owner.has_reagent(/datum/reagent/water/holywater) || prob(60)) return @@ -64,7 +64,7 @@ /// Randomly secretes alcohol or hallucinogens when you're drinking something -/obj/item/organ/internal/liver/corrupt +/obj/item/organ/liver/corrupt name = "corrupt liver" desc = "After what you've seen you could really go for a drink." organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS @@ -83,20 +83,20 @@ /datum/reagent/drug/mushroomhallucinogen, ) -/obj/item/organ/internal/liver/corrupt/Initialize(mapload) +/obj/item/organ/liver/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) -/obj/item/organ/internal/liver/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank)) -/obj/item/organ/internal/liver/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS) /// If we drank something, add a little extra -/obj/item/organ/internal/liver/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) +/obj/item/organ/liver/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) SIGNAL_HANDLER if (!(methods & INGEST)) return @@ -108,7 +108,7 @@ /// Rapidly become hungry if you are not digesting blood -/obj/item/organ/internal/stomach/corrupt +/obj/item/organ/stomach/corrupt name = "corrupt stomach" desc = "This parasite demands an unwholesome diet in order to be satisfied." organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS @@ -119,21 +119,21 @@ /// How long until we prompt the player to drink blood again? COOLDOWN_DECLARE(message_cooldown) -/obj/item/organ/internal/stomach/corrupt/Initialize(mapload) +/obj/item/organ/stomach/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) AddElement(/datum/element/noticable_organ, "%PRONOUN_They %PRONOUN_have an unhealthy pallor.") -/obj/item/organ/internal/stomach/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/stomach/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank)) -/obj/item/organ/internal/stomach/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/stomach/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS) /// Check if we drank a little blood -/obj/item/organ/internal/stomach/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) +/obj/item/organ/stomach/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) SIGNAL_HANDLER if (!(methods & INGEST)) return @@ -148,7 +148,7 @@ deltimer(thirst_timer) thirst_timer = addtimer(VARSET_CALLBACK(src, thirst_satiated, FALSE), 3 MINUTES, TIMER_STOPPABLE | TIMER_DELETE_ME) -/obj/item/organ/internal/stomach/corrupt/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) +/obj/item/organ/stomach/corrupt/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) if (thirst_satiated || human.has_reagent(/datum/reagent/water/holywater)) return ..() @@ -174,18 +174,18 @@ /// Occasionally bombards you with spooky hands and lets everyone hear your pulse. -/obj/item/organ/internal/heart/corrupt +/obj/item/organ/heart/corrupt name = "corrupt heart" desc = "What corruption is this spreading along with the blood?" organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How long until the next heart? COOLDOWN_DECLARE(hand_cooldown) -/obj/item/organ/internal/heart/corrupt/Initialize(mapload) +/obj/item/organ/heart/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) -/obj/item/organ/internal/heart/corrupt/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/corrupt/on_life(seconds_per_tick, times_fired) . = ..() if (!COOLDOWN_FINISHED(src, hand_cooldown) || IS_IN_MANSUS(owner) || !owner.needs_heart() || !is_beating() || owner.has_reagent(/datum/reagent/water/holywater)) return @@ -194,7 +194,7 @@ /// Sometimes cough out some kind of dangerous gas -/obj/item/organ/internal/lungs/corrupt +/obj/item/organ/lungs/corrupt name = "corrupt lungs" desc = "Some things SHOULD be drowned in tar." organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS @@ -209,11 +209,11 @@ /datum/gas/plasma = 20, ) -/obj/item/organ/internal/lungs/corrupt/Initialize(mapload) +/obj/item/organ/lungs/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) -/obj/item/organ/internal/lungs/corrupt/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) +/obj/item/organ/lungs/corrupt/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) . = ..() if (!. || IS_IN_MANSUS(owner) || breather.has_reagent(/datum/reagent/water/holywater) || !prob(cough_chance)) return @@ -229,19 +229,19 @@ /// It's full of worms -/obj/item/organ/internal/appendix/corrupt +/obj/item/organ/appendix/corrupt name = "corrupt appendix" desc = "What kind of dark, cosmic force is even going to bother to corrupt an appendix?" organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /// How likely are we to spawn worms? var/worm_chance = 2 -/obj/item/organ/internal/appendix/corrupt/Initialize(mapload) +/obj/item/organ/appendix/corrupt/Initialize(mapload) . = ..() AddElement(/datum/element/corrupted_organ) AddElement(/datum/element/noticable_organ, "%PRONOUN_Their abdomen is distended... and wiggling.", BODY_ZONE_PRECISE_GROIN) -/obj/item/organ/internal/appendix/corrupt/on_life(seconds_per_tick, times_fired) +/obj/item/organ/appendix/corrupt/on_life(seconds_per_tick, times_fired) . = ..() if (owner.stat != CONSCIOUS || owner.has_reagent(/datum/reagent/water/holywater) || IS_IN_MANSUS(owner) || !SPT_PROB(worm_chance, seconds_per_tick)) return diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index 3e9d3675b1351..0cbe1d1117b49 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -129,14 +129,14 @@ // A list made of the organs and bodyparts the heretic can get var/static/list/random_bodypart_or_organ = list( - /obj/item/organ/internal/brain, - /obj/item/organ/internal/lungs, - /obj/item/organ/internal/eyes, - /obj/item/organ/internal/ears, - /obj/item/organ/internal/heart, - /obj/item/organ/internal/liver, - /obj/item/organ/internal/stomach, - /obj/item/organ/internal/appendix, + /obj/item/organ/brain, + /obj/item/organ/lungs, + /obj/item/organ/eyes, + /obj/item/organ/ears, + /obj/item/organ/heart, + /obj/item/organ/liver, + /obj/item/organ/stomach, + /obj/item/organ/appendix, /obj/item/bodypart/arm/left, /obj/item/bodypart/arm/right, /obj/item/bodypart/leg/left, diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 9384a9af4b9d8..d950de44a34d2 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -142,7 +142,7 @@ /datum/heretic_knowledge/curse/paralysis, ) required_atoms = list( - /obj/item/organ/internal/liver = 1, + /obj/item/organ/liver = 1, /obj/item/melee/baton/security = 1, // Technically means a cattleprod is valid /obj/item/clothing/mask = 1, /obj/item/flashlight/flare/candle = 4, diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index c0fd2b7bbe381..47db297042331 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -252,7 +252,7 @@ /datum/heretic_knowledge/spell/opening_blast, ) required_atoms = list( - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/eyes = 1, /obj/effect/decal/cleanable/blood = 1, /obj/item/bodypart/arm/left = 1, ) @@ -295,9 +295,9 @@ /datum/heretic_knowledge/spell/cleave, ) required_atoms = list( - /obj/item/organ/external/tail = 1, - /obj/item/organ/internal/stomach = 1, - /obj/item/organ/internal/tongue = 1, + /obj/item/organ/tail = 1, + /obj/item/organ/stomach = 1, + /obj/item/organ/tongue = 1, /obj/item/pen = 1, /obj/item/paper = 1, ) diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index b23ed148611b6..b23f3cd2d6c10 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -130,7 +130,7 @@ /datum/heretic_knowledge/painting, ) required_atoms = list( - /obj/item/organ/internal/heart = 1, + /obj/item/organ/heart = 1, /obj/item/stack/sheet/glass = 2, /obj/item/clothing/neck/tie = 1, ) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm index 87086de6e0024..782ec6ec55dc2 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm @@ -68,15 +68,15 @@ return var/list/removable_organs = list() - for(var/obj/item/organ/internal/bodypart_organ in organ_storage.contents) - if(bodypart_organ.organ_flags & ORGAN_UNREMOVABLE) + for(var/obj/item/organ/bodypart_organ in organ_storage.contents) + if(bodypart_organ.organ_flags & (ORGAN_EXTERNAL|ORGAN_UNREMOVABLE)) continue removable_organs += bodypart_organ if (!length(removable_organs)) return // This one is a little more possible but they're probably already in pretty bad shape by this point - var/obj/item/organ/internal/removing_organ = pick(removable_organs) + var/obj/item/organ/removing_organ = pick(removable_organs) if (carbon_owner.vomit(vomit_flags = VOMIT_CATEGORY_BLOOD)) carbon_owner.visible_message(span_boldwarning("[carbon_owner] vomits out [carbon_owner.p_their()] [removing_organ]")) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 65e6b6b2470e7..3a5e84e75bca7 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -31,13 +31,13 @@ var/list/return_timers /// Evil organs we can put in people var/static/list/grantable_organs = list( - /obj/item/organ/internal/appendix/corrupt, - /obj/item/organ/internal/eyes/corrupt, - /obj/item/organ/internal/heart/corrupt, - /obj/item/organ/internal/liver/corrupt, - /obj/item/organ/internal/lungs/corrupt, - /obj/item/organ/internal/stomach/corrupt, - /obj/item/organ/internal/tongue/corrupt, + /obj/item/organ/appendix/corrupt, + /obj/item/organ/eyes/corrupt, + /obj/item/organ/heart/corrupt, + /obj/item/organ/liver/corrupt, + /obj/item/organ/lungs/corrupt, + /obj/item/organ/stomach/corrupt, + /obj/item/organ/tongue/corrupt, ) /datum/heretic_knowledge/hunt_and_sacrifice/Destroy(force) @@ -415,7 +415,7 @@ /datum/heretic_knowledge/hunt_and_sacrifice/proc/curse_organs(mob/living/carbon/human/sac_target) var/usable_organs = grantable_organs.Copy() if (isplasmaman(sac_target)) - usable_organs -= /obj/item/organ/internal/lungs/corrupt // Their lungs are already more cursed than anything I could give them + usable_organs -= /obj/item/organ/lungs/corrupt // Their lungs are already more cursed than anything I could give them var/total_implant = rand(2, 4) @@ -423,7 +423,7 @@ if (!length(usable_organs)) return var/organ_path = pick_n_take(usable_organs) - var/obj/item/organ/internal/to_give = new organ_path + var/obj/item/organ/to_give = new organ_path to_give.Insert(sac_target) new /obj/effect/gibspawner/human/bodypartless(get_turf(sac_target)) diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index 3ed3f110a802a..90a51dcccb068 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -9,7 +9,7 @@ /datum/heretic_knowledge/spell/moon_smile, ) required_atoms = list( - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/eyes = 1, /obj/item/shard = 1, /obj/item/flashlight/flare/candle = 1, ) diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index 1a08236aee64d..7b7bdddb19ac8 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -12,7 +12,7 @@ ) required_atoms = list( /obj/effect/decal/cleanable/ash = 1, - /obj/item/organ/internal/liver = 1, + /obj/item/organ/liver = 1, /obj/item/stack/sheet/mineral/plasma = 1, ) mob_to_summon = /mob/living/basic/heretic_summon/fire_shark diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm index 1e265b974980f..cb719d163d5c2 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -27,7 +27,7 @@ /datum/heretic_knowledge/moon_amulet, ) required_atoms = list( - /obj/item/organ/internal/lungs = 1, + /obj/item/organ/lungs = 1, /obj/item/stack/rods = 3, /obj/item/storage/belt = 1, ) @@ -62,11 +62,11 @@ depth = 8 /datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - if(locate(/obj/item/organ/internal/eyes) in atoms) + if(locate(/obj/item/organ/eyes) in atoms) src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping) src.required_atoms = list( /obj/item/canvas = 1, - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/eyes = 1, ) return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 0a4f7fbe86a1c..d4e5d465125f1 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -60,7 +60,7 @@ required_atoms = list( /obj/item/wirecutters = 1, /obj/effect/decal/cleanable/vomit = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/heart = 1, ) duration = 0.5 MINUTES duration_modifier = 4 diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 56945262e3cb0..17eb87affbaf3 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -162,7 +162,7 @@ /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/clothing/suit/armor = 1, /obj/item/assembly/flash = 1, - /obj/item/organ/internal/lungs = 1, + /obj/item/organ/lungs = 1, ) cost = 1 route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 2b5186bb55019..a4560058db818 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) research_tree_icon_state = "living_heart" research_tree_icon_frame = 1 /// The typepath of the organ type required for our heart. - var/required_organ_type = /obj/item/organ/internal/heart + var/required_organ_type = /obj/item/organ/heart /datum/heretic_knowledge/living_heart/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -65,9 +65,9 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) // If a heretic is made from a species without a heart, we need to find a backup. if(!where_to_put_our_heart) var/static/list/backup_organs = list( - ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs, - ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver, - ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, ) for(var/backup_slot in backup_organs) @@ -201,7 +201,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) desc = "Allows you to transmute a sheet of glass and a pair of eyes to create an Amber Focus. \ A focus must be worn in order to cast more advanced spells." required_atoms = list( - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/eyes = 1, /obj/item/stack/sheet/glass = 1, ) result_atoms = list(/obj/item/clothing/neck/heretic_focus) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 6f0f006842d89..04612a506f3c8 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -258,7 +258,7 @@ heavy_storm = new(user, 10) if(ishuman(user)) var/mob/living/carbon/human/ascended_human = user - var/obj/item/organ/internal/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) heretic_eyes?.color_cutoffs = list(30, 30, 30) ascended_human.update_sight() diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 63bcc4cc84831..e2010ac0f9446 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -40,7 +40,7 @@ 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) + var/obj/item/organ/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 + 1 SECONDS) / (2 SECONDS)) diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index 4aaacb77e5f3e..70cf4c640836c 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -4,7 +4,7 @@ #define HEART_SPECIAL_SHADOWIFY 2 -/obj/item/organ/internal/brain/shadow/nightmare +/obj/item/organ/brain/shadow/nightmare name = "tumorous mass" desc = "A fleshy growth that was dug out of the skull of a Nightmare." icon = 'icons/obj/medical/organs/organs.dmi' @@ -15,7 +15,7 @@ ///Our associated terrorize spell, for antagonist nightmares var/datum/action/cooldown/spell/pointed/terrorize/terrorize_spell -/obj/item/organ/internal/brain/shadow/nightmare/on_mob_insert(mob/living/carbon/brain_owner) +/obj/item/organ/brain/shadow/nightmare/on_mob_insert(mob/living/carbon/brain_owner) . = ..() if(brain_owner.dna.species.id != SPECIES_NIGHTMARE) @@ -29,7 +29,7 @@ terrorize_spell = new(src) terrorize_spell.Grant(brain_owner) -/obj/item/organ/internal/brain/shadow/nightmare/on_mob_remove(mob/living/carbon/brain_owner) +/obj/item/organ/brain/shadow/nightmare/on_mob_remove(mob/living/carbon/brain_owner) . = ..() QDEL_NULL(our_jaunt) QDEL_NULL(terrorize_spell) @@ -62,7 +62,7 @@ playsound(source, SFX_BULLET_MISS, 75, TRUE) return COMPONENT_BULLET_PIERCED -/obj/item/organ/internal/heart/nightmare +/obj/item/organ/heart/nightmare name = "heart of darkness" desc = "An alien organ that twists and writhes when exposed to light." visual = TRUE @@ -78,7 +78,7 @@ /// The armblade granted to the host of this heart. var/obj/item/light_eater/blade -/obj/item/organ/internal/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) +/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) if(M != user) return ..() user.visible_message( @@ -94,23 +94,23 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/internal/heart/nightmare/on_mob_insert(mob/living/carbon/heart_owner, special) +/obj/item/organ/heart/nightmare/on_mob_insert(mob/living/carbon/heart_owner, special) . = ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater heart_owner.put_in_hands(blade) -/obj/item/organ/internal/heart/nightmare/on_mob_remove(mob/living/carbon/heart_owner, special) +/obj/item/organ/heart/nightmare/on_mob_remove(mob/living/carbon/heart_owner, special) . = ..() respawn_progress = 0 if(blade && special != HEART_SPECIAL_SHADOWIFY) heart_owner.visible_message(span_warning("\The [blade] disintegrates!")) QDEL_NULL(blade) -/obj/item/organ/internal/heart/nightmare/Stop() +/obj/item/organ/heart/nightmare/Stop() return FALSE -/obj/item/organ/internal/heart/nightmare/on_death(seconds_per_tick, times_fired) +/obj/item/organ/heart/nightmare/on_death(seconds_per_tick, times_fired) if(!owner) return var/turf/T = get_turf(owner) @@ -134,7 +134,7 @@ playsound(owner, 'sound/effects/hallucinations/far_noise.ogg', 50, TRUE) respawn_progress = 0 -/obj/item/organ/internal/heart/nightmare/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/heart/nightmare/get_availability(datum/species/owner_species, mob/living/owner_mob) if(isnightmare(owner_mob)) return TRUE return ..() diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 38db2dfae8657..e81819e44fccd 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -24,8 +24,8 @@ TRAIT_NEVER_WOUNDED, ) - mutantheart = /obj/item/organ/internal/heart/nightmare - mutantbrain = /obj/item/organ/internal/brain/shadow/nightmare + mutantheart = /obj/item/organ/heart/nightmare + mutantbrain = /obj/item/organ/brain/shadow/nightmare bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/shadow/nightmare, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/shadow/nightmare, diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index ff4232ab2dc00..cd58d6fec5d9a 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -41,7 +41,7 @@ if(!istype(C)) to_chat(admin, "[roundend_category] come from a brain trauma, so they need to at least be a carbon!") return - if(!C.get_organ_by_type(/obj/item/organ/internal/brain)) // If only I had a brain + if(!C.get_organ_by_type(/obj/item/organ/brain)) // If only I had a brain to_chat(admin, "[roundend_category] come from a brain trauma, so they need to HAVE A BRAIN.") return message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] into [name].") diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index dc35b76684300..a339b0cc2640d 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -186,7 +186,7 @@ /datum/antagonist/rev/head/on_removal() if(give_hud) var/mob/living/carbon/C = owner.current - var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/S = C.get_organ_slot(ORGAN_SLOT_HUD) + var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = C.get_organ_slot(ORGAN_SLOT_HUD) if(S) S.Remove(C) return ..() @@ -365,7 +365,7 @@ to_chat(carbon_owner, "The Syndicate were unfortunately unable to get you a flash.") if(give_hud) - var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/hud = new() + var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/hud = new() hud.Insert(carbon_owner) if(carbon_owner.get_quirk(/datum/quirk/body_purist)) to_chat(carbon_owner, "Being a body purist, you would never accept cybernetic implants. Upon hearing this, your employers signed you up for a special program, which... for \ diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm index ccab7952a9c2c..1aa318fb6828d 100644 --- a/code/modules/antagonists/spy/spy_bounty.dm +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -621,10 +621,10 @@ /obj/item/bodypart/arm/right, /obj/item/bodypart/leg/left, /obj/item/bodypart/leg/right, - /obj/item/organ/internal/stomach, - /obj/item/organ/internal/appendix, - /obj/item/organ/internal/liver, - /obj/item/organ/internal/eyes, + /obj/item/organ/stomach, + /obj/item/organ/appendix, + /obj/item/organ/liver, + /obj/item/organ/eyes, ) return ..() diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index 7d664b20d36cb..2ddad4913f0d3 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -81,7 +81,7 @@ continue var/mob/living/carbon/human/targets_current = possible_target.current - if(!targets_current.get_organ_by_type(/obj/item/organ/internal/eyes)) + if(!targets_current.get_organ_by_type(/obj/item/organ/eyes)) continue possible_targets += possible_target @@ -110,7 +110,7 @@ AddComponent(/datum/component/traitor_objective_register, target, fail_signals = list(COMSIG_QDELETING)) return TRUE -/datum/traitor_objective/target_player/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) +/datum/traitor_objective/target_player/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed) SIGNAL_HANDLER if(!istype(removed)) @@ -159,7 +159,7 @@ if(used || !istype(target) || !target.Adjacent(user)) //Works only once, no TK use return ..() - var/obj/item/organ/internal/eyes/eyeballies = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyeballies = target.get_organ_slot(ORGAN_SLOT_EYES) var/obj/item/bodypart/head/head = target.get_bodypart(BODY_ZONE_HEAD) if(!head || !eyeballies || target.is_eyes_covered()) @@ -224,7 +224,7 @@ if(used) . += span_notice("It has been used up.") -/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/internal/eyes/eyeballies, obj/item/bodypart/head/head, mob/living/carbon/human/target) +/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/eyes/eyeballies, obj/item/bodypart/head/head, mob/living/carbon/human/target) if(!eyeballies || QDELETED(eyeballies)) return FALSE if(!head || QDELETED(head)) @@ -232,7 +232,7 @@ if(eyeballies.owner != target) return FALSE - var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) //got different eyes or doesn't own the head... somehow if(head.owner != target || eyes != eyeballies) return FALSE diff --git a/code/modules/antagonists/voidwalker/voidwalker_organs.dm b/code/modules/antagonists/voidwalker/voidwalker_organs.dm index e6e3d028ac8ef..23f1c6fb2fe47 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_organs.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_organs.dm @@ -1,5 +1,5 @@ /// Voidwalker eyes with nightvision and thermals -/obj/item/organ/internal/eyes/voidwalker +/obj/item/organ/eyes/voidwalker name = "blackened orbs" desc = "These orbs will withstand the light of the sun, yet still see within the darkest voids." eye_icon_state = null @@ -9,7 +9,7 @@ sight_flags = SEE_MOBS /// Voidwalker brain stacked with a lot of the abilities -/obj/item/organ/internal/brain/voidwalker +/obj/item/organ/brain/voidwalker name = "cosmic brain" desc = "A mind fully integrated into the cosmic thread." icon = 'icons/obj/medical/organs/shadow_organs.dmi' @@ -30,7 +30,7 @@ /// Our brain transmit telepathy spell var/datum/action/transmit = /datum/action/cooldown/spell/list_target/telepathy/voidwalker -/obj/item/organ/internal/brain/voidwalker/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/brain/voidwalker/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() RegisterSignal(organ_owner, COMSIG_ATOM_ENTERING, PROC_REF(on_atom_entering)) @@ -52,7 +52,7 @@ glass_breaker = new/obj/item/void_eater organ_owner.put_in_hands(glass_breaker) -/obj/item/organ/internal/brain/voidwalker/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/brain/voidwalker/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_ENTER_AREA) @@ -75,7 +75,7 @@ if(glass_breaker) qdel(glass_breaker) -/obj/item/organ/internal/brain/voidwalker/proc/on_atom_entering(mob/living/carbon/organ_owner, atom/entering) +/obj/item/organ/brain/voidwalker/proc/on_atom_entering(mob/living/carbon/organ_owner, atom/entering) SIGNAL_HANDLER if(!isturf(entering)) @@ -90,7 +90,7 @@ else organ_owner.remove_movespeed_modifier(speed_modifier) -/obj/item/organ/internal/brain/voidwalker/on_death() +/obj/item/organ/brain/voidwalker/on_death() . = ..() var/turf/spawn_loc = get_turf(owner) diff --git a/code/modules/antagonists/voidwalker/voidwalker_species.dm b/code/modules/antagonists/voidwalker/voidwalker_species.dm index 5b50c3da69ed9..8c417c97773ea 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_species.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_species.dm @@ -35,8 +35,8 @@ no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_ICLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_MASK | ITEM_SLOT_HEAD | ITEM_SLOT_FEET | ITEM_SLOT_BACK | ITEM_SLOT_EARS | ITEM_SLOT_EYES - mutantbrain = /obj/item/organ/internal/brain/voidwalker - mutanteyes = /obj/item/organ/internal/eyes/voidwalker + mutantbrain = /obj/item/organ/brain/voidwalker + mutanteyes = /obj/item/organ/eyes/voidwalker mutantheart = null mutantlungs = null mutanttongue = null diff --git a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm index 9bf5b3c2664c3..f88c09188cf48 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm @@ -63,7 +63,7 @@ hewmon.balloon_alert(user, "shattering...") if(do_after(user, 4 SECONDS, hewmon)) new /obj/effect/spawner/random/glass_shards (spawnloc) - var/obj/item/organ/brain = hewmon.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain = hewmon.get_organ_by_type(/obj/item/organ/brain) if(brain) brain.Remove(hewmon) brain.forceMove(spawnloc) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index ef2a40636d0fc..e56f651a095a8 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -311,7 +311,7 @@ head = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) //Provides a decent heal, need to pump every 6 seconds -/obj/item/organ/internal/heart/cursed/wizard +/obj/item/organ/heart/cursed/wizard pump_delay = 6 SECONDS heal_brute = 25 heal_burn = 25 diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 6e448637dbaa4..88b21cf8971ef 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -313,7 +313,7 @@ var/datum/weakref/arm /obj/item/assembly/flash/armimplant/burn_out() - var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() if(real_arm?.owner) to_chat(real_arm.owner, span_warning("Your photon projector implant overheats and deactivates!")) real_arm.Retract() @@ -322,7 +322,7 @@ /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) if(overheat) - var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() if(real_arm?.owner) to_chat(real_arm.owner, span_warning("Your photon projector is running too hot to be used again so quickly!")) return FALSE diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index be8aa9de8907a..67a56ed9b3232 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -53,7 +53,7 @@ cybernetic augments by Synthman Co. to you in this rare exclusive offer! With this letter, you are being gifted a \ special limited edition choice NTSDA-certified grade-A cybernetic implant, FREE OF CHARGE! Build up your body to \ GREATNESS with Synthman's new exclusive line of cybernetic products! Become greater, stronger, and BETTER today!" - var/obj/item/organ/internal/heart/cybernetic/sample + var/obj/item/organ/heart/cybernetic/sample /obj/item/paper/pamphlet/cybernetics/Initialize(mapload) . = ..() diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index ae15ddbd623e7..9f473980bbf96 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -178,7 +178,7 @@ if(failed) to_chat(neo, span_warning("One of your disks failed to load. Check for duplicate or inactive disks.")) - var/obj/item/organ/internal/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN) for(var/obj/item/skillchip/skill_chip as anything in neo_brain?.skillchips) if(!skill_chip.active) continue diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index f9b367b12f06e..d15f4405f7b10 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -3,10 +3,10 @@ description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto! We'll take a cybernetic one if need be, but only if it's upgraded." reward = CARGO_CRATE_VALUE * 5 wanted_types = list( - /obj/item/organ/internal/heart = TRUE, - /obj/item/organ/internal/heart/cybernetic = FALSE, - /obj/item/organ/internal/heart/cybernetic/tier2 = TRUE, - /obj/item/organ/internal/heart/cybernetic/tier3 = TRUE, + /obj/item/organ/heart = TRUE, + /obj/item/organ/heart/cybernetic = FALSE, + /obj/item/organ/heart/cybernetic/tier2 = TRUE, + /obj/item/organ/heart/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/lung @@ -15,17 +15,17 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/internal/lungs = TRUE, - /obj/item/organ/internal/lungs/cybernetic = FALSE, - /obj/item/organ/internal/lungs/cybernetic/tier2 = TRUE, - /obj/item/organ/internal/lungs/cybernetic/tier3 = TRUE, + /obj/item/organ/lungs = TRUE, + /obj/item/organ/lungs/cybernetic = FALSE, + /obj/item/organ/lungs/cybernetic/tier2 = TRUE, + /obj/item/organ/lungs/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/appendix name = "Appendix" description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." reward = CARGO_CRATE_VALUE * 5 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/internal/appendix = TRUE) + wanted_types = list(/obj/item/organ/appendix = TRUE) /datum/bounty/item/medical/ears name = "Ears" @@ -33,11 +33,11 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/internal/ears = TRUE, - /obj/item/organ/internal/ears/cybernetic = FALSE, - /obj/item/organ/internal/ears/cybernetic/upgraded = TRUE, - /obj/item/organ/internal/ears/cybernetic/whisper = TRUE, - /obj/item/organ/internal/ears/cybernetic/xray = TRUE, + /obj/item/organ/ears = TRUE, + /obj/item/organ/ears/cybernetic = FALSE, + /obj/item/organ/ears/cybernetic/upgraded = TRUE, + /obj/item/organ/ears/cybernetic/whisper = TRUE, + /obj/item/organ/ears/cybernetic/xray = TRUE, ) /datum/bounty/item/medical/liver @@ -46,10 +46,10 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/internal/liver = TRUE, - /obj/item/organ/internal/liver/cybernetic = FALSE, - /obj/item/organ/internal/liver/cybernetic/tier2 = TRUE, - /obj/item/organ/internal/liver/cybernetic/tier3 = TRUE, + /obj/item/organ/liver = TRUE, + /obj/item/organ/liver/cybernetic = FALSE, + /obj/item/organ/liver/cybernetic/tier2 = TRUE, + /obj/item/organ/liver/cybernetic/tier3 = TRUE, ) /datum/bounty/item/medical/eye @@ -58,8 +58,8 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/internal/eyes = TRUE, - /obj/item/organ/internal/eyes/robotic = FALSE, + /obj/item/organ/eyes = TRUE, + /obj/item/organ/eyes/robotic = FALSE, ) /datum/bounty/item/medical/tongue @@ -67,19 +67,19 @@ description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." reward = CARGO_CRATE_VALUE * 10 required_count = 3 - wanted_types = list(/obj/item/organ/internal/tongue = TRUE) + wanted_types = list(/obj/item/organ/tongue = TRUE) /datum/bounty/item/medical/lizard_tail name = "Lizard Tail" description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?" reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/organ/external/tail/lizard = TRUE) + wanted_types = list(/obj/item/organ/tail/lizard = TRUE) /datum/bounty/item/medical/cat_tail name = "Cat Tail" description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/organ/external/tail/cat = TRUE) + wanted_types = list(/obj/item/organ/tail/cat = TRUE) /datum/bounty/item/medical/chainsaw name = "Chainsaw" diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index 268ac2ea03334..8f395b5152fb1 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -4,12 +4,12 @@ reward = CARGO_CRATE_VALUE * 50 required_count = 3 wanted_types = list( - /obj/item/organ/internal/brain/alien = TRUE, - /obj/item/organ/internal/alien = TRUE, - /obj/item/organ/internal/body_egg/alien_embryo = TRUE, - /obj/item/organ/internal/liver/alien = TRUE, - /obj/item/organ/internal/tongue/alien = TRUE, - /obj/item/organ/internal/eyes/alien = TRUE, + /obj/item/organ/brain/alien = TRUE, + /obj/item/organ/alien = TRUE, + /obj/item/organ/body_egg/alien_embryo = TRUE, + /obj/item/organ/liver/alien = TRUE, + /obj/item/organ/tongue/alien = TRUE, + /obj/item/organ/eyes/alien = TRUE, ) /datum/bounty/item/syndicate_documents diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index 7102db0dd8f0d..6b621beeaeb1e 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -8,10 +8,10 @@ /obj/item/immortality_talisman, /obj/item/book_of_babel, /obj/item/wisp_lantern, - /obj/item/organ/internal/cyberimp/arm/shard/katana, + /obj/item/organ/cyberimp/arm/shard/katana, /obj/item/clothing/glasses/godeye, /obj/item/clothing/neck/necklace/memento_mori, - /obj/item/organ/internal/heart/cursed/wizard, + /obj/item/organ/heart/cursed/wizard, /obj/item/clothing/suit/hooded/cloak/drake, /obj/item/ship_in_a_bottle, /obj/item/clothing/shoes/clown_shoes/banana_shoes, @@ -48,7 +48,7 @@ export_types = list( /obj/item/hierophant_club, /obj/item/melee/cleaving_saw, - /obj/item/organ/internal/vocal_cords/colossus, + /obj/item/organ/vocal_cords/colossus, /obj/machinery/anomalous_crystal, /obj/item/mayhem, /obj/item/soulscythe, diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm index 784af1c857426..ec042a8613e44 100644 --- a/code/modules/cargo/exports/organs.dm +++ b/code/modules/cargo/exports/organs.dm @@ -4,51 +4,51 @@ /datum/export/organ/heart cost = CARGO_CRATE_VALUE * 0.2 //For the man who has everything and nothing. unit_name = "humanoid heart" - export_types = list(/obj/item/organ/internal/heart) + export_types = list(/obj/item/organ/heart) /datum/export/organ/eyes cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid eyes" - export_types = list(/obj/item/organ/internal/eyes) + export_types = list(/obj/item/organ/eyes) /datum/export/organ/ears cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid ears" - export_types = list(/obj/item/organ/internal/ears) + export_types = list(/obj/item/organ/ears) /datum/export/organ/liver cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid liver" - export_types = list(/obj/item/organ/internal/liver) + export_types = list(/obj/item/organ/liver) /datum/export/organ/lungs cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid lungs" - export_types = list(/obj/item/organ/internal/lungs) + export_types = list(/obj/item/organ/lungs) /datum/export/organ/stomach cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid stomach" - export_types = list(/obj/item/organ/internal/stomach) + export_types = list(/obj/item/organ/stomach) /datum/export/organ/tongue cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid tounge" - export_types = list(/obj/item/organ/internal/tongue) + export_types = list(/obj/item/organ/tongue) /datum/export/organ/external/tail/lizard cost = CARGO_CRATE_VALUE * 1.25 unit_name = "lizard tail" - export_types = list(/obj/item/organ/external/tail/lizard) + export_types = list(/obj/item/organ/tail/lizard) /datum/export/organ/external/tail/cat cost = CARGO_CRATE_VALUE * 1.5 unit_name = "cat tail" - export_types = list(/obj/item/organ/external/tail/cat) + export_types = list(/obj/item/organ/tail/cat) /datum/export/organ/ears/cat cost = CARGO_CRATE_VALUE unit_name = "cat ears" - export_types = list(/obj/item/organ/internal/ears/cat) + export_types = list(/obj/item/organ/ears/cat) diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 3005cfd7fcabb..d021fa8665ff2 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -188,7 +188,7 @@ name = "Strong-Arm Implant Set" desc = "A crate containing two implants, which can be surgically implanted to empower the strength of human arms. Warranty void if exposed to electromagnetic pulses." cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/organ/internal/cyberimp/arm/strongarm = 2) + contains = list(/obj/item/organ/cyberimp/arm/strongarm = 2) crate_name = "Strong-Arm implant crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 21459697f864f..e456d366b9629 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -32,7 +32,7 @@ if(!hetero) target.eye_color_right = value - var/obj/item/organ/internal/eyes/eyes_organ = target.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes_organ = target.get_organ_by_type(/obj/item/organ/eyes) if (!eyes_organ || !istype(eyes_organ)) return diff --git a/code/modules/client/preferences/species_features/felinid.dm b/code/modules/client/preferences/species_features/felinid.dm index 5910e42894f02..3aa4fd1083a5c 100644 --- a/code/modules/client/preferences/species_features/felinid.dm +++ b/code/modules/client/preferences/species_features/felinid.dm @@ -3,7 +3,7 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/external/tail/cat + relevant_external_organ = /obj/item/organ/tail/cat /datum/preference/choiced/tail_felinid/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_felinid) @@ -20,7 +20,7 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/internal/ears/cat + relevant_external_organ = /obj/item/organ/ears/cat /datum/preference/choiced/felinid_ears/init_possible_values() return assoc_to_keys_features(SSaccessories.ears_list) diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index 11fefc17b8b9e..fbf27521365a3 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -159,7 +159,7 @@ savefile_key = "feature_lizard_spines" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/external/spines + relevant_external_organ = /obj/item/organ/spines /datum/preference/choiced/lizard_spines/init_possible_values() return assoc_to_keys_features(SSaccessories.spines_list) @@ -171,7 +171,7 @@ savefile_key = "feature_lizard_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/external/tail/lizard + relevant_external_organ = /obj/item/organ/tail/lizard /datum/preference/choiced/lizard_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_lizard) diff --git a/code/modules/client/preferences/species_features/monkey.dm b/code/modules/client/preferences/species_features/monkey.dm index 8417cd7142e07..e35b6401553a6 100644 --- a/code/modules/client/preferences/species_features/monkey.dm +++ b/code/modules/client/preferences/species_features/monkey.dm @@ -2,7 +2,7 @@ savefile_key = "feature_monkey_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/external/tail/monkey + relevant_external_organ = /obj/item/organ/tail/monkey can_randomize = FALSE /datum/preference/choiced/monkey_tail/init_possible_values() diff --git a/code/modules/client/preferences/species_features/mushperson.dm b/code/modules/client/preferences/species_features/mushperson.dm index 4b624e9c02b4f..fc89a68521bbe 100644 --- a/code/modules/client/preferences/species_features/mushperson.dm +++ b/code/modules/client/preferences/species_features/mushperson.dm @@ -2,7 +2,7 @@ savefile_key = "feature_mushperson_cap" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/external/mushroom_cap + relevant_external_organ = /obj/item/organ/mushroom_cap /datum/preference/choiced/mushroom_cap/init_possible_values() return assoc_to_keys_features(SSaccessories.caps_list) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 4cff2c52f00bc..cead31d6207c0 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -53,7 +53,7 @@ /obj/item/clothing/glasses/proc/thermal_overload() if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc - var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) if(!H.is_blind()) if(H.glasses == src) to_chat(H, span_danger("[src] overloads and blinds you!")) @@ -456,7 +456,7 @@ if(!user.get_organ_slot(ORGAN_SLOT_EYES)) to_chat(user, span_warning("You have no eyes to apply the contacts to!")) return - var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) to_chat(user, span_notice("You begin applying the contact lenses to your eyes...")) if(!do_after(user, 3 SECONDS, src)) diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index d9b888fcd0e7a..7a005fe7fc313 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -215,7 +215,7 @@ var/mob/living/wearer = loc var/stamina_exhaustion = 2 + challenge.difficulty * 0.02 var/is_heavy_gravity = wearer.has_gravity() > STANDARD_GRAVITY - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = wearer.get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = wearer.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) stamina_exhaustion *= potential_spine.athletics_boost_multiplier if(HAS_TRAIT(wearer, TRAIT_STRENGTH)) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index a15a59f05addf..640867a7c9334 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -707,7 +707,7 @@ if(human_examined.is_mouth_covered()) final_message += "\tYou can't see [examining.p_their()] mouth." else - var/obj/item/organ/internal/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE) var/pill_count = 0 for(var/datum/action/item_action/activate_pill/pill in human_examined.actions) pill_count++ @@ -724,7 +724,7 @@ if(human_examined.is_ears_covered()) final_message += "\tYou can't see [examining.p_their()] ears." else - var/obj/item/organ/internal/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS) if(has_ears) if(has_ears.deaf) final_message += "\tDamaged eardrums in [examining.p_their()] ear canals." @@ -736,7 +736,7 @@ if(human_examined.is_eyes_covered()) final_message += "\tYou can't see [examining.p_their()] eyes." else - var/obj/item/organ/internal/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES) if(has_eyes) final_message += "\tA pair of [has_eyes.damage ? "" : "healthy "][has_eyes.name]." else diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index 74ce320a8aba0..c1e6df6c30cfc 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -109,7 +109,7 @@ ";WE REPEAT OUR LIVES DAILY WITHOUT FURTHER QUESTIONS!!" ) user.say(pick(conspiracy_line), forced=type) - var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) if(brain) brain.set_organ_damage(BRAIN_DAMAGE_DEATH) return OXYLOSS diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index a02c7d1debff9..6d97c116ab11a 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -234,10 +234,10 @@ var/heart_strength var/pulse_pressure - var/obj/item/organ/internal/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART) - var/obj/item/organ/internal/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS) - var/obj/item/organ/internal/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER) - var/obj/item/organ/internal/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX) var/render_list = list()//information will be packaged in a list for clean display to the user diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 32af7abad5f3c..d25f247f5d4db 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -17,7 +17,7 @@ continue if(H.stat == DEAD) // What are you doing in this list continue - if(!H.get_organ_by_type(/obj/item/organ/internal/brain)) // If only I had a brain + if(!H.get_organ_by_type(/obj/item/organ/brain)) // If only I had a brain continue if(!(H.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) //please stop giving my centcom admin gimmicks full body paralysis continue diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm index 648c2cc9db04c..0dfa87ddfa333 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -19,7 +19,7 @@ continue if(H.mind.has_antag_datum(/datum/antagonist/obsessed)) continue - if(!H.get_organ_by_type(/obj/item/organ/internal/brain)) + if(!H.get_organ_by_type(/obj/item/organ/brain)) continue H.gain_trauma(/datum/brain_trauma/special/obsessed) announce_to_ghosts(H) diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 8cc87a60df515..833afd35bbc52 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -61,5 +61,5 @@ /obj/item/food/candy, /obj/item/food/candiedapple, /obj/item/food/chocolatebar, - /obj/item/organ/internal/brain ) // OH GOD THIS ISN'T CANDY! + /obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY! new type(src) diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index c9f4f1b3d1bd7..4b4871e33f67d 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -429,7 +429,7 @@ . = ..() if (!.) return - var/obj/item/organ/internal/brain/scanned_brain = check.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/scanned_brain = check.get_organ_slot(ORGAN_SLOT_BRAIN) if (isnull(scanned_brain)) experiment_handler.announce_message("Subject is brainless!") return FALSE diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm index 390937e0dd4e4..67850aedd28a1 100644 --- a/code/modules/experisci/handheld_scanner.dm +++ b/code/modules/experisci/handheld_scanner.dm @@ -46,7 +46,7 @@ /obj/item/experi_scanner/proc/make_meat_toilet(mob/living/carbon/user) ///The suicide victim's brain that will be placed inside the toilet's cistern - var/obj/item/organ/internal/brain/toilet_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/toilet_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) ///The toilet we're about to unleash unto this cursed plane of existence var/obj/structure/toilet/greyscale/result_toilet = new (drop_location()) diff --git a/code/modules/explorer_drone/exploration_events/trader.dm b/code/modules/explorer_drone/exploration_events/trader.dm index b686a53582d53..0367eb71516e7 100644 --- a/code/modules/explorer_drone/exploration_events/trader.dm +++ b/code/modules/explorer_drone/exploration_events/trader.dm @@ -89,7 +89,7 @@ requires_translator = FALSE required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_CIVILIZED) band_values = list(EXOSCANNER_BAND_LIFE=1) - required_path = list(/obj/item/organ/internal/heart,/obj/item/organ/internal/liver,/obj/item/organ/internal/stomach,/obj/item/organ/internal/eyes) + required_path = list(/obj/item/organ/heart,/obj/item/organ/liver,/obj/item/organ/stomach,/obj/item/organ/eyes) traded_path = list(/obj/item/implanter/explosive) amount = 1 diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index c69de62fbfc97..2aab17f5b9ea0 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -661,7 +661,7 @@ required_reagents = list(/datum/reagent/water = 50) required_ingredients = list( /obj/item/food/grown/tomato = 2, - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/eyes = 1, ) results = list( /datum/reagent/consumable/nutriment/soup/eyeball = 20, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index 8f78cb01ebc23..d0517272d7769 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -155,8 +155,8 @@ /datum/crafting_recipe/food/breaddog name = "Living dog/bread hybrid" reqs = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/brain = 1, + /obj/item/organ/heart = 1, /obj/item/food/bread/plain = 2, /obj/item/food/meat/slab = 3, /datum/reagent/blood = 30, @@ -216,8 +216,8 @@ name = "Bread cat/bread hybrid" reqs = list( /obj/item/food/bread/plain = 1, - /obj/item/organ/internal/ears/cat = 1, - /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, /obj/item/food/meat/slab = 3, /datum/reagent/blood = 50, /datum/reagent/medicine/strange_reagent = 5 diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 4e7c63413ecea..2953f8408ac92 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -39,7 +39,7 @@ /datum/crafting_recipe/food/appendixburger name = "Appendix burger" reqs = list( - /obj/item/organ/internal/appendix = 1, + /obj/item/organ/appendix = 1, /obj/item/food/bun = 1 ) result = /obj/item/food/burger/appendix @@ -48,7 +48,7 @@ /datum/crafting_recipe/food/brainburger name = "Brain burger" reqs = list( - /obj/item/organ/internal/brain = 1, + /obj/item/organ/brain = 1, /obj/item/food/bun = 1 ) result = /obj/item/food/burger/brain @@ -306,8 +306,8 @@ reqs = list( /obj/item/food/bun = 1, /obj/item/food/patty/plain = 1, - /obj/item/organ/internal/ears/cat = 1, - /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, ) result = /obj/item/food/burger/catburger category = CAT_BURGER diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index 4b56874eb7c6b..86956ba861cad 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -90,7 +90,7 @@ /datum/crafting_recipe/food/braincake name = "Brain cake" reqs = list( - /obj/item/organ/internal/brain = 1, + /obj/item/organ/brain = 1, /obj/item/food/cake/plain = 1 ) result = /obj/item/food/cake/brain @@ -218,8 +218,8 @@ /datum/crafting_recipe/food/cak name = "Living cat/cake hybrid" reqs = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/brain = 1, + /obj/item/organ/heart = 1, /obj/item/food/cake/birthday = 1, /obj/item/food/meat/slab = 3, /datum/reagent/blood = 30, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm index 5a754361ffb1f..5a7947c569e4b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -11,10 +11,10 @@ name = "Lizard Wine" time = 40 reqs = list( - /obj/item/organ/external/tail/lizard = 1, + /obj/item/organ/tail/lizard = 1, /datum/reagent/consumable/ethanol = 100 ) - blacklist = list(/obj/item/organ/external/tail/lizard/fake) + blacklist = list(/obj/item/organ/tail/lizard/fake) result = /obj/item/reagent_containers/cup/glass/bottle/lizardwine category = CAT_DRINK diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm index 7b253f32ce17d..d9f9cd16fe940 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -25,11 +25,11 @@ /obj/item/food/grown/carrot = 1, /obj/item/food/grown/chili = 1, /obj/item/food/grown/onion = 1, - /obj/item/organ/internal/lungs = 1, + /obj/item/organ/lungs = 1, /obj/item/reagent_containers/cup/bowl = 1, ) blacklist = list( - /obj/item/organ/internal/lungs/cybernetic, + /obj/item/organ/lungs/cybernetic, ) result = /obj/item/food/shredded_lungs @@ -38,10 +38,10 @@ /datum/crafting_recipe/food/tsatsikh name = "Tsatsikh" reqs = list( - /obj/item/organ/internal/heart = 1, - /obj/item/organ/internal/liver = 1, - /obj/item/organ/internal/lungs = 1, - /obj/item/organ/internal/stomach = 1, + /obj/item/organ/heart = 1, + /obj/item/organ/liver = 1, + /obj/item/organ/lungs = 1, + /obj/item/organ/stomach = 1, /datum/reagent/consumable/salt = 2, /datum/reagent/consumable/blackpepper = 2 ) @@ -51,7 +51,7 @@ /datum/crafting_recipe/food/liver_pate name = "Liver pate" reqs = list( - /obj/item/organ/internal/liver = 1, + /obj/item/organ/liver = 1, /obj/item/food/meat/rawcutlet = 1, /obj/item/food/grown/onion = 1 ) @@ -104,8 +104,8 @@ /datum/crafting_recipe/food/brain_pate name = "Eyeball-and-brain pate" reqs = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/eyes = 1, + /obj/item/organ/brain = 1, + /obj/item/organ/eyes = 1, /obj/item/food/grown/onion = 1, /datum/reagent/consumable/salt = 3 ) @@ -305,7 +305,7 @@ /obj/item/food/root_flatbread = 1, /obj/item/food/grown/cucumber = 2, /obj/item/food/egg = 1, - /obj/item/organ/internal/liver = 1 + /obj/item/organ/liver = 1 ) result = /obj/item/food/pizza/flatbread/zmorgast category = CAT_LIZARD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 804956cbeed5b..9244f4c54f30d 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -33,7 +33,7 @@ name = "Lizard tail kebab" reqs = list( /obj/item/stack/rods = 1, - /obj/item/organ/external/tail/lizard = 1 + /obj/item/organ/tail/lizard = 1 ) result = /obj/item/food/kebab/tail category = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm index 840d3a8c08b1a..3dbd7093a7415 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm @@ -107,7 +107,7 @@ time = 40 reqs = list( /obj/item/food/meat/steak/goliath = 1, - /obj/item/organ/internal/monster_core/regenerative_core/legion = 1, + /obj/item/organ/monster_core/regenerative_core/legion = 1, /datum/reagent/consumable/ketchup = 2, /datum/reagent/consumable/capsaicin = 2 ) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index cc27a6f078bef..9e145500a17c4 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -154,8 +154,8 @@ /datum/crafting_recipe/food/butterbear //ITS ALIVEEEEEE! name = "Living bear/butter hybrid" reqs = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/brain = 1, + /obj/item/organ/heart = 1, /obj/item/food/butter = 4, /obj/item/food/meat/slab = 5, /datum/reagent/blood = 50, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 8798f7cd8806c..522f6e9f695f8 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -423,7 +423,7 @@ time = 15 name = "Deluxe Meat-pocket" reqs = list( - /obj/item/organ/internal/heart = 1, + /obj/item/organ/heart = 1, /obj/item/food/meatball = 1, /obj/item/food/meat/slab = 1, /obj/item/food/grown/herbs = 1 diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 6e09ee3497cdd..db47c5625e3ba 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -39,7 +39,7 @@ ///Clowns will always like bananas. /obj/item/food/grown/banana/proc/check_liked(mob/living/carbon/human/consumer) - var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if (!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) return FOOD_LIKED diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index b17dbfb228dc2..0646d1d1df350 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -151,7 +151,7 @@ if(length(mind_traits)) spawned.mind.add_traits(mind_traits, JOB_TRAIT) - var/obj/item/organ/internal/liver/liver = spawned.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = spawned.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && length(liver_traits)) liver.add_traits(liver_traits, JOB_TRAIT) diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm index d5eb15d0c4733..a0e8bd47d3c89 100644 --- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm +++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm @@ -49,7 +49,7 @@ /datum/outfit/job/assistant/gimmick/cyborg/post_equip(mob/living/carbon/human/equipped, visuals_only) . = ..() - var/obj/item/organ/internal/tongue/robot/robotongue = new () + var/obj/item/organ/tongue/robot/robotongue = new () robotongue.Insert(equipped, movement_flags = DELETE_IF_REPLACED) /datum/outfit/job/assistant/gimmick/skater diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 7d4ece1d2085a..5a3e7a044e5a0 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -45,7 +45,7 @@ rods[nullrod_type] = initial(nullrod_type.menu_description) //special non-nullrod subtyped shit rods[/obj/item/gun/ballistic/bow/divine/with_quiver] = "A divine bow and 10 quivered holy arrows." - rods[/obj/item/organ/internal/cyberimp/arm/shard/scythe] = "A shard that implants itself into your arm, \ + rods[/obj/item/organ/cyberimp/arm/shard/scythe] = "A shard that implants itself into your arm, \ allowing you to conjure forth a vorpal scythe. \ Allows you to behead targets for empowered strikes. \ Harms you if you dismiss the scythe without first causing harm to a creature. \ diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index e6f34b894b3de..d2f6f61251dd2 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -5,17 +5,17 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and #define SCYTHE_SATED 1 #define SCYTHE_EMPOWERED 2 -/obj/item/organ/internal/cyberimp/arm/shard/scythe +/obj/item/organ/cyberimp/arm/shard/scythe name = "sinister shard" desc = "This shard seems to be directly linked to some sinister entity. It might be your god! It also gives you a really horrible rash when you hold onto it for too long." items_to_create = list(/obj/item/vorpalscythe) -/obj/item/organ/internal/cyberimp/arm/shard/scythe/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/cyberimp/arm/shard/scythe/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(receiver.mind) ADD_TRAIT(receiver.mind, TRAIT_MORBID, ORGAN_TRAIT) -/obj/item/organ/internal/cyberimp/arm/shard/scythe/Retract() +/obj/item/organ/cyberimp/arm/shard/scythe/Retract() var/obj/item/vorpalscythe/scythe = active_item if(!scythe) return FALSE diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index b328679795a2c..f0626d111522e 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -128,7 +128,7 @@ if(visuals_only) return if(!equipped.get_quirk(/datum/quirk/body_purist)) - var/obj/item/organ/internal/tongue/robot/cybernetic = new() + var/obj/item/organ/tongue/robot/cybernetic = new() cybernetic.Insert(equipped, special = TRUE, movement_flags = DELETE_IF_REPLACED) //you only get respect if you go all the way, man. ADD_TRAIT(equipped, TRAIT_COMMISSIONED, INNATE_TRAIT) diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm index 2dec45a6abf77..dc42dd7db90a3 100644 --- a/code/modules/library/skill_learning/skill_station.dm +++ b/code/modules/library/skill_learning/skill_station.dm @@ -229,7 +229,7 @@ .["slots_max"] = null return - var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) // If there's no brain, we don't need to worry either. if(QDELETED(occupant_brain)) @@ -272,7 +272,7 @@ return TRUE var/chipref = params["ref"] var/mob/living/carbon/carbon_occupant = occupant - var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(carbon_occupant) || QDELETED(occupant_brain)) return TRUE var/obj/item/skillchip/to_be_removed = locate(chipref) in occupant_brain.skillchips @@ -297,7 +297,7 @@ stack_trace("[usr] tried to toggle skillchip activation when [src] was in an invalid state.") return TRUE var/mob/living/carbon/carbon_occupant = occupant - var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(carbon_occupant) || QDELETED(occupant_brain)) return TRUE var/obj/item/skillchip/to_be_removed = locate(chipref) in occupant_brain.skillchips diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index eddaf300e08a9..5ca3f784ecbec 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -42,7 +42,7 @@ /// Set to TRUE when the skill chip's effects are applied. Set to FALSE when they're not. var/active = FALSE /// Brain that holds this skillchip. - var/obj/item/organ/internal/brain/holding_brain + var/obj/item/organ/brain/holding_brain /obj/item/skillchip/Initialize(mapload, is_removable = TRUE) . = ..() @@ -131,7 +131,7 @@ * Arguments: * * owner_brain - The brain that this skillchip was implanted in to. */ -/obj/item/skillchip/proc/on_implant(obj/item/organ/internal/brain/owner_brain) +/obj/item/skillchip/proc/on_implant(obj/item/organ/brain/owner_brain) if(holding_brain) CRASH("Skillchip is trying to be implanted into [owner_brain], but it's already implanted in [holding_brain]") @@ -205,7 +205,7 @@ * Arguments: * * skillchip - The skillchip you're intending to activate. Does not activate the chip. */ -/obj/item/skillchip/proc/has_activate_incompatibility(obj/item/organ/internal/brain/brain) +/obj/item/skillchip/proc/has_activate_incompatibility(obj/item/organ/brain/brain) if(QDELETED(brain)) return "No brain detected." @@ -255,7 +255,7 @@ return "Incompatible lifeform detected." // No brain - var/obj/item/organ/internal/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(brain)) return "No brain detected." @@ -274,7 +274,7 @@ * Arguments: * * brain - The brain to check for implantability with. */ -/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/internal/brain/brain) +/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/brain/brain) if(!istype(brain)) stack_trace("Attempted to check incompatibility with invalid brain object [brain].") return "Incompatible brain." diff --git a/code/modules/lost_crew/damages/decay.dm b/code/modules/lost_crew/damages/decay.dm index 666e63d3bedb8..55674894474e5 100644 --- a/code/modules/lost_crew/damages/decay.dm +++ b/code/modules/lost_crew/damages/decay.dm @@ -11,7 +11,7 @@ // * 0.5 because life ticks happen about every 2 seconds (we really need a way to get the current life tickspeed) var/decay_ticks = max_decay_time * severity * 0.5 - for(var/obj/item/organ/internal/internal in body.organs) + for(var/obj/item/organ/internal in body.organs) internal.apply_organ_damage(decay_ticks * internal.decay_factor) return TRUE diff --git a/code/modules/lost_crew/lost_crew_manager.dm b/code/modules/lost_crew/lost_crew_manager.dm index 7c1fdbe997b87..aa9ea571df703 100644 --- a/code/modules/lost_crew/lost_crew_manager.dm +++ b/code/modules/lost_crew/lost_crew_manager.dm @@ -56,7 +56,7 @@ GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new) if(!HAS_TRAIT(new_body, TRAIT_HUSK)) paper.name = "DO NOT REMOVE BRAIN" paper.add_raw_text("Body swapping is not covered by medical insurance for unhusked bodies. Chemical brain explosives have been administered to enforce stipend.") - var/obj/item/organ/internal/brain/boombrain = new_body.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/boombrain = new_body.get_organ_by_type(/obj/item/organ/brain) //I swear to fuck I will explode you. you're not clever //everyone thought of this, but I am the fool for having any faith //in people actually wanting to play the job in an interesting manner @@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new) paper.name = "BODYSWAPPING PERMITTED" paper.add_raw_text("Body swapping is covered by medical insurance in case of husking and a lack of skill in the practictioner.") - var/obj/item/organ/internal/brain/hersens = new_body.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/hersens = new_body.get_organ_by_type(/obj/item/organ/brain) hersens.AddComponent( /datum/component/ghostrole_on_revive, \ /* refuse_revival_if_failed = */ TRUE, \ @@ -75,7 +75,7 @@ GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new) ) /// Set a timer for awarding succes and drop some awesome deathlore -/datum/lost_crew_manager/proc/on_succesful_revive(obj/item/organ/internal/brain/brain, list/death_lore, list/datum/callback/on_revive_and_player_occupancy) +/datum/lost_crew_manager/proc/on_succesful_revive(obj/item/organ/brain/brain, list/death_lore, list/datum/callback/on_revive_and_player_occupancy) var/mob/living/carbon/human/owner = brain.owner owner.mind.add_antag_datum(/datum/antagonist/recovered_crew) //for tracking mostly diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm index c49b5c1399625..172c0e2f9e5cb 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm @@ -29,13 +29,13 @@ /obj/structure/closet/crate/secure/freezer/commsagent/PopulateContents() . = ..() //Contains a variety of less exotic tongues (And tongue accessories) for the comms agent to mess with. - new /obj/item/organ/internal/tongue(src) - new /obj/item/organ/internal/tongue/lizard(src) - new /obj/item/organ/internal/tongue/fly(src) - new /obj/item/organ/internal/tongue/zombie(src) - new /obj/item/organ/internal/tongue/bone(src) - new /obj/item/organ/internal/tongue/robot(src) //DANGER! CRYSTAL HYPERSTRUCTURE- - new /obj/item/organ/internal/tongue/ethereal(src) + new /obj/item/organ/tongue(src) + new /obj/item/organ/tongue/lizard(src) + new /obj/item/organ/tongue/fly(src) + new /obj/item/organ/tongue/zombie(src) + new /obj/item/organ/tongue/bone(src) + new /obj/item/organ/tongue/robot(src) //DANGER! CRYSTAL HYPERSTRUCTURE- + new /obj/item/organ/tongue/ethereal(src) new /obj/item/autosurgeon/syndicate/commsagent(src) new /obj/item/book/granter/sign_language(src) new /obj/item/clothing/gloves/radio(src) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index a91d033f1ee7b..d40d9178f3a85 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -73,27 +73,27 @@ var/stored_organ /// Types of organ we can spawn var/static/list/allowed_organs = list( - /obj/item/organ/internal/heart/gland/egg = 7, - /obj/item/organ/internal/heart/gland/plasma = 7, - /obj/item/organ/internal/alien/plasmavessel = 5, - /obj/item/organ/internal/heart/gland/chem = 5, - /obj/item/organ/internal/heart/gland/mindshock = 5, - /obj/item/organ/internal/heart/gland/spiderman = 5, - /obj/item/organ/internal/heart/gland/transform = 5, - /obj/item/organ/internal/heart/gland/slime = 4, - /obj/item/organ/internal/heart/gland/trauma = 4, - /obj/item/organ/internal/heart/carp = 3, - /obj/item/organ/internal/heart/rat = 3, - /obj/item/organ/internal/heart/gland/electric = 3, - /obj/item/organ/internal/monster_core/brimdust_sac = 3, - /obj/item/organ/internal/monster_core/regenerative_core = 3, - /obj/item/organ/internal/monster_core/rush_gland = 3, - /obj/item/organ/internal/tongue/carp = 3, - /obj/item/organ/internal/alien/acid = 2, - /obj/item/organ/internal/alien/resinspinner = 2, - /obj/item/organ/internal/eyes/night_vision/goliath = 2, - /obj/item/organ/internal/eyes/night_vision/rat = 2, - /obj/item/organ/internal/heart/gland/ventcrawling = 1, + /obj/item/organ/heart/gland/egg = 7, + /obj/item/organ/heart/gland/plasma = 7, + /obj/item/organ/alien/plasmavessel = 5, + /obj/item/organ/heart/gland/chem = 5, + /obj/item/organ/heart/gland/mindshock = 5, + /obj/item/organ/heart/gland/spiderman = 5, + /obj/item/organ/heart/gland/transform = 5, + /obj/item/organ/heart/gland/slime = 4, + /obj/item/organ/heart/gland/trauma = 4, + /obj/item/organ/heart/carp = 3, + /obj/item/organ/heart/rat = 3, + /obj/item/organ/heart/gland/electric = 3, + /obj/item/organ/monster_core/brimdust_sac = 3, + /obj/item/organ/monster_core/regenerative_core = 3, + /obj/item/organ/monster_core/rush_gland = 3, + /obj/item/organ/tongue/carp = 3, + /obj/item/organ/alien/acid = 2, + /obj/item/organ/alien/resinspinner = 2, + /obj/item/organ/eyes/night_vision/goliath = 2, + /obj/item/organ/eyes/night_vision/rat = 2, + /obj/item/organ/heart/gland/ventcrawling = 1, ) /obj/structure/meateor_fluff/flesh_pod/Initialize(mapload) diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 36fdad25d842e..ba135081532da 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -379,7 +379,7 @@ hits = 2 heavy = TRUE meteorsound = 'sound/effects/blob/blobattack.ogg' - meteordrop = list(/obj/item/food/meat/slab/human, /obj/item/food/meat/slab/human/mutant, /obj/item/organ/internal/heart, /obj/item/organ/internal/lungs, /obj/item/organ/internal/tongue, /obj/item/organ/internal/appendix/) + meteordrop = list(/obj/item/food/meat/slab/human, /obj/item/food/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/) var/meteorgibs = /obj/effect/gibspawner/generic threat = 2 signature = "culinary material" @@ -391,7 +391,7 @@ meteordrop += pick(subtypesof(path)) for(var/path in meteordrop) - if(path == /obj/item/organ/internal/tongue) + if(path == /obj/item/organ/tongue) meteordrop -= path meteordrop += pick(typesof(path)) return ..() @@ -412,12 +412,12 @@ //Meaty Ore Xeno edition /obj/effect/meteor/meaty/xeno color = "#5EFF00" - meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/internal/tongue/alien) + meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/tongue/alien) meteorgibs = /obj/effect/gibspawner/xeno signature = "exotic culinary material" /obj/effect/meteor/meaty/xeno/Initialize(mapload) - meteordrop += subtypesof(/obj/item/organ/internal/alien) + meteordrop += subtypesof(/obj/item/organ/alien) return ..() /obj/effect/meteor/meaty/xeno/ram_turf(turf/T) diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm index a77e526a9d1f7..d58ecf4da425d 100644 --- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm +++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm @@ -11,7 +11,7 @@ * If implanted, you can shake off a cloud of brimdust to give this buff to people around you.area * It will also automatically grant you one stack every 30 seconds if you are on lavaland. */ -/obj/item/organ/internal/monster_core/brimdust_sac +/obj/item/organ/monster_core/brimdust_sac name = "brimdust sac" desc = "A strange organ from a brimdemon. You can shake it out to coat yourself in explosive powder." icon_state = "brim_sac" @@ -24,16 +24,16 @@ /// You will gain a stack of the buff every x seconds COOLDOWN_DECLARE(brimdust_auto_apply_cooldown) -/obj/item/organ/internal/monster_core/brimdust_sac/Initialize(mapload) +/obj/item/organ/monster_core/brimdust_sac/Initialize(mapload) . = ..() AddComponent(/datum/component/explodable, light_impact_range = 1) -/obj/item/organ/internal/monster_core/brimdust_sac/apply_to(mob/living/target, mob/user) +/obj/item/organ/monster_core/brimdust_sac/apply_to(mob/living/target, mob/user) target.apply_status_effect(user_status, BRIMDUST_STACKS_ON_USE) qdel(src) // Every x seconds, if on lavaland, add one stack -/obj/item/organ/internal/monster_core/brimdust_sac/on_life(seconds_per_tick, times_fired) +/obj/item/organ/monster_core/brimdust_sac/on_life(seconds_per_tick, times_fired) . = ..() if(!COOLDOWN_FINISHED(src, brimdust_auto_apply_cooldown)) return @@ -43,7 +43,7 @@ owner.apply_status_effect(user_status, BRIMDUST_STACKS_ON_LIFE) /// Make a cloud which applies brimdust to everyone nearby -/obj/item/organ/internal/monster_core/brimdust_sac/on_triggered_internal() +/obj/item/organ/monster_core/brimdust_sac/on_triggered_internal() var/turf/origin_turf = get_turf(owner) do_smoke(range = 2, holder = owner, location = origin_turf, smoke_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust) diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index 679f3f81dd608..b6bd54a361eb5 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -11,7 +11,7 @@ /obj/item/mining_stabilizer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isorgan(interacting_with)) return NONE - var/obj/item/organ/internal/monster_core/target_core = interacting_with + var/obj/item/organ/monster_core/target_core = interacting_with if (!istype(target_core)) balloon_alert(user, "invalid target!") return ITEM_INTERACT_BLOCKING @@ -29,7 +29,7 @@ * Generalised behaviour is that they will decay and become useless unless provided with serum. * These should usually do something both when used in-hand, or when implanted into someone. */ -/obj/item/organ/internal/monster_core +/obj/item/organ/monster_core name = "monster core" desc = "All that remains of a monster. This abstract item should not spawn. \ It will rapidly decay into uselessness. but don't worry because it's already useless." @@ -58,11 +58,11 @@ /// Status effect applied by this organ var/datum/status_effect/user_status -/obj/item/organ/internal/monster_core/Initialize(mapload) +/obj/item/organ/monster_core/Initialize(mapload) . = ..() decay_timer = addtimer(CALLBACK(src, PROC_REF(go_inert)), time_to_decay, TIMER_STOPPABLE) -/obj/item/organ/internal/monster_core/examine(mob/user) +/obj/item/organ/monster_core/examine(mob/user) . = ..() if(!decay_timer) return @@ -79,11 +79,11 @@ if(0 SECONDS to 1 MINUTES) . += span_warning("Signs of decay have set in, but it still looks alive. It's probably about to become unusable really quickly.") -/obj/item/organ/internal/monster_core/Destroy(force) +/obj/item/organ/monster_core/Destroy(force) deltimer(decay_timer) return ..() -/obj/item/organ/internal/monster_core/mob_insert(mob/living/carbon/target_carbon, special = FALSE, movement_flags) +/obj/item/organ/monster_core/mob_insert(mob/living/carbon/target_carbon, special = FALSE, movement_flags) . = ..() if (inert) @@ -96,7 +96,7 @@ target_carbon.visible_message(span_notice("[src] stabilizes as it's inserted.")) return TRUE -/obj/item/organ/internal/monster_core/mob_remove(mob/living/carbon/target_carbon, special, movement_flags) +/obj/item/organ/monster_core/mob_remove(mob/living/carbon/target_carbon, special, movement_flags) if (!inert && !special) owner.visible_message(span_notice("[src] rapidly decays as it's removed.")) go_inert() @@ -107,7 +107,7 @@ * Returns true if successful. * * Implanted - If true, organ has just been inserted into someone. */ -/obj/item/organ/internal/monster_core/proc/preserve(implanted = FALSE) +/obj/item/organ/monster_core/proc/preserve(implanted = FALSE) if (inert) return FALSE deltimer(decay_timer) @@ -118,7 +118,7 @@ /** * Decays the organ, it is now useless. */ -/obj/item/organ/internal/monster_core/proc/go_inert() +/obj/item/organ/monster_core/proc/go_inert() if (inert) return FALSE inert = TRUE @@ -128,7 +128,7 @@ update_appearance() return TRUE -/obj/item/organ/internal/monster_core/update_desc() +/obj/item/organ/monster_core/update_desc() if (inert) desc = desc_inert ? desc_inert : initial(desc) return ..() @@ -138,7 +138,7 @@ desc = initial(desc) return ..() -/obj/item/organ/internal/monster_core/update_icon_state() +/obj/item/organ/monster_core/update_icon_state() if (inert) icon_state = icon_state_inert ? icon_state_inert : initial(icon_state) return ..() @@ -148,14 +148,14 @@ icon_state = initial(icon_state) return ..() -/obj/item/organ/internal/monster_core/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/organ/monster_core/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) return NONE try_apply(interacting_with, user) return ITEM_INTERACT_SUCCESS -/obj/item/organ/internal/monster_core/attack_self(mob/user) +/obj/item/organ/monster_core/attack_self(mob/user) if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH|ALLOW_RESTING)) return try_apply(user, user) @@ -167,7 +167,7 @@ * * target - Person you are applying this to. * * user - Person who is doing the applying. */ -/obj/item/organ/internal/monster_core/proc/try_apply(atom/target, mob/user) +/obj/item/organ/monster_core/proc/try_apply(atom/target, mob/user) if (!isliving(target)) balloon_alert(user, "invalid target!") return @@ -187,7 +187,7 @@ * * target - Person you are applying this to. * * user - Person who is doing the applying. */ -/obj/item/organ/internal/monster_core/proc/apply_to(mob/living/target, mob/user) +/obj/item/organ/monster_core/proc/apply_to(mob/living/target, mob/user) if (user_status) target.apply_status_effect(user_status) qdel(src) @@ -196,7 +196,7 @@ * Utility proc to find the associated monster organ action and trigger it. * Call this instead of on_triggered_internal() if the action needs to trigger automatically, or the cooldown won't happen. */ -/obj/item/organ/internal/monster_core/proc/trigger_organ_action(trigger_flags) +/obj/item/organ/monster_core/proc/trigger_organ_action(trigger_flags) var/datum/action/cooldown/monster_core_action/action = locate() in actions action?.Trigger(trigger_flags = trigger_flags) @@ -204,7 +204,7 @@ * Called when activated while implanted inside someone. * This could be via clicking the associated action button or through the above method. */ -/obj/item/organ/internal/monster_core/proc/on_triggered_internal() +/obj/item/organ/monster_core/proc/on_triggered_internal() SHOULD_CALL_PARENT(FALSE) CRASH("Someone forgot to make their organ do something when you implant it.") @@ -221,7 +221,7 @@ . = ..() if (!target) return - var/obj/item/organ/internal/monster_core/organ = target + var/obj/item/organ/monster_core/organ = target if (!istype(organ)) return organ.on_triggered_internal() diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm index 98758d5a369ce..e601ac89f8c59 100644 --- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm +++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm @@ -2,7 +2,7 @@ * On use in hand, heals you over time and removes injury movement debuffs. Also makes you a bit sad. * On use when implanted, fully heals. Automatically fully heals if you would enter crit. */ -/obj/item/organ/internal/monster_core/regenerative_core +/obj/item/organ/monster_core/regenerative_core name = "regenerative core" desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness." desc_preserved = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay." @@ -12,30 +12,30 @@ icon_state = "hivelord_core" icon_state_inert = "hivelord_core_decayed" -/obj/item/organ/internal/monster_core/regenerative_core/preserve(implanted = FALSE) +/obj/item/organ/monster_core/regenerative_core/preserve(implanted = FALSE) if (implanted) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "implanted")) else SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer")) return ..() -/obj/item/organ/internal/monster_core/regenerative_core/go_inert() +/obj/item/organ/monster_core/regenerative_core/go_inert() . = .. () if (!.) return SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert")) -/obj/item/organ/internal/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired) +/obj/item/organ/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired) . = ..() if (owner.health <= owner.crit_threshold) trigger_organ_action(TRIGGER_FORCE_AVAILABLE) -/obj/item/organ/internal/monster_core/regenerative_core/on_triggered_internal() +/obj/item/organ/monster_core/regenerative_core/on_triggered_internal() owner.revive(HEAL_ALL) qdel(src) /// Log applications and apply moodlet. -/obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) +/obj/item/organ/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) if (target != user) target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!")) @@ -46,7 +46,7 @@ return ..() /// Different graphics/desc for the lavaland legion -/obj/item/organ/internal/monster_core/regenerative_core/legion +/obj/item/organ/monster_core/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." desc_preserved = "The core has been stabilized, allowing you to use it to heal completely without danger of decay." desc_inert = "The core has decayed, and is completely useless." diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm index f9cfa1b88f1c3..cf901269e904c 100644 --- a/code/modules/mining/equipment/monster_organs/rush_gland.dm +++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm @@ -5,7 +5,7 @@ * On use in hand, makes you run really fast for 5 seconds and ignore injury movement decrease. * On use when implanted, run for longer and ignore all negative movement. Automatically triggers if health is low (to escape). */ -/obj/item/organ/internal/monster_core/rush_gland +/obj/item/organ/monster_core/rush_gland name = "rush gland" icon_state = "lobster_gland" icon_state_preserved = "lobster_gland_stable" @@ -16,23 +16,23 @@ user_status = /datum/status_effect/lobster_rush actions_types = list(/datum/action/cooldown/monster_core_action/adrenal_boost) -/obj/item/organ/internal/monster_core/rush_gland/on_life(seconds_per_tick, times_fired) +/obj/item/organ/monster_core/rush_gland/on_life(seconds_per_tick, times_fired) . = ..() if (owner.health <= HEALTH_DANGER_ZONE) trigger_organ_action() -/obj/item/organ/internal/monster_core/rush_gland/on_mob_insert(mob/living/carbon/organ_owner) +/obj/item/organ/monster_core/rush_gland/on_mob_insert(mob/living/carbon/organ_owner) . = ..() RegisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED, PROC_REF(trigger_organ_action_on_sig)) -/obj/item/organ/internal/monster_core/rush_gland/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/monster_core/rush_gland/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED) -/obj/item/organ/internal/monster_core/rush_gland/on_triggered_internal() +/obj/item/organ/monster_core/rush_gland/on_triggered_internal() owner.apply_status_effect(/datum/status_effect/lobster_rush/extended) -/obj/item/organ/internal/monster_core/rush_gland/proc/trigger_organ_action_on_sig(datum/source) +/obj/item/organ/monster_core/rush_gland/proc/trigger_organ_action_on_sig(datum/source) SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(trigger_organ_action)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 3a1e88d5af13b..58b7b437d7c54 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -27,7 +27,7 @@ if(2) new /obj/item/soulstone/anybody/mining(src) if(3) - new /obj/item/organ/internal/cyberimp/arm/shard/katana(src) + new /obj/item/organ/cyberimp/arm/shard/katana(src) if(4) new /obj/item/clothing/glasses/godeye(src) if(5) @@ -48,7 +48,7 @@ if(8) new /obj/item/rod_of_asclepius(src) if(9) - new /obj/item/organ/internal/heart/cursed/wizard(src) + new /obj/item/organ/heart/cursed/wizard(src) if(10) new /obj/item/ship_in_a_bottle(src) if(11) @@ -154,7 +154,7 @@ var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) var/random_crystal = pick(choices) new random_crystal(src) - new /obj/item/organ/internal/vocal_cords/colossus(src) + new /obj/item/organ/vocal_cords/colossus(src) /obj/structure/closet/crate/necropolis/colossus/crusher name = "angelic colossus chest" diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 02156684afac4..fe338b35ccb93 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -552,7 +552,7 @@ to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as your wings change shape!")) else to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as wings burst out!")) - var/obj/item/organ/external/wings/functional/wings = get_wing_choice(exposed_human, chest) + var/obj/item/organ/wings/functional/wings = get_wing_choice(exposed_human, chest) wings = new wings() wings.Insert(exposed_human) playsound(exposed_human.loc, 'sound/items/poster/poster_ripped.ogg', 50, TRUE, -1) @@ -565,7 +565,7 @@ return wing_types[1] var/list/radial_wings = list() var/list/name2type = list() - for(var/obj/item/organ/external/wings/functional/possible_type as anything in wing_types) + for(var/obj/item/organ/wings/functional/possible_type as anything in wing_types) var/datum/sprite_accessory/accessory = initial(possible_type.sprite_accessory_override) //get the type accessory = SSaccessories.wings_list[initial(accessory.name)] //get the singleton instance var/image/img = image(icon = accessory.icon, icon_state = "m_wingsopen_[accessory.icon_state]_BEHIND") //Process the HUD elements @@ -927,7 +927,7 @@ name = "Scan Target" desc = "Contact may or may not be close." -/obj/item/organ/internal/cyberimp/arm/shard +/obj/item/organ/cyberimp/arm/shard name = "dark spoon shard" desc = "An eerie metal shard surrounded by dark energies...of soup drinking. You probably don't think you should have been able to find this." icon = 'icons/obj/mining_zones/artefacts.dmi' @@ -937,7 +937,7 @@ extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' -/obj/item/organ/internal/cyberimp/arm/shard/attack_self(mob/user, modifiers) +/obj/item/organ/cyberimp/arm/shard/attack_self(mob/user, modifiers) . = ..() to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!")) playsound(user, 'sound/effects/magic/demon_consume.ogg', 50, TRUE) @@ -947,15 +947,15 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/internal/cyberimp/arm/shard/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/cyberimp/arm/shard/screwdriver_act(mob/living/user, obj/item/screwtool) return -/obj/item/organ/internal/cyberimp/arm/shard/katana +/obj/item/organ/cyberimp/arm/shard/katana name = "dark shard" desc = "An eerie metal shard surrounded by dark energies." items_to_create = list(/obj/item/cursed_katana) -/obj/item/organ/internal/cyberimp/arm/shard/katana/Retract() +/obj/item/organ/cyberimp/arm/shard/katana/Retract() var/obj/item/cursed_katana/katana = active_item if(!katana || katana.shattered) return FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5567162d8bd78..39b989b9d2c85 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -275,8 +275,8 @@ Works together with spawning an observer, noted above. if(ishuman(usr)) //following code only applies to those capable of having an ethereal heart, ie humans var/mob/living/carbon/human/crystal_fella = usr var/our_heart = crystal_fella.get_organ_slot(ORGAN_SLOT_HEART) - if(istype(our_heart, /obj/item/organ/internal/heart/ethereal)) //so you got the heart? - var/obj/item/organ/internal/heart/ethereal/ethereal_heart = our_heart + if(istype(our_heart, /obj/item/organ/heart/ethereal)) //so you got the heart? + var/obj/item/organ/heart/ethereal/ethereal_heart = our_heart ethereal_heart.stop_crystalization_process(crystal_fella) //stops the crystallization process stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now diff --git a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm index 1fa30063dd581..13caade7c9416 100644 --- a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm +++ b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm @@ -83,7 +83,7 @@ if(HAS_TRAIT(current_target, TRAIT_DEAF)) return - var/obj/item/organ/internal/ears/target_ears = current_target.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/target_ears = current_target.get_organ_slot(ORGAN_SLOT_EARS) target_ears?.adjustEarDamage(0, 5) /mob/living/basic/bot/honkbot/ui_data(mob/user) diff --git a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm index b83c4f253f362..6f8c2e5c96f07 100644 --- a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm +++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm @@ -28,7 +28,7 @@ var/static/list/loot = list( /obj/effect/decal/cleanable/ash, /obj/item/clothing/suit/armor/vest, - /obj/item/organ/internal/lungs, + /obj/item/organ/lungs, /obj/item/shard, ) AddElement(/datum/element/death_drops, loot) diff --git a/code/modules/mob/living/basic/heretic/raw_prophet.dm b/code/modules/mob/living/basic/heretic/raw_prophet.dm index f4ed7229a005e..1d0d0f93f203b 100644 --- a/code/modules/mob/living/basic/heretic/raw_prophet.dm +++ b/code/modules/mob/living/basic/heretic/raw_prophet.dm @@ -25,7 +25,7 @@ /mob/living/basic/heretic_summon/raw_prophet/Initialize(mapload) . = ..() AddElement(/datum/element/wheel) - var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes) + var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/eyes) AddElement(/datum/element/death_drops, body_parts) AddComponent(/datum/component/focused_attacker) var/on_link_message = "You feel something new enter your sphere of mind... \ diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm index 81dc34002eedb..e314fe152caf6 100644 --- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm @@ -31,7 +31,7 @@ butcher_results = list( /obj/item/food/meat/slab = 2, /obj/effect/decal/cleanable/brimdust = 1, - /obj/item/organ/internal/monster_core/brimdust_sac = 1, + /obj/item/organ/monster_core/brimdust_sac = 1, ) /// How we get blasting var/datum/action/cooldown/mob_cooldown/brimbeam/beam diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm index f76479dc1312d..286e7539624fb 100644 --- a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -29,7 +29,7 @@ /mob/living/basic/mining/hivelord/Initialize(mapload) . = ..() - var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core) + var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core) AddElement(/datum/element/relay_attackers) AddElement(/datum/element/death_drops, death_loot) AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") // They writhe so much. diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm index 76d3f51947e63..007d8b6bfa666 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm @@ -50,7 +50,7 @@ /// Create what we want to drop on death, in proc form so we can always return a static list /mob/living/basic/mining/legion/proc/get_loot_list() - var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) + var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core/legion) return death_loot /mob/living/basic/mining/legion/Exited(atom/movable/gone, direction) @@ -88,7 +88,7 @@ if (prob(75)) return // Congratulations you have won a special prize: cancer - var/obj/item/organ/internal/legion_tumour/cancer = new() + var/obj/item/organ/legion_tumour/cancer = new() cancer.Insert(consumed, special = TRUE, movement_flags = DELETE_IF_REPLACED) /// A Legion which only drops skeletons instead of corpses which might have fun loot, so it cannot be farmed @@ -167,5 +167,5 @@ /// Create what we want to drop on death, in proc form so we can always return a static list /mob/living/basic/mining/legion/large/get_loot_list() - var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4) + var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4) return death_loot diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm index d4503230e482f..984080907c2a8 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -1,5 +1,5 @@ /// Left behind when a legion infects you, for medical enrichment -/obj/item/organ/internal/legion_tumour +/obj/item/organ/legion_tumour name = "legion tumour" desc = "A mass of pulsing flesh and dark tendrils, containing the power to regenerate flesh at a terrible cost." failing_desc = "pulses and writhes with horrible life, reaching towards you with its tendrils!" @@ -27,22 +27,22 @@ 'sound/mobs/non-humanoids/hiss/lowHiss4.ogg', ) -/obj/item/organ/internal/legion_tumour/Initialize(mapload) +/obj/item/organ/legion_tumour/Initialize(mapload) . = ..() animate_pulse() -/obj/item/organ/internal/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag) +/obj/item/organ/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag) var/was_failing = organ_flags & ORGAN_FAILING . = ..() if (was_failing != (organ_flags & ORGAN_FAILING)) animate_pulse() -/obj/item/organ/internal/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) +/obj/item/organ/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) . = ..() animate_pulse() /// Do a heartbeat animation depending on if we're failing or not -/obj/item/organ/internal/legion_tumour/proc/animate_pulse() +/obj/item/organ/legion_tumour/proc/animate_pulse() animate(src, transform = matrix()) // Stop any current animation var/speed_divider = organ_flags & ORGAN_FAILING ? 2 : 1 @@ -51,23 +51,23 @@ animate(transform = matrix(), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_IN) animate(transform = matrix(), time = 2 SECONDS / speed_divider) -/obj/item/organ/internal/legion_tumour/Remove(mob/living/carbon/egg_owner, special, movement_flags) +/obj/item/organ/legion_tumour/Remove(mob/living/carbon/egg_owner, special, movement_flags) . = ..() stage = 0 elapsed_time = 0 -/obj/item/organ/internal/legion_tumour/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/legion_tumour/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() owner.log_message("has received [src] which will eventually turn them into a Legion.", LOG_VICTIM) -/obj/item/organ/internal/legion_tumour/attack(mob/living/target, mob/living/user, params) +/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, params) if (try_apply(target, user)) qdel(src) return return ..() /// Smear it on someone like a regen core, why not. Make sure they're alive though. -/obj/item/organ/internal/legion_tumour/proc/try_apply(mob/living/target, mob/user) +/obj/item/organ/legion_tumour/proc/try_apply(mob/living/target, mob/user) if(!user.Adjacent(target) || !isliving(target)) return FALSE @@ -90,7 +90,7 @@ skull.melee_attack(target) return TRUE -/obj/item/organ/internal/legion_tumour/on_life(seconds_per_tick, times_fired) +/obj/item/organ/legion_tumour/on_life(seconds_per_tick, times_fired) . = ..() if (QDELETED(src) || QDELETED(owner)) return @@ -146,7 +146,7 @@ to_chat(owner, span_bolddanger("Something is moving under your skin!")) /// Consume our host -/obj/item/organ/internal/legion_tumour/proc/infest() +/obj/item/organ/legion_tumour/proc/infest() if (QDELETED(src) || QDELETED(owner)) return owner.log_message("has been turned into a Legion by their tumour.", LOG_VICTIM) @@ -155,7 +155,7 @@ new_legion.consume(owner) qdel(src) -/obj/item/organ/internal/legion_tumour/on_find(mob/living/finder) +/obj/item/organ/legion_tumour/on_find(mob/living/finder) . = ..() to_chat(finder, span_warning("There's an enormous tumour in [owner]'s [zone]!")) if(stage < 4) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index d7f5a024aceb1..d8288360bd1a2 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -22,7 +22,7 @@ butcher_results = list( /obj/item/food/meat/slab/rawcrab = 2, /obj/item/stack/sheet/bone = 2, - /obj/item/organ/internal/monster_core/rush_gland = 1, + /obj/item/organ/monster_core/rush_gland = 1, ) crusher_loot = /obj/item/crusher_trophy/lobster_claw ai_controller = /datum/ai_controller/basic_controller/lobstrosity @@ -146,7 +146,7 @@ butcher_results = list( /obj/item/food/meat/slab/rawcrab = 1, /obj/item/stack/sheet/bone = 1, - /obj/item/organ/internal/monster_core/rush_gland = 1, + /obj/item/organ/monster_core/rush_gland = 1, ) crusher_loot = null ai_controller = /datum/ai_controller/basic_controller/lobstrosity/juvenile diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 3c2ab3f7c9f9b..3075aa6bcb72b 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -12,8 +12,8 @@ unsuitable_atmos_damage = 0.5 butcher_results = list( /obj/item/food/meat/slab = 1, - /obj/item/organ/internal/ears/cat = 1, - /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1 ) response_help_continuous = "pets" @@ -181,8 +181,8 @@ can_interact_with_stove = TRUE butcher_results = list( /obj/item/food/meat/slab = 2, - /obj/item/organ/internal/ears/cat = 1, - /obj/item/organ/external/tail/cat = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, /obj/item/food/breadslice/plain = 1 ) collar_icon_state = null diff --git a/code/modules/mob/living/basic/pets/cat/keeki.dm b/code/modules/mob/living/basic/pets/cat/keeki.dm index 4c18d22b02a73..7314f9b49068a 100644 --- a/code/modules/mob/living/basic/pets/cat/keeki.dm +++ b/code/modules/mob/living/basic/pets/cat/keeki.dm @@ -8,8 +8,8 @@ maxHealth = 50 gender = FEMALE butcher_results = list( - /obj/item/organ/internal/brain = 1, - /obj/item/organ/internal/heart = 1, + /obj/item/organ/brain = 1, + /obj/item/organ/heart = 1, /obj/item/food/cakeslice/birthday = 3, /obj/item/food/meat/slab = 2 ) @@ -40,7 +40,7 @@ /mob/living/basic/pet/cat/cak/CheckParts(list/parts) . = ..() - var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents + var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents if(isnull(candidate?.brainmob?.mind)) return var/datum/mind/candidate_mind = candidate.brainmob.mind diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm index 9ac8e10d8f4f9..c5fac5f966e48 100644 --- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm +++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm @@ -91,7 +91,7 @@ maxHealth = 50 gender = NEUTER damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, STAMINA = 0, OXY = 1) - butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/breadslice/plain = 3, \ + butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/breadslice/plain = 3, \ /obj/item/food/meat/slab = 2) response_harm_continuous = "takes a bite out of" response_harm_simple = "take a bite out of" @@ -101,7 +101,7 @@ /mob/living/basic/pet/dog/breaddog/CheckParts(list/parts) . = ..() - var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents + var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) return candidate.brainmob.mind.transfer_to(src) diff --git a/code/modules/mob/living/basic/pets/penguin/penguin.dm b/code/modules/mob/living/basic/pets/penguin/penguin.dm index 5a4732039987d..debc4e721e761 100644 --- a/code/modules/mob/living/basic/pets/penguin/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin/penguin.dm @@ -131,7 +131,7 @@ density = FALSE pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL - butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) + butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) ai_controller = /datum/ai_controller/basic_controller/penguin/baby can_lay_eggs = FALSE ///will it grow up? 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 7a28473f1fa9a..e6d77586e4b1b 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -132,7 +132,7 @@ response_harm_simple = "take a bite out of" attacked_sound = 'sound/items/eatfood.ogg' death_message = "loses its false life and collapses!" - butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1) + butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/brain = 1, /obj/item/organ/heart = 1) attack_sound = 'sound/items/weapons/slap.ogg' attack_vis_effect = ATTACK_EFFECT_DISARM attack_verb_simple = "slap" @@ -160,7 +160,7 @@ /mob/living/basic/bear/butter/CheckParts(list/parts) //Borrowed code from Cak, allows the brain used to actually control the bear. . = ..() - var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents + var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents if(!candidate || !candidate.brainmob || !candidate.brainmob.mind) return var/datum/mind/candidate_mind = candidate.brainmob.mind diff --git a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm index 246b025d559dc..926ce374fafe1 100644 --- a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm +++ b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm @@ -51,7 +51,7 @@ return var/mob/living/carbon/human/attacked = target - var/obj/item/organ/external/tail/cat/tail = attacked.get_organ_by_type(/obj/item/organ/external/tail/cat) + var/obj/item/organ/tail/cat/tail = attacked.get_organ_by_type(/obj/item/organ/tail/cat) if(QDELETED(tail)) return diff --git a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm index d7aa8903398a6..f2585aecd6276 100644 --- a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm +++ b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm @@ -74,7 +74,7 @@ /// Simply infects the target corpse with our changeling eggs. This shouldn't fail, because all checks should have been done in check_and_implant() /// Just to be super-duper safe to the player, we do return TRUE if all goes well and read that value in check_and_implant() to be nice to the player. /mob/living/basic/headslug/proc/infect(mob/living/carbon/victim) - var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) + var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) egg.origin = mind diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm index 811186d43ad9a..fdc92d06f661f 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm @@ -1,16 +1,16 @@ /// The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl -/obj/item/organ/internal/heart/demon +/obj/item/organ/heart/demon name = "demon heart" desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/medical/organs/organs.dmi' icon_state = "demon_heart-on" decay_factor = 0 -/obj/item/organ/internal/heart/demon/Initialize(mapload) +/obj/item/organ/heart/demon/Initialize(mapload) AddElement(/datum/element/update_icon_blocker) return ..() -/obj/item/organ/internal/heart/demon/attack(mob/target_mob, mob/living/carbon/user, obj/target) +/obj/item/organ/heart/demon/attack(mob/target_mob, mob/living/carbon/user, obj/target) if(target_mob != user) return ..() @@ -33,18 +33,18 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E -/obj/item/organ/internal/heart/demon/on_mob_insert(mob/living/carbon/heart_owner) +/obj/item/organ/heart/demon/on_mob_insert(mob/living/carbon/heart_owner) . = ..() // Gives a non-eat-people crawl to the new owner var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = new(heart_owner) crawl.Grant(heart_owner) -/obj/item/organ/internal/heart/demon/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE) +/obj/item/organ/heart/demon/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE) . = ..() var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = locate() in heart_owner.actions qdel(crawl) -/obj/item/organ/internal/heart/demon/Stop() +/obj/item/organ/heart/demon/Stop() return FALSE // Always beating. /obj/effect/decal/cleanable/blood/innards diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm index a8073fa8329f7..add0ba237f86b 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm @@ -45,7 +45,7 @@ var/static/list/droppable_loot = list( /obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/blood/innards, - /obj/item/organ/internal/heart/demon, + /obj/item/organ/heart/demon, ) return droppable_loot diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm index e735067b3ed8d..9c56ec044c75f 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -100,13 +100,13 @@ if(!ishuman(target)) return TRUE var/mob/living/carbon/human_target = target - var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) if(isnull(eyes) || eyes.damage < 10) return TRUE heal_eye_damage(human_target, eyes) return FALSE -/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/internal/eyes/eyes) +/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/eyes/eyes) if(!COOLDOWN_FINISHED(src, eye_healing)) return to_chat(target, span_warning("[src] seems to be healing your [eyes.zone]!")) diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm index 5051f8153714d..27f637d3a879a 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm @@ -7,7 +7,7 @@ if(!eye_damage_threshold) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED for(var/mob/living/carbon/blind in oview(9, living_pawn)) - var/obj/item/organ/internal/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES) if(isnull(eyes)) continue if(eyes.damage < eye_damage_threshold) @@ -36,7 +36,7 @@ if(QDELETED(target)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) var/datum/callback/callback = CALLBACK(living_pawn, TYPE_PROC_REF(/mob/living/basic/eyeball, heal_eye_damage), target, eyes) callback.Invoke() diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm index 17b260d03ed72..f71594ea0ec1e 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm @@ -34,7 +34,7 @@ var/eye_damage_threshold = owner.ai_controller.blackboard[BB_EYE_DAMAGE_THRESHOLD] if(!eye_damage_threshold) return TRUE - var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) if(eyes.damage > eye_damage_threshold) //we dont attack people with bad vision return FALSE diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 7ae89e8d0ae1d..592d187ebbf0b 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -10,7 +10,7 @@ var/mob/living/brain/brainmob = null //The current occupant. var/mob/living/silicon/robot = null //Appears unused. var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm. - var/obj/item/organ/internal/brain/brain = null //The actual brain + var/obj/item/organ/brain/brain = null //The actual brain var/datum/ai_laws/laws = new() var/force_replace_ai_name = FALSE var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. @@ -35,7 +35,7 @@ if(!brain) icon_state = "[base_icon_state]_off" return ..() - icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/internal/brain/alien) ? "_alien" : null]" + icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/brain/alien) ? "_alien" : null]" return ..() /obj/item/mmi/update_overlays() @@ -51,8 +51,8 @@ /obj/item/mmi/attackby(obj/item/O, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) - if(istype(O, /obj/item/organ/internal/brain)) //Time to stick a brain in it --NEO - var/obj/item/organ/internal/brain/newbrain = O + if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO + var/obj/item/organ/brain/newbrain = O if(brain) to_chat(user, span_warning("There's already a brain in the MMI!")) return @@ -99,7 +99,7 @@ name = "[initial(name)]: [brainmob.real_name]" update_appearance() - if(istype(brain, /obj/item/organ/internal/brain/alien)) + if(istype(brain, /obj/item/organ/brain/alien)) braintype = "Xenoborg" //HISS....Beep. else braintype = "Cyborg" @@ -121,7 +121,7 @@ * Arguments: * * new_brain - Brain to be force-inserted into the MMI. Any calling code should handle proper removal of the brain from the mob, as this proc only forceMoves. */ -/obj/item/mmi/proc/force_brain_into(obj/item/organ/internal/brain/new_brain) +/obj/item/mmi/proc/force_brain_into(obj/item/organ/brain/new_brain) if(isnull(new_brain)) stack_trace("Proc called with null brain.") return FALSE @@ -160,7 +160,7 @@ name = "[initial(name)]: [brainmob.real_name]" update_appearance() - if(istype(brain, /obj/item/organ/internal/brain/alien)) + if(istype(brain, /obj/item/organ/brain/alien)) braintype = "Xenoborg" else braintype = "Cyborg" @@ -209,7 +209,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L - var/obj/item/organ/internal/brain/newbrain = H.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/newbrain = H.get_organ_by_type(/obj/item/organ/brain) newbrain.Remove(H, special = TRUE, movement_flags = NO_ID_TRANSFER) newbrain.forceMove(src) brain = newbrain @@ -220,7 +220,7 @@ name = "[initial(name)]: [brainmob.real_name]" update_appearance() - if(istype(brain, /obj/item/organ/internal/brain/alien)) + if(istype(brain, /obj/item/organ/brain/alien)) braintype = "Xenoborg" //HISS....Beep. else braintype = "Cyborg" diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 17f5be02a91cf..ccce0269e54ea 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -11,7 +11,7 @@ create_dna(src) stored_dna.initialize_dna(random_blood_type()) if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned) - var/obj/item/organ/internal/brain/OB = new(loc) //we create a new brain organ for it. + var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it. OB.brainmob = src forceMove(OB) if(!container?.mecha && (!container || container.immobilize)) //Unless inside a mecha, brains are rather helpless. @@ -19,7 +19,7 @@ ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) /mob/living/brain/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - var/obj/item/organ/internal/brain/brain_loc = loc + var/obj/item/organ/brain/brain_loc = loc if(brain_loc && isnull(new_turf) && brain_loc.owner) //we're actively being put inside a new body. return ..(old_turf, get_turf(brain_loc.owner), same_z_layer, notify_contents) return ..() @@ -79,10 +79,10 @@ /mob/living/brain/forceMove(atom/destination) if(container) return container.forceMove(destination) - else if (istype(loc, /obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/B = loc + else if (istype(loc, /obj/item/organ/brain)) + var/obj/item/organ/brain/B = loc B.forceMove(destination) - else if (istype(destination, /obj/item/organ/internal/brain)) + else if (istype(destination, /obj/item/organ/brain)) doMove(destination) else if (istype(destination, /obj/item/mmi)) doMove(destination) @@ -102,8 +102,8 @@ /mob/living/brain/proc/get_traumas() . = list() - if(istype(loc, /obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/B = loc + if(istype(loc, /obj/item/organ/brain)) + var/obj/item/organ/brain/B = loc . = B.traumas /mob/living/brain/get_policy_keywords() diff --git a/code/modules/mob/living/brain/brain_cybernetic.dm b/code/modules/mob/living/brain/brain_cybernetic.dm index d87b6d902837c..c88db6dc1a1a4 100644 --- a/code/modules/mob/living/brain/brain_cybernetic.dm +++ b/code/modules/mob/living/brain/brain_cybernetic.dm @@ -1,11 +1,11 @@ -/obj/item/organ/internal/brain/cybernetic +/obj/item/organ/brain/cybernetic name = "cybernetic brain" desc = "A mechanical brain found inside of androids. Not to be confused with a positronic brain." icon_state = "brain-c" organ_flags = ORGAN_ROBOTIC | ORGAN_VITAL failing_desc = "seems to be broken, and will not work without repairs." -/obj/item/organ/internal/brain/cybernetic/brain_damage_examine() +/obj/item/organ/brain/cybernetic/brain_damage_examine() if(suicided) return span_info("Its circuitry is smoking slightly. They must not have been able to handle the stress of it all.") if(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost())) @@ -18,7 +18,7 @@ else return span_info("This one is completely devoid of life.") -/obj/item/organ/internal/brain/cybernetic/check_for_repair(obj/item/item, mob/user) +/obj/item/organ/brain/cybernetic/check_for_repair(obj/item/item, mob/user) if (item.tool_behaviour == TOOL_MULTITOOL) //attempt to repair the brain if (brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!")) @@ -48,7 +48,7 @@ return TRUE return FALSE -/obj/item/organ/internal/brain/cybernetic/emp_act(severity) +/obj/item/organ/brain/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index be9c6dc1d1cd1..7907fabbfc0a5 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/brain +/obj/item/organ/brain name = "brain" desc = "A piece of juicy meat found in a person's head." icon_state = "brain" @@ -45,12 +45,12 @@ /// We got smooth from being washed var/smooth_brain = FALSE -/obj/item/organ/internal/brain/Initialize(mapload) +/obj/item/organ/brain/Initialize(mapload) . = ..() // Brain size logic transform = transform.Scale(brain_size) -/obj/item/organ/internal/brain/examine() +/obj/item/organ/brain/examine() . = ..() if (smooth_brain) . += span_notice("All the pesky wrinkles are gone. Now it just needs a good drying...") @@ -59,7 +59,7 @@ if(brain_size > 1) . += span_notice("It is bigger than average...") -/obj/item/organ/internal/brain/mob_insert(mob/living/carbon/brain_owner, special = FALSE, movement_flags) +/obj/item/organ/brain/mob_insert(mob/living/carbon/brain_owner, special = FALSE, movement_flags) . = ..() if(!.) return @@ -115,7 +115,7 @@ if(!special && !(brain_owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS)) brain_owner.update_body_parts() -/obj/item/organ/internal/brain/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/brain/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) // Delete skillchips first as parent proc sets owner to null, and skillchips need to know the brain's owner. if(!QDELETED(organ_owner) && length(skillchips)) if(!special) @@ -139,11 +139,11 @@ organ_owner.update_body_parts() organ_owner.clear_mood_event("brain_damage") -/obj/item/organ/internal/brain/update_icon_state() +/obj/item/organ/brain/update_icon_state() icon_state = "[initial(icon_state)][smooth_brain ? "-smooth_brain" : ""]" return ..() -/obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L) +/obj/item/organ/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s [initial(name)]" if(brainmob) if(!decoy_override) @@ -175,7 +175,7 @@ L.mind.transfer_to(brainmob) to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain.")) -/obj/item/organ/internal/brain/attackby(obj/item/item, mob/user, params) +/obj/item/organ/brain/attackby(obj/item/item, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) if(istype(item, /obj/item/borg/apparatus/organ_storage)) @@ -217,7 +217,7 @@ visible_message(span_danger("[user] hits [src] with [item]!")) to_chat(user, span_danger("You hit [src] with [item]!")) -/obj/item/organ/internal/brain/proc/check_for_repair(obj/item/item, mob/user) +/obj/item/organ/brain/proc/check_for_repair(obj/item/item, mob/user) if(damage && item.is_drainable() && item.reagents.has_reagent(/datum/reagent/medicine/mannitol) && (organ_flags & ORGAN_ORGANIC)) //attempt to heal the brain if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!")) @@ -236,7 +236,7 @@ return TRUE return FALSE -/obj/item/organ/internal/brain/examine(mob/user) +/obj/item/organ/brain/examine(mob/user) . = ..() if(length(skillchips)) . += span_info("It has a skillchip embedded in it.") @@ -247,7 +247,7 @@ . += span_notice("It is bigger than average...") /// Needed so subtypes can override examine text while still calling parent -/obj/item/organ/internal/brain/proc/brain_damage_examine() +/obj/item/organ/brain/proc/brain_damage_examine() if(suicided) return span_info("It's started turning slightly grey. They must not have been able to handle the stress of it all.") if(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost())) @@ -260,7 +260,7 @@ else return span_info("This one is completely devoid of life.") -/obj/item/organ/internal/brain/get_status_appendix(advanced, add_tooltips) +/obj/item/organ/brain/get_status_appendix(advanced, add_tooltips) var/list/trauma_text for(var/datum/brain_trauma/trauma as anything in traumas) var/trauma_desc = "" @@ -280,7 +280,7 @@ if(LAZYLEN(trauma_text)) return "Mental trauma: [english_list(trauma_text, and_text = ", and ")]." -/obj/item/organ/internal/brain/attack(mob/living/carbon/C, mob/user) +/obj/item/organ/brain/attack(mob/living/carbon/C, mob/user) if(!istype(C)) return ..() @@ -289,7 +289,7 @@ if(user.zone_selected != BODY_ZONE_HEAD) return ..() - var/target_has_brain = C.get_organ_by_type(/obj/item/organ/internal/brain) + var/target_has_brain = C.get_organ_by_type(/obj/item/organ/brain) if(!target_has_brain && C.is_eyes_covered()) to_chat(user, span_warning("You're going to need to remove [C.p_their()] head cover first!")) @@ -317,7 +317,7 @@ else ..() -/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs. +/obj/item/organ/brain/Destroy() //copypasted from MMIs. QDEL_NULL(brainmob) QDEL_LIST(traumas) @@ -325,13 +325,13 @@ owner?.mind?.set_current(null) //You aren't allowed to return to brains that don't exist return ..() -/obj/item/organ/internal/brain/on_life(seconds_per_tick, times_fired) +/obj/item/organ/brain/on_life(seconds_per_tick, times_fired) if(damage >= BRAIN_DAMAGE_DEATH) //rip to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out...")) owner.investigate_log("has been killed by brain damage.", INVESTIGATE_DEATHS) owner.death() -/obj/item/organ/internal/brain/check_damage_thresholds(mob/M) +/obj/item/organ/brain/check_damage_thresholds(mob/M) . = ..() //if we're not more injured than before, return without gambling for a trauma if(damage <= prev_damage) @@ -364,9 +364,9 @@ else return brain_message -/obj/item/organ/internal/brain/before_organ_replacement(obj/item/organ/replacement) +/obj/item/organ/brain/before_organ_replacement(obj/item/organ/replacement) . = ..() - var/obj/item/organ/internal/brain/replacement_brain = replacement + var/obj/item/organ/brain/replacement_brain = replacement if(!istype(replacement_brain)) return @@ -403,7 +403,7 @@ remove_trauma_from_traumas(trauma) replacement_brain.add_trauma_to_traumas(trauma) -/obj/item/organ/internal/brain/machine_wash(obj/machinery/washing_machine/brainwasher) +/obj/item/organ/brain/machine_wash(obj/machinery/washing_machine/brainwasher) . = ..() if (can_smoothen_out && !smooth_brain) smooth_brain = TRUE @@ -415,19 +415,19 @@ else set_organ_damage(BRAIN_DAMAGE_DEATH) -/obj/item/organ/internal/brain/zombie +/obj/item/organ/brain/zombie name = "zombie brain" desc = "This glob of green mass can't have much intelligence inside it." icon_state = "brain-x" organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE) -/obj/item/organ/internal/brain/alien +/obj/item/organ/brain/alien name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" organ_traits = list(TRAIT_CAN_STRIP) -/obj/item/organ/internal/brain/primitive //No like books and stompy metal men +/obj/item/organ/brain/primitive //No like books and stompy metal men name = "primitive brain" desc = "This juicy piece of meat has a clearly underdeveloped frontal lobe." organ_traits = list( @@ -440,7 +440,7 @@ TRAIT_BEAST_EMPATHY, // know the way of beast, calm with food ) -/obj/item/organ/internal/brain/golem +/obj/item/organ/brain/golem name = "crystalline matrix" desc = "This collection of sparkling gems somehow allows a golem to think." icon_state = "adamantine_resonator" @@ -449,32 +449,32 @@ organ_flags = ORGAN_MINERAL organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP, TRAIT_ROCK_METAMORPHIC) -/obj/item/organ/internal/brain/lustrous +/obj/item/organ/brain/lustrous name = "lustrous brain" desc = "This is your brain on bluespace dust. Not even once." icon_state = "random_fly_4" can_smoothen_out = FALSE organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP) -/obj/item/organ/internal/brain/lustrous/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/brain/lustrous/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() organ_owner.cure_trauma_type(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE) organ_owner.RemoveElement(/datum/element/tenacious) -/obj/item/organ/internal/brain/lustrous/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/brain/lustrous/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE) organ_owner.AddElement(/datum/element/tenacious) -/obj/item/organ/internal/brain/felinid //A bit smaller than average +/obj/item/organ/brain/felinid //A bit smaller than average brain_size = 0.8 -/obj/item/organ/internal/brain/lizard //A bit smaller than average +/obj/item/organ/brain/lizard //A bit smaller than average name = "lizard brain" desc = "This juicy piece of meat has a oversized brain stem and cerebellum, with not much of a limbic system to speak of at all. You would expect it's owner to be pretty cold blooded." organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER) -/obj/item/organ/internal/brain/abductor +/obj/item/organ/brain/abductor name = "grey brain" desc = "A piece of juicy meat found in an ayy lmao's head." icon_state = "brain-x" @@ -483,20 +483,20 @@ ////////////////////////////////////TRAUMAS//////////////////////////////////////// -/obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) +/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) for(var/X in traumas) var/datum/brain_trauma/BT = X if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience)) return BT -/obj/item/organ/internal/brain/proc/get_traumas_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) +/obj/item/organ/brain/proc/get_traumas_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) . = list() for(var/X in traumas) var/datum/brain_trauma/BT = X if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience)) . += BT -/obj/item/organ/internal/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) +/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) @@ -532,19 +532,19 @@ return TRUE //Proc to use when directly adding a trauma to the brain, so extra args can be given -/obj/item/organ/internal/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...) +/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...) var/list/arguments = list() if(args.len > 2) arguments = args.Copy(3) . = brain_gain_trauma(trauma, resilience, arguments) -/obj/item/organ/internal/brain/vv_edit_var(var_name, var_value) +/obj/item/organ/brain/vv_edit_var(var_name, var_value) . = ..() if(var_name == NAMEOF(src, smooth_brain)) update_appearance() //Direct trauma gaining proc. Necessary to assign a trauma to its brain. Avoid using directly. -/obj/item/organ/internal/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments) +/obj/item/organ/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments) if(!can_gain_trauma(trauma, resilience)) return FALSE @@ -574,18 +574,18 @@ /// Adds the passed trauma instance to our list of traumas and links it to our brain. /// DOES NOT handle setting up the trauma, that's done by [proc/brain_gain_trauma]! -/obj/item/organ/internal/brain/proc/add_trauma_to_traumas(datum/brain_trauma/trauma) +/obj/item/organ/brain/proc/add_trauma_to_traumas(datum/brain_trauma/trauma) trauma.brain = src traumas += trauma /// Removes the passed trauma instance to our list of traumas and links it to our brain /// DOES NOT handle removing the trauma's effects, that's done by [/datum/brain_trauma/Destroy()]! -/obj/item/organ/internal/brain/proc/remove_trauma_from_traumas(datum/brain_trauma/trauma) +/obj/item/organ/brain/proc/remove_trauma_from_traumas(datum/brain_trauma/trauma) trauma.brain = null traumas -= trauma //Add a random trauma of a certain subtype -/obj/item/organ/internal/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE) +/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE) var/list/datum/brain_trauma/possible_traumas = list() for(var/T in subtypesof(brain_trauma_type)) var/datum/brain_trauma/BT = T @@ -599,12 +599,12 @@ return gain_trauma(trauma_type, resilience) //Cure a random trauma of a certain resilience level -/obj/item/organ/internal/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC) +/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC) var/list/traumas = get_traumas_type(brain_trauma_type, resilience) if(LAZYLEN(traumas)) qdel(pick(traumas)) -/obj/item/organ/internal/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC) +/obj/item/organ/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC) var/amount_cured = 0 var/list/traumas = get_traumas_type(resilience = resilience) for(var/X in traumas) @@ -612,7 +612,7 @@ amount_cured++ return amount_cured -/obj/item/organ/internal/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) +/obj/item/organ/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE) . = ..() if(!owner) return FALSE @@ -622,7 +622,7 @@ owner.clear_mood_event("brain_damage") /// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike. -/obj/item/organ/internal/brain/proc/get_attacking_limb(mob/living/carbon/human/target) +/obj/item/organ/brain/proc/get_attacking_limb(mob/living/carbon/human/target) var/obj/item/bodypart/arm/active_hand = owner.get_active_hand() if(target.body_position == LYING_DOWN && owner.usable_legs) var/obj/item/bodypart/found_bodypart = owner.get_bodypart((active_hand.held_index % 2) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG) @@ -630,8 +630,8 @@ return active_hand /// Brains REALLY like ghosting people. we need special tricks to avoid that, namely removing the old brain with no_id_transfer -/obj/item/organ/internal/brain/replace_into(mob/living/carbon/new_owner) - var/obj/item/organ/internal/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN) +/obj/item/organ/brain/replace_into(mob/living/carbon/new_owner) + var/obj/item/organ/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN) old_brain.Remove(new_owner, special = TRUE, movement_flags = NO_ID_TRANSFER) qdel(old_brain) return Insert(new_owner, special = TRUE, movement_flags = NO_ID_TRANSFER | DELETE_IF_REPLACED) diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm index 60487aa0c3599..8166e9f844600 100644 --- a/code/modules/mob/living/brain/death.dm +++ b/code/modules/mob/living/brain/death.dm @@ -15,6 +15,6 @@ if(container) qdel(container)//Gets rid of the MMI if there is one if(loc) - if(istype(loc, /obj/item/organ/internal/brain)) + if(istype(loc, /obj/item/organ/brain)) qdel(loc)//Gets rid of the brain item ..() diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 7ffe49951ec26..5b016db7fba61 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -20,10 +20,10 @@ return if(stat != DEAD) death() - var/obj/item/organ/internal/brain/BR + var/obj/item/organ/brain/BR if(container?.brain) BR = container.brain - else if(istype(loc, /obj/item/organ/internal/brain)) + else if(istype(loc, /obj/item/organ/brain)) BR = loc if(BR) BR.set_organ_damage(BRAIN_DAMAGE_DEATH) //beaten to a pulp diff --git a/code/modules/mob/living/brain/skillchip.dm b/code/modules/mob/living/brain/skillchip.dm index 2c066c7e73570..4bab004c685dc 100644 --- a/code/modules/mob/living/brain/skillchip.dm +++ b/code/modules/mob/living/brain/skillchip.dm @@ -6,7 +6,7 @@ * Arguments: * * skillchip - The skillchip you'd like to remove. */ -/obj/item/organ/internal/brain/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE) +/obj/item/organ/brain/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE) // Check this skillchip is in the brain. if(!(skillchip in skillchips)) stack_trace("Attempted to remove skillchip [skillchip] that wasn't in [src] skillchip list.") @@ -27,7 +27,7 @@ * * skillchip - The skillchip you'd like to implant. * * force - Whether or not to force the skillchip to be implanted, ignoring any checks. */ -/obj/item/organ/internal/brain/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE) +/obj/item/organ/brain/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE) // If we're not forcing the implant, so let's do some checks. if(!force) // Slot capacity check! @@ -50,7 +50,7 @@ * Arguments: * * not_removable - Special override, whether or not to force cloned chips to be non-removable, i.e. to delete on removal. */ -/obj/item/organ/internal/brain/proc/clone_skillchip_list(not_removable = FALSE) +/obj/item/organ/brain/proc/clone_skillchip_list(not_removable = FALSE) var/list/skillchip_metadata = list() // Remove and call on_removal proc if successful. for(var/chip in skillchips) @@ -76,7 +76,7 @@ * Arguments: * * silent - Whether to give the user a chat notification with the removal flavour text. */ -/obj/item/organ/internal/brain/proc/destroy_all_skillchips(silent = TRUE) +/obj/item/organ/brain/proc/destroy_all_skillchips(silent = TRUE) if(!QDELETED(owner)) for(var/chip in skillchips) var/obj/item/skillchip/skillchip = chip @@ -86,7 +86,7 @@ /** * Returns the total maximum skillchip complexity supported by this brain. */ -/obj/item/organ/internal/brain/proc/get_max_skillchip_complexity() +/obj/item/organ/brain/proc/get_max_skillchip_complexity() if(!QDELETED(owner)) return max_skillchip_complexity + owner.skillchip_complexity_modifier @@ -95,7 +95,7 @@ /** * Returns the total current skillchip complexity used in this brain. */ -/obj/item/organ/internal/brain/proc/get_used_skillchip_complexity() +/obj/item/organ/brain/proc/get_used_skillchip_complexity() var/complexity_tally = 0 for(var/chip in skillchips) @@ -111,13 +111,13 @@ /** * Returns the total maximum skillchip slot capacity supported by this brain. */ -/obj/item/organ/internal/brain/proc/get_max_skillchip_slots() +/obj/item/organ/brain/proc/get_max_skillchip_slots() return max_skillchip_slots /** * Returns the total current skillchip slot capacity used in this brain. */ -/obj/item/organ/internal/brain/proc/get_used_skillchip_slots() +/obj/item/organ/brain/proc/get_used_skillchip_slots() var/slot_tally = 0 for(var/chip in skillchips) @@ -130,7 +130,7 @@ /** * Deactivates all chips currently in the brain. */ -/obj/item/organ/internal/brain/proc/activate_skillchip_failsafe(silent = TRUE) +/obj/item/organ/brain/proc/activate_skillchip_failsafe(silent = TRUE) if(QDELETED(owner)) return @@ -154,7 +154,7 @@ to_chat(owner, span_warning("Unusual brain biology detected during regeneration. Failsafe procedure engaged. [chip_tally] skillchips have been deactivated.")) /// Disables or re-enables any extra skillchips after skillchip limit changes. -/obj/item/organ/internal/brain/proc/update_skillchips() +/obj/item/organ/brain/proc/update_skillchips() var/limit = get_max_skillchip_complexity() var/dt = limit - get_used_skillchip_complexity() diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index c53491e0ce782..d2c41e61a12fb 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items) /mob/living/carbon/alien/adult/create_internal_organs() - organs += new /obj/item/organ/internal/stomach/alien() + organs += new /obj/item/organ/stomach/alien() return ..() /mob/living/carbon/alien/adult/cuff_resist(obj/item/I) @@ -127,7 +127,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( if(!can_consume(lucky_winner)) return TRUE - var/obj/item/organ/internal/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH) if(!istype(melting_pot)) visible_message(span_clown("[src] can't seem to consume [lucky_winner]!"), \ span_alien("You feel a pain in your... chest? You can't get [lucky_winner] down.")) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index 0b760c0f2e7b9..ace63074cc202 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -367,7 +367,7 @@ Doesn't work on other aliens/AI.*/ if(!iscarbon(owner)) return var/mob/living/carbon/alien/adult/alieninated_owner = owner - var/obj/item/organ/internal/stomach/alien/melting_pot = alieninated_owner.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/alien/melting_pot = alieninated_owner.get_organ_slot(ORGAN_SLOT_STOMACH) if(!melting_pot) owner.visible_message(span_clown("[src] gags, and spits up a bit of purple liquid. Ewwww."), \ span_alien("You feel a pain in your... chest? There's nothing there there's nothing there no no n-")) @@ -384,14 +384,14 @@ Doesn't work on other aliens/AI.*/ /// Gets the plasma level of this carbon's plasma vessel, or -1 if they don't have one /mob/living/carbon/proc/getPlasma() - var/obj/item/organ/internal/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel) + var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(!vessel) return -1 return vessel.stored_plasma /// Adjusts the plasma level of the carbon's plasma vessel if they have one /mob/living/carbon/proc/adjustPlasma(amount) - var/obj/item/organ/internal/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel) + var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel) if(!vessel) return FALSE vessel.stored_plasma = max(vessel.stored_plasma + amount,0) diff --git a/code/modules/mob/living/carbon/alien/adult/caste/drone.dm b/code/modules/mob/living/carbon/alien/adult/caste/drone.dm index ff208baabd229..c238f1013ab29 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/drone.dm @@ -10,9 +10,9 @@ return ..() /mob/living/carbon/alien/adult/drone/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel/large - organs += new /obj/item/organ/internal/alien/resinspinner - organs += new /obj/item/organ/internal/alien/acid + organs += new /obj/item/organ/alien/plasmavessel/large + organs += new /obj/item/organ/alien/resinspinner + organs += new /obj/item/organ/alien/acid return ..() /datum/action/cooldown/alien/evolve_to_praetorian @@ -33,7 +33,7 @@ return FALSE var/mob/living/carbon/alien/adult/royal/evolver = owner - var/obj/item/organ/internal/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/internal/alien/hivenode) + var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) // Players are Murphy's Law. We may not expect // there to ever be a living xeno with no hivenode, // but they _WILL_ make it happen. diff --git a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm index 51d9a3bce1b7a..3bfbe7961648a 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm @@ -10,7 +10,7 @@ var/pounce_speed = 2 /mob/living/carbon/alien/adult/hunter/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel/small + organs += new /obj/item/organ/alien/plasmavessel/small ..() //Hunter verbs diff --git a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm index 8fa142a38f05f..473cdfafec21d 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm @@ -19,10 +19,10 @@ return ..() /mob/living/carbon/alien/adult/royal/praetorian/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel/large - organs += new /obj/item/organ/internal/alien/resinspinner - organs += new /obj/item/organ/internal/alien/acid - organs += new /obj/item/organ/internal/alien/neurotoxin + organs += new /obj/item/organ/alien/plasmavessel/large + organs += new /obj/item/organ/alien/resinspinner + organs += new /obj/item/organ/alien/acid + organs += new /obj/item/organ/alien/neurotoxin return ..() /datum/action/cooldown/alien/evolve_to_queen @@ -43,7 +43,7 @@ return FALSE var/mob/living/carbon/alien/adult/royal/evolver = owner - var/obj/item/organ/internal/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/internal/alien/hivenode) + var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode) if(!node || node.recent_queen_death) return FALSE diff --git a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm index bef621905f442..2560522c405f9 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm @@ -11,7 +11,7 @@ return ..() /mob/living/carbon/alien/adult/sentinel/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel - organs += new /obj/item/organ/internal/alien/acid - organs += new /obj/item/organ/internal/alien/neurotoxin + organs += new /obj/item/organ/alien/plasmavessel + organs += new /obj/item/organ/alien/acid + organs += new /obj/item/organ/alien/neurotoxin ..() diff --git a/code/modules/mob/living/carbon/alien/adult/death.dm b/code/modules/mob/living/carbon/alien/adult/death.dm index ce99343ea2c9a..d71d466089cad 100644 --- a/code/modules/mob/living/carbon/alien/adult/death.dm +++ b/code/modules/mob/living/carbon/alien/adult/death.dm @@ -15,7 +15,7 @@ for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C == src) //Make sure not to proc it on ourselves. continue - var/obj/item/organ/internal/alien/hivenode/node = C.get_organ_by_type(/obj/item/organ/internal/alien/hivenode) + var/obj/item/organ/alien/hivenode/node = C.get_organ_by_type(/obj/item/organ/alien/hivenode) if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot node.queen_death() diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index a925b4c5460ea..8cbd55719774c 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -65,11 +65,11 @@ return ..() /mob/living/carbon/alien/adult/royal/queen/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel/large/queen - organs += new /obj/item/organ/internal/alien/resinspinner - organs += new /obj/item/organ/internal/alien/acid - organs += new /obj/item/organ/internal/alien/neurotoxin - organs += new /obj/item/organ/internal/alien/eggsac + organs += new /obj/item/organ/alien/plasmavessel/large/queen + organs += new /obj/item/organ/alien/resinspinner + organs += new /obj/item/organ/alien/acid + organs += new /obj/item/organ/alien/neurotoxin + organs += new /obj/item/organ/alien/eggsac return ..() //Queen verbs diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index dcf00435fba91..663001c2cc7b0 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -53,12 +53,12 @@ CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_has_trait), src, TRAIT_ADVANCEDTOOLUSER)) /mob/living/carbon/alien/create_internal_organs() - organs += new /obj/item/organ/internal/brain/alien - organs += new /obj/item/organ/internal/alien/hivenode - organs += new /obj/item/organ/internal/tongue/alien - organs += new /obj/item/organ/internal/eyes/alien - organs += new /obj/item/organ/internal/liver/alien - organs += new /obj/item/organ/internal/ears + organs += new /obj/item/organ/brain/alien + organs += new /obj/item/organ/alien/hivenode + organs += new /obj/item/organ/tongue/alien + organs += new /obj/item/organ/eyes/alien + organs += new /obj/item/organ/liver/alien + organs += new /obj/item/organ/ears ..() /mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums @@ -100,7 +100,7 @@ Des: Gives the client of the alien an image on each infected mob. for (var/i in GLOB.mob_living_list) var/mob/living/L = i if(HAS_TRAIT(L, TRAIT_XENO_HOST)) - var/obj/item/organ/internal/body_egg/alien_embryo/A = L.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo) + var/obj/item/organ/body_egg/alien_embryo/A = L.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo) if(A) var/I = image('icons/mob/nonhuman-player/alien.dmi', loc = L, icon_state = "infected[A.stage]") client.images += I @@ -145,8 +145,8 @@ Des: Removes all infected images from the alien. mind.name = new_xeno.real_name mind.transfer_to(new_xeno) - var/obj/item/organ/internal/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH) - var/obj/item/organ/internal/stomach/alien/frying_pan = new_xeno.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/alien/frying_pan = new_xeno.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(melting_pot) && istype(frying_pan)) for (var/atom/movable/poor_sod as anything in melting_pot.stomach_contents) frying_pan.consume_thing(poor_sod) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 0217a99fa04be..751676a74ae26 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -71,7 +71,7 @@ In all, this is a lot like the monkey code. /N if(!. || QDELETED(src)) return FALSE - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) gib(DROP_ALL_REMAINS) diff --git a/code/modules/mob/living/carbon/alien/alien_say.dm b/code/modules/mob/living/carbon/alien/alien_say.dm index 4cfdc265abfaf..29f55300d9114 100644 --- a/code/modules/mob/living/carbon/alien/alien_say.dm +++ b/code/modules/mob/living/carbon/alien/alien_say.dm @@ -20,6 +20,6 @@ ..(message, shown_name, TRUE) /mob/living/carbon/hivecheck() - var/obj/item/organ/internal/alien/hivenode/N = get_organ_by_type(/obj/item/organ/internal/alien/hivenode) + var/obj/item/organ/alien/hivenode/N = get_organ_by_type(/obj/item/organ/alien/hivenode) if(N && !N.recent_queen_death) //Mob has alien hive node and is not under the dead queen special effect. return TRUE diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index f4159813ed9bc..39915a0384d5d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -40,7 +40,7 @@ return ..() /mob/living/carbon/alien/larva/create_internal_organs() - organs += new /obj/item/organ/internal/alien/plasmavessel/small/tiny + organs += new /obj/item/organ/alien/plasmavessel/small/tiny ..() //This needs to be fixed diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 52f7b8dfc4789..a8de80b705827 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -14,7 +14,7 @@ if(HAS_TRAIT(src, TRAIT_GODMODE)) return if(stat != DEAD) - if(health <= -maxHealth || !get_organ_by_type(/obj/item/organ/internal/brain)) + if(health <= -maxHealth || !get_organ_by_type(/obj/item/organ/brain)) death() return if((HAS_TRAIT(src, TRAIT_KNOCKEDOUT))) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index ac9fd81cf976b..f0bf6bb2d11fa 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,8 +1,8 @@ -/obj/item/organ/internal/alien +/obj/item/organ/alien icon_state = "acid" food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) -/obj/item/organ/internal/alien/plasmavessel +/obj/item/organ/alien/plasmavessel name = "plasma vessel" icon_state = "plasma" w_class = WEIGHT_CLASS_NORMAL @@ -23,7 +23,7 @@ /// The rate this organ regenerates plasma at per second. var/plasma_rate = 5 -/obj/item/organ/internal/alien/plasmavessel/large +/obj/item/organ/alien/plasmavessel/large name = "large plasma vessel" icon_state = "plasma_large" w_class = WEIGHT_CLASS_BULKY @@ -31,10 +31,10 @@ max_plasma = 500 plasma_rate = 7.5 -/obj/item/organ/internal/alien/plasmavessel/large/queen +/obj/item/organ/alien/plasmavessel/large/queen plasma_rate = 10 -/obj/item/organ/internal/alien/plasmavessel/small +/obj/item/organ/alien/plasmavessel/small name = "small plasma vessel" icon_state = "plasma_small" w_class = WEIGHT_CLASS_SMALL @@ -42,14 +42,14 @@ max_plasma = 150 plasma_rate = 2.5 -/obj/item/organ/internal/alien/plasmavessel/small/tiny +/obj/item/organ/alien/plasmavessel/small/tiny name = "tiny plasma vessel" icon_state = "plasma_tiny" w_class = WEIGHT_CLASS_TINY max_plasma = 100 actions_types = list(/datum/action/cooldown/alien/transfer) -/obj/item/organ/internal/alien/plasmavessel/on_life(seconds_per_tick, times_fired) +/obj/item/organ/alien/plasmavessel/on_life(seconds_per_tick, times_fired) var/delta_time = DELTA_WORLD_TIME(SSmobs) //Instantly healing to max health in a single tick would be silly. If it takes 8 seconds to fire, then something's fucked. var/delta_time_capped = min(delta_time, 8) @@ -68,27 +68,27 @@ else owner.adjustPlasma(0.1 * plasma_rate * delta_time) -/obj/item/organ/internal/alien/plasmavessel/on_mob_insert(mob/living/carbon/organ_owner) +/obj/item/organ/alien/plasmavessel/on_mob_insert(mob/living/carbon/organ_owner) . = ..() if(isalien(organ_owner)) var/mob/living/carbon/alien/target_alien = organ_owner target_alien.updatePlasmaDisplay() RegisterSignal(organ_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) -/obj/item/organ/internal/alien/plasmavessel/on_mob_remove(mob/living/carbon/organ_owner) +/obj/item/organ/alien/plasmavessel/on_mob_remove(mob/living/carbon/organ_owner) . = ..() if(isalien(organ_owner)) var/mob/living/carbon/alien/organ_owner_alien = organ_owner organ_owner_alien.updatePlasmaDisplay() UnregisterSignal(organ_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS) -/obj/item/organ/internal/alien/plasmavessel/proc/get_status_tab_item(mob/living/carbon/source, list/items) +/obj/item/organ/alien/plasmavessel/proc/get_status_tab_item(mob/living/carbon/source, list/items) SIGNAL_HANDLER items += "Plasma Stored: [stored_plasma]/[max_plasma]" #define QUEEN_DEATH_DEBUFF_DURATION 2400 -/obj/item/organ/internal/alien/hivenode +/obj/item/organ/alien/hivenode name = "hive node" icon_state = "hivenode" zone = BODY_ZONE_HEAD @@ -99,17 +99,17 @@ /// Indicates if the queen died recently, aliens are heavily weakened while this is active. var/recent_queen_death = FALSE -/obj/item/organ/internal/alien/hivenode/on_mob_insert(mob/living/carbon/organ_owner) +/obj/item/organ/alien/hivenode/on_mob_insert(mob/living/carbon/organ_owner) . = ..() organ_owner.faction |= ROLE_ALIEN -/obj/item/organ/internal/alien/hivenode/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE) +/obj/item/organ/alien/hivenode/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE) if(organ_owner) organ_owner.faction -= ROLE_ALIEN return ..() //When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her. -/obj/item/organ/internal/alien/hivenode/proc/queen_death() +/obj/item/organ/alien/hivenode/proc/queen_death() if(!owner || owner.stat == DEAD) return if(isalien(owner)) //Different effects for aliens than humans @@ -132,7 +132,7 @@ addtimer(CALLBACK(src, PROC_REF(clear_queen_death)), QUEEN_DEATH_DEBUFF_DURATION) -/obj/item/organ/internal/alien/hivenode/proc/clear_queen_death() +/obj/item/organ/alien/hivenode/proc/clear_queen_death() if(QDELETED(src)) //In case the node is deleted return recent_queen_death = FALSE @@ -143,7 +143,7 @@ #undef QUEEN_DEATH_DEBUFF_DURATION -/obj/item/organ/internal/alien/resinspinner +/obj/item/organ/alien/resinspinner name = "resin spinner" icon_state = "spinner-x" zone = BODY_ZONE_PRECISE_MOUTH @@ -151,7 +151,7 @@ actions_types = list(/datum/action/cooldown/alien/make_structure/resin) -/obj/item/organ/internal/alien/acid +/obj/item/organ/alien/acid name = "acid gland" icon_state = "acid" zone = BODY_ZONE_PRECISE_MOUTH @@ -159,7 +159,7 @@ actions_types = list(/datum/action/cooldown/alien/acid/corrosion) -/obj/item/organ/internal/alien/neurotoxin +/obj/item/organ/alien/neurotoxin name = "neurotoxin gland" icon_state = "neurotox" zone = BODY_ZONE_PRECISE_MOUTH @@ -167,7 +167,7 @@ actions_types = list(/datum/action/cooldown/alien/acid/neurotoxin) -/obj/item/organ/internal/alien/eggsac +/obj/item/organ/alien/eggsac name = "egg sac" icon_state = "eggsac" zone = BODY_ZONE_PRECISE_GROIN @@ -176,18 +176,18 @@ actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg) /// The stomach that lets aliens eat people/things -/obj/item/organ/internal/stomach/alien +/obj/item/organ/stomach/alien name = "alien stomach" icon_state = "stomach-x" w_class = WEIGHT_CLASS_BULKY actions_types = list(/datum/action/cooldown/alien/regurgitate) var/list/atom/movable/stomach_contents = list() -/obj/item/organ/internal/stomach/alien/Destroy() +/obj/item/organ/stomach/alien/Destroy() QDEL_LIST(stomach_contents) return ..() -/obj/item/organ/internal/stomach/alien/on_life(seconds_per_tick, times_fired) +/obj/item/organ/stomach/alien/on_life(seconds_per_tick, times_fired) . = ..() if(!owner || SSmobs.times_fired % 3 != 0) return @@ -198,7 +198,7 @@ continue thing.acid_act(75, 10) -/obj/item/organ/internal/stomach/alien/proc/consume_thing(atom/movable/thing) +/obj/item/organ/stomach/alien/proc/consume_thing(atom/movable/thing) RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(content_moved)) RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(content_deleted)) if(isliving(thing)) @@ -206,30 +206,30 @@ stomach_contents += thing thing.forceMove(owner || src) // We assert that if we have no owner, we will not be nullspaced -/obj/item/organ/internal/stomach/alien/proc/content_died(atom/movable/source) +/obj/item/organ/stomach/alien/proc/content_died(atom/movable/source) SIGNAL_HANDLER qdel(source) -/obj/item/organ/internal/stomach/alien/proc/content_deleted(atom/movable/source) +/obj/item/organ/stomach/alien/proc/content_deleted(atom/movable/source) SIGNAL_HANDLER stomach_contents -= source -/obj/item/organ/internal/stomach/alien/proc/content_moved(atom/movable/source) +/obj/item/organ/stomach/alien/proc/content_moved(atom/movable/source) SIGNAL_HANDLER if(source.loc == src || source.loc == owner) // not in us? out da list then return stomach_contents -= source UnregisterSignal(source, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_DEATH, COMSIG_QDELETING)) -/obj/item/organ/internal/stomach/alien/mob_insert(mob/living/carbon/stomach_owner, special, movement_flags) +/obj/item/organ/stomach/alien/mob_insert(mob/living/carbon/stomach_owner, special, movement_flags) RegisterSignal(stomach_owner, COMSIG_ATOM_RELAYMOVE, PROC_REF(something_moved)) return ..() -/obj/item/organ/internal/stomach/alien/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags) +/obj/item/organ/stomach/alien/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags) UnregisterSignal(stomach_owner, COMSIG_ATOM_RELAYMOVE) return ..() -/obj/item/organ/internal/stomach/alien/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) +/obj/item/organ/stomach/alien/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() if(loc == null && owner) for(var/atom/movable/thing as anything in contents) @@ -238,12 +238,12 @@ for(var/atom/movable/thing as anything in contents) thing.forceMove(src) -/obj/item/organ/internal/stomach/alien/proc/something_moved(mob/living/source, mob/living/user, direction) +/obj/item/organ/stomach/alien/proc/something_moved(mob/living/source, mob/living/user, direction) SIGNAL_HANDLER relaymove(user, direction) return COMSIG_BLOCK_RELAYMOVE -/obj/item/organ/internal/stomach/alien/relaymove(mob/living/user, direction) +/obj/item/organ/stomach/alien/relaymove(mob/living/user, direction) if(!(user in src.stomach_contents)) return if(!prob(40)) @@ -327,7 +327,7 @@ owner.gib(DROP_ALL_REMAINS) qdel(src) -/obj/item/organ/internal/stomach/alien/proc/eject_stomach(list/turf/targets, spit_range, content_speed, particle_delay, particle_count=4) +/obj/item/organ/stomach/alien/proc/eject_stomach(list/turf/targets, spit_range, content_speed, particle_delay, particle_count=4) var/atom/spit_as = owner || src // Throw out the stuff in our stomach for(var/atom/movable/thing as anything in stomach_contents) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index f4b0fffb7a085..b6b2d2f9953b6 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -1,6 +1,6 @@ // This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability // It functions almost identically (see code/datums/diseases/alien_embryo.dm) -/obj/item/organ/internal/body_egg/alien_embryo +/obj/item/organ/body_egg/alien_embryo name = "alien embryo" icon = 'icons/mob/nonhuman-player/alien.dmi' icon_state = "larva0_dead" @@ -12,11 +12,11 @@ /// How long does it take to advance one stage? Growth time * 5 = how long till we make a Larva! var/growth_time = 60 SECONDS -/obj/item/organ/internal/body_egg/alien_embryo/Initialize(mapload) +/obj/item/organ/body_egg/alien_embryo/Initialize(mapload) . = ..() advance_embryo_stage() -/obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder) +/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder) ..() if(stage < 5) to_chat(finder, span_notice("It's small and weak, barely the size of a foetus.")) @@ -25,7 +25,7 @@ if(prob(10)) attempt_grow(gib_on_success = FALSE) -/obj/item/organ/internal/body_egg/alien_embryo/on_life(seconds_per_tick, times_fired) +/obj/item/organ/body_egg/alien_embryo/on_life(seconds_per_tick, times_fired) . = ..() if(QDELETED(src) || QDELETED(owner)) return @@ -58,7 +58,7 @@ owner.adjustToxLoss(5 * seconds_per_tick) // Why is this [TOX]? /// Controls Xenomorph Embryo growth. If embryo is fully grown (or overgrown), stop the proc. If not, increase the stage by one and if it's not fully grown (stage 6), add a timer to do this proc again after however long the growth time variable is. -/obj/item/organ/internal/body_egg/alien_embryo/proc/advance_embryo_stage() +/obj/item/organ/body_egg/alien_embryo/proc/advance_embryo_stage() if(stage >= 6) return stage++ @@ -73,7 +73,7 @@ addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown) -/obj/item/organ/internal/body_egg/alien_embryo/egg_process() +/obj/item/organ/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) for(var/datum/surgery/operations as anything in owner.surgeries) if(operations.location != BODY_ZONE_CHEST) @@ -85,7 +85,7 @@ attempt_grow() /// Attempt to burst an alien outside of the host, getting a ghost to play as the xeno. -/obj/item/organ/internal/body_egg/alien_embryo/proc/attempt_grow(gib_on_success = TRUE) +/obj/item/organ/body_egg/alien_embryo/proc/attempt_grow(gib_on_success = TRUE) if(QDELETED(owner) || bursting) return @@ -104,7 +104,7 @@ on_poll_concluded(gib_on_success, chosen_one) /// Poll has concluded with a suitor -/obj/item/organ/internal/body_egg/alien_embryo/proc/on_poll_concluded(gib_on_success, mob/dead/observer/ghost) +/obj/item/organ/body_egg/alien_embryo/proc/on_poll_concluded(gib_on_success, mob/dead/observer/ghost) if(QDELETED(owner)) return @@ -150,7 +150,7 @@ Proc: AddInfectionImages(C) Des: Adds the infection image to all aliens for this embryo ----------------------------------------*/ -/obj/item/organ/internal/body_egg/alien_embryo/AddInfectionImages() +/obj/item/organ/body_egg/alien_embryo/AddInfectionImages() for(var/mob/living/carbon/alien/alien in GLOB.player_list) var/I = image('icons/mob/nonhuman-player/alien.dmi', loc = owner, icon_state = "infected[stage]") alien.client?.images += I @@ -159,7 +159,7 @@ Des: Adds the infection image to all aliens for this embryo Proc: RemoveInfectionImage(C) Des: Removes all images from the mob infected by this embryo ----------------------------------------*/ -/obj/item/organ/internal/body_egg/alien_embryo/RemoveInfectionImages() +/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages() for(var/mob/living/carbon/alien/alien in GLOB.player_list) for(var/image/I in alien.client?.images) var/searchfor = "infected" diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 3fcfc8977231d..532fa10727ecd 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -213,8 +213,8 @@ worn_icon_state = "[base_icon_state]_impregnated" var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST) - if((!LC || IS_ORGANIC_LIMB(LC)) && !target.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) - new /obj/item/organ/internal/body_egg/alien_embryo(target) + if((!LC || IS_ORGANIC_LIMB(LC)) && !target.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) + new /obj/item/organ/body_egg/alien_embryo(target) target.log_message("was impregnated by a facehugger", LOG_GAME) target.log_message("was impregnated by a facehugger", LOG_VICTIM, log_globally = FALSE) if(target.stat != DEAD && istype(target.buckled, /obj/structure/bed/nest)) //Handles toggling the nest sustenance status effect if the user was already buckled to a nest. @@ -257,7 +257,7 @@ AddComponent(/datum/component/knockoff, knockoff_chance = 40, target_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST), slots_knockoffable = slot_flags) /obj/item/clothing/mask/facehugger/allow_attack_hand_drop(mob/living/carbon/human/user) - if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) + if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) return ..() if(istype(user) && ishuman(loc) && stat != DEAD) if(user == loc && user.get_item_by_slot(slot_flags) == src) @@ -269,7 +269,7 @@ var/mob/living/carbon/human/wearer = loc if(!istype(wearer) || user != wearer) return - if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) + if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) return ..() if(wearer.get_item_by_slot(slot_flags) == src && stat != DEAD) to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) @@ -281,7 +281,7 @@ return FALSE if(M.stat == DEAD) return FALSE - if(M.get_organ_by_type(/obj/item/organ/internal/alien/hivenode)) + if(M.get_organ_by_type(/obj/item/organ/alien/hivenode)) return FALSE var/mob/living/carbon/C = M if(ishuman(C) && !(C.dna.species.no_equip_flags & ITEM_SLOT_MASK)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 80f36d8739e5b..af5dded4a1028 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -202,7 +202,7 @@ log_message("has thrown [thrown_thing] [power_throw_text]", LOG_ATTACK) var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) extra_throw_range += potential_spine.added_throw_range @@ -596,7 +596,7 @@ lighting_cutoff = initial(lighting_cutoff) lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if(eyes) set_invis_see(eyes.see_invisible) new_sight |= eyes.sight_flags @@ -652,7 +652,7 @@ for(var/obj/item/clothing/worn_item in get_equipped_items()) tint += worn_item.tint - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if(eyes) tint += eyes.tint @@ -953,7 +953,7 @@ return ..() /mob/living/carbon/can_be_revived() - if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) + if(!get_organ_by_type(/obj/item/organ/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE return ..() @@ -972,7 +972,7 @@ // Only check for a heart if they actually need a heart. Who would've thunk if (needs_heart()) - var/obj/item/organ/internal/heart = get_organ_by_type(/obj/item/organ/internal/heart) + var/obj/item/organ/heart = get_organ_by_type(/obj/item/organ/heart) if (!heart) return DEFIB_FAIL_NO_HEART @@ -980,7 +980,7 @@ if (heart.organ_flags & ORGAN_FAILING) return DEFIB_FAIL_FAILING_HEART - var/obj/item/organ/internal/brain/current_brain = get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/current_brain = get_organ_by_type(/obj/item/organ/brain) if (QDELETED(current_brain)) return DEFIB_FAIL_NO_BRAIN @@ -1091,7 +1091,7 @@ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bodypart, update = TRUE, multiplicative_slowdown = final_modification) /mob/living/carbon/proc/create_internal_organs() - for(var/obj/item/organ/internal/internal_organ in organs) + for(var/obj/item/organ/internal_organ in organs) internal_organ.Insert(src) /proc/cmp_organ_slot_asc(slot_a, slot_b) @@ -1344,7 +1344,7 @@ /mob/living/carbon/proc/adjust_skillchip_complexity_modifier(delta) skillchip_complexity_modifier += delta - var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) if(!brain) return @@ -1459,7 +1459,7 @@ /// Accepts an optional timeout after which we remove the tail wagging /// Returns true if successful, false otherwise /mob/living/carbon/proc/wag_tail(timeout = INFINITY) - var/obj/item/organ/external/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(!wagged) return FALSE return wagged.start_wag(src, timeout) @@ -1467,7 +1467,7 @@ /// Helper to cleanly stop all tail wagging /// Returns true if successful, false otherwise /mob/living/carbon/proc/unwag_tail() // can't unwag a tail - var/obj/item/organ/external/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(!unwagged) return FALSE return unwagged.stop_wag(src) diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm index 59d3a6db71a47..b376ea3e113fe 100644 --- a/code/modules/mob/living/carbon/carbon_context.dm +++ b/code/modules/mob/living/carbon/carbon_context.dm @@ -25,7 +25,7 @@ if (body_position == STANDING_UP) if(check_zone(user.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) context[SCREENTIP_CONTEXT_LMB] = "Headpat" - else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(get_organ_by_type(/obj/item/organ/external/tail))) + else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(get_organ_by_type(/obj/item/organ/tail))) context[SCREENTIP_CONTEXT_LMB] = "Pull tail" else context[SCREENTIP_CONTEXT_LMB] = "Hug" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index f8552fdfa243f..fd76fa07ddd59 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -4,7 +4,7 @@ . = ..() if(is_blind() && !is_blind_from(list(UNCONSCIOUS_TRAIT, HYPNOCHAIR_TRAIT))) return INFINITY //For all my homies that can not see in the world - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if(eyes) . += eyes.flash_protect else @@ -20,7 +20,7 @@ . = ..() if(HAS_TRAIT(src, TRAIT_DEAF)) return INFINITY //For all my homies that can not hear in the world - var/obj/item/organ/internal/ears/E = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/E = get_organ_slot(ORGAN_SLOT_EARS) if(!E) return INFINITY else @@ -45,7 +45,7 @@ return null /mob/living/carbon/is_pepper_proof(check_flags = ALL) - var/obj/item/organ/internal/eyes/eyes = get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes = get_organ_by_type(/obj/item/organ/eyes) if(eyes && eyes.pepperspray_protect) return eyes if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & PEPPERPROOF)) @@ -312,7 +312,7 @@ if(HAS_TRAIT(src, TRAIT_BADTOUCH)) to_chat(helper, span_warning("[src] looks visibly upset as you pat [p_them()] on the head.")) - else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.get_organ_by_type(/obj/item/organ/external/tail))) + else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.get_organ_by_type(/obj/item/organ/tail))) helper.visible_message(span_notice("[helper] pulls on [src]'s tail!"), \ null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src)) to_chat(helper, span_notice("You pull on [src]'s tail!")) @@ -427,7 +427,7 @@ /mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) //can't flash what can't see! return @@ -478,7 +478,7 @@ SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) intensity = reflist[1] var/ear_safety = get_ear_protection() - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) @@ -520,7 +520,7 @@ /mob/living/carbon/can_hear() . = FALSE - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) if(ears && !HAS_TRAIT(src, TRAIT_DEAF)) . = TRUE if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)) @@ -695,7 +695,7 @@ body_parts -= part GLOB.bioscrambler_valid_parts = body_parts - var/list/organs = subtypesof(/obj/item/organ/internal) + subtypesof(/obj/item/organ/external) + var/list/organs = subtypesof(/obj/item/organ) + subtypesof(/obj/item/organ) for(var/obj/item/organ/organ_type as anything in organs) if(!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_ROBOTIC)) continue diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm index 3e4c29fa0e837..e1dc3d279921f 100644 --- a/code/modules/mob/living/carbon/carbon_say.dm +++ b/code/modules/mob/living/carbon/carbon_say.dm @@ -7,7 +7,7 @@ return ..() /mob/living/carbon/could_speak_language(datum/language/language_path) - var/obj/item/organ/internal/tongue/spoken_with = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/spoken_with = get_organ_slot(ORGAN_SLOT_TONGUE) if(spoken_with) // the tower of babel needs to bypass the tongue language restrictions without giving omnitongue return HAS_MIND_TRAIT(src, TRAIT_TOWER_OF_BABEL) || spoken_with.could_speak_language(language_path) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index abf7cdaabdd99..bb34100877375 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -34,7 +34,7 @@ var/atom/Tsec = drop_location() for(var/obj/item/organ/organ as anything in organs) - if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/internal/brain)) + if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/brain)) if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST)) // chests can't drop continue // the head will drop, so the brain should stay inside @@ -43,7 +43,7 @@ organ.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1,3), 5) continue - if((drop_bitflags & DROP_ORGANS) && !istype(organ, /obj/item/organ/internal/brain)) + if((drop_bitflags & DROP_ORGANS) && !istype(organ, /obj/item/organ/brain)) if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST)) continue // only chest & groin organs will be ejected @@ -65,7 +65,7 @@ /mob/living/carbon/set_suicide(suicide_state) //you thought that box trick was pretty clever, didn't you? well now hardmode is on, boyo. . = ..() - var/obj/item/organ/internal/brain/userbrain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/userbrain = get_organ_slot(ORGAN_SLOT_BRAIN) if(userbrain) userbrain.suicided = suicide_state diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index ef57e0aaa90e2..fcf1fae0a5326 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -51,7 +51,7 @@ if (length(status_examines)) . += status_examines - if(get_bodypart(BODY_ZONE_HEAD) && !get_organ_by_type(/obj/item/organ/internal/brain)) + if(get_bodypart(BODY_ZONE_HEAD) && !get_organ_by_type(/obj/item/organ/brain)) . += span_deadsay("It appears that [t_his] brain is missing...") var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) @@ -239,7 +239,7 @@ if(CONSCIOUS) if(HAS_TRAIT(src, TRAIT_DUMB)) . += "[t_He] [t_has] a stupid expression on [t_his] face." - var/obj/item/organ/internal/brain/brain = get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/brain = get_organ_by_type(/obj/item/organ/brain) if(brain && isnull(ai_controller)) var/npc_message = "" if(HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE)) @@ -320,7 +320,7 @@ var/t_his = p_their() var/t_is = p_are() //This checks to see if the body is revivable - var/obj/item/organ/brain = get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain = get_organ_by_type(/obj/item/organ/brain) if(brain && HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE)) return span_deadsay("[t_He] [t_is] limp and unresponsive; but [t_his] soul might yet come back...") var/client_like = client || HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) @@ -519,7 +519,7 @@ . = list() var/list/cybers = list() - for(var/obj/item/organ/internal/cyberimp/cyberimp in organs) + for(var/obj/item/organ/cyberimp/cyberimp in organs) if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) cybers += cyberimp.examine_title(user) if(length(cybers)) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index ccde80bb2b38a..8aeda13ee3cf3 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -73,23 +73,23 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Internal organs that are unique to this race, like a tail or other cosmetic organs. list(typepath of organ 1, typepath of organ 2 = "Round"). var/list/mutant_organs = list() ///Replaces default brain with a different organ - var/obj/item/organ/internal/brain/mutantbrain = /obj/item/organ/internal/brain + var/obj/item/organ/brain/mutantbrain = /obj/item/organ/brain ///Replaces default heart with a different organ - var/obj/item/organ/internal/heart/mutantheart = /obj/item/organ/internal/heart + var/obj/item/organ/heart/mutantheart = /obj/item/organ/heart ///Replaces default lungs with a different organ - var/obj/item/organ/internal/lungs/mutantlungs = /obj/item/organ/internal/lungs + var/obj/item/organ/lungs/mutantlungs = /obj/item/organ/lungs ///Replaces default eyes with a different organ - var/obj/item/organ/internal/eyes/mutanteyes = /obj/item/organ/internal/eyes + var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes ///Replaces default ears with a different organ - var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears + var/obj/item/organ/ears/mutantears = /obj/item/organ/ears ///Replaces default tongue with a different organ - var/obj/item/organ/internal/tongue/mutanttongue = /obj/item/organ/internal/tongue + var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue ///Replaces default liver with a different organ - var/obj/item/organ/internal/liver/mutantliver = /obj/item/organ/internal/liver + var/obj/item/organ/liver/mutantliver = /obj/item/organ/liver ///Replaces default stomach with a different organ - var/obj/item/organ/internal/stomach/mutantstomach = /obj/item/organ/internal/stomach + var/obj/item/organ/stomach/mutantstomach = /obj/item/organ/stomach ///Replaces default appendix with a different organ. - var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix + var/obj/item/organ/appendix/mutantappendix = /obj/item/organ/appendix /// Store body marking defines. See mobs.dm for bitflags var/list/body_markings = list() @@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(remove_existing) health_pct = (existing_organ.maxHealth - existing_organ.damage) / existing_organ.maxHealth if(slot == ORGAN_SLOT_BRAIN) - var/obj/item/organ/internal/brain/existing_brain = existing_organ + var/obj/item/organ/brain/existing_brain = existing_organ existing_brain.before_organ_replacement(new_organ) existing_brain.Remove(organ_holder, special = TRUE, movement_flags = NO_ID_TRANSFER) else @@ -489,7 +489,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) if(noggin?.head_flags & HEAD_EYESPRITES) // eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now) - var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) if(eye_organ) eye_organ.refresh(call_update = FALSE) standing += eye_organ.generate_body_overlay(species_human) @@ -655,7 +655,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(ITEM_SLOT_EYES) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE - var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) if(eyes?.no_glasses) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) @@ -842,7 +842,7 @@ GLOBAL_LIST_EMPTY(features_by_species) to_chat(user, span_warning("You don't want to harm [target]!")) return FALSE - var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) var/obj/item/bodypart/attacking_bodypart if(brain) attacking_bodypart = brain.get_attacking_limb(target) @@ -1367,7 +1367,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/spec_stun(mob/living/carbon/human/H,amount) if((H.movement_type & FLYING) && !H.buckled) - var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) if(wings) wings.toggle_flight(H) wings.fly_slip(H) @@ -1536,7 +1536,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return null var/static/list/food_flags = FOOD_FLAGS - var/obj/item/organ/internal/tongue/fake_tongue = mutanttongue + var/obj/item/organ/tongue/fake_tongue = mutanttongue return list( "liked_food" = bitfield_to_list(initial(fake_tongue.liked_foodtypes), food_flags), @@ -1859,7 +1859,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/list/to_add = list() var/alcohol_tolerance = initial(mutantliver.alcohol_tolerance) - var/obj/item/organ/internal/liver/base_liver = /obj/item/organ/internal/liver + var/obj/item/organ/liver/base_liver = /obj/item/organ/liver var/tolerance_difference = alcohol_tolerance - initial(base_liver.alcohol_tolerance) if (tolerance_difference != 0) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index dd97c12bd844f..9f7f156c98f00 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) if(stat == DEAD) return stop_sound_channel(CHANNEL_HEARTBEAT) - var/obj/item/organ/internal/heart/human_heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/human_heart = get_organ_slot(ORGAN_SLOT_HEART) human_heart?.beat = BEAT_NONE human_heart?.Stop() @@ -49,7 +49,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) readout += "
[round(reagent.volume, 0.001)] units of [reagent.name]" readout += "
Stomach:" - var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) for(var/datum/reagent/bile in belly?.reagents?.reagent_list) if(!belly.food_reagents[bile.type]) readout += "
[round(bile.volume, 0.001)] units of [bile.name]" diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 3d03d4ffc6689..cae75ae990c55 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -119,7 +119,7 @@ /datum/emote/living/carbon/human/wag/run_emote(mob/user, params, type_override, intentional) . = ..() - var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) //I am so sorry my son //We bypass helpers here cause we already have the tail if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote() @@ -129,14 +129,14 @@ /datum/emote/living/carbon/human/wag/select_message_type(mob/user, intentional) . = ..() - var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(oranges_accessory.wag_flags & WAG_WAGGING) . = "stops wagging " + message else . = "wags " + message /datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check, intentional, params) - var/obj/item/organ/external/tail/tail = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/tail = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(tail?.wag_flags & WAG_ABLE) return ..() return FALSE @@ -148,7 +148,7 @@ /datum/emote/living/carbon/human/wing/run_emote(mob/user, params, type_override, intentional) . = ..() - var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) if(isnull(wings)) CRASH("[type] ran on a mob that has no wings!") if(wings.wings_open) @@ -157,12 +157,12 @@ wings.open_wings() /datum/emote/living/carbon/human/wing/select_message_type(mob/user, intentional) - var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) var/emote_verb = wings.wings_open ? "closes" : "opens" return "[emote_verb] [message]" /datum/emote/living/carbon/human/wing/can_run_emote(mob/user, status_check = TRUE, intentional, params) - if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/external/wings/functional)) + if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/wings/functional)) return FALSE return ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 462b9b8e33124..ba3ecbf83cfe1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -527,7 +527,7 @@ to_chat(src, span_warning("you can't breathe!")) return FALSE - var/obj/item/organ/internal/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(human_lungs)) balloon_alert(src, "you don't have lungs!") return FALSE @@ -882,7 +882,7 @@ if(result != "Yes") return - var/obj/item/organ/internal/brain/target_brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = get_organ_slot(ORGAN_SLOT_BRAIN) if(isnull(target_brain)) to_chat(usr, "This mob has no brain to insert into an MMI.") @@ -943,7 +943,7 @@ // can remove up to 2 seconds at legendary carrydelay -= fitness_level * (1/3) SECONDS - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) carrydelay *= potential_spine.athletics_boost_multiplier diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 68e6640bdeb10..caec7392a4601 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -285,7 +285,7 @@ //200 max knockdown for EXPLODE_HEAVY //160 max knockdown for EXPLODE_LIGHT - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD @@ -394,7 +394,7 @@ //Note we both check that the user is in cardiac arrest and can actually heartattack //If they can't, they're missing their heart and this would runtime if(undergoing_cardiac_arrest() && can_heartattack() && (shock_damage * siemens_coeff >= 1) && prob(25)) - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(heart.Restart() && stat == CONSCIOUS) to_chat(src, span_notice("You feel your heart beating again!")) if (!(flags & SHOCK_NO_HUMAN_ANIM)) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 07325c97137d1..a9875773fe84b 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -137,7 +137,7 @@ . += "[dna.species.type]" /mob/living/carbon/human/proc/get_eye_scars() - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if (!isnull(eyes)) return eyes.scarring diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 8edeeb8088403..2908ae52364a3 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -22,7 +22,7 @@ return ..() /mob/living/carbon/human/get_default_say_verb() - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) if(isnull(tongue)) if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) return "signs" diff --git a/code/modules/mob/living/carbon/human/human_suicide.dm b/code/modules/mob/living/carbon/human/human_suicide.dm index 318cba1587d4a..e6b4bbac8e073 100644 --- a/code/modules/mob/living/carbon/human/human_suicide.dm +++ b/code/modules/mob/living/carbon/human/human_suicide.dm @@ -22,7 +22,7 @@ if(combat_mode) send_applicable_messages(HUMAN_COMBAT_MODE_SUICIDE_MESSAGE) else - var/obj/item/organ/internal/brain/userbrain = get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/userbrain = get_organ_by_type(/obj/item/organ/brain) if(userbrain?.damage >= 75) send_applicable_messages(HUMAN_BRAIN_DAMAGE_SUICIDE_MESSAGE) else diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 048f7bcfe2cb7..6befcb5c9fe69 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -79,7 +79,7 @@ return ..() /mob/living/carbon/human/check_breath(datum/gas_mixture/breath) - var/obj/item/organ/internal/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(human_lungs) return human_lungs.check_breath(breath, src) diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 04df6a7058884..db332b0efde8c 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -12,11 +12,11 @@ TRAIT_NO_UNDERWEAR, TRAIT_VIRUSIMMUNE, ) - mutanttongue = /obj/item/organ/internal/tongue/abductor + mutanttongue = /obj/item/organ/tongue/abductor mutantstomach = null mutantheart = null mutantlungs = null - mutantbrain = /obj/item/organ/internal/brain/abductor + mutantbrain = /obj/item/organ/brain/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT bodypart_overrides = list( diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 86f745bb8be61..2974155515d13 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -26,15 +26,15 @@ inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null - mutantbrain = /obj/item/organ/internal/brain/cybernetic - mutanttongue = /obj/item/organ/internal/tongue/robot + mutantbrain = /obj/item/organ/brain/cybernetic + mutanttongue = /obj/item/organ/tongue/robot mutantstomach = null mutantappendix = null mutantheart = null mutantliver = null mutantlungs = null - mutanteyes = /obj/item/organ/internal/eyes/robotic - mutantears = /obj/item/organ/internal/ears/cybernetic + mutanteyes = /obj/item/organ/eyes/robotic + mutantears = /obj/item/organ/ears/cybernetic species_language_holder = /datum/language_holder/synthetic changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index d4dea2abfcc6a..1dcc922b13f48 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -19,10 +19,10 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutantbrain = /obj/item/organ/internal/brain/dullahan - mutanteyes = /obj/item/organ/internal/eyes/dullahan - mutanttongue = /obj/item/organ/internal/tongue/dullahan - mutantears = /obj/item/organ/internal/ears/dullahan + mutantbrain = /obj/item/organ/brain/dullahan + mutanteyes = /obj/item/organ/eyes/dullahan + mutanttongue = /obj/item/organ/tongue/dullahan + mutantears = /obj/item/organ/ears/dullahan mutantstomach = null mutantlungs = null skinned_type = /obj/item/stack/sheet/animalhide/human @@ -51,7 +51,7 @@ human.put_in_hands(head) // We want to give the head some boring old eyes just so it doesn't look too jank on the head sprite. - var/obj/item/organ/internal/eyes/eyes = new /obj/item/organ/internal/eyes(head) + var/obj/item/organ/eyes/eyes = new /obj/item/organ/eyes(head) eyes.eye_color_left = human.eye_color_left eyes.eye_color_right = human.eye_color_right eyes.bodypart_insert(my_head) @@ -95,7 +95,7 @@ human.reset_perspective(human) /datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/human) - var/obj/item/organ/internal/eyes/eyes = human.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = human.get_organ_slot(ORGAN_SLOT_EYES) if(eyes) human.update_tint() if(eyes.tint) @@ -106,7 +106,7 @@ prevent_perspective_change = TRUE /datum/species/dullahan/on_owner_login(mob/living/carbon/human/owner) - var/obj/item/organ/internal/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES) if(owner_first_client_connection_handled) if(!eyes.tint) owner.reset_perspective(my_head, TRUE) @@ -164,15 +164,15 @@ return to_add -/obj/item/organ/internal/brain/dullahan +/obj/item/organ/brain/dullahan decoy_override = TRUE organ_flags = ORGAN_ORGANIC //not vital -/obj/item/organ/internal/tongue/dullahan +/obj/item/organ/tongue/dullahan zone = "abstract" modifies_speech = TRUE -/obj/item/organ/internal/tongue/dullahan/handle_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) if(ishuman(owner)) var/mob/living/carbon/human/human = owner if(isdullahan(human)) @@ -182,10 +182,10 @@ head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], message_range = speech_args[SPEECH_RANGE]) speech_args[SPEECH_MESSAGE] = "" -/obj/item/organ/internal/ears/dullahan +/obj/item/organ/ears/dullahan zone = "abstract" -/obj/item/organ/internal/eyes/dullahan +/obj/item/organ/eyes/dullahan name = "head vision" desc = "An abstraction." actions_types = list(/datum/action/item_action/organ_action/dullahan) @@ -198,7 +198,7 @@ /datum/action/item_action/organ_action/dullahan/Trigger(trigger_flags) . = ..() - var/obj/item/organ/internal/eyes/dullahan/dullahan_eyes = target + var/obj/item/organ/eyes/dullahan/dullahan_eyes = target dullahan_eyes.tint = dullahan_eyes.tint ? NONE : INFINITY if(ishuman(owner)) @@ -247,7 +247,7 @@ return // It's so over detached_head.real_name = wearer.real_name detached_head.name = wearer.real_name - var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in detached_head + var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in detached_head brain.name = "[wearer.name]'s brain" /obj/item/dullahan_relay/proc/examinate_check(mob/user, atom/source) diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 4fa4db943368c..1f1d7d3af478d 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -2,10 +2,10 @@ name = "\improper Ethereal" id = SPECIES_ETHEREAL meat = /obj/item/food/meat/slab/human/mutant/ethereal - mutantlungs = /obj/item/organ/internal/lungs/ethereal - mutantstomach = /obj/item/organ/internal/stomach/ethereal - mutanttongue = /obj/item/organ/internal/tongue/ethereal - mutantheart = /obj/item/organ/internal/heart/ethereal + mutantlungs = /obj/item/organ/lungs/ethereal + mutantstomach = /obj/item/organ/stomach/ethereal + mutanttongue = /obj/item/organ/tongue/ethereal + mutantheart = /obj/item/organ/heart/ethereal exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer exotic_bloodtype = "LE" siemens_coeff = 0.5 //They thrive on energy @@ -60,7 +60,7 @@ ethereal_light = new_ethereal.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species) refresh_light_color(new_ethereal) - var/obj/item/organ/internal/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART) ethereal_heart.ethereal_color = default_color for(var/obj/item/bodypart/limb as anything in new_ethereal.bodyparts) @@ -241,7 +241,7 @@ name = "Lustrous" id = SPECIES_ETHEREAL_LUSTROUS examine_limb_id = SPECIES_ETHEREAL - mutantbrain = /obj/item/organ/internal/brain/lustrous + mutantbrain = /obj/item/organ/brain/lustrous changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN inherent_traits = list( TRAIT_MUTANT_COLORS, diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 0704a1a9259f7..0f151f5f8f5fd 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -3,11 +3,11 @@ name = "Felinid" id = SPECIES_FELINE examine_limb_id = SPECIES_HUMAN - mutantbrain = /obj/item/organ/internal/brain/felinid - mutanttongue = /obj/item/organ/internal/tongue/cat - mutantears = /obj/item/organ/internal/ears/cat + mutantbrain = /obj/item/organ/brain/felinid + mutanttongue = /obj/item/organ/tongue/cat + mutantears = /obj/item/organ/ears/cat mutant_organs = list( - /obj/item/organ/external/tail/cat = "Cat", + /obj/item/organ/tail/cat = "Cat", ) inherent_traits = list( TRAIT_CATLIKE_GRACE, @@ -41,9 +41,9 @@ if(target_human.dna.features["ears"] == "None") target_human.dna.features["ears"] = "Cat" if(target_human.dna.features["ears"] == "None") - mutantears = /obj/item/organ/internal/ears + mutantears = /obj/item/organ/ears else - var/obj/item/organ/internal/ears/cat/ears = new(FALSE, target_human.dna.features["ears"]) + var/obj/item/organ/ears/cat/ears = new(FALSE, target_human.dna.features["ears"]) ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) return ..() @@ -128,7 +128,7 @@ /proc/purrbation_toggle(mob/living/carbon/human/target_human, silent = FALSE) if(!ishuman(target_human)) return - if(!istype(target_human.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/internal/ears/cat)) + if(!istype(target_human.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat)) purrbation_apply(target_human, silent = silent) . = TRUE else @@ -144,7 +144,7 @@ cat_species.original_felinid = FALSE else // This removes the spines if they exist - var/obj/item/organ/external/spines/current_spines = soon_to_be_felinid.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) + var/obj/item/organ/spines/current_spines = soon_to_be_felinid.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) if(current_spines) current_spines.Remove(soon_to_be_felinid, special = TRUE) qdel(current_spines) @@ -153,10 +153,10 @@ // Humans get converted directly to felinids, and the key is handled in on_species_gain. // Now when we get mob.dna.features[feature_key], it returns None, which is why the tail is invisible. // stored_feature_id is only set once (the first time an organ is inserted), so this should be safe. - var/obj/item/organ/internal/ears/cat/kitty_ears = new + var/obj/item/organ/ears/cat/kitty_ears = new kitty_ears.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED) - if(should_visual_organ_apply_to(/obj/item/organ/external/tail/cat, soon_to_be_felinid)) //only give them a tail if they actually have sprites for it / are a compatible subspecies. - var/obj/item/organ/external/tail/cat/kitty_tail = new + if(should_visual_organ_apply_to(/obj/item/organ/tail/cat, soon_to_be_felinid)) //only give them a tail if they actually have sprites for it / are a compatible subspecies. + var/obj/item/organ/tail/cat/kitty_tail = new kitty_tail.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED) if(!silent) @@ -173,24 +173,24 @@ var/datum/species/target_species = purrbated_human.dna.species // From the previous check we know they're not a felinid, therefore removing cat ears and tail is safe - var/obj/item/organ/external/tail/old_tail = purrbated_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(istype(old_tail, /obj/item/organ/external/tail/cat)) + var/obj/item/organ/tail/old_tail = purrbated_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(istype(old_tail, /obj/item/organ/tail/cat)) old_tail.Remove(purrbated_human, special = TRUE) qdel(old_tail) // Locate does not work on assoc lists, so we do it by hand for(var/external_organ in target_species.mutant_organs) if(!should_visual_organ_apply_to(external_organ, purrbated_human)) continue - if(ispath(external_organ, /obj/item/organ/external/tail)) - var/obj/item/organ/external/tail/new_tail = new external_organ() + if(ispath(external_organ, /obj/item/organ/tail)) + var/obj/item/organ/tail/new_tail = new external_organ() new_tail.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) // Don't forget the spines we removed earlier - else if(ispath(external_organ, /obj/item/organ/external/spines)) - var/obj/item/organ/external/spines/new_spines = new external_organ() + else if(ispath(external_organ, /obj/item/organ/spines)) + var/obj/item/organ/spines/new_spines = new external_organ() new_spines.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) - var/obj/item/organ/internal/ears/old_ears = purrbated_human.get_organ_slot(ORGAN_SLOT_EARS) - if(istype(old_ears, /obj/item/organ/internal/ears/cat)) + var/obj/item/organ/ears/old_ears = purrbated_human.get_organ_slot(ORGAN_SLOT_EARS) + if(istype(old_ears, /obj/item/organ/ears/cat)) var/obj/item/organ/new_ears = new target_species.mutantears() new_ears.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) if(!silent) @@ -200,7 +200,7 @@ human_for_preview.set_haircolor("#ffcccc", update = FALSE) // pink human_for_preview.set_hairstyle("Hime Cut", update = TRUE) - var/obj/item/organ/internal/ears/cat/cat_ears = human_for_preview.get_organ_by_type(/obj/item/organ/internal/ears/cat) + var/obj/item/organ/ears/cat/cat_ears = human_for_preview.get_organ_by_type(/obj/item/organ/ears/cat) if (cat_ears) cat_ears.color = human_for_preview.hair_color human_for_preview.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 0f2072b777353..11548c7b12952 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -4,18 +4,18 @@ id = SPECIES_FLYPERSON inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG meat = /obj/item/food/meat/slab/human/mutant/fly - mutanteyes = /obj/item/organ/internal/eyes/fly + mutanteyes = /obj/item/organ/eyes/fly changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/fly payday_modifier = 1.0 - mutanttongue = /obj/item/organ/internal/tongue/fly - mutantheart = /obj/item/organ/internal/heart/fly - mutantlungs = /obj/item/organ/internal/lungs/fly - mutantliver = /obj/item/organ/internal/liver/fly - mutantstomach = /obj/item/organ/internal/stomach/fly - mutantappendix = /obj/item/organ/internal/appendix/fly - mutant_organs = list(/obj/item/organ/internal/fly, /obj/item/organ/internal/fly/groin) + mutanttongue = /obj/item/organ/tongue/fly + mutantheart = /obj/item/organ/heart/fly + mutantlungs = /obj/item/organ/lungs/fly + mutantliver = /obj/item/organ/liver/fly + mutantstomach = /obj/item/organ/stomach/fly + mutantappendix = /obj/item/organ/appendix/fly + mutant_organs = list(/obj/item/organ/fly, /obj/item/organ/fly/groin) bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fly, diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 416178fd3bbdd..e610f05bb54ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -34,13 +34,13 @@ bodytemp_heat_damage_limit = BODYTEMP_HEAT_LAVALAND_SAFE bodytemp_cold_damage_limit = BODYTEMP_COLD_ICEBOX_SAFE - mutant_organs = list(/obj/item/organ/internal/adamantine_resonator) - mutanteyes = /obj/item/organ/internal/eyes/golem - mutantbrain = /obj/item/organ/internal/brain/golem - mutanttongue = /obj/item/organ/internal/tongue/golem - mutantstomach = /obj/item/organ/internal/stomach/golem - mutantliver = /obj/item/organ/internal/liver/golem - mutantappendix = /obj/item/organ/internal/appendix/golem + mutant_organs = list(/obj/item/organ/adamantine_resonator) + mutanteyes = /obj/item/organ/eyes/golem + mutantbrain = /obj/item/organ/brain/golem + mutanttongue = /obj/item/organ/tongue/golem + mutantstomach = /obj/item/organ/stomach/golem + mutantliver = /obj/item/organ/liver/golem + mutantappendix = /obj/item/organ/appendix/golem bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem, diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 3b1f8fe4037fe..d866e9c8105dd 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -17,9 +17,9 @@ TRAIT_TOXINLOVER, TRAIT_NOBLOOD, ) - mutanttongue = /obj/item/organ/internal/tongue/jelly - mutantlungs = /obj/item/organ/internal/lungs/slime - mutanteyes = /obj/item/organ/internal/eyes/jelly + mutanttongue = /obj/item/organ/tongue/jelly + mutantlungs = /obj/item/organ/lungs/slime + mutanteyes = /obj/item/organ/eyes/jelly mutantheart = null meat = /obj/item/food/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly @@ -178,7 +178,7 @@ plural_form = "Slimepeople" id = SPECIES_SLIMEPERSON changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - mutanteyes = /obj/item/organ/internal/eyes + mutanteyes = /obj/item/organ/eyes var/datum/action/innate/split_body/slime_split var/list/mob/living/carbon/bodies var/datum/action/innate/swap_body/swap_body @@ -488,7 +488,7 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly/luminescent, BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly/luminescent, ) - mutanteyes = /obj/item/organ/internal/eyes + mutanteyes = /obj/item/organ/eyes /// How strong is our glow var/glow_intensity = LUMINESCENT_DEFAULT_GLOW /// Internal dummy used to glow (very cool) 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 f9bd9abc768d6..bf22c032b0589 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -9,13 +9,13 @@ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None") mutant_organs = list( - /obj/item/organ/external/horns = "None", - /obj/item/organ/external/frills = "None", - /obj/item/organ/external/snout = "Round", - /obj/item/organ/external/spines = "None", - /obj/item/organ/external/tail/lizard = "Smooth", + /obj/item/organ/horns = "None", + /obj/item/organ/frills = "None", + /obj/item/organ/snout = "Round", + /obj/item/organ/spines = "None", + /obj/item/organ/tail/lizard = "Smooth", ) - mutanttongue = /obj/item/organ/internal/tongue/lizard + mutanttongue = /obj/item/organ/tongue/lizard coldmod = 1.5 heatmod = 0.67 payday_modifier = 1.0 @@ -165,8 +165,8 @@ Lizard subspecies: ASHWALKERS name = "Ash Walker" id = SPECIES_LIZARD_ASH examine_limb_id = SPECIES_LIZARD - mutantlungs = /obj/item/organ/internal/lungs/lavaland - mutantbrain = /obj/item/organ/internal/brain/primitive + mutantlungs = /obj/item/organ/lungs/lavaland + mutantbrain = /obj/item/organ/brain/primitive inherent_traits = list( TRAIT_MUTANT_COLORS, TRAIT_VIRUSIMMUNE, @@ -207,7 +207,7 @@ Lizard subspecies: SILVER SCALED mutantlungs = null damage_modifier = 10 //very light silvery scales soften blows species_language_holder = /datum/language_holder/lizard/silver - mutanttongue = /obj/item/organ/internal/tongue/lizard/silver + mutanttongue = /obj/item/organ/tongue/lizard/silver changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN examine_limb_id = SPECIES_LIZARD ///stored mutcolor for when we turn back off of a silverscale. 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 1ca2979d3d6fc..a1f98250e7456 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -4,10 +4,10 @@ name = "\improper Monkey" id = SPECIES_MONKEY mutant_organs = list( - /obj/item/organ/external/tail/monkey = "Monkey", + /obj/item/organ/tail/monkey = "Monkey", ) - mutanttongue = /obj/item/organ/internal/tongue/monkey - mutantbrain = /obj/item/organ/internal/brain/primate + mutanttongue = /obj/item/organ/tongue/monkey + mutantbrain = /obj/item/organ/brain/primate skinned_type = /obj/item/stack/sheet/animalhide/monkey meat = /obj/item/food/meat/slab/monkey knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1) @@ -124,7 +124,7 @@ return to_add -/obj/item/organ/internal/brain/primate //Ook Ook +/obj/item/organ/brain/primate //Ook Ook name = "Primate Brain" desc = "This wad of meat is small, but has enlaged occipital lobes for spotting bananas." organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE, TRAIT_GUN_NATURAL) // No literacy or advanced tool usage. @@ -144,7 +144,7 @@ if(!.) return - var/obj/item/organ/internal/brain/primate/monkey_brain = target + var/obj/item/organ/brain/primate/monkey_brain = target if(monkey_brain.tripping) monkey_brain.tripping = FALSE background_icon_state = "bg_default" @@ -155,21 +155,21 @@ to_chat(monkey_brain.owner, span_notice("You will now stumble while while colliding with people who are in combat mode.")) build_all_button_icons() -/obj/item/organ/internal/brain/primate/on_mob_insert(mob/living/carbon/primate) +/obj/item/organ/brain/primate/on_mob_insert(mob/living/carbon/primate) . = ..() RegisterSignal(primate, COMSIG_LIVING_MOB_BUMPED, PROC_REF(on_mob_bump)) -/obj/item/organ/internal/brain/primate/on_mob_remove(mob/living/carbon/primate) +/obj/item/organ/brain/primate/on_mob_remove(mob/living/carbon/primate) . = ..() UnregisterSignal(primate, COMSIG_LIVING_MOB_BUMPED) -/obj/item/organ/internal/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob) +/obj/item/organ/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob) SIGNAL_HANDLER if(!tripping || !crossing_mob.combat_mode) return crossing_mob.knockOver(owner) -/obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target) +/obj/item/organ/brain/primate/get_attacking_limb(mob/living/carbon/human/target) if(!HAS_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER)) return owner.get_bodypart(BODY_ZONE_HEAD) return ..() 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 17e516c06f0d2..e95990148fc9f 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -4,10 +4,10 @@ id = SPECIES_MOTH inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None") - mutant_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain") + mutant_organs = list(/obj/item/organ/wings/moth = "Plain", /obj/item/organ/antennae = "Plain") meat = /obj/item/food/meat/slab/human/mutant/moth - mutanttongue = /obj/item/organ/internal/tongue/moth - mutanteyes = /obj/item/organ/internal/eyes/moth + mutanttongue = /obj/item/organ/tongue/moth + mutanteyes = /obj/item/organ/eyes/moth changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_cookie = /obj/item/food/muffin/moffin species_language_holder = /datum/language_holder/moth diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 1e2b73616d91c..4e53fe462087a 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -6,7 +6,7 @@ fixed_mut_color = "#DBBF92" - mutant_organs = list(/obj/item/organ/external/mushroom_cap = "Round") + mutant_organs = list(/obj/item/organ/mushroom_cap = "Round") inherent_traits = list( TRAIT_MUTANT_COLORS, @@ -20,8 +20,8 @@ heatmod = 1.5 - mutanttongue = /obj/item/organ/internal/tongue/mush - mutanteyes = /obj/item/organ/internal/eyes/night_vision/mushroom + mutanttongue = /obj/item/organ/tongue/mush + mutanteyes = /obj/item/organ/eyes/night_vision/mushroom mutantlungs = null species_language_holder = /datum/language_holder/mushroom @@ -61,7 +61,7 @@ return "#FF4B19" //cap color, spot color uses eye color /// A mushpersons mushroom cap organ -/obj/item/organ/external/mushroom_cap +/obj/item/organ/mushroom_cap name = "mushroom cap" desc = "These are yummie, no cap." @@ -77,10 +77,13 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/mushroom_cap + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + /// Bodypart overlay for the mushroom cap organ /datum/bodypart_overlay/mutant/mushroom_cap layers = EXTERNAL_ADJACENT feature_key = "caps" + dyable = TRUE /datum/bodypart_overlay/mutant/mushroom_cap/get_global_feature_list() return SSaccessories.caps_list @@ -90,3 +93,7 @@ return FALSE return TRUE + +/datum/bodypart_overlay/mutant/mushroom_cap/override_color(obj/item/bodypart/bodypart_owner) + //The mushroom cap is red by default (can still be dyed) + return "#FF4B19" diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index c8a8faaa4827c..b27759e594faa 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -18,10 +18,10 @@ inherent_biotypes = MOB_HUMANOID|MOB_MINERAL inherent_respiration_type = RESPIRATION_PLASMA - mutantlungs = /obj/item/organ/internal/lungs/plasmaman - mutanttongue = /obj/item/organ/internal/tongue/bone/plasmaman - mutantliver = /obj/item/organ/internal/liver/bone/plasmaman - mutantstomach = /obj/item/organ/internal/stomach/bone/plasmaman + mutantlungs = /obj/item/organ/lungs/plasmaman + mutanttongue = /obj/item/organ/tongue/bone/plasmaman + mutantliver = /obj/item/organ/liver/bone/plasmaman + mutantstomach = /obj/item/organ/stomach/bone/plasmaman mutantappendix = null mutantheart = null heatmod = 1.5 diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index e5e735b31e44f..87ea18af437fc 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -8,7 +8,7 @@ TRAIT_PLANT_SAFE, ) mutant_organs = list( - /obj/item/organ/external/pod_hair = "None", + /obj/item/organ/pod_hair = "None", ) inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT inherent_factions = list(FACTION_PLANTS, FACTION_VINES) @@ -19,7 +19,7 @@ exotic_blood = /datum/reagent/water changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/plant - mutanttongue = /obj/item/organ/internal/tongue/pod + mutanttongue = /obj/item/organ/tongue/pod bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/pod, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/pod, diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 7f1173841effd..8a8c16c182a84 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -16,8 +16,8 @@ inherent_factions = list(FACTION_FAITHLESS) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - mutantbrain = /obj/item/organ/internal/brain/shadow - mutanteyes = /obj/item/organ/internal/eyes/shadow + mutantbrain = /obj/item/organ/brain/shadow + mutanteyes = /obj/item/organ/eyes/shadow mutantheart = null mutantlungs = null @@ -89,7 +89,7 @@ return to_add -/obj/item/organ/internal/eyes/shadow +/obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon = 'icons/obj/medical/organs/shadow_organs.dmi' @@ -98,14 +98,14 @@ flash_protect = FLASH_PROTECTION_SENSITIVE /// the key to some of their powers -/obj/item/organ/internal/brain/shadow +/obj/item/organ/brain/shadow name = "shadowling tumor" desc = "Something that was once a brain, before being remolded by a shadowling. It has adapted to the dark, irreversibly." icon = 'icons/obj/medical/organs/shadow_organs.dmi' /// What status effect do we gain while in darkness? var/applied_status = /datum/status_effect/shadow_regeneration -/obj/item/organ/internal/brain/shadow/on_life(seconds_per_tick, times_fired) +/obj/item/organ/brain/shadow/on_life(seconds_per_tick, times_fired) . = ..() var/turf/owner_turf = owner.loc if(!isturf(owner_turf)) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index fb3e69dbc37de..da8c1dadd0b22 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -24,11 +24,11 @@ TRAIT_XENO_IMMUNE, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/internal/tongue/bone - mutantstomach = /obj/item/organ/internal/stomach/bone + mutanttongue = /obj/item/organ/tongue/bone + mutantstomach = /obj/item/organ/stomach/bone mutantappendix = null mutantheart = null - mutantliver = /obj/item/organ/internal/liver/bone + mutantliver = /obj/item/organ/liver/bone mutantlungs = null //They can technically be in an ERT changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index a1142923ddc6b..a10499a4863d3 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -13,8 +13,8 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP sexes = FALSE //snails are hermaphrodites - mutanteyes = /obj/item/organ/internal/eyes/snail - mutanttongue = /obj/item/organ/internal/tongue/snail + mutanteyes = /obj/item/organ/eyes/snail + mutanttongue = /obj/item/organ/tongue/snail exotic_blood = /datum/reagent/lube bodypart_overrides = list( diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 9333d598758ce..d0b052a888865 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -20,8 +20,8 @@ changesource_flags = MIRROR_BADMIN | MIRROR_PRIDE | WABBAJACK | ERT_SPAWN exotic_bloodtype = "U" blood_deficiency_drain_rate = BLOOD_DEFICIENCY_MODIFIER // vampires already passively lose blood, so this just makes them lose it slightly more quickly when they have blood deficiency. - mutantheart = /obj/item/organ/internal/heart/vampire - mutanttongue = /obj/item/organ/internal/tongue/vampire + mutantheart = /obj/item/organ/heart/vampire + mutanttongue = /obj/item/organ/tongue/vampire mutantstomach = null mutantlungs = null skinned_type = /obj/item/stack/sheet/animalhide/human @@ -147,7 +147,7 @@ return to_add -/obj/item/organ/internal/tongue/vampire +/obj/item/organ/tongue/vampire name = "vampire tongue" actions_types = list(/datum/action/item_action/organ_action/vampire) color = COLOR_CRAYON_BLACK @@ -161,7 +161,7 @@ . = ..() if(iscarbon(owner)) var/mob/living/carbon/H = owner - var/obj/item/organ/internal/tongue/vampire/V = target + var/obj/item/organ/tongue/vampire/V = target if(!COOLDOWN_FINISHED(V, drain_cooldown)) to_chat(H, span_warning("You just drained blood, wait a few seconds!")) return @@ -197,19 +197,19 @@ if(!victim.blood_volume) to_chat(H, span_notice("You finish off [victim]'s blood supply.")) -/obj/item/organ/internal/heart/vampire +/obj/item/organ/heart/vampire name = "vampire heart" color = COLOR_CRAYON_BLACK -/obj/item/organ/internal/heart/vampire/on_mob_insert(mob/living/carbon/receiver) +/obj/item/organ/heart/vampire/on_mob_insert(mob/living/carbon/receiver) . = ..() RegisterSignal(receiver, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item)) -/obj/item/organ/internal/heart/vampire/on_mob_remove(mob/living/carbon/heartless) +/obj/item/organ/heart/vampire/on_mob_remove(mob/living/carbon/heartless) . = ..() UnregisterSignal(heartless, COMSIG_MOB_GET_STATUS_TAB_ITEMS) -/obj/item/organ/internal/heart/vampire/proc/get_status_tab_item(mob/living/carbon/source, list/items) +/obj/item/organ/heart/vampire/proc/get_status_tab_item(mob/living/carbon/source, list/items) SIGNAL_HANDLER items += "Blood Level: [source.blood_volume]/[BLOOD_VOLUME_MAXIMUM]" diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 9bd61766efc5c..77d2765ba98b3 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -4,7 +4,7 @@ id = SPECIES_ZOMBIE sexes = FALSE meat = /obj/item/food/meat/slab/human/mutant/zombie - mutanttongue = /obj/item/organ/internal/tongue/zombie + mutanttongue = /obj/item/organ/tongue/zombie inherent_traits = list( // SHARED WITH ALL ZOMBIES TRAIT_EASILY_WOUNDED, @@ -95,9 +95,9 @@ id = SPECIES_ZOMBIE_INFECTIOUS examine_limb_id = SPECIES_ZOMBIE damage_modifier = 20 // 120 damage to KO a zombie, which kills it - mutanteyes = /obj/item/organ/internal/eyes/zombie - mutantbrain = /obj/item/organ/internal/brain/zombie - mutanttongue = /obj/item/organ/internal/tongue/zombie + mutanteyes = /obj/item/organ/eyes/zombie + mutantbrain = /obj/item/organ/brain/zombie + mutanttongue = /obj/item/organ/tongue/zombie changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN inherent_traits = list( @@ -139,7 +139,7 @@ // Deal with the source of this zombie corruption // Infection organ needs to be handled separately from mutant_organs // because it persists through species transitions - var/obj/item/organ/internal/zombie_infection/infection = new_zombie.get_organ_slot(ORGAN_SLOT_ZOMBIE) + var/obj/item/organ/zombie_infection/infection = new_zombie.get_organ_slot(ORGAN_SLOT_ZOMBIE) if(isnull(infection)) infection = new() infection.Insert(new_zombie) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index db6ad1a80e3fd..93d6f9ce2e19f 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -41,8 +41,8 @@ // Start of a breath chain, calls [carbon/proc/breathe()] /mob/living/carbon/handle_breathing(seconds_per_tick, times_fired) var/next_breath = 4 - var/obj/item/organ/internal/lungs/L = get_organ_slot(ORGAN_SLOT_LUNGS) - var/obj/item/organ/internal/heart/H = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/lungs/L = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/heart/H = get_organ_slot(ORGAN_SLOT_HEART) if(L) if(L.damage > L.high_threshold) next_breath-- @@ -63,7 +63,7 @@ // Second link in a breath chain, calls [carbon/proc/check_breath()] /mob/living/carbon/proc/breathe(seconds_per_tick, times_fired) - var/obj/item/organ/internal/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) var/is_on_internals = FALSE if(SEND_SIGNAL(src, COMSIG_CARBON_ATTEMPT_BREATHE, seconds_per_tick, times_fired) & COMSIG_CARBON_BLOCK_BREATH) @@ -169,7 +169,7 @@ /// Indicates if there are moles of gas in the breath. var/has_moles = breath.total_moles() != 0 - var/obj/item/organ/internal/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) // Indicates if lungs can breathe without gas. var/can_breathe_vacuum = FALSE if(lungs) @@ -464,7 +464,7 @@ if(stat == DEAD) if(reagents && (reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/cryostylane))) // No organ decay if the body contains formaldehyde. return - for(var/obj/item/organ/internal/organ in organs) + for(var/obj/item/organ/organ in organs) // On-death is where organ decay is handled if(organ?.owner) // organ + owner can be null due to reagent metabolization causing organ shuffling organ.on_death(seconds_per_tick, times_fired) @@ -477,7 +477,7 @@ for(var/slot in organs_slot) // We don't use get_organ_slot here because we know we have the organ we want, since we're iterating the list containing em already // This code is hot enough that it's just not worth the time - var/obj/item/organ/internal/organ = organs_slot[slot] + var/obj/item/organ/organ = organs_slot[slot] if(organ?.owner) // This exist mostly because reagent metabolization can cause organ reshuffling organ.on_life(seconds_per_tick, times_fired) @@ -689,7 +689,7 @@ /mob/living/carbon/get_fullness() var/fullness = nutrition - var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) if(!belly) //nothing to see here if we do not have a stomach return fullness @@ -707,7 +707,7 @@ . = ..() if(.) return - var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH) if(!belly) return FALSE return belly.reagents.has_reagent(reagent, amount, needs_metabolizing) @@ -722,7 +722,7 @@ if(isnull(has_dna())) return - var/obj/item/organ/internal/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER) if(liver) return @@ -736,7 +736,7 @@ adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* seconds_per_tick) /mob/living/carbon/proc/undergoing_liver_failure() - var/obj/item/organ/internal/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER) if(liver?.organ_flags & ORGAN_FAILING) return TRUE @@ -756,7 +756,7 @@ /mob/living/carbon/proc/can_heartattack() if(!needs_heart()) return FALSE - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(!heart || IS_ROBOTIC_ORGAN(heart)) return FALSE return TRUE @@ -776,7 +776,7 @@ * related situations (i.e not just cardiac arrest) */ /mob/living/carbon/proc/undergoing_cardiac_arrest() - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(istype(heart) && heart.is_beating()) return FALSE else if(!needs_heart()) @@ -794,7 +794,7 @@ if(status && !can_heartattack()) return FALSE - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(!istype(heart)) return FALSE diff --git a/code/modules/mob/living/carbon/skillchip.dm b/code/modules/mob/living/carbon/skillchip.dm index 19009f21892a1..062ec616a5142 100644 --- a/code/modules/mob/living/carbon/skillchip.dm +++ b/code/modules/mob/living/carbon/skillchip.dm @@ -9,7 +9,7 @@ */ /mob/living/carbon/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE) // Grab the brain. - var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) // Check for the brain. No brain = no implant. if(QDELETED(brain)) @@ -37,7 +37,7 @@ */ /mob/living/carbon/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE) // Check the target's brain, making sure the target exists and has a brain. - var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(brain)) return FALSE @@ -59,7 +59,7 @@ */ /mob/living/carbon/proc/clone_skillchip_list(not_removable = FALSE) // Check the target's brain, making sure the target exists and has a brain. - var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(brain)) return list() @@ -70,7 +70,7 @@ */ /mob/living/carbon/proc/destroy_all_skillchips(silent = FALSE) // Check the target's brain, making sure the target exists and has a brain. - var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN) if(QDELETED(brain)) return FALSE diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index b1ca17337115e..a7f4652533440 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -16,17 +16,17 @@ /mob/living/carbon/proc/get_traumas() . = list() - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) . = B.traumas /mob/living/carbon/proc/has_trauma_type(brain_trauma_type, resilience) - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) . = B.has_trauma_type(brain_trauma_type, resilience) /mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...) - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) var/list/arguments = list() if(args.len > 2) @@ -34,16 +34,16 @@ . = B.brain_gain_trauma(trauma, resilience, arguments) /mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience) - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) . = B.gain_trauma_type(brain_trauma_type, resilience) /mob/living/carbon/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience) - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) . = B.cure_trauma_type(brain_trauma_type, resilience) /mob/living/carbon/proc/cure_all_traumas(resilience) - var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN) if(B) . = B.cure_all_traumas(resilience) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index a6078afc9d521..5666ac00560be 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -308,7 +308,7 @@ if(HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE if (required_respiration_type) - var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type return FALSE @@ -335,7 +335,7 @@ if(HAS_TRAIT(src, TRAIT_GODMODE)) return FALSE - var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(affected_lungs)) if(!(mob_respiration_type & required_respiration_type)) return FALSE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 92099c7dac3b7..360d975cb9ed8 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -143,7 +143,7 @@ if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/open = FALSE - var/obj/item/organ/external/wings/functional/wings = human_user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/functional/wings = human_user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) // open/close functional wings if(istype(wings)) @@ -152,7 +152,7 @@ wings.close_wings() else wings.open_wings() - addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/external/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/external/wings/functional, close_wings)), wing_time) + addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/wings/functional, close_wings)), wing_time) // play a flapping noise if the wing has this implemented wings.make_flap_sound(human_user) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6326eacd06b2a..b1c71055f2417 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -65,14 +65,14 @@ // multiplier for the damage taken from falling var/damage_softening_multiplier = 1 - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) damage_softening_multiplier *= potential_spine.athletics_boost_multiplier // If you are incapped, you probably can't brace yourself var/can_help_themselves = !INCAPACITATED_IGNORING(src, INCAPABLE_RESTRAINTS) if(levels <= 1 && can_help_themselves) - var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings) + var/obj/item/organ/wings/gliders = get_organ_by_type(/obj/item/organ/wings) if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed var/graceful_landing = HAS_TRAIT(src, TRAIT_CATLIKE_GRACE) @@ -697,7 +697,7 @@ var/get_up_time = 1 SECONDS - var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) + var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) get_up_time *= potential_spine.athletics_boost_multiplier diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3550b16829cdb..24f22cb905236 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -456,7 +456,7 @@ if(hack_software) new/obj/item/malf_upgrade(get_turf(src)) the_mmi = mmi_type - the_mmi.brain = new /obj/item/organ/internal/brain(the_mmi) + the_mmi.brain = new /obj/item/organ/brain(the_mmi) the_mmi.brain.organ_flags |= ORGAN_FROZEN the_mmi.brain.name = "[real_name]'s brain" the_mmi.name = "[initial(the_mmi.name)]: [real_name]" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e53fa80dfdd8c..d88573510d3d1 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -66,7 +66,7 @@ //MMI stuff. Held togheter by magic. ~Miauw if(!mmi?.brainmob) mmi = new (src) - mmi.brain = new /obj/item/organ/internal/brain(mmi) + mmi.brain = new /obj/item/organ/brain(mmi) mmi.brain.organ_flags |= ORGAN_FROZEN mmi.brain.name = "[real_name]'s brain" mmi.name = "[initial(mmi.name)]: [real_name]" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index c7171b3c5556a..f1e3461271359 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -153,7 +153,7 @@ Difficulty: Hard */ /mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params) . = ..() - if(istype(W, /obj/item/organ/internal/tongue)) + if(istype(W, /obj/item/organ/tongue)) user.client?.give_award(/datum/award/achievement/jobs/frenching, user) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index b40a793f0fc74..1cf118d587675 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -274,8 +274,8 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/structure/elite_tumor/item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers) . = NONE - if(istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) - var/obj/item/organ/internal/monster_core/regenerative_core/core = attacking_item + if(istype(attacking_item, /obj/item/organ/monster_core/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) + var/obj/item/organ/monster_core/regenerative_core/core = attacking_item visible_message(span_boldwarning("As [user] drops the core into [src], [src] appears to swell.")) icon_state = "advanced_tumor" boosted = TRUE diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 2b88984bf41fc..8790def4bd10e 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -14,7 +14,7 @@ return DEFAULT_TASTE_SENSITIVITY /mob/living/carbon/get_taste_sensitivity() - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) if(istype(tongue)) . = tongue.taste_sensitivity else @@ -57,7 +57,7 @@ // Handled in here since the brain trauma can't modify taste directly (/datum/brain_trauma/severe/flesh_desire) if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) return GORE | MEAT - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) . = tongue.liked_foodtypes if(HAS_TRAIT(src, TRAIT_VEGETARIAN)) . &= ~MEAT @@ -73,7 +73,7 @@ /mob/living/carbon/get_disliked_foodtypes() if(HAS_TRAIT(src, TRAIT_AGEUSIA)) return NONE - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) . = tongue.disliked_foodtypes if(HAS_TRAIT(src, TRAIT_VEGETARIAN)) . |= MEAT @@ -86,7 +86,7 @@ return TOXIC /mob/living/carbon/get_toxic_foodtypes() - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return ..() if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) @@ -140,7 +140,7 @@ return food_taste_reaction /mob/living/carbon/get_food_taste_reaction(obj/item/food, foodtypes) - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) // No tongue, no tastin' if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) // i hate that i have to do this, but we want to ensure toxic food is still BAD diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index 3963cefcb4931..e9a4a9b05044d 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -26,7 +26,7 @@ /obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) . = ..() - var/obj/item/organ/internal/legion_tumour/cancer = new() + var/obj/item/organ/legion_tumour/cancer = new() cancer.Insert(spawned_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) /// Returns the outfit worn by our corpse diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm index 5fc643bffa622..af7cde7320d0c 100644 --- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/golem_roles.dm @@ -78,7 +78,7 @@ if(!ishuman(new_spawn)) return var/mob/living/carbon/human/new_golem = new_spawn - var/obj/item/organ/internal/vocal_cords/adamantine/free_golem_radio = new() + var/obj/item/organ/vocal_cords/adamantine/free_golem_radio = new() free_golem_radio.Insert(new_golem) // Subtype which follows orders diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 791c5347722b6..79a8eff5e290a 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -265,27 +265,27 @@ var/charge_modifier = 0.1 /obj/item/mod/core/ethereal/charge_source() - var/obj/item/organ/internal/stomach/ethereal/ethereal_stomach = mod.wearer.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/ethereal_stomach = mod.wearer.get_organ_slot(ORGAN_SLOT_STOMACH) if(!istype(ethereal_stomach)) return return ethereal_stomach /obj/item/mod/core/ethereal/charge_amount() - var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() return charge_source?.cell.charge() || ETHEREAL_CHARGE_NONE /obj/item/mod/core/ethereal/max_charge_amount() return ETHEREAL_CHARGE_FULL /obj/item/mod/core/ethereal/add_charge(amount) - var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() if(!charge_source) return FALSE charge_source.adjust_charge(amount*charge_modifier) return TRUE /obj/item/mod/core/ethereal/subtract_charge(amount) - var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() if(!charge_source) return FALSE return -charge_source.adjust_charge(-amount*charge_modifier) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 281b4239d60d7..d1394ad3d7eab 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -515,7 +515,7 @@ /obj/item/mod/module/infiltrator/on_suit_activation() mod.wearer.add_traits(traits_to_add, MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH, PROC_REF(on_speech_modification)) - var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) user_tongue.temp_say_mod = "states" var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(istype(head_cover)) @@ -524,7 +524,7 @@ /obj/item/mod/module/infiltrator/on_suit_deactivation(deleting = FALSE) mod.wearer.remove_traits(traits_to_add, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH) - var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) user_tongue.temp_say_mod = initial(user_tongue.temp_say_mod) if(deleting) return diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 1d913f4a236b0..41c285d46a5d8 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -49,7 +49,7 @@ return ..() /obj/item/paperplane/suicide_act(mob/living/user) - var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) user.Stun(20 SECONDS) user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")) user.adjust_eye_blur(12 SECONDS) @@ -98,7 +98,7 @@ if(. || !ishuman(hit_atom)) //if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/hit_human = hit_atom - var/obj/item/organ/internal/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES) if(!prob(hit_probability)) return if(hit_human.is_eyes_covered()) diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 3b786cfd199c9..c156d8bb07003 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -13,7 +13,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/apc_interactor = user - var/obj/item/organ/internal/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.get_organ_slot(ORGAN_SLOT_STOMACH) if(!istype(maybe_ethereal_stomach)) togglelock(user) else @@ -27,14 +27,14 @@ if(!ishuman(user)) return var/mob/living/carbon/human/ethereal = user - var/obj/item/organ/internal/stomach/maybe_stomach = ethereal.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/maybe_stomach = ethereal.get_organ_slot(ORGAN_SLOT_STOMACH) // how long we wanna wait before we show the balloon alert. don't want it to be very long in case the ethereal wants to opt-out of doing that action, just long enough to where it doesn't collide with previously queued balloon alerts. var/alert_timer_duration = 0.75 SECONDS - if(!istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) + if(!istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) return var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - ETHEREAL_APC_POWER_GAIN - var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach var/obj/item/stock_parts/power_store/stomach_cell = stomach.cell if(!((stomach?.drain_time < world.time) && LAZYACCESS(modifiers, RIGHT_CLICK))) return diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 487b26dd31459..3657bb84db83a 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -548,9 +548,9 @@ var/protected = FALSE if(istype(user)) - var/obj/item/organ/internal/stomach/maybe_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) - var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/stomach/maybe_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) + var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach if(stomach.drain_time > world.time) return to_chat(user, span_notice("You start channeling some power through the [fitting] into your body.")) diff --git a/code/modules/power/power_store.dm b/code/modules/power/power_store.dm index 1be39dfbaa031..8756f052781df 100644 --- a/code/modules/power/power_store.dm +++ b/code/modules/power/power_store.dm @@ -290,12 +290,12 @@ /obj/item/stock_parts/power_store/attack_self(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user - var/obj/item/organ/internal/stomach/maybe_stomach = H.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/maybe_stomach = H.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) + if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - CELL_POWER_GAIN - var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach var/obj/item/stock_parts/power_store/stomach_cell = stomach.cell if((stomach.drain_time > world.time) || !stomach) return diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm index c07ec7bbe89f7..3cb6c8fd82c3e 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm @@ -95,7 +95,7 @@ var/mob/living/carbon/jedi = user to_chat(jedi, span_userdanger("That was a really dense idea.")) jedi.ghostize() - var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs + var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs if(rip_u) rip_u.Remove(jedi) qdel(rip_u) diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 11b42d7144625..167ee7988b138 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -59,7 +59,7 @@ to_chat(jedi, span_userdanger("That was a really dense idea.")) jedi.investigate_log("had [jedi.p_their()] brain dusted by touching [src] with telekinesis.", INVESTIGATE_DEATHS) jedi.ghostize() - var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs + var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs if(rip_u) rip_u.Remove(jedi) qdel(rip_u) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 5437ee0afd93c..2e2931c835c0d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -163,7 +163,7 @@ return var/mob/living/carbon/jedi = user to_chat(jedi, span_userdanger("That was a shockingly dumb idea.")) - var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs + var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs jedi.ghostize(jedi) if(rip_u) qdel(rip_u) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 45bcd9d870ae5..0641a2959bc68 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -612,7 +612,7 @@ #define BRAINS_BLOWN_THROW_SPEED 1 /obj/item/gun/ballistic/suicide_act(mob/living/user) - var/obj/item/organ/internal/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN) if (B && chambered && chambered.loaded_projectile && can_trigger_gun(user) && chambered.loaded_projectile.damage > 0) user.visible_message(span_suicide("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")) sleep(2.5 SECONDS) diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index 593bc6d471092..625d4e118075a 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -430,7 +430,7 @@ else if(!ignore_stomach && (methods & INGEST) && iscarbon(target)) var/mob/living/carbon/eater = target - var/obj/item/organ/internal/stomach/belly = eater.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = eater.get_organ_slot(ORGAN_SLOT_STOMACH) if(!belly) var/expel_amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) if(expel_amount > 0 ) diff --git a/code/modules/reagents/chemistry/holder/mob_life.dm b/code/modules/reagents/chemistry/holder/mob_life.dm index 890797247716b..bbf12bf956861 100644 --- a/code/modules/reagents/chemistry/holder/mob_life.dm +++ b/code/modules/reagents/chemistry/holder/mob_life.dm @@ -19,8 +19,8 @@ expose_temperature(owner.bodytemperature, 0.25) var/need_mob_update = FALSE - var/obj/item/organ/internal/stomach/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH) - var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/stomach/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER) var/liver_tolerance = 0 var/liver_damage = 0 var/provide_pain_message diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index a81dd522b595b..d9ca390f1f4f3 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -158,7 +158,7 @@ return UPDATE_MOB_HEALTH /datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume) - if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/internal/stomach)) ) + if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/stomach)) ) return A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05) @@ -421,7 +421,7 @@ var/mob/living/carbon/C = A if(trans_volume >= 0.4) //prevents cheesing with ultralow doses. C.adjustToxLoss((-3 * min(2, trans_volume) * REM) * normalise_creation_purity(), required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel. - var/obj/item/organ/internal/liver/L = C.organs_slot[ORGAN_SLOT_LIVER] + var/obj/item/organ/liver/L = C.organs_slot[ORGAN_SLOT_LIVER] if(!L || L.organ_flags & ORGAN_FAILING) return conversion_amount = (trans_volume * (min(100 -C.get_organ_loss(ORGAN_SLOT_LIVER), 80) / 100)*normalise_creation_purity()) //the more damaged the liver the worse we metabolize. diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index fcc428df9b629..58bacc57bcfd3 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -75,7 +75,7 @@ // Volume, power, and server alcohol rate effect how quickly one gets drunk drinker.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE * REM * seconds_per_tick) if(boozepwr > 0) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) var/heavy_drinker_multiplier = (HAS_TRAIT(drinker, TRAIT_HEAVY_DRINKER) ? 0.5 : 1) if (istype(liver)) if(liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/150))) @@ -255,7 +255,7 @@ to_chat(drinker, span_notice("[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) if(SPT_PROB(2.5, seconds_per_tick) && iscarbon(drinker)) - var/obj/item/organ/internal/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES) if(eyes && IS_ORGANIC_ORGAN(eyes)) // doesn't affect robotic eyes if(drinker.is_blind()) eyes.Remove(drinker) @@ -662,7 +662,7 @@ /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") if (HAS_TRAIT(drinker, TRAIT_IRRADIATED)) @@ -780,7 +780,7 @@ if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) metabolization_rate = 0.8 // if you don't have a liver, or your liver isn't an officer's liver - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) beepsky_hallucination = new() drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) @@ -788,7 +788,7 @@ /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() drinker.set_jitter_if_lower(4 SECONDS) - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) // if you have a liver and that liver is an officer's liver if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) if(drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype)) @@ -805,7 +805,7 @@ /datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) . = ..() - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) // if you don't have a liver, or your liver isn't an officer's liver if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) drinker.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) @@ -1296,7 +1296,7 @@ /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(drinker)) if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH @@ -1606,7 +1606,7 @@ /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH @@ -1623,7 +1623,7 @@ /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) var/need_mob_update need_mob_update = drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) @@ -2653,7 +2653,7 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 0.02 * ETHEREAL_CHARGE_NORMAL) @@ -2673,7 +2673,7 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 0.05 * ETHEREAL_CHARGE_NORMAL) @@ -2700,7 +2700,7 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 0.1 * ETHEREAL_CHARGE_NORMAL) diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index cb400e9ac7dae..f70ffb329d27d 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -113,7 +113,7 @@ /datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(affected_mob)) if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH @@ -181,7 +181,7 @@ /datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))) if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) return UPDATE_MOB_HEALTH @@ -513,7 +513,7 @@ /datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) . = ..() - var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 @@ -775,7 +775,7 @@ need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.nutrition && (affected_mob.nutrition - 2 > 0)) - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM))) // Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight! affected_mob.adjust_nutrition(-2 * REM * seconds_per_tick) @@ -1289,6 +1289,6 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 0.02 * ETHEREAL_CHARGE_NORMAL) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 904d09db7334b..61836a49163e0 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -333,7 +333,7 @@ /datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) affected_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 @@ -380,7 +380,7 @@ return var/mob/living/carbon/carbon_mob = affected_mob - var/obj/item/organ/internal/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) carbon_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) metabolization_rate *= 0.8 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 5bb978e628192..b0ee1e35ffa85 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -543,7 +543,7 @@ affected_mob.Paralyze(10) affected_mob.set_jitter_if_lower(20 SECONDS) else - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM)) if(SPT_PROB(10, seconds_per_tick)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) @@ -578,7 +578,7 @@ /datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE)) return UPDATE_MOB_HEALTH @@ -952,7 +952,7 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 0.03 * ETHEREAL_CHARGE_NORMAL) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index 20cd80d9c5b0e..b9c0ee0522dfa 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -16,7 +16,7 @@ /datum/reagent/impurity/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) var/need_mob_update if(liver)//Though, lets be safe diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index 3fd9188e8d4f0..6a295afc0d5a8 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -141,21 +141,21 @@ Basically, we fill the time between now and 2s from now with hands based off the return RegisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) RegisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) this_liver.alcohol_tolerance *= 2 /datum/reagent/inverse/libitoil/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/liver)) + if(!istype(organ, /obj/item/organ/liver)) return - var/obj/item/organ/internal/liver/this_liver = organ + var/obj/item/organ/liver/this_liver = organ this_liver.alcohol_tolerance *= 2 /datum/reagent/inverse/libitoil/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/liver)) + if(!istype(organ, /obj/item/organ/liver)) return - var/obj/item/organ/internal/liver/this_liver = organ + var/obj/item/organ/liver/this_liver = organ this_liver.alcohol_tolerance /= 2 /datum/reagent/inverse/libitoil/on_mob_delete(mob/living/affected_mob) @@ -163,7 +163,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/mob/living/carbon/consumer = affected_mob UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) if(!this_liver) return this_liver.alcohol_tolerance /= 2 @@ -366,19 +366,19 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return apply_lung_levels(lungs) /datum/reagent/inverse/healing/convermol/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/lungs)) + if(!istype(organ, /obj/item/organ/lungs)) return - var/obj/item/organ/internal/lungs/lungs = organ + var/obj/item/organ/lungs/lungs = organ apply_lung_levels(lungs) -/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/internal/lungs/lungs) +/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/lungs/lungs) cached_heat_level_1 = lungs.heat_level_1_threshold cached_heat_level_2 = lungs.heat_level_2_threshold cached_heat_level_3 = lungs.heat_level_3_threshold @@ -396,12 +396,12 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/healing/convermol/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/lungs)) + if(!istype(organ, /obj/item/organ/lungs)) return - var/obj/item/organ/internal/lungs/lungs = organ + var/obj/item/organ/lungs/lungs = organ restore_lung_levels(lungs) -/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/internal/lungs/lungs) +/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/lungs/lungs) lungs.heat_level_1_threshold = cached_heat_level_1 lungs.heat_level_2_threshold = cached_heat_level_2 lungs.heat_level_3_threshold = cached_heat_level_3 @@ -413,7 +413,7 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) return restore_lung_levels(lungs) @@ -523,7 +523,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick) . = ..() - var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) return metabolization_rate = 0.2 * REM @@ -557,7 +557,7 @@ Basically, we fill the time between now and 2s from now with hands based off the affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) if(affected_mob.health < HEALTH_THRESHOLD_FULLCRIT) affected_mob.add_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium) - var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) remove_buffs(affected_mob) if(need_mob_update) @@ -566,7 +566,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/affected_mob) . = ..() remove_buffs(affected_mob) - var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(affected_mob.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500 explosion(affected_mob, light_impact_range = 1, explosion_cause = src) qdel(heart) @@ -576,7 +576,7 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() if(!back_from_the_dead) return ..() - var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) if(!heart) //No heart? No life! REMOVE_TRAIT(affected_mob, TRAIT_NODEATH, type) affected_mob.stat = DEAD @@ -661,7 +661,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/brain_trauma/special/honorbound, // Designed to be chaplain exclusive ) traumalist -= forbiddentraumas - var/obj/item/organ/internal/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN) traumalist = shuffle(traumalist) for(var/trauma in traumalist) if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)) @@ -693,7 +693,7 @@ Basically, we fill the time between now and 2s from now with hands based off the if(!iscarbon(affected_mob)) return var/mob/living/carbon/carbon_mob = affected_mob - var/obj/item/organ/internal/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART) if(isnull(affected_heart)) return carbon_mob.AddComponent(/datum/component/manual_heart) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm index 0872fa6658815..4e904dcf684d3 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm @@ -29,7 +29,7 @@ /datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags)) return UPDATE_MOB_HEALTH @@ -59,7 +59,7 @@ /datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, seconds_per_tick) . = ..() - var/obj/item/organ/internal/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return if(SPT_PROB(4.0, seconds_per_tick)) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 64626883b3c47..d0fe8be21359f 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -559,7 +559,7 @@ var/need_mob_update need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) - var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type // use lungs' respiration type or mob_respiration_type if no lungs if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick @@ -698,33 +698,33 @@ return RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) return improve_eyesight(affected_mob, eyes) -/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/affected_mob, obj/item/organ/internal/eyes/eyes) +/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/affected_mob, obj/item/organ/eyes/eyes) delta_light = creation_purity*10 eyes.lighting_cutoff += delta_light affected_mob.update_sight() -/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/affected_mob, obj/item/organ/internal/eyes/eyes) +/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/affected_mob, obj/item/organ/eyes/eyes) eyes.lighting_cutoff -= delta_light affected_mob.update_sight() /datum/reagent/medicine/oculine/proc/on_gained_organ(mob/affected_mob, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/eyes)) + if(!istype(organ, /obj/item/organ/eyes)) return - var/obj/item/organ/internal/eyes/affected_eyes = organ + var/obj/item/organ/eyes/affected_eyes = organ improve_eyesight(affected_mob, affected_eyes) /datum/reagent/medicine/oculine/proc/on_removed_organ(mob/prev_affected_mob, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/internal/eyes)) + if(!istype(organ, /obj/item/organ/eyes)) return - var/obj/item/organ/internal/eyes/eyes = organ + var/obj/item/organ/eyes/eyes = organ restore_eyesight(prev_affected_mob, eyes) /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) @@ -732,7 +732,7 @@ var/normalized_purity = normalise_creation_purity() affected_mob.adjust_temp_blindness(-4 SECONDS * REM * seconds_per_tick * normalized_purity) affected_mob.adjust_eye_blur(-4 SECONDS * REM * seconds_per_tick * normalized_purity) - var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(eyes) // Healing eye damage will cure nearsightedness and blindness from ... eye damage if(eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags)) @@ -749,7 +749,7 @@ /datum/reagent/medicine/oculine/on_mob_delete(mob/living/affected_mob) . = ..() - var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) return restore_eyesight(affected_mob, eyes) @@ -786,7 +786,7 @@ /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS) if(!ears) return ears.adjustEarDamage(-4 * REM * seconds_per_tick * normalise_creation_purity(), -4 * REM * seconds_per_tick * normalise_creation_purity()) @@ -819,7 +819,7 @@ need_mob_update += affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(need_mob_update) . = UPDATE_MOB_HEALTH - var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath = 0 @@ -859,7 +859,7 @@ need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(affected_mob.losebreath >= 4) - var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath -= 2 * REM * seconds_per_tick @@ -886,7 +886,7 @@ var/need_mob_update need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE) need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype) - var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type if(our_respiration_type & affected_respiration_type) affected_mob.losebreath++ @@ -1705,10 +1705,10 @@ affected_mob.adjustOxyLoss(rand(3, 4) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) if(prob(50)) - var/obj/item/organ/internal/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS) our_lungs.apply_organ_damage(1 * REM * seconds_per_tick) else - var/obj/item/organ/internal/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART) our_heart.apply_organ_damage(1 * REM * seconds_per_tick) return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b0e35f9f23aa6..36492caacdcd1 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1313,7 +1313,7 @@ /datum/reagent/fuel/on_mob_life(mob/living/carbon/victim, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = victim.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = victim.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return if(victim.adjustToxLoss(0.5 * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) @@ -1449,7 +1449,7 @@ /datum/reagent/cyborg_mutation_nanomachines/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - var/obj/item/organ/internal/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) @@ -1945,7 +1945,7 @@ /datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver) // Heads of staff and the captain have a "royal metabolism" if(HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM)) @@ -2436,7 +2436,7 @@ . = ..() // Silently add the zombie infection organ to be activated upon death if(!exposed_mob.get_organ_slot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new() + var/obj/item/organ/zombie_infection/nodamage/ZI = new() ZI.Insert(exposed_mob) /datum/reagent/magillitis diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 39b477a51a572..6160f9a419618 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -655,7 +655,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) //it counteracts its own toxin damage. return UPDATE_MOB_HEALTH @@ -1085,7 +1085,7 @@ . = ..() if(!istype(exposed_carbon)) return - var/obj/item/organ/internal/liver/liver = exposed_carbon.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = exposed_carbon.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return reac_volume = round(reac_volume,0.1) @@ -1336,7 +1336,7 @@ if(SPT_PROB(20, seconds_per_tick)) affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick)) - var/obj/item/organ/internal/tongue/tongue = affected_mob.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = affected_mob.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) to_chat(affected_mob, span_warning("Your [tongue.name] feels numb...")) affected_mob.set_slurring_if_lower(5 SECONDS * REM * seconds_per_tick) diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 8c093888028e9..b34461f99b449 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -43,7 +43,7 @@ //This looks rediculous, but expose is usually called from the donor reagents datum - we want to edit the post exposure version present in the mob. var/mob/living/carbon/carby = living_mob //But because carbon mobs have stomachs we have to search in there because we're ingested - var/obj/item/organ/internal/stomach/stomach = carby.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/stomach = carby.get_organ_slot(ORGAN_SLOT_STOMACH) var/datum/reagent/eigenstate/eigen if(stomach) eigen = stomach.reagents.has_reagent(/datum/reagent/eigenstate) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 4670aebdd6e0a..8816ec87dfb60 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -314,8 +314,8 @@ // Not quite the same if the reaction is in their stomach; they'll throw up // from any explosion, but it'll only make them puke up everything in their // stomach - else if (istype(holder.my_atom, /obj/item/organ/internal/stomach)) - var/obj/item/organ/internal/stomach/indigestion = holder.my_atom + else if (istype(holder.my_atom, /obj/item/organ/stomach)) + var/obj/item/organ/stomach/indigestion = holder.my_atom if(power < 1) return indigestion.owner?.vomit(MOB_VOMIT_MESSAGE | MOB_VOMIT_FORCE, lost_nutrition = 150, distance = 5, purge_ratio = 1) diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index dcf56faec4c80..5712d383f0b57 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -693,7 +693,7 @@ return //The bonus to success chance that the user gets for being a command role - var/obj/item/organ/internal/liver/liver = user.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = user.get_organ_slot(ORGAN_SLOT_LIVER) var/command_bonus = (!isnull(liver) && HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM)) ? 20 : 0 //The bonus to success chance that the user gets for having a sabrage skillchip installed/otherwise having the trait through other means diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index 844c62956e555..66c1f573d773b 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -111,7 +111,7 @@ to_chat(affected_human, span_warning("Your chin itches.")) affected_human.set_facial_hairstyle("Beard (Full)", update = TRUE) //Only like gross food - var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) return tongue.liked_foodtypes = GROSS @@ -124,7 +124,7 @@ return to_chat(affected_carbon, span_warning("You feel yourself adapt to the darkness.")) var/mob/living/carbon/human/affected_human = affected_carbon - var/obj/item/organ/internal/eyes/empowered_eyes = affected_human.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/empowered_eyes = affected_human.get_organ_by_type(/obj/item/organ/eyes) if(empowered_eyes) ADD_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction") empowered_eyes?.refresh() @@ -146,7 +146,7 @@ . = ..() affected_carbon.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type) //restore tongue's tastes - var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE) if(tongue) tongue.liked_foodtypes = initial(tongue.liked_foodtypes) tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) @@ -155,7 +155,7 @@ return var/mob/living/carbon/human/affected_human = affected_carbon REMOVE_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction") - var/obj/item/organ/internal/eyes/eyes = affected_human.get_organ_by_type(/obj/item/organ/internal/eyes) + var/obj/item/organ/eyes/eyes = affected_human.get_organ_by_type(/obj/item/organ/eyes) eyes?.refresh() ///Makes you a hypochondriac - I'd like to call it hypochondria, but "I could use some hypochondria" doesn't work @@ -195,7 +195,7 @@ if(!HAS_TRAIT(affected_carbon, TRAIT_RESISTCOLD)) possibilities += /datum/hallucination/fake_alert/cold - var/obj/item/organ/internal/lungs/lungs = affected_carbon.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = affected_carbon.get_organ_slot(ORGAN_SLOT_LUNGS) if(lungs) if(lungs.safe_oxygen_min) possibilities += /datum/hallucination/fake_alert/need_oxygen diff --git a/code/modules/religion/burdened/burdened_trauma.dm b/code/modules/religion/burdened/burdened_trauma.dm index 51e763dbcb570..ebdfcda656505 100644 --- a/code/modules/religion/burdened/burdened_trauma.dm +++ b/code/modules/religion/burdened/burdened_trauma.dm @@ -153,8 +153,8 @@ if(!(organ.slot in critical_slots)) return FALSE - else if(istype(organ, /obj/item/organ/internal/eyes)) - var/obj/item/organ/internal/eyes/eyes = organ + else if(istype(organ, /obj/item/organ/eyes)) + var/obj/item/organ/eyes/eyes = organ if(eyes.tint < TINT_BLIND) //unless you were already blinded by them (flashlight eyes), this is adding burden! return TRUE return FALSE diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index f111d04f93013..77cfcdaac2494 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/brain/psyker +/obj/item/organ/brain/psyker name = "psyker brain" desc = "This brain is blue, split into two hemispheres, and has immense psychic powers. What kind of monstrosity would use that?" icon_state = "brain-psyker" @@ -10,17 +10,17 @@ organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP, TRAIT_ANTIMAGIC_NO_SELFBLOCK) w_class = WEIGHT_CLASS_NORMAL -/obj/item/organ/internal/brain/psyker/on_mob_insert(mob/living/carbon/inserted_into) +/obj/item/organ/brain/psyker/on_mob_insert(mob/living/carbon/inserted_into) . = ..() inserted_into.AddComponent(/datum/component/echolocation, blocking_trait = TRAIT_DUMB, echo_group = "psyker", echo_icon = "psyker", color_path = /datum/client_colour/psyker) inserted_into.AddComponent(/datum/component/anti_magic, antimagic_flags = MAGIC_RESISTANCE_MIND) -/obj/item/organ/internal/brain/psyker/on_mob_remove(mob/living/carbon/removed_from) +/obj/item/organ/brain/psyker/on_mob_remove(mob/living/carbon/removed_from) . = ..() qdel(removed_from.GetComponent(/datum/component/echolocation)) qdel(removed_from.GetComponent(/datum/component/anti_magic)) -/obj/item/organ/internal/brain/psyker/on_life(seconds_per_tick, times_fired) +/obj/item/organ/brain/psyker/on_life(seconds_per_tick, times_fired) . = ..() var/obj/item/bodypart/head/psyker/psyker_head = owner.get_bodypart(zone) if(istype(psyker_head)) @@ -72,15 +72,15 @@ /// Proc with no side effects that turns someone into a psyker. returns FALSE if it could not psykerize. /mob/living/carbon/human/proc/psykerize() var/obj/item/bodypart/head/old_head = get_bodypart(BODY_ZONE_HEAD) - var/obj/item/organ/internal/brain/old_brain = get_organ_slot(ORGAN_SLOT_BRAIN) - var/obj/item/organ/internal/old_eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/brain/old_brain = get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/old_eyes = get_organ_slot(ORGAN_SLOT_EYES) if(stat == DEAD || !old_head || !old_brain) return FALSE var/obj/item/bodypart/head/psyker/psyker_head = new() if(!psyker_head.replace_limb(src, special = TRUE)) return FALSE qdel(old_head) - var/obj/item/organ/internal/brain/psyker/psyker_brain = new() + var/obj/item/organ/brain/psyker/psyker_brain = new() old_brain.before_organ_replacement(psyker_brain) old_brain.Remove(src, special = TRUE, movement_flags = NO_ID_TRANSFER) qdel(old_brain) diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index b1c055ec9bddb..58209cac74ae5 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -169,7 +169,7 @@ //first we determine if we can charge them var/did_we_charge = FALSE - var/obj/item/organ/internal/stomach/ethereal/eth_stomach = blessed.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/eth_stomach = blessed.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(eth_stomach)) eth_stomach.adjust_charge(0.06 * STANDARD_CELL_CHARGE) did_we_charge = TRUE diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index b54c4e09b2951..cd0fabba84974 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -132,31 +132,31 @@ list( // Arms list( - /obj/item/organ/internal/cyberimp/arm/combat = 1, - /obj/item/organ/internal/cyberimp/arm/surgery = 1000000, - /obj/item/organ/internal/cyberimp/arm/toolset = 1500000, + /obj/item/organ/cyberimp/arm/combat = 1, + /obj/item/organ/cyberimp/arm/surgery = 1000000, + /obj/item/organ/cyberimp/arm/toolset = 1500000, ) = 15, // Eyes list( - /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic = 1, - /obj/item/organ/internal/cyberimp/eyes/hud/medical = 1, - /obj/item/organ/internal/eyes/robotic/glow = 1, - /obj/item/organ/internal/eyes/robotic/shield = 2, + /obj/item/organ/cyberimp/eyes/hud/diagnostic = 1, + /obj/item/organ/cyberimp/eyes/hud/medical = 1, + /obj/item/organ/eyes/robotic/glow = 1, + /obj/item/organ/eyes/robotic/shield = 2, ) = 15, // Chest list( - /obj/item/organ/internal/cyberimp/chest/reviver = 1, - /obj/item/organ/internal/cyberimp/chest/thrusters = 2, + /obj/item/organ/cyberimp/chest/reviver = 1, + /obj/item/organ/cyberimp/chest/thrusters = 2, ) = 9, // Brain / Head list( - /obj/item/organ/internal/cyberimp/brain/anti_drop = 50, - /obj/item/organ/internal/cyberimp/brain/connector = 50, - /obj/item/organ/internal/cyberimp/brain/anti_stun = 10, + /obj/item/organ/cyberimp/brain/anti_drop = 50, + /obj/item/organ/cyberimp/brain/connector = 50, + /obj/item/organ/cyberimp/brain/anti_stun = 10, ) = 10, // Misc list( - /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 1, + /obj/item/organ/cyberimp/mouth/breathing_tube = 1, ) = 5, ) ) @@ -264,7 +264,7 @@ if(!HAS_TRAIT_FROM(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation")) to_chat(user, span_warning("You need to adapt to maintenance first.")) return FALSE - var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/adapted = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/night_vision/maintenance_adapted/adapted = user.get_organ_slot(ORGAN_SLOT_EYES) if(adapted && istype(adapted)) to_chat(user, span_warning("Your eyes are already adapted!")) return FALSE @@ -272,12 +272,12 @@ /datum/religion_rites/adapted_eyes/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool) ..() - var/obj/item/organ/internal/eyes/oldeyes = user.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/oldeyes = user.get_organ_slot(ORGAN_SLOT_EYES) to_chat(user, span_warning("You feel your eyes adapt to the darkness!")) if(oldeyes) oldeyes.Remove(user, special = TRUE) qdel(oldeyes)//eh - var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/neweyes = new + var/obj/item/organ/eyes/night_vision/maintenance_adapted/neweyes = new neweyes.Insert(user, special = TRUE) /datum/religion_rites/adapted_food diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index ef8c762acd7f4..53309d39c7dfd 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -41,7 +41,7 @@ id = "heart" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 30) - build_path = /obj/item/organ/internal/heart + build_path = /obj/item/organ/heart category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/lungs @@ -49,7 +49,7 @@ id = "lungs" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/internal/lungs + build_path = /obj/item/organ/lungs category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/liver @@ -57,7 +57,7 @@ id = "liver" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/internal/liver + build_path = /obj/item/organ/liver category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/stomach @@ -65,7 +65,7 @@ id = "stomach" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 15) - build_path = /obj/item/organ/internal/stomach + build_path = /obj/item/organ/stomach category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/appendix @@ -73,7 +73,7 @@ id = "appendix" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 5) //why would you need this - build_path = /obj/item/organ/internal/appendix + build_path = /obj/item/organ/appendix category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/eyes @@ -81,7 +81,7 @@ id = "eyes" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) - build_path = /obj/item/organ/internal/eyes + build_path = /obj/item/organ/eyes category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/ears @@ -89,7 +89,7 @@ id = "ears" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) - build_path = /obj/item/organ/internal/ears + build_path = /obj/item/organ/ears category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) /datum/design/tongue @@ -97,7 +97,7 @@ id = "tongue" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) - build_path = /obj/item/organ/internal/tongue + build_path = /obj/item/organ/tongue category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL) // Grows a fake lizard tail - not usable in lizard wine and other similar recipes. @@ -106,7 +106,7 @@ id = "liztail" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/external/tail/lizard/fake + build_path = /obj/item/organ/tail/lizard/fake category = list(SPECIES_LIZARD) /datum/design/lizard_tongue @@ -114,7 +114,7 @@ id = "liztongue" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/internal/tongue/lizard + build_path = /obj/item/organ/tongue/lizard category = list(SPECIES_LIZARD) /datum/design/monkey_tail @@ -122,7 +122,7 @@ id = "monkeytail" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/external/tail/monkey + build_path = /obj/item/organ/tail/monkey category = list(RND_CATEGORY_LIMBS_OTHER, RND_CATEGORY_INITIAL) /datum/design/cat_tail @@ -130,7 +130,7 @@ id = "cattail" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/external/tail/cat + build_path = /obj/item/organ/tail/cat category = list(SPECIES_HUMAN) /datum/design/cat_ears @@ -138,7 +138,7 @@ id = "catears" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) - build_path = /obj/item/organ/internal/ears/cat + build_path = /obj/item/organ/ears/cat category = list(SPECIES_HUMAN) /datum/design/plasmaman_lungs @@ -146,7 +146,7 @@ id = "plasmamanlungs" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) - build_path = /obj/item/organ/internal/lungs/plasmaman + build_path = /obj/item/organ/lungs/plasmaman category = list(SPECIES_PLASMAMAN) /datum/design/plasmaman_tongue @@ -154,7 +154,7 @@ id = "plasmamantongue" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) - build_path = /obj/item/organ/internal/tongue/bone/plasmaman + build_path = /obj/item/organ/tongue/bone/plasmaman category = list(SPECIES_PLASMAMAN) /datum/design/plasmaman_liver @@ -162,7 +162,7 @@ id = "plasmamanliver" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) - build_path = /obj/item/organ/internal/liver/bone/plasmaman + build_path = /obj/item/organ/liver/bone/plasmaman category = list(SPECIES_PLASMAMAN) /datum/design/plasmaman_stomach @@ -170,7 +170,7 @@ id = "plasmamanstomach" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) - build_path = /obj/item/organ/internal/stomach/bone/plasmaman + build_path = /obj/item/organ/stomach/bone/plasmaman category = list(SPECIES_PLASMAMAN) /datum/design/ethereal_stomach @@ -178,7 +178,7 @@ id = "etherealstomach" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) - build_path = /obj/item/organ/internal/stomach/ethereal + build_path = /obj/item/organ/stomach/ethereal category = list(SPECIES_ETHEREAL) /datum/design/ethereal_tongue @@ -186,7 +186,7 @@ id = "etherealtongue" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) - build_path = /obj/item/organ/internal/tongue/ethereal + build_path = /obj/item/organ/tongue/ethereal category = list(SPECIES_ETHEREAL) /datum/design/ethereal_lungs @@ -194,7 +194,7 @@ id = "ethereallungs" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) - build_path = /obj/item/organ/internal/lungs/ethereal + build_path = /obj/item/organ/lungs/ethereal category = list(SPECIES_ETHEREAL) // Intentionally not growable by normal means - for balance conerns. @@ -203,7 +203,7 @@ id = "etherealheart" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) - build_path = /obj/item/organ/internal/heart/ethereal + build_path = /obj/item/organ/heart/ethereal category = list(SPECIES_ETHEREAL) /datum/design/armblade diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index c34411fff61cb..d55c1a6f24373 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -392,7 +392,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 3.5 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*2.5) - build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube + build_path = /obj/item/organ/cyberimp/mouth/breathing_tube category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH ) @@ -409,7 +409,7 @@ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) construction_time = 2 SECONDS - build_path = /obj/item/organ/internal/cyberimp/arm/surgery + build_path = /obj/item/organ/cyberimp/arm/surgery category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -426,7 +426,7 @@ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) construction_time = 2 SECONDS - build_path = /obj/item/organ/internal/cyberimp/arm/toolset + build_path = /obj/item/organ/cyberimp/arm/toolset category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -444,7 +444,7 @@ /datum/material/silver =SMALL_MATERIAL_AMOUNT*5, /datum/material/gold =SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical + build_path = /obj/item/organ/cyberimp/eyes/hud/medical category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -462,7 +462,7 @@ /datum/material/silver = SMALL_MATERIAL_AMOUNT*7.5, /datum/material/gold = SMALL_MATERIAL_AMOUNT*7.5, ) - build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security + build_path = /obj/item/organ/cyberimp/eyes/hud/security category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -480,7 +480,7 @@ /datum/material/silver = SMALL_MATERIAL_AMOUNT*6, /datum/material/gold = SMALL_MATERIAL_AMOUNT*6, ) - build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic + build_path = /obj/item/organ/cyberimp/eyes/hud/diagnostic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -502,7 +502,7 @@ /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/organ/internal/eyes/robotic/xray + build_path = /obj/item/organ/eyes/robotic/xray category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT ) @@ -511,7 +511,7 @@ /datum/design/cyberimp_xray/moth name = "Moth X-ray Eyes" id = "ci-xray-moth" - build_path = /obj/item/organ/internal/eyes/robotic/xray/moth + build_path = /obj/item/organ/eyes/robotic/xray/moth /datum/design/cyberimp_thermals name = "Thermal Eyes" @@ -527,7 +527,7 @@ /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/organ/internal/eyes/robotic/thermals + build_path = /obj/item/organ/eyes/robotic/thermals category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT ) @@ -536,7 +536,7 @@ /datum/design/cyberimp_thermals/moth name = "Moth Thermal Eyes" id = "ci-thermals-moth" - build_path = /obj/item/organ/internal/eyes/robotic/thermals/moth + build_path = /obj/item/organ/eyes/robotic/thermals/moth /datum/design/cyberimp_antidrop name = "Anti-Drop Implant" @@ -550,7 +550,7 @@ /datum/material/silver = SMALL_MATERIAL_AMOUNT*4, /datum/material/gold = SMALL_MATERIAL_AMOUNT*4, ) - build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop + build_path = /obj/item/organ/cyberimp/brain/anti_drop category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT ) @@ -568,7 +568,7 @@ /datum/material/silver =SMALL_MATERIAL_AMOUNT*5, /datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun + build_path = /obj/item/organ/cyberimp/brain/anti_stun category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT ) @@ -586,7 +586,7 @@ /datum/material/gold=SMALL_MATERIAL_AMOUNT*3, /datum/material/diamond =SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/cyberimp/chest/spine + build_path = /obj/item/organ/cyberimp/chest/spine category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH ) @@ -603,7 +603,7 @@ /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, /datum/material/titanium = SMALL_MATERIAL_AMOUNT*3, ) - build_path = /obj/item/organ/internal/cyberimp/brain/connector + build_path = /obj/item/organ/cyberimp/brain/connector category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC ) @@ -620,7 +620,7 @@ /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/gold =SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/cyberimp/chest/nutriment + build_path = /obj/item/organ/cyberimp/chest/nutriment category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH ) @@ -638,7 +638,7 @@ /datum/material/gold =SMALL_MATERIAL_AMOUNT*5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT*7.5, ) - build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus + build_path = /obj/item/organ/cyberimp/chest/nutriment/plus category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH ) @@ -656,7 +656,7 @@ /datum/material/gold =SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium =SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/cyberimp/chest/reviver + build_path = /obj/item/organ/cyberimp/chest/reviver category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH ) @@ -674,7 +674,7 @@ /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond =HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/organ/internal/cyberimp/chest/thrusters + build_path = /obj/item/organ/cyberimp/chest/thrusters category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -789,7 +789,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/liver/cybernetic + build_path = /obj/item/organ/liver/cybernetic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -800,7 +800,7 @@ desc = "A cybernetic liver." id = "cybernetic_liver_tier2" materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/liver/cybernetic/tier2 + build_path = /obj/item/organ/liver/cybernetic/tier2 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -812,7 +812,7 @@ id = "cybernetic_liver_tier3" construction_time = 5 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/liver/cybernetic/tier3 + build_path = /obj/item/organ/liver/cybernetic/tier3 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -825,7 +825,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/heart/cybernetic + build_path = /obj/item/organ/heart/cybernetic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -836,7 +836,7 @@ desc = "A cybernetic heart." id = "cybernetic_heart_tier2" materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/heart/cybernetic/tier2 + build_path = /obj/item/organ/heart/cybernetic/tier2 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -848,7 +848,7 @@ id = "cybernetic_heart_tier3" construction_time = 5 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/heart/cybernetic/tier3 + build_path = /obj/item/organ/heart/cybernetic/tier3 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -865,7 +865,7 @@ /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/organ/internal/heart/cybernetic/anomalock + build_path = /obj/item/organ/heart/cybernetic/anomalock category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE ) @@ -878,7 +878,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/lungs/cybernetic + build_path = /obj/item/organ/lungs/cybernetic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -889,7 +889,7 @@ desc = "A pair of cybernetic lungs." id = "cybernetic_lungs_tier2" materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/lungs/cybernetic/tier2 + build_path = /obj/item/organ/lungs/cybernetic/tier2 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -901,7 +901,7 @@ id = "cybernetic_lungs_tier3" construction_time = 5 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/lungs/cybernetic/tier3 + build_path = /obj/item/organ/lungs/cybernetic/tier3 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -914,7 +914,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/stomach/cybernetic + build_path = /obj/item/organ/stomach/cybernetic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -925,7 +925,7 @@ desc = "A cybernetic stomach." id = "cybernetic_stomach_tier2" materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/stomach/cybernetic/tier2 + build_path = /obj/item/organ/stomach/cybernetic/tier2 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -937,7 +937,7 @@ id = "cybernetic_stomach_tier3" construction_time = 5 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/organ/internal/stomach/cybernetic/tier3 + build_path = /obj/item/organ/stomach/cybernetic/tier3 category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -950,7 +950,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 3 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) - build_path = /obj/item/organ/internal/ears/cybernetic + build_path = /obj/item/organ/ears/cybernetic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -967,7 +967,7 @@ /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/ears/cybernetic/upgraded + build_path = /obj/item/organ/ears/cybernetic/upgraded category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -984,7 +984,7 @@ /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/ears/cybernetic/whisper + build_path = /obj/item/organ/ears/cybernetic/whisper category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -1001,7 +1001,7 @@ /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, ) - build_path = /obj/item/organ/internal/ears/cybernetic/xray + build_path = /obj/item/organ/ears/cybernetic/xray category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -1014,7 +1014,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 3 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) - build_path = /obj/item/organ/internal/eyes/robotic/basic + build_path = /obj/item/organ/eyes/robotic/basic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 ) @@ -1023,13 +1023,13 @@ /datum/design/cybernetic_eyes/moth name = "Basic Cybernetic Moth Eyes" id = "cybernetic_eyes_moth" - build_path = /obj/item/organ/internal/eyes/robotic/basic/moth + build_path = /obj/item/organ/eyes/robotic/basic/moth /datum/design/cybernetic_eyes/improved name = "Cybernetic Eyes" desc = "A pair of cybernetic eyes." id = "cybernetic_eyes_improved" - build_path = /obj/item/organ/internal/eyes/robotic + build_path = /obj/item/organ/eyes/robotic category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2 ) @@ -1038,7 +1038,7 @@ /datum/design/cybernetic_eyes/improved/moth name = "Cybernetic Moth Eyes" id = "cybernetic_eyes_improved_moth" - build_path = /obj/item/organ/internal/eyes/robotic/moth + build_path = /obj/item/organ/eyes/robotic/moth /datum/design/cyberimp_welding name = "Welding Shield Eyes" @@ -1047,7 +1047,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) - build_path = /obj/item/organ/internal/eyes/robotic/shield + build_path = /obj/item/organ/eyes/robotic/shield category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -1056,7 +1056,7 @@ /datum/design/cyberimp_welding/moth name = "Welding Shield Moth Eyes" id = "ci-welding-moth" - build_path = /obj/item/organ/internal/eyes/robotic/shield/moth + build_path = /obj/item/organ/eyes/robotic/shield/moth /datum/design/cyberimp_gloweyes name = "Luminescent Eyes" @@ -1065,7 +1065,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/organ/internal/eyes/robotic/glow + build_path = /obj/item/organ/eyes/robotic/glow category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 ) @@ -1074,7 +1074,7 @@ /datum/design/cyberimp_gloweyes/moth name = "Luminescent Moth Eyes" id = "ci-gloweyes-moth" - build_path = /obj/item/organ/internal/eyes/robotic/glow/moth + build_path = /obj/item/organ/eyes/robotic/glow/moth ///////////////////// ///Surgery Designs/// diff --git a/code/modules/spells/spell_types/self/lichdom.dm b/code/modules/spells/spell_types/self/lichdom.dm index 19ad55d9eee45..8aa86d63a1b48 100644 --- a/code/modules/spells/spell_types/self/lichdom.dm +++ b/code/modules/spells/spell_types/self/lichdom.dm @@ -62,7 +62,7 @@ if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on - var/obj/item/organ/internal/brain/lich_brain = carbon_cast_on.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/lich_brain = carbon_cast_on.get_organ_slot(ORGAN_SLOT_BRAIN) if(lich_brain) // This prevents MMIs being used to stop lich revives lich_brain.organ_flags &= ~ORGAN_VITAL lich_brain.decoy_override = TRUE diff --git a/code/modules/station_goals/vault_mutation.dm b/code/modules/station_goals/vault_mutation.dm index c5a77c62775ba..80e539472b343 100644 --- a/code/modules/station_goals/vault_mutation.dm +++ b/code/modules/station_goals/vault_mutation.dm @@ -109,7 +109,7 @@ /datum/mutation/human/plasmocile/on_acquiring(mob/living/carbon/human/acquirer) . = ..() - var/obj/item/organ/internal/lungs/improved_lungs = acquirer.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/improved_lungs = acquirer.get_organ_slot(ORGAN_SLOT_LUNGS) ADD_TRAIT(owner, TRAIT_VIRUSIMMUNE, GENETIC_MUTATION) if(improved_lungs) apply_buff(improved_lungs) @@ -118,7 +118,7 @@ /datum/mutation/human/plasmocile/on_losing(mob/living/carbon/human/owner) . = ..() - var/obj/item/organ/internal/lungs/improved_lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/improved_lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS) REMOVE_TRAIT(owner, TRAIT_VIRUSIMMUNE, GENETIC_MUTATION) UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) @@ -128,20 +128,20 @@ /datum/mutation/human/plasmocile/proc/remove_modification(mob/source, obj/item/organ/old_organ) SIGNAL_HANDLER - if(istype(old_organ, /obj/item/organ/internal/lungs)) + if(istype(old_organ, /obj/item/organ/lungs)) remove_buff(old_organ) /datum/mutation/human/plasmocile/proc/reapply_modification(mob/source, obj/item/organ/new_organ) SIGNAL_HANDLER - if(istype(new_organ, /obj/item/organ/internal/lungs)) + if(istype(new_organ, /obj/item/organ/lungs)) apply_buff(new_organ) -/datum/mutation/human/plasmocile/proc/apply_buff(obj/item/organ/internal/lungs/our_lungs) +/datum/mutation/human/plasmocile/proc/apply_buff(obj/item/organ/lungs/our_lungs) our_lungs.plas_breath_dam_min *= 0 our_lungs.plas_breath_dam_max *= 0 -/datum/mutation/human/plasmocile/proc/remove_buff(obj/item/organ/internal/lungs/our_lungs) +/datum/mutation/human/plasmocile/proc/remove_buff(obj/item/organ/lungs/our_lungs) our_lungs.plas_breath_dam_min = initial(our_lungs.plas_breath_dam_min) our_lungs.plas_breath_dam_max = initial(our_lungs.plas_breath_dam_max) diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm index 2e20f0906acdd..cd7d55f664c47 100644 --- a/code/modules/surgery/advanced/bioware/cortex_folding.dm +++ b/code/modules/surgery/advanced/bioware/cortex_folding.dm @@ -30,7 +30,7 @@ ) /datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return ..() diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm index 27a75a261674d..4f65f305df36a 100644 --- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm +++ b/code/modules/surgery/advanced/bioware/cortex_imprint.dm @@ -31,7 +31,7 @@ ) /datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return ..() diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 402a9aa73e19f..fe2af113f4d12 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -35,7 +35,7 @@ /datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index 5c528acae52fc..cd433d559819a 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -28,7 +28,7 @@ . = ..() if(!.) return FALSE - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE @@ -102,7 +102,7 @@ return ..() /datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(target_brain) display_results( user, diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm index 63350139e07bd..a4512e9378e42 100644 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ b/code/modules/surgery/advanced/necrotic_revival.dm @@ -13,7 +13,7 @@ /datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target) . = ..() - var/obj/item/organ/internal/zombie_infection/z_infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE) + var/obj/item/organ/zombie_infection/z_infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE) if(z_infection) return FALSE @@ -46,6 +46,6 @@ ) display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") if(!target.get_organ_slot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/internal/zombie_infection/z_infection = new() + var/obj/item/organ/zombie_infection/z_infection = new() z_infection.Insert(target) return ..() diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm index 6c2d990cb9624..899bd6a436ce8 100644 --- a/code/modules/surgery/advanced/pacification.dm +++ b/code/modules/surgery/advanced/pacification.dm @@ -26,7 +26,7 @@ /datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target) . = ..() - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm index 21e34efc2d76d..a3931dd4e5e96 100644 --- a/code/modules/surgery/advanced/wingreconstruction.dm +++ b/code/modules/surgery/advanced/wingreconstruction.dm @@ -12,8 +12,8 @@ /datum/surgery/advanced/wing_reconstruction/can_start(mob/user, mob/living/carbon/target) if(!istype(target)) return FALSE - var/obj/item/organ/external/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(!istype(wings, /obj/item/organ/external/wings/moth)) + var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + if(!istype(wings, /obj/item/organ/wings/moth)) return FALSE return ..() && wings?.burnt @@ -48,11 +48,11 @@ span_notice("[user] completes the surgery on [target]'s wings."), ) display_pain(target, "You can feel your wings again!") - var/obj/item/organ/external/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) - if(istype(wings, /obj/item/organ/external/wings/moth)) //make sure we only heal moth wings. + var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + if(istype(wings, /obj/item/organ/wings/moth)) //make sure we only heal moth wings. wings.heal_wings(user, ALL) - var/obj/item/organ/external/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too + var/obj/item/organ/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too antennae?.heal_antennae(user, ALL) human_target.update_body_parts() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 30c841147a708..0f1a5203ea5bf 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -113,7 +113,7 @@ /obj/item/bodypart/head/examine(mob/user) . = ..() if(show_organs_on_examine && IS_ORGANIC_LIMB(src)) - var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src + var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in src if(!brain) . += span_info("The brain has been removed from [src].") else if(brain.suicided || (brain.brainmob && HAS_TRAIT(brain.brainmob, TRAIT_SUICIDED))) @@ -130,13 +130,13 @@ else . += span_info("It's completely lifeless.") - if(!(locate(/obj/item/organ/internal/eyes) in src)) + if(!(locate(/obj/item/organ/eyes) in src)) . += span_info("[real_name]'s eyes have been removed.") - if(!(locate(/obj/item/organ/internal/ears) in src)) + if(!(locate(/obj/item/organ/ears) in src)) . += span_info("[real_name]'s ears have been removed.") - if(!(locate(/obj/item/organ/internal/tongue) in src)) + if(!(locate(/obj/item/organ/tongue) in src)) . += span_info("[real_name]'s tongue has been removed.") /obj/item/bodypart/head/can_dismember(obj/item/item) @@ -151,7 +151,7 @@ /obj/item/bodypart/head/drop_organs(mob/user, violent_removal) if(user) user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain.")) - var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src + var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in src if(brain && violent_removal && prob(90)) //ghetto surgery can damage the brain. to_chat(user, span_warning("[brain] was damaged in the process!")) brain.set_organ_damage(brain.maxHealth) @@ -176,7 +176,7 @@ . += get_hair_and_lips_icon(dropped) // We need to get the eyes if we are dropped (ugh) if(dropped) - var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in src + var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in src // This is a bit of copy/paste code from eyes.dm:generate_body_overlay if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES)) var/image/eye_left = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH) diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 861076e184b7c..3dcd42d61c9fb 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -37,12 +37,12 @@ else show_eyeless = FALSE else - if(!hair_hidden && !(locate(/obj/item/organ/internal/brain) in src)) + if(!hair_hidden && !(locate(/obj/item/organ/brain) in src)) show_debrained = TRUE else show_debrained = FALSE - if(!(locate(/obj/item/organ/internal/eyes) in src)) + if(!(locate(/obj/item/organ/eyes) in src)) show_eyeless = TRUE else show_eyeless = FALSE diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index c94bd0db701f4..25f66f40af9a8 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -35,7 +35,7 @@ /// Offset to apply to equipment worn on the neck var/datum/worn_feature_offset/worn_neck_offset /// Which functional (i.e. flightpotion) wing types (if any) does this bodypart support? If count is >1 a radial menu is used to choose between all icons in list - var/list/wing_types = list(/obj/item/organ/external/wings/functional/angel) + var/list/wing_types = list(/obj/item/organ/wings/functional/angel) /obj/item/bodypart/chest/forced_removal(dismembered, special, move_to_floor) var/mob/living/carbon/old_owner = owner @@ -74,7 +74,7 @@ if(!ishuman(owner)) return null var/mob/living/carbon/human/human_owner = owner - var/obj/item/organ/external/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(tail) return tail.get_butt_sprite() diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 738b3ce97ac3b..d9e25302ad7c1 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -212,7 +212,7 @@ robotic_emp_paralyze_damage_percent_threshold = 0.6 - wing_types = list(/obj/item/organ/external/wings/functional/robotic) + wing_types = list(/obj/item/organ/wings/functional/robotic) var/wired = FALSE var/obj/item/stock_parts/power_store/cell = null diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index c5cc96c31377f..4d67622818f1b 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -10,7 +10,7 @@ icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD is_dimorphic = TRUE - wing_types = list(/obj/item/organ/external/wings/functional/dragon) + wing_types = list(/obj/item/organ/wings/functional/dragon) /obj/item/bodypart/chest/lizard/get_butt_sprite() return icon('icons/mob/butts.dmi', BUTT_SPRITE_LIZARD) diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 0422b4a77fb81..08b22373d32ae 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -96,7 +96,7 @@ is_dimorphic = TRUE dmg_overlay_type = null burn_modifier = 0.5 // = 1/2x generic burn damage - wing_types = list(/obj/item/organ/external/wings/functional/slime) + wing_types = list(/obj/item/organ/wings/functional/slime) /obj/item/bodypart/chest/jelly/get_butt_sprite() return icon('icons/mob/butts.dmi', BUTT_SPRITE_SLIME) @@ -260,7 +260,7 @@ limb_id = SPECIES_FLYPERSON is_dimorphic = TRUE should_draw_greyscale = FALSE - wing_types = list(/obj/item/organ/external/wings/functional/fly) + wing_types = list(/obj/item/organ/wings/functional/fly) bodypart_traits = list(TRAIT_TACKLING_FRAIL_ATTACKER) /obj/item/bodypart/arm/left/fly @@ -337,7 +337,7 @@ should_draw_greyscale = FALSE dmg_overlay_type = null bodypart_flags = BODYPART_UNHUSKABLE - wing_types = list(/obj/item/organ/external/wings/functional/skeleton) + wing_types = list(/obj/item/organ/wings/functional/skeleton) /obj/item/bodypart/arm/left/skeleton biological_state = (BIO_BONE|BIO_JOINTED) diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm index 6761fa6751a5d..080201c9fab9e 100644 --- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm @@ -16,7 +16,7 @@ limb_id = SPECIES_MOTH is_dimorphic = TRUE should_draw_greyscale = FALSE - wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra) + wing_types = list(/obj/item/organ/wings/functional/moth/megamoth, /obj/item/organ/wings/functional/moth/mothra) bodypart_traits = list(TRAIT_TACKLING_WINGED_ATTACKER) /obj/item/bodypart/chest/moth/get_butt_sprite() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index c2cc3f551acd2..1c5012d7580b9 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -26,7 +26,7 @@ ) /datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) if(isnull(target_heart) || target_heart.damage < 60 || target_heart.operated) return FALSE return ..() @@ -134,7 +134,7 @@ /datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) target.setOrganLoss(ORGAN_SLOT_HEART, 60) - var/obj/item/organ/internal/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART) if(target_heart) //slightly worrying if we lost our heart mid-operation, but that's life target_heart.operated = TRUE if(target_heart.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that diff --git a/code/modules/surgery/ear_surgery.dm b/code/modules/surgery/ear_surgery.dm index 4333b00913ba3..9e363e2ae9b23 100644 --- a/code/modules/surgery/ear_surgery.dm +++ b/code/modules/surgery/ear_surgery.dm @@ -36,7 +36,7 @@ display_pain(target, "You feel a dizzying pain in your head!") /datum/surgery_step/fix_ears/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/organ/internal/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS) display_results( user, target, @@ -50,7 +50,7 @@ return ..() /datum/surgery_step/fix_ears/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_by_type(/obj/item/organ/internal/brain)) + if(target.get_organ_by_type(/obj/item/organ/brain)) display_results( user, target, diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index fb759baca8771..3a0f71400917b 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -34,7 +34,7 @@ display_pain(target, "You feel a stabbing pain in your eyes!") /datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/organ/internal/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES) user.visible_message(span_notice("[user] successfully fixes [target]'s eyes!"), span_notice("You succeed in fixing [target]'s eyes.")) display_results( user, @@ -50,7 +50,7 @@ return ..() /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.get_organ_by_type(/obj/item/organ/internal/brain)) + if(target.get_organ_by_type(/obj/item/organ/brain)) display_results( user, target, diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm index b72e01d0ecf7d..d09933f303fed 100644 --- a/code/modules/surgery/gastrectomy.dm +++ b/code/modules/surgery/gastrectomy.dm @@ -27,7 +27,7 @@ ) /datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) if(isnull(target_stomach) || target_stomach.damage < 50 || target_stomach.operated) return FALSE return ..() @@ -70,7 +70,7 @@ /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 - var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) target_human.setOrganLoss(ORGAN_SLOT_STOMACH, 20) // Stomachs have a threshold for being able to even digest food, so I might tweak this number if(target_stomach) target_stomach.operated = TRUE diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index c0d94abb69a99..82921c3f2752e 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -26,7 +26,7 @@ ) /datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) if(isnull(target_liver) || target_liver.damage < 50 || target_liver.operated) return FALSE return ..() @@ -69,7 +69,7 @@ /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 - var/obj/item/organ/internal/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER) human_target.setOrganLoss(ORGAN_SLOT_LIVER, 10) //not bad, not great if(target_liver) target_liver.operated = TRUE diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 85a963953c68e..e0988c8376c87 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -24,7 +24,7 @@ ) /datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS) if(isnull(target_lungs) || target_lungs.damage < 60 || target_lungs.operated) return FALSE return ..() @@ -67,7 +67,7 @@ /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)) var/mob/living/carbon/human/human_target = target - var/obj/item/organ/internal/lungs/target_lungs = human_target.get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/target_lungs = human_target.get_organ_slot(ORGAN_SLOT_LUNGS) human_target.setOrganLoss(ORGAN_SLOT_LUNGS, 60) if(target_lungs) target_lungs.operated = TRUE diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 84edc783af7a9..a5f4a0505f6fd 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -305,7 +305,7 @@ ///only operate on internal organs /datum/surgery_step/manipulate_organs/internal/can_use_organ(mob/user, obj/item/organ/organ) - return isinternalorgan(organ) + return !(organ.organ_flags & ORGAN_EXTERNAL) ///prosthetic surgery gives full effectiveness to crowbars (and hemostats) /datum/surgery_step/manipulate_organs/internal/mechanic @@ -319,7 +319,7 @@ ///Only operate on external organs /datum/surgery_step/manipulate_organs/external/can_use_organ(mob/user, obj/item/organ/organ) - return isexternalorgan(organ) + return (organ.organ_flags & ORGAN_EXTERNAL) ///prosthetic surgery gives full effectiveness to crowbars (and hemostats) /datum/surgery_step/manipulate_organs/external/mechanic diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 4d5114ad88a7e..e2f05a9ed5610 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -249,20 +249,20 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) set_heartattack(FALSE) // Ears have aditional vаr "deaf", need to update it too - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) ears?.adjustEarDamage(0, -INFINITY) // full heal ears deafness return // Default organ fixing handling // May result in kinda cursed stuff for mobs which don't need these organs - var/obj/item/organ/internal/lungs/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/lungs/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) if(!lungs) lungs = new() lungs.Insert(src) lungs.set_organ_damage(0) - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) + var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) if(heart) set_heartattack(FALSE) else @@ -270,19 +270,19 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) heart.Insert(src) heart.set_organ_damage(0) - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) if(!tongue) tongue = new() tongue.Insert(src) tongue.set_organ_damage(0) - var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES) if(!eyes) eyes = new() eyes.Insert(src) eyes.set_organ_damage(0) - var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS) if(!ears) ears = new() ears.Insert(src) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 59107666bfde5..296b40beea94a 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -140,7 +140,7 @@ name = "autosurgeon" desc = "A single use autosurgeon that contains a medical heads-up display augment. A screwdriver can be used to remove it, but implants can't be placed back in." uses = 1 - starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/medical + starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical /obj/item/autosurgeon/syndicate @@ -156,28 +156,28 @@ /obj/item/autosurgeon/syndicate/laser_arm desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in." uses = 1 - starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser + starting_organ = /obj/item/organ/cyberimp/arm/gun/laser /obj/item/autosurgeon/syndicate/thermal_eyes - starting_organ = /obj/item/organ/internal/eyes/robotic/thermals + starting_organ = /obj/item/organ/eyes/robotic/thermals /obj/item/autosurgeon/syndicate/thermal_eyes/single_use uses = 1 /obj/item/autosurgeon/syndicate/xray_eyes - starting_organ = /obj/item/organ/internal/eyes/robotic/xray + starting_organ = /obj/item/organ/eyes/robotic/xray /obj/item/autosurgeon/syndicate/xray_eyes/single_use uses = 1 /obj/item/autosurgeon/syndicate/anti_stun - starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun + starting_organ = /obj/item/organ/cyberimp/brain/anti_stun /obj/item/autosurgeon/syndicate/anti_stun/single_use uses = 1 /obj/item/autosurgeon/syndicate/reviver - starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver + starting_organ = /obj/item/organ/cyberimp/chest/reviver /obj/item/autosurgeon/syndicate/reviver/single_use uses = 1 @@ -185,14 +185,14 @@ /obj/item/autosurgeon/syndicate/commsagent desc = "A device that automatically - painfully - inserts an implant. It seems someone's specially \ modified this one to only insert... tongues. Horrifying." - starting_organ = /obj/item/organ/internal/tongue + starting_organ = /obj/item/organ/tongue /obj/item/autosurgeon/syndicate/commsagent/Initialize(mapload) . = ..() - organ_whitelist += /obj/item/organ/internal/tongue + organ_whitelist += /obj/item/organ/tongue /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset - starting_organ = /obj/item/organ/internal/cyberimp/arm/surgery/emagged + starting_organ = /obj/item/organ/cyberimp/arm/surgery/emagged /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset/single_use uses = 1 @@ -200,4 +200,4 @@ /obj/item/autosurgeon/syndicate/contraband_sechud desc = "Contains a contraband SecHUD implant, undetectable by health scanners." uses = 1 - starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate + starting_organ = /obj/item/organ/cyberimp/eyes/hud/security/syndicate diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 024756b6e098a..0b01a174d096e 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -100,7 +100,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times . += bodypart_overlay.get_overlay(external_layer, bodypart_owner) ///The horns of a lizard! -/obj/item/organ/external/horns +/obj/item/organ/horns name = "horns" desc = "Why do lizards even have horns? Well, this one obviously doesn't." icon_state = "horns" @@ -114,9 +114,12 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay = /datum/bodypart_overlay/mutant/horns + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + /datum/bodypart_overlay/mutant/horns layers = EXTERNAL_ADJACENT feature_key = "horns" + dyable = TRUE /datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(mob/living/carbon/human/human) if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) @@ -128,7 +131,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times return SSaccessories.horns_list ///The frills of a lizard (like weird fin ears) -/obj/item/organ/external/frills +/obj/item/organ/frills name = "frills" desc = "Ear-like external organs often seen on aquatic reptillians." icon_state = "frills" @@ -142,6 +145,8 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay = /datum/bodypart_overlay/mutant/frills + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + /datum/bodypart_overlay/mutant/frills layers = EXTERNAL_ADJACENT feature_key = "frills" @@ -155,7 +160,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times return SSaccessories.frills_list ///Guess what part of the lizard this is? -/obj/item/organ/external/snout +/obj/item/organ/snout name = "lizard snout" desc = "Take a closer look at that snout!" icon_state = "snout" @@ -171,6 +176,8 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay = /datum/bodypart_overlay/mutant/snout + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + /datum/bodypart_overlay/mutant/snout layers = EXTERNAL_ADJACENT feature_key = "snout" @@ -184,7 +191,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times return SSaccessories.snouts_list ///A moth's antennae -/obj/item/organ/external/antennae +/obj/item/organ/antennae name = "moth antennae" desc = "A moths antennae. What is it telling them? What are they sensing?" icon_state = "antennae" @@ -198,24 +205,26 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay = /datum/bodypart_overlay/mutant/antennae + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + ///Are we burned? var/burnt = FALSE ///Store our old datum here for if our antennae are healed var/original_sprite_datum -/obj/item/organ/external/antennae/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/antennae/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_antennae)) RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_antennae)) -/obj/item/organ/external/antennae/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/antennae/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL)) ///check if our antennae can burn off ;_; -/obj/item/organ/external/antennae/proc/try_burn_antennae(mob/living/carbon/human/human) +/obj/item/organ/antennae/proc/try_burn_antennae(mob/living/carbon/human/human) SIGNAL_HANDLER if(!burnt && human.bodytemperature >= 800 && human.fire_stacks > 0) //do not go into the extremely hot light. you will not survive @@ -225,13 +234,13 @@ Unlike normal organs, we're actually inside a persons limbs at all times human.update_body_parts() ///Burn our antennae off ;_; -/obj/item/organ/external/antennae/proc/burn_antennae() +/obj/item/organ/antennae/proc/burn_antennae() var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay antennae.burnt = TRUE burnt = TRUE ///heal our antennae back up!! -/obj/item/organ/external/antennae/proc/heal_antennae(datum/source, heal_flags) +/obj/item/organ/antennae/proc/heal_antennae(datum/source, heal_flags) SIGNAL_HANDLER if(!burnt) @@ -246,6 +255,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/antennae layers = EXTERNAL_FRONT | EXTERNAL_BEHIND feature_key = "moth_antennae" + dyable = TRUE ///Accessory datum of the burn sprite var/datum/sprite_accessory/burn_datum = /datum/sprite_accessory/moth_antennae/burnt_off ///Are we burned? If so we draw differently @@ -268,7 +278,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times return FALSE ///The leafy hair of a podperson -/obj/item/organ/external/pod_hair +/obj/item/organ/pod_hair name = "podperson hair" desc = "Base for many-o-salads." @@ -283,10 +293,13 @@ Unlike normal organs, we're actually inside a persons limbs at all times bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + ///Podperson bodypart overlay, with special coloring functionality to render the flowers in the inverse color /datum/bodypart_overlay/mutant/pod_hair layers = EXTERNAL_FRONT|EXTERNAL_ADJACENT feature_key = "pod_hair" + dyable = TRUE ///This layer will be colored differently than the rest of the organ. So we can get differently colored flowers or something var/color_swapped_layer = EXTERNAL_FRONT @@ -300,8 +313,9 @@ Unlike normal organs, we're actually inside a persons limbs at all times if(draw_layer != bitflag_to_layer(color_swapped_layer)) return ..() - if(draw_color) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING - var/list/rgb_list = rgb2num(draw_color) + var/color_to_use = dye_color || draw_color + if(color_to_use) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING + var/list/rgb_list = rgb2num(color_to_use) overlay.color = rgb(color_inverse_base - rgb_list[1], color_inverse_base - rgb_list[2], color_inverse_base - rgb_list[3]) //inversa da color else overlay.color = null diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 214c58df09923..23c29358a0dfc 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -1,5 +1,5 @@ ///A lizards spines (those things on their back), but also including tail spines (gasp) -/obj/item/organ/external/spines +/obj/item/organ/spines name = "lizard spines" desc = "Not an actual spine, obviously." icon_state = "spines" @@ -14,15 +14,17 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/spines -/obj/item/organ/external/spines/mob_insert(mob/living/carbon/receiver, special, movement_flags) + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + +/obj/item/organ/spines/mob_insert(mob/living/carbon/receiver, special, movement_flags) // If we have a tail, attempt to add a tail spines overlay - var/obj/item/organ/external/tail/our_tail = receiver.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/our_tail = receiver.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) our_tail?.try_insert_tail_spines(our_tail.bodypart_owner) return ..() -/obj/item/organ/external/spines/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/spines/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) // If we have a tail, remove any tail spines overlay - var/obj/item/organ/external/tail/our_tail = organ_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + var/obj/item/organ/tail/our_tail = organ_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) our_tail?.remove_tail_spines(our_tail.bodypart_owner) return ..() @@ -30,6 +32,7 @@ /datum/bodypart_overlay/mutant/spines layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND feature_key = "spines" + dyable = TRUE /datum/bodypart_overlay/mutant/spines/get_global_feature_list() return SSaccessories.spines_list @@ -38,3 +41,8 @@ . = ..() if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) return FALSE + +/datum/bodypart_overlay/mutant/spines/set_dye_color(new_color, obj/item/organ/tail/organ) + var/obj/item/organ/tail/tail = organ?.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + tail?.tail_spines_overlay?.set_dye_color(new_color, organ) + return ..() diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 5c7b211db7695..8004f88a68052 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -1,5 +1,5 @@ ///Tail parent, it doesn't do very much. -/obj/item/organ/external/tail +/obj/item/organ/tail name = "tail" desc = "A severed tail. What did you cut this off of?" icon_state = "severedtail" @@ -13,6 +13,8 @@ // defaults to cat, but the parent type shouldn't be created regardless bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + ///Does this tail have a wagging sprite, and is it currently wagging? var/wag_flags = NONE ///The original owner of this tail @@ -20,7 +22,7 @@ ///The overlay for tail spines, if any var/datum/bodypart_overlay/mutant/tail_spines/tail_spines_overlay -/obj/item/organ/external/tail/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/tail/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(.) receiver.clear_mood_event("tail_lost") @@ -39,18 +41,18 @@ 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) +/obj/item/organ/tail/on_bodypart_insert(obj/item/bodypart/bodypart) + var/obj/item/organ/spines/our_spines = bodypart.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) if(our_spines) try_insert_tail_spines(bodypart) return ..() -/obj/item/organ/external/tail/on_bodypart_remove(obj/item/bodypart/bodypart) +/obj/item/organ/tail/on_bodypart_remove(obj/item/bodypart/bodypart) remove_tail_spines(bodypart) return ..() /// If the owner has spines and an appropriate overlay exists, add a tail spines overlay. -/obj/item/organ/external/tail/proc/try_insert_tail_spines(obj/item/bodypart/bodypart) +/obj/item/organ/tail/proc/try_insert_tail_spines(obj/item/bodypart/bodypart) // Don't insert another overlay if there already is one. if(tail_spines_overlay) return @@ -69,13 +71,13 @@ bodypart.add_bodypart_overlay(tail_spines_overlay) /// If we have a tail spines overlay, delete it -/obj/item/organ/external/tail/proc/remove_tail_spines(obj/item/bodypart/bodypart) +/obj/item/organ/tail/proc/remove_tail_spines(obj/item/bodypart/bodypart) if(!tail_spines_overlay) return bodypart.remove_bodypart_overlay(tail_spines_overlay) QDEL_NULL(tail_spines_overlay) -/obj/item/organ/external/tail/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/tail/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if(wag_flags & WAG_WAGGING) @@ -90,7 +92,7 @@ ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later ///Accepts an optional timeout after which we remove the tail wagging ///Returns false if the wag worked, true otherwise -/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY) +/obj/item/organ/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY) if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging return FALSE if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied @@ -108,13 +110,13 @@ RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) return TRUE -/obj/item/organ/external/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy +/obj/item/organ/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy SIGNAL_HANDLER stop_wag(organ_owner) ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later ///Returns false if the wag stopping worked, true otherwise -/obj/item/organ/external/tail/proc/stop_wag(mob/living/carbon/organ_owner) +/obj/item/organ/tail/proc/stop_wag(mob/living/carbon/organ_owner) if(!(wag_flags & WAG_ABLE)) return FALSE @@ -134,12 +136,13 @@ UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH) return succeeded -/obj/item/organ/external/tail/proc/get_butt_sprite() +/obj/item/organ/tail/proc/get_butt_sprite() return null ///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail layers = EXTERNAL_FRONT|EXTERNAL_BEHIND + dyable = TRUE var/wagging = FALSE /datum/bodypart_overlay/mutant/tail/get_base_icon_state() @@ -150,7 +153,7 @@ return FALSE return TRUE -/obj/item/organ/external/tail/cat +/obj/item/organ/tail/cat name = "tail" preference = "feature_human_tail" @@ -158,7 +161,7 @@ wag_flags = WAG_ABLE -/obj/item/organ/external/tail/cat/get_butt_sprite() +/obj/item/organ/tail/cat/get_butt_sprite() return icon('icons/mob/butts.dmi', BUTT_SPRITE_CAT) ///Cat tail bodypart overlay @@ -169,7 +172,7 @@ /datum/bodypart_overlay/mutant/tail/cat/get_global_feature_list() return SSaccessories.tails_list_felinid -/obj/item/organ/external/tail/monkey +/obj/item/organ/tail/monkey name = "monkey tail" preference = "feature_monkey_tail" @@ -185,7 +188,7 @@ /datum/bodypart_overlay/mutant/tail/monkey/get_global_feature_list() return SSaccessories.tails_list_monkey -/obj/item/organ/external/tail/lizard +/obj/item/organ/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." preference = "feature_lizard_tail" @@ -202,7 +205,7 @@ /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard -/obj/item/organ/external/tail/lizard/fake +/obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." @@ -225,3 +228,6 @@ . = ..() if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) return FALSE + +/datum/bodypart_overlay/mutant/tail_spines/set_dye_color(new_color, obj/item/organ/organ) + dye_color = new_color //no update_body_parts() call, tail/set_dye_color will do it. diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index 2b48337204a1a..63759761548d9 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -10,12 +10,12 @@ /datum/action/innate/flight/Activate() var/mob/living/carbon/human/human = owner - var/obj/item/organ/external/wings/functional/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/wings/functional/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) if(wings?.can_fly(human)) wings.toggle_flight(human) ///The true wings that you can use to fly and shit (you cant actually shit with them) -/obj/item/organ/external/wings/functional +/obj/item/organ/wings/functional ///The flight action object var/datum/action/innate/flight/fly @@ -29,29 +29,29 @@ // grind_results = list(/datum/reagent/flightpotion = 5) food_reagents = list(/datum/reagent/flightpotion = 5) -/obj/item/organ/external/wings/functional/Destroy() +/obj/item/organ/wings/functional/Destroy() QDEL_NULL(fly) return ..() -/obj/item/organ/external/wings/functional/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/wings/functional/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(QDELETED(fly)) fly = new fly.Grant(receiver) -/obj/item/organ/external/wings/functional/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/wings/functional/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() fly?.Remove(organ_owner) if(wings_open) toggle_flight(organ_owner) -/obj/item/organ/external/wings/functional/on_life(seconds_per_tick, times_fired) +/obj/item/organ/wings/functional/on_life(seconds_per_tick, times_fired) . = ..() handle_flight(owner) ///Called on_life(). Handle flight code and check if we're still flying -/obj/item/organ/external/wings/functional/proc/handle_flight(mob/living/carbon/human/human) +/obj/item/organ/wings/functional/proc/handle_flight(mob/living/carbon/human/human) if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) return FALSE if(!can_fly(human)) @@ -61,7 +61,7 @@ ///Check if we're still eligible for flight (wings covered, atmosphere too thin, etc) -/obj/item/organ/external/wings/functional/proc/can_fly(mob/living/carbon/human/human) +/obj/item/organ/wings/functional/proc/can_fly(mob/living/carbon/human/human) if(human.stat || human.body_position == LYING_DOWN || isnull(human.client)) return FALSE //Jumpsuits have tail holes, so it makes sense they have wing holes too @@ -79,7 +79,7 @@ return TRUE ///Slipping but in the air? -/obj/item/organ/external/wings/functional/proc/fly_slip(mob/living/carbon/human/human) +/obj/item/organ/wings/functional/proc/fly_slip(mob/living/carbon/human/human) var/obj/buckled_obj if(human.buckled) buckled_obj = human.buckled @@ -102,7 +102,7 @@ return TRUE ///UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly -/obj/item/organ/external/wings/functional/proc/toggle_flight(mob/living/carbon/human/human) +/obj/item/organ/wings/functional/proc/toggle_flight(mob/living/carbon/human/human) if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)) human.physiology.stun_mod *= 2 human.add_traits(list(TRAIT_NO_FLOATING_ANIM, TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT) @@ -129,7 +129,7 @@ close_wings() human.refresh_gravity() -/obj/item/organ/external/wings/functional/proc/on_client_move(mob/source, list/move_args) +/obj/item/organ/wings/functional/proc/on_client_move(mob/source, list/move_args) SIGNAL_HANDLER if (!can_fly(source)) @@ -139,7 +139,7 @@ source.newtonian_move(dir2angle(source.client.intended_direction), instant = TRUE, drift_force = FUNCTIONAL_WING_FORCE, controlled_cap = max_drift_force) source.setDir(source.client.intended_direction) -/obj/item/organ/external/wings/functional/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup) +/obj/item/organ/wings/functional/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup) SIGNAL_HANDLER if (get_dir(source, backup) == movement_dir || source.loc == backup.loc) @@ -150,7 +150,7 @@ return COMPONENT_PREVENT_SPACEMOVE_HALT -/obj/item/organ/external/wings/functional/process(seconds_per_tick) +/obj/item/organ/wings/functional/process(seconds_per_tick) if (!owner || !can_fly(owner) || isnull(owner.drift_handler)) return @@ -158,14 +158,14 @@ owner.drift_handler.stabilize_drift(owner.client.intended_direction ? dir2angle(owner.client.intended_direction) : null, owner.client.intended_direction ? max_drift_force : 0, FUNCTIONAL_WING_STABILIZATION * (seconds_per_tick * 1 SECONDS)) ///SPREAD OUR WINGS AND FLLLLLYYYYYY -/obj/item/organ/external/wings/functional/proc/open_wings() +/obj/item/organ/wings/functional/proc/open_wings() var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay overlay.open_wings() wings_open = TRUE owner.update_body_parts() ///close our wings -/obj/item/organ/external/wings/functional/proc/close_wings() +/obj/item/organ/wings/functional/proc/close_wings() var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay wings_open = FALSE overlay.close_wings() @@ -205,7 +205,7 @@ . += wings_open ? "open" : "closed" ///angel wings, which relate to humans. comes with holiness. -/obj/item/organ/external/wings/functional/angel +/obj/item/organ/wings/functional/angel name = "angel wings" desc = "Holier-than-thou attitude not included." sprite_accessory_override = /datum/sprite_accessory/wings_open/angel @@ -213,47 +213,47 @@ organ_traits = list(TRAIT_HOLY) ///dragon wings, which relate to lizards. -/obj/item/organ/external/wings/functional/dragon +/obj/item/organ/wings/functional/dragon name = "dragon wings" desc = "Hey, HEY- NOT lizard wings. Dragon wings. Mighty dragon wings." sprite_accessory_override = /datum/sprite_accessory/wings/dragon ///robotic wings, which relate to androids. -/obj/item/organ/external/wings/functional/robotic +/obj/item/organ/wings/functional/robotic name = "robotic wings" desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gathering enough of them, and you can lift impressively large things." organ_flags = ORGAN_ROBOTIC sprite_accessory_override = /datum/sprite_accessory/wings/robotic ///skeletal wings, which relate to skeletal races. -/obj/item/organ/external/wings/functional/skeleton +/obj/item/organ/wings/functional/skeleton name = "skeletal wings" desc = "Powered by pure edgy-teenager-notebook-scribblings. Just kidding. But seriously, how do these keep you flying?!" sprite_accessory_override = /datum/sprite_accessory/wings/skeleton -/obj/item/organ/external/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner) +/obj/item/organ/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner) playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE) ///mothra wings, which relate to moths. -/obj/item/organ/external/wings/functional/moth/mothra +/obj/item/organ/wings/functional/moth/mothra name = "mothra wings" desc = "Fly like the mighty mothra of legend once did." sprite_accessory_override = /datum/sprite_accessory/wings/mothra ///megamoth wings, which relate to moths as an alternate choice. they're both pretty cool. -/obj/item/organ/external/wings/functional/moth/megamoth +/obj/item/organ/wings/functional/moth/megamoth name = "megamoth wings" desc = "Don't get murderous." sprite_accessory_override = /datum/sprite_accessory/wings/megamoth ///fly wings, which relate to flies. -/obj/item/organ/external/wings/functional/fly +/obj/item/organ/wings/functional/fly name = "fly wings" desc = "Fly as a fly." sprite_accessory_override = /datum/sprite_accessory/wings/fly ///slime wings, which relate to slimes. -/obj/item/organ/external/wings/functional/slime +/obj/item/organ/wings/functional/slime name = "slime wings" desc = "How does something so squishy even fly?" sprite_accessory_override = /datum/sprite_accessory/wings/slime diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index 266d777b4572c..2753c88f2c478 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -1,7 +1,7 @@ #define MOTH_WING_FORCE 1 NEWTONS ///Moth wings! They can flutter in low-grav and burn off in heat -/obj/item/organ/external/wings/moth +/obj/item/organ/wings/moth name = "moth wings" desc = "Spread your wings and FLOOOOAAAAAT!" @@ -16,7 +16,7 @@ ///Store our old datum here for if our burned wings are healed var/original_sprite_datum -/obj/item/organ/external/wings/moth/on_mob_insert(mob/living/carbon/receiver) +/obj/item/organ/wings/moth/on_mob_insert(mob/living/carbon/receiver) . = ..() RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_wings)) RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_wings)) @@ -24,18 +24,18 @@ RegisterSignal(receiver, COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE, PROC_REF(on_pushoff)) START_PROCESSING(SSnewtonian_movement, src) -/obj/item/organ/external/wings/moth/on_mob_remove(mob/living/carbon/organ_owner) +/obj/item/organ/wings/moth/on_mob_remove(mob/living/carbon/organ_owner) . = ..() UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_CLIENT_MOVE_NOGRAV, COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE)) STOP_PROCESSING(SSnewtonian_movement, src) -/obj/item/organ/external/wings/moth/make_flap_sound(mob/living/carbon/wing_owner) +/obj/item/organ/wings/moth/make_flap_sound(mob/living/carbon/wing_owner) playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE) -/obj/item/organ/external/wings/moth/can_soften_fall() +/obj/item/organ/wings/moth/can_soften_fall() return !burnt -/obj/item/organ/external/wings/moth/proc/allow_flight() +/obj/item/organ/wings/moth/proc/allow_flight() if(!owner || !owner.client) return FALSE if(!isturf(owner.loc)) @@ -59,14 +59,14 @@ return TRUE return FALSE -/obj/item/organ/external/wings/moth/process(seconds_per_tick) +/obj/item/organ/wings/moth/process(seconds_per_tick) if (!owner || !allow_flight() || isnull(owner.drift_handler)) return var/max_drift_force = (DEFAULT_INERTIA_SPEED / owner.cached_multiplicative_slowdown - 1) / INERTIA_SPEED_COEF + 1 owner.drift_handler.stabilize_drift(owner.client.intended_direction ? dir2angle(owner.client.intended_direction) : null, owner.client.intended_direction ? max_drift_force : 0, MOTH_WING_FORCE * (seconds_per_tick * 1 SECONDS)) -/obj/item/organ/external/wings/moth/proc/on_client_move(mob/source, list/move_args) +/obj/item/organ/wings/moth/proc/on_client_move(mob/source, list/move_args) SIGNAL_HANDLER if (!allow_flight()) @@ -76,7 +76,7 @@ source.newtonian_move(dir2angle(source.client.intended_direction), instant = TRUE, drift_force = MOTH_WING_FORCE, controlled_cap = max_drift_force) source.setDir(source.client.intended_direction) -/obj/item/organ/external/wings/moth/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup) +/obj/item/organ/wings/moth/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup) SIGNAL_HANDLER if (get_dir(source, backup) == movement_dir || source.loc == backup.loc) @@ -88,7 +88,7 @@ return COMPONENT_PREVENT_SPACEMOVE_HALT ///check if our wings can burn off ;_; -/obj/item/organ/external/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human) +/obj/item/organ/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human) SIGNAL_HANDLER if(!burnt && human.bodytemperature >= 800 && human.fire_stacks > 0) //do not go into the extremely hot light. you will not survive @@ -99,13 +99,13 @@ human.update_body_parts() ///burn the wings off -/obj/item/organ/external/wings/moth/proc/burn_wings() +/obj/item/organ/wings/moth/proc/burn_wings() var/datum/bodypart_overlay/mutant/wings/moth/wings = bodypart_overlay wings.burnt = TRUE burnt = TRUE ///heal our wings back up!! -/obj/item/organ/external/wings/moth/proc/heal_wings(datum/source, heal_flags) +/obj/item/organ/wings/moth/proc/heal_wings(datum/source, heal_flags) SIGNAL_HANDLER if(!burnt) diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm index 775ffebf54cdf..07171f67a015d 100644 --- a/code/modules/surgery/organs/external/wings/wings.dm +++ b/code/modules/surgery/organs/external/wings/wings.dm @@ -1,5 +1,5 @@ ///Wing base type. doesn't really do anything -/obj/item/organ/external/wings +/obj/item/organ/wings name = "wings" desc = "Spread your wings and FLLLLLLLLYYYYY!" @@ -9,12 +9,14 @@ use_mob_sprite_as_obj_sprite = TRUE bodypart_overlay = /datum/bodypart_overlay/mutant/wings + organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL + ///Checks if the wings can soften short falls -/obj/item/organ/external/wings/proc/can_soften_fall() +/obj/item/organ/wings/proc/can_soften_fall() return TRUE ///Implement as needed to play a sound effect on *flap emote -/obj/item/organ/external/wings/proc/make_flap_sound(mob/living/carbon/wing_owner) +/obj/item/organ/wings/proc/make_flap_sound(mob/living/carbon/wing_owner) return ///Bodypart overlay of default wings. Does not have any wing functionality diff --git a/code/modules/surgery/organs/internal/_internal_organ.dm b/code/modules/surgery/organs/internal/_internal_organ.dm index 8b7bd35493127..0527e6d79808f 100644 --- a/code/modules/surgery/organs/internal/_internal_organ.dm +++ b/code/modules/surgery/organs/internal/_internal_organ.dm @@ -1,11 +1,11 @@ -/obj/item/organ/internal +/obj/item/organ name = "organ" -/obj/item/organ/internal/Initialize(mapload) +/obj/item/organ/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) -/obj/item/organ/internal/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() // organs_slot must ALWAYS be ordered in the same way as organ_process_order @@ -14,7 +14,7 @@ STOP_PROCESSING(SSobj, src) -/obj/item/organ/internal/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE) +/obj/item/organ/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE) . = ..() if((organ_flags & ORGAN_VITAL) && !special && !HAS_TRAIT(organ_owner, TRAIT_GODMODE)) @@ -24,10 +24,10 @@ START_PROCESSING(SSobj, src) -/obj/item/organ/internal/process(seconds_per_tick, times_fired) +/obj/item/organ/process(seconds_per_tick, times_fired) on_death(seconds_per_tick, times_fired) //Kinda hate doing it like this, but I really don't want to call process directly. -/obj/item/organ/internal/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person +/obj/item/organ/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person if(organ_flags & (ORGAN_ROBOTIC | ORGAN_FROZEN)) return @@ -45,7 +45,7 @@ /// NOTE: THIS IS VERY HOT. Be careful what you put in here /// To give you some scale, if there's 100 carbons in the game, they each have maybe 9 organs /// So that's 900 calls to this proc every life process. Please don't be dumb -/obj/item/organ/internal/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing +/obj/item/organ/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing if(organ_flags & ORGAN_FAILING) handle_failing_organs(seconds_per_tick) return @@ -70,15 +70,15 @@ apply_organ_damage(-healing_amount * maxHealth * seconds_per_tick, damage) // pass curent damage incase we are over cap ///Used as callbacks by object pooling -/obj/item/organ/internal/exit_wardrobe() +/obj/item/organ/exit_wardrobe() START_PROCESSING(SSobj, src) //See above -/obj/item/organ/internal/enter_wardrobe() +/obj/item/organ/enter_wardrobe() STOP_PROCESSING(SSobj, src) ///Organs don't die instantly, and neither should you when you get fucked up -/obj/item/organ/internal/handle_failing_organs(seconds_per_tick) +/obj/item/organ/handle_failing_organs(seconds_per_tick) if(owner.stat == DEAD) return diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm index 420d4efc1185c..98e8a0f4ed116 100644 --- a/code/modules/surgery/organs/internal/appendix/_appendix.dm +++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -2,7 +2,7 @@ #define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600) #define INFLAMATION_ADVANCEMENT_PROB 2 -/obj/item/organ/internal/appendix +/obj/item/organ/appendix name = "appendix" icon_state = "appendix" base_icon_state = "appendix" @@ -19,15 +19,15 @@ var/inflamation_stage = 0 -/obj/item/organ/internal/appendix/update_name() +/obj/item/organ/appendix/update_name() . = ..() name = "[inflamation_stage ? "inflamed " : null][initial(name)]" -/obj/item/organ/internal/appendix/update_icon_state() +/obj/item/organ/appendix/update_icon_state() icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]" return ..() -/obj/item/organ/internal/appendix/on_life(seconds_per_tick, times_fired) +/obj/item/organ/appendix/on_life(seconds_per_tick, times_fired) . = ..() if(!owner) return @@ -40,7 +40,7 @@ else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_TEMPORARY_BODY)) become_inflamed() -/obj/item/organ/internal/appendix/proc/become_inflamed() +/obj/item/organ/appendix/proc/become_inflamed() inflamation_stage = 1 update_appearance() if(owner) @@ -52,7 +52,7 @@ header = "Whoa, Sick!", ) -/obj/item/organ/internal/appendix/proc/inflamation(seconds_per_tick) +/obj/item/organ/appendix/proc/inflamation(seconds_per_tick) var/mob/living/carbon/organ_owner = owner if(inflamation_stage < 3 && SPT_PROB(INFLAMATION_ADVANCEMENT_PROB, seconds_per_tick)) inflamation_stage += 1 @@ -73,21 +73,21 @@ organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) -/obj/item/organ/internal/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantappendix -/obj/item/organ/internal/appendix/on_mob_remove(mob/living/carbon/organ_owner) +/obj/item/organ/appendix/on_mob_remove(mob/living/carbon/organ_owner) . = ..() REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) organ_owner.med_hud_set_status() -/obj/item/organ/internal/appendix/on_mob_insert(mob/living/carbon/organ_owner) +/obj/item/organ/appendix/on_mob_insert(mob/living/carbon/organ_owner) . = ..() if(inflamation_stage) ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) organ_owner.med_hud_set_status() -/obj/item/organ/internal/appendix/get_status_text(advanced, add_tooltips) +/obj/item/organ/appendix/get_status_text(advanced, add_tooltips) if(!(organ_flags & ORGAN_FAILING) && inflamation_stage) return conditional_tooltip("Inflamed", "Remove surgically.", add_tooltips) return ..() diff --git a/code/modules/surgery/organs/internal/appendix/appendix_golem.dm b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm index 5510b4bf96796..08a53e28f8d9c 100644 --- a/code/modules/surgery/organs/internal/appendix/appendix_golem.dm +++ b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm @@ -1,5 +1,5 @@ -/obj/item/organ/internal/appendix/golem +/obj/item/organ/appendix/golem name = "internal forge" desc = "This expanded digestive chamber allows golems to smelt minerals, provided that they are immersed in lava." icon_state = "ethereal_heart-off" @@ -8,16 +8,16 @@ /// Action which performs smelting var/datum/action/cooldown/internal_smelting/smelter -/obj/item/organ/internal/appendix/golem/Initialize(mapload) +/obj/item/organ/appendix/golem/Initialize(mapload) . = ..() smelter = new(src) -/obj/item/organ/internal/appendix/golem/on_mob_insert(mob/living/carbon/organ_owner) +/obj/item/organ/appendix/golem/on_mob_insert(mob/living/carbon/organ_owner) . = ..() RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_for_lava)) /// Give the action while in lava -/obj/item/organ/internal/appendix/golem/proc/check_for_lava(mob/living/owner) +/obj/item/organ/appendix/golem/proc/check_for_lava(mob/living/owner) SIGNAL_HANDLER if (!islava(owner.loc)) smelter.Remove(owner) @@ -25,12 +25,12 @@ if (smelter.owner != owner) smelter.Grant(owner) -/obj/item/organ/internal/appendix/golem/on_mob_remove(mob/living/carbon/organ_owner) +/obj/item/organ/appendix/golem/on_mob_remove(mob/living/carbon/organ_owner) UnregisterSignal(organ_owner, COMSIG_MOVABLE_MOVED) smelter?.Remove(organ_owner) // Might have been deleted by Destroy already return ..() -/obj/item/organ/internal/appendix/golem/Destroy() +/obj/item/organ/appendix/golem/Destroy() QDEL_NULL(smelter) return ..() diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 0946d1441039c..a07b8caed6c9f 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/cyberimp/arm +/obj/item/organ/cyberimp/arm name = "arm-mounted implant" desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" zone = BODY_ZONE_R_ARM @@ -22,7 +22,7 @@ /// Organ slot that the implant occupies for the left arm var/left_arm_organ_slot = ORGAN_SLOT_LEFT_ARM_AUG -/obj/item/organ/internal/cyberimp/arm/Initialize(mapload) +/obj/item/organ/cyberimp/arm/Initialize(mapload) . = ..() if(ispath(active_item)) active_item = new active_item(src) @@ -35,7 +35,7 @@ update_appearance() SetSlotFromZone() -/obj/item/organ/internal/cyberimp/arm/Destroy() +/obj/item/organ/cyberimp/arm/Destroy() hand = null active_item = null for(var/datum/weakref/ref in items_list) @@ -49,7 +49,7 @@ /datum/action/item_action/organ_action/toggle/toolkit desc = "You can also activate your empty hand or the tool in your hand to open the tools radial menu." -/obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone() +/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() switch(zone) if(BODY_ZONE_L_ARM) slot = left_arm_organ_slot @@ -58,16 +58,16 @@ else CRASH("Invalid zone for [type]") -/obj/item/organ/internal/cyberimp/arm/update_icon() +/obj/item/organ/cyberimp/arm/update_icon() . = ..() transform = (zone == BODY_ZONE_R_ARM) ? null : matrix(-1, 0, 0, 0, 1, 0) -/obj/item/organ/internal/cyberimp/arm/examine(mob/user) +/obj/item/organ/cyberimp/arm/examine(mob/user) . = ..() if(IS_ROBOTIC_ORGAN(src)) . += span_info("[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") -/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) . = ..() if(.) return TRUE @@ -80,19 +80,19 @@ to_chat(user, span_notice("You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.")) update_appearance() -/obj/item/organ/internal/cyberimp/arm/on_mob_insert(mob/living/carbon/arm_owner) +/obj/item/organ/cyberimp/arm/on_mob_insert(mob/living/carbon/arm_owner) . = ..() RegisterSignal(arm_owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_limb_attached)) RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. on_limb_attached(arm_owner, arm_owner.hand_bodyparts[zone == BODY_ZONE_R_ARM ? RIGHT_HANDS : LEFT_HANDS]) -/obj/item/organ/internal/cyberimp/arm/on_mob_remove(mob/living/carbon/arm_owner) +/obj/item/organ/cyberimp/arm/on_mob_remove(mob/living/carbon/arm_owner) . = ..() Retract() UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN)) on_limb_detached(hand) -/obj/item/organ/internal/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb) +/obj/item/organ/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb) SIGNAL_HANDLER if(!limb || QDELETED(limb) || limb.body_zone != zone) return @@ -102,18 +102,18 @@ RegisterSignal(limb, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_detached)) hand = limb -/obj/item/organ/internal/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source) +/obj/item/organ/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source) SIGNAL_HANDLER if(source != hand || QDELETED(hand)) return UnregisterSignal(hand, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_BODYPART_REMOVED)) hand = null -/obj/item/organ/internal/cyberimp/arm/proc/on_item_attack_self() +/obj/item/organ/cyberimp/arm/proc/on_item_attack_self() SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(ui_action_click)) -/obj/item/organ/internal/cyberimp/arm/emp_act(severity) +/obj/item/organ/cyberimp/arm/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF || !IS_ROBOTIC_ORGAN(src)) return @@ -129,7 +129,7 @@ * quick way to store implant items. In this case, we check to make sure the user has the correct arm * selected, and that the item is actually owned by us, and then we'll hand off the rest to Retract() **/ -/obj/item/organ/internal/cyberimp/arm/proc/dropkey(mob/living/carbon/host) +/obj/item/organ/cyberimp/arm/proc/dropkey(mob/living/carbon/host) SIGNAL_HANDLER if(!host) return //How did we even get here @@ -138,7 +138,7 @@ if(Retract()) return COMSIG_KB_ACTIVATED -/obj/item/organ/internal/cyberimp/arm/proc/Retract() +/obj/item/organ/cyberimp/arm/proc/Retract() if(!active_item || (active_item in src)) return FALSE active_item.resistance_flags = active_item::resistance_flags @@ -159,7 +159,7 @@ playsound(get_turf(owner), retract_sound, 50, TRUE) return TRUE -/obj/item/organ/internal/cyberimp/arm/proc/Extend(obj/item/augment) +/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/augment) if(!(augment in src)) return @@ -198,12 +198,12 @@ if(length(items_list) > 1) RegisterSignals(active_item, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(swap_tools)) // secondary for welders -/obj/item/organ/internal/cyberimp/arm/proc/swap_tools(active_item) +/obj/item/organ/cyberimp/arm/proc/swap_tools(active_item) SIGNAL_HANDLER Retract(active_item) INVOKE_ASYNC(src, PROC_REF(ui_action_click)) -/obj/item/organ/internal/cyberimp/arm/ui_action_click() +/obj/item/organ/cyberimp/arm/ui_action_click() if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) return @@ -228,7 +228,7 @@ Retract() -/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) +/obj/item/organ/cyberimp/arm/gun/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -243,25 +243,25 @@ organ_flags |= ORGAN_FAILING -/obj/item/organ/internal/cyberimp/arm/gun/laser +/obj/item/organ/cyberimp/arm/gun/laser name = "arm-mounted laser implant" desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_laser" items_to_create = list(/obj/item/gun/energy/laser/mounted/augment) -/obj/item/organ/internal/cyberimp/arm/gun/laser/l +/obj/item/organ/cyberimp/arm/gun/laser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/gun/taser +/obj/item/organ/cyberimp/arm/gun/taser name = "arm-mounted taser implant" desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_taser" items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) -/obj/item/organ/internal/cyberimp/arm/gun/taser/l +/obj/item/organ/cyberimp/arm/gun/taser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/toolset +/obj/item/organ/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." icon_state = "toolkit_engineering" @@ -275,10 +275,10 @@ /obj/item/multitool/cyborg, ) -/obj/item/organ/internal/cyberimp/arm/toolset/l +/obj/item/organ/cyberimp/arm/toolset/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) +/obj/item/organ/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_knife = created_item.resolve() if(istype(/obj/item/knife/combat/cyborg, potential_knife)) @@ -288,23 +288,23 @@ items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src)) return TRUE -/obj/item/organ/internal/cyberimp/arm/esword +/obj/item/organ/cyberimp/arm/esword name = "arm-mounted energy blade" desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy." items_to_create = list(/obj/item/melee/energy/blade/hardlight) -/obj/item/organ/internal/cyberimp/arm/medibeam +/obj/item/organ/cyberimp/arm/medibeam name = "integrated medical beamgun" desc = "A cybernetic implant that allows the user to project a healing beam from their hand." items_to_create = list(/obj/item/gun/medbeam) -/obj/item/organ/internal/cyberimp/arm/flash +/obj/item/organ/cyberimp/arm/flash name = "integrated high-intensity photon projector" //Why not desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." items_to_create = list(/obj/item/assembly/flash/armimplant) -/obj/item/organ/internal/cyberimp/arm/flash/Initialize(mapload) +/obj/item/organ/cyberimp/arm/flash/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -313,22 +313,22 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) -/obj/item/organ/internal/cyberimp/arm/flash/Extend() +/obj/item/organ/cyberimp/arm/flash/Extend() . = ..() active_item.set_light_range(7) active_item.set_light_on(TRUE) -/obj/item/organ/internal/cyberimp/arm/flash/Retract() +/obj/item/organ/cyberimp/arm/flash/Retract() if(active_item) active_item.set_light_on(FALSE) return ..() -/obj/item/organ/internal/cyberimp/arm/baton +/obj/item/organ/cyberimp/arm/baton name = "arm electrification implant" desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." items_to_create = list(/obj/item/borg/stun) -/obj/item/organ/internal/cyberimp/arm/combat +/obj/item/organ/cyberimp/arm/combat name = "combat cybernetics implant" desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." items_to_create = list( @@ -338,7 +338,7 @@ /obj/item/assembly/flash/armimplant, ) -/obj/item/organ/internal/cyberimp/arm/combat/Initialize(mapload) +/obj/item/organ/cyberimp/arm/combat/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -347,7 +347,7 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) -/obj/item/organ/internal/cyberimp/arm/surgery +/obj/item/organ/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." icon_state = "toolkit_surgical" @@ -362,7 +362,7 @@ /obj/item/surgical_drapes, ) -/obj/item/organ/internal/cyberimp/arm/surgery/emagged +/obj/item/organ/cyberimp/arm/surgery/emagged name = "hacked surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm. This one seems to have been tampered with." items_to_create = list( @@ -376,7 +376,7 @@ /obj/item/knife/combat/cyborg, ) -/obj/item/organ/internal/cyberimp/arm/strongarm +/obj/item/organ/cyberimp/arm/strongarm name = "\proper Strong-Arm empowered musculature implant" desc = "When implanted, this cybernetic implant will enhance the muscles of the arm to deliver more power-per-action." icon_state = "muscle_implant" @@ -409,19 +409,19 @@ ///Tracks how soon we can perform another slam attack COOLDOWN_DECLARE(slam_cooldown) -/obj/item/organ/internal/cyberimp/arm/strongarm/l +/obj/item/organ/cyberimp/arm/strongarm/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_insert(mob/living/carbon/arm_owner) +/obj/item/organ/cyberimp/arm/strongarm/on_mob_insert(mob/living/carbon/arm_owner) . = ..() if(ishuman(arm_owner)) //Sorry, only humans RegisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) -/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_remove(mob/living/carbon/arm_owner) +/obj/item/organ/cyberimp/arm/strongarm/on_mob_remove(mob/living/carbon/arm_owner) . = ..() UnregisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) -/obj/item/organ/internal/cyberimp/arm/strongarm/emp_act(severity) +/obj/item/organ/cyberimp/arm/strongarm/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return @@ -429,11 +429,11 @@ organ_flags |= ORGAN_FAILING addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) -/obj/item/organ/internal/cyberimp/arm/strongarm/proc/reboot() +/obj/item/organ/cyberimp/arm/strongarm/proc/reboot() organ_flags &= ~ORGAN_FAILING owner.balloon_alert(owner, "your arm stops spasming!") -/obj/item/organ/internal/cyberimp/arm/strongarm/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) +/obj/item/organ/cyberimp/arm/strongarm/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) SIGNAL_HANDLER if(source.get_active_hand() != hand || !proximity) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index c9cbfbe445bdf..eae996502e4ab 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -1,9 +1,9 @@ -/obj/item/organ/internal/cyberimp/chest +/obj/item/organ/cyberimp/chest name = "cybernetic torso implant" desc = "Implants for the organs in your torso." zone = BODY_ZONE_CHEST -/obj/item/organ/internal/cyberimp/chest/nutriment +/obj/item/organ/cyberimp/chest/nutriment name = "nutriment pump implant" desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are starving." icon_state = "nutriment_implant" @@ -12,7 +12,7 @@ var/poison_amount = 5 slot = ORGAN_SLOT_STOMACH_AID -/obj/item/organ/internal/cyberimp/chest/nutriment/on_life(seconds_per_tick, times_fired) +/obj/item/organ/cyberimp/chest/nutriment/on_life(seconds_per_tick, times_fired) if(synthesizing) return @@ -22,10 +22,10 @@ owner.adjust_nutrition(25 * seconds_per_tick) addtimer(CALLBACK(src, PROC_REF(synth_cool)), 5 SECONDS) -/obj/item/organ/internal/cyberimp/chest/nutriment/proc/synth_cool() +/obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool() synthesizing = FALSE -/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity) +/obj/item/organ/cyberimp/chest/nutriment/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -33,14 +33,14 @@ to_chat(owner, span_warning("You feel like your insides are burning.")) -/obj/item/organ/internal/cyberimp/chest/nutriment/plus +/obj/item/organ/cyberimp/chest/nutriment/plus name = "nutriment pump implant PLUS" desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." icon_state = "adv_nutriment_implant" hunger_threshold = NUTRITION_LEVEL_HUNGRY poison_amount = 10 -/obj/item/organ/internal/cyberimp/chest/reviver +/obj/item/organ/cyberimp/chest/reviver name = "reviver implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!" icon_state = "reviver_implant" @@ -50,15 +50,15 @@ COOLDOWN_DECLARE(reviver_cooldown) COOLDOWN_DECLARE(defib_cooldown) -/obj/item/organ/internal/cyberimp/chest/reviver/on_death(seconds_per_tick, times_fired) - if(isnull(owner)) // owner can be null, on_death() gets called by /obj/item/organ/internal/process() for decay +/obj/item/organ/cyberimp/chest/reviver/on_death(seconds_per_tick, times_fired) + if(isnull(owner)) // owner can be null, on_death() gets called by /obj/item/organ/process() for decay return try_heal() // Allows implant to work even on dead people -/obj/item/organ/internal/cyberimp/chest/reviver/on_life(seconds_per_tick, times_fired) +/obj/item/organ/cyberimp/chest/reviver/on_life(seconds_per_tick, times_fired) try_heal() -/obj/item/organ/internal/cyberimp/chest/reviver/proc/try_heal() +/obj/item/organ/cyberimp/chest/reviver/proc/try_heal() if(reviving) if(owner.stat == CONSCIOUS) COOLDOWN_START(src, reviver_cooldown, revive_cost) @@ -78,7 +78,7 @@ COOLDOWN_START(src, defib_cooldown, 8 SECONDS) // 5 seconds after heal proc delay -/obj/item/organ/internal/cyberimp/chest/reviver/proc/heal() +/obj/item/organ/cyberimp/chest/reviver/proc/heal() if(COOLDOWN_FINISHED(src, defib_cooldown)) revive_dead() @@ -106,7 +106,7 @@ owner.visible_message(span_warning("[owner]'s body twitches a bit."), span_notice("You feel like something is patching your injured body.")) -/obj/item/organ/internal/cyberimp/chest/reviver/proc/revive_dead() +/obj/item/organ/cyberimp/chest/reviver/proc/revive_dead() if(!COOLDOWN_FINISHED(src, defib_cooldown) || owner.stat != DEAD || owner.can_defib() != DEFIB_POSSIBLE) return owner.notify_revival("You are being revived by [src]!") @@ -126,7 +126,7 @@ log_game("[owner] been revived by [src]") -/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) +/obj/item/organ/cyberimp/chest/reviver/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -143,7 +143,7 @@ to_chat(human_owner, span_userdanger("You feel a horrible agony in your chest!")) addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), 600 / severity) -/obj/item/organ/internal/cyberimp/chest/reviver/proc/undo_heart_attack() +/obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack() var/mob/living/carbon/human/human_owner = owner if(!istype(human_owner)) return @@ -152,7 +152,7 @@ to_chat(human_owner, span_notice("You feel your heart beating again!")) -/obj/item/organ/internal/cyberimp/chest/thrusters +/obj/item/organ/cyberimp/chest/thrusters name = "implantable thrusters set" desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \ Unlike regular jetpacks, this device has no stabilization system." @@ -164,7 +164,7 @@ w_class = WEIGHT_CLASS_NORMAL var/on = FALSE -/obj/item/organ/internal/cyberimp/chest/thrusters/Initialize(mapload) +/obj/item/organ/cyberimp/chest/thrusters/Initialize(mapload) . = ..() AddComponent( \ /datum/component/jetpack, \ @@ -178,21 +178,21 @@ /datum/effect_system/trail_follow/ion, \ ) -/obj/item/organ/internal/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special, movement_flags) +/obj/item/organ/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special, movement_flags) if(on) deactivate(silent = TRUE) ..() -/obj/item/organ/internal/cyberimp/chest/thrusters/ui_action_click() +/obj/item/organ/cyberimp/chest/thrusters/ui_action_click() toggle() -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle(silent = FALSE) +/obj/item/organ/cyberimp/chest/thrusters/proc/toggle(silent = FALSE) if(on) deactivate() else activate() -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/activate(silent = FALSE) +/obj/item/organ/cyberimp/chest/thrusters/proc/activate(silent = FALSE) if(on) return if(organ_flags & ORGAN_FAILING) @@ -208,7 +208,7 @@ to_chat(owner, span_notice("You turn your thrusters set on.")) update_appearance() -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE) +/obj/item/organ/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE) if(!on) return SEND_SIGNAL(src, COMSIG_THRUSTER_DEACTIVATED, owner) @@ -218,11 +218,11 @@ on = FALSE update_appearance() -/obj/item/organ/internal/cyberimp/chest/thrusters/update_icon_state() +/obj/item/organ/cyberimp/chest/thrusters/update_icon_state() icon_state = "[base_icon_state][on ? "-on" : null]" return ..() -/obj/item/organ/internal/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE) +/obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE) if(!owner) return FALSE @@ -257,7 +257,7 @@ deactivate(silent = TRUE) return FALSE -/obj/item/organ/internal/cyberimp/chest/spine +/obj/item/organ/cyberimp/chest/spine name = "\improper Herculean gravitronic spinal implant" desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \ Contains a slot which can be upgraded with a gravity anomaly core, improving its performance." @@ -274,21 +274,21 @@ /// The overlay for our implant to indicate that, yes, this person has an implant inserted. var/mutable_appearance/stone_overlay -/obj/item/organ/internal/cyberimp/chest/spine/emp_act(severity) +/obj/item/organ/cyberimp/chest/spine/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return to_chat(owner, span_warning("You feel sheering pain as your body is crushed like a soda can!")) owner.apply_damage(20/severity, BRUTE, def_zone = BODY_ZONE_CHEST) -/obj/item/organ/internal/cyberimp/chest/spine/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/cyberimp/chest/spine/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() stone_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "stone") organ_owner.add_overlay(stone_overlay) if(core_applied) organ_owner.AddElement(/datum/element/forced_gravity, 1) -/obj/item/organ/internal/cyberimp/chest/spine/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/cyberimp/chest/spine/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if(stone_overlay) organ_owner.cut_overlay(stone_overlay) @@ -296,7 +296,7 @@ if(core_applied) organ_owner.RemoveElement(/datum/element/forced_gravity, 1) -/obj/item/organ/internal/cyberimp/chest/spine/item_interaction(mob/living/user, obj/item/tool, list/modifiers) +/obj/item/organ/cyberimp/chest/spine/item_interaction(mob/living/user, obj/item/tool, list/modifiers) . = ..() if(core_applied) user.balloon_alert(user, "core already installed!") diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm index aa67fe0c08de8..d720953a24ca5 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/cyberimp/eyes +/obj/item/organ/cyberimp/eyes name = "cybernetic eye implant" desc = "Implants for your eyes." icon_state = "eye_implant" @@ -7,7 +7,7 @@ w_class = WEIGHT_CLASS_TINY // HUD implants -/obj/item/organ/internal/cyberimp/eyes/hud +/obj/item/organ/cyberimp/eyes/hud name = "HUD implant" desc = "These cybernetic eyes will display a HUD over everything you see. Maybe." slot = ORGAN_SLOT_HUD @@ -17,7 +17,7 @@ var/toggled_on = TRUE -/obj/item/organ/internal/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner) +/obj/item/organ/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner) if(toggled_on) toggled_on = FALSE eye_owner.add_traits(HUD_traits, ORGAN_TRAIT) @@ -27,36 +27,36 @@ eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT) balloon_alert(eye_owner, "hud enabled") -/obj/item/organ/internal/cyberimp/eyes/hud/mob_insert(mob/living/carbon/eye_owner, special = FALSE, movement_flags) +/obj/item/organ/cyberimp/eyes/hud/mob_insert(mob/living/carbon/eye_owner, special = FALSE, movement_flags) . = ..() eye_owner.add_traits(HUD_traits, ORGAN_TRAIT) toggled_on = TRUE -/obj/item/organ/internal/cyberimp/eyes/hud/mob_remove(mob/living/carbon/eye_owner, special, movement_flags) +/obj/item/organ/cyberimp/eyes/hud/mob_remove(mob/living/carbon/eye_owner, special, movement_flags) . = ..() eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT) toggled_on = FALSE -/obj/item/organ/internal/cyberimp/eyes/hud/medical +/obj/item/organ/cyberimp/eyes/hud/medical name = "medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." icon_state = "eye_implant_medical" HUD_traits = list(TRAIT_MEDICAL_HUD) -/obj/item/organ/internal/cyberimp/eyes/hud/security +/obj/item/organ/cyberimp/eyes/hud/security name = "security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." icon_state = "eye_implant_security" HUD_traits = list(TRAIT_SECURITY_HUD) -/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic +/obj/item/organ/cyberimp/eyes/hud/diagnostic name = "diagnostic HUD implant" desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." icon_state = "eye_implant_diagnostic" HUD_traits = list(TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD) -/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate +/obj/item/organ/cyberimp/eyes/hud/security/syndicate name = "contraband security HUD implant" desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see." icon_state = "eye_implant_syndicate" diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 334c8941f6b8f..42f0e5ac7b237 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -1,5 +1,5 @@ -/obj/item/organ/internal/cyberimp +/obj/item/organ/cyberimp name = "cybernetic implant" desc = "A state-of-the-art implant that improves a baseline's functionality." @@ -8,7 +8,7 @@ var/implant_color = COLOR_WHITE var/implant_overlay -/obj/item/organ/internal/cyberimp/New(mob/implanted_mob = null) +/obj/item/organ/cyberimp/New(mob/implanted_mob = null) if(iscarbon(implanted_mob)) src.Insert(implanted_mob) if(implant_overlay) @@ -19,13 +19,13 @@ //[[[[BRAIN]]]] -/obj/item/organ/internal/cyberimp/brain +/obj/item/organ/cyberimp/brain name = "cybernetic brain implant" desc = "Injectors of extra sub-routines for the brain." zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY -/obj/item/organ/internal/cyberimp/brain/emp_act(severity) +/obj/item/organ/cyberimp/brain/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -34,7 +34,7 @@ to_chat(owner, span_warning("Your body seizes up!")) -/obj/item/organ/internal/cyberimp/brain/anti_drop +/obj/item/organ/cyberimp/brain/anti_drop name = "anti-drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." icon_state = "brain_implant_antidrop" @@ -43,7 +43,7 @@ slot = ORGAN_SLOT_BRAIN_CEREBELLUM actions_types = list(/datum/action/item_action/organ_action/toggle) -/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() +/obj/item/organ/cyberimp/brain/anti_drop/ui_action_click() active = !active if(active) var/list/hold_list = owner.get_empty_held_indexes() @@ -63,7 +63,7 @@ to_chat(owner, span_notice("Your hands relax...")) -/obj/item/organ/internal/cyberimp/brain/anti_drop/emp_act(severity) +/obj/item/organ/cyberimp/brain/anti_drop/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -78,25 +78,25 @@ stored_items = list() -/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() +/obj/item/organ/cyberimp/brain/anti_drop/proc/release_items() for(var/obj/item/stored_item as anything in stored_items) REMOVE_TRAIT(stored_item, TRAIT_NODROP, IMPLANT_TRAIT) UnregisterSignal(stored_item, COMSIG_ITEM_DROPPED) stored_items = list() -/obj/item/organ/internal/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special, movement_flags) +/obj/item/organ/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special, movement_flags) if(active) ui_action_click() ..() -/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/on_held_item_dropped(obj/item/source, mob/user) +/obj/item/organ/cyberimp/brain/anti_drop/proc/on_held_item_dropped(obj/item/source, mob/user) SIGNAL_HANDLER REMOVE_TRAIT(source, TRAIT_NODROP, IMPLANT_TRAIT) UnregisterSignal(source, COMSIG_ITEM_DROPPED) stored_items -= source -/obj/item/organ/internal/cyberimp/brain/anti_stun +/obj/item/organ/cyberimp/brain/anti_stun name = "CNS rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." icon_state = "brain_implant_rebooter" @@ -114,28 +114,28 @@ var/stun_resistance_time = 6 SECONDS COOLDOWN_DECLARE(implant_cooldown) -/obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner) +/obj/item/organ/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner) . = ..() UnregisterSignal(implant_owner, signalCache) UnregisterSignal(implant_owner, COMSIG_LIVING_ENTER_STAMCRIT) remove_stun_buffs(implant_owner) -/obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver) +/obj/item/organ/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver) . = ..() RegisterSignals(receiver, signalCache, PROC_REF(on_signal)) RegisterSignal(receiver, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) +/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) SIGNAL_HANDLER if(!(organ_flags & ORGAN_FAILING) && amount > 0) addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_stamcrit(datum/source) +/obj/item/organ/cyberimp/brain/anti_stun/proc/on_stamcrit(datum/source) SIGNAL_HANDLER if(!(organ_flags & ORGAN_FAILING)) addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns() +/obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns() if(isnull(owner) || (organ_flags & ORGAN_FAILING) || !COOLDOWN_FINISHED(src, implant_cooldown)) return @@ -156,37 +156,37 @@ COOLDOWN_START(src, implant_cooldown, 60 SECONDS) addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/implant_ready() +/obj/item/organ/cyberimp/brain/anti_stun/proc/implant_ready() if(owner) to_chat(owner, span_purple("Your rebooter implant is ready.")) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner) +/obj/item/organ/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner) give_to.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) give_to.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner) +/obj/item/organ/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner) remove_from.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) remove_from.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown) -/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity) +/obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return organ_flags |= ORGAN_FAILING addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) -/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/reboot() +/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() organ_flags &= ~ORGAN_FAILING implant_ready() -/obj/item/organ/internal/cyberimp/brain/connector +/obj/item/organ/cyberimp/brain/connector name = "CNS skillchip connector implant" desc = "This cybernetic adds a port to the back of your head, where you can remove or add skillchips at will." icon_state = "brain_implant_connector" slot = ORGAN_SLOT_BRAIN_CNS actions_types = list(/datum/action/item_action/organ_action/use) -/obj/item/organ/internal/cyberimp/brain/connector/ui_action_click() +/obj/item/organ/cyberimp/brain/connector/ui_action_click() to_chat(owner, span_warning("You start fiddling around with [src]...")) playsound(owner, 'sound/items/taperecorder/tape_flip.ogg', 20, vary = TRUE) // asmr @@ -208,12 +208,12 @@ else to_chat(owner, span_warning("You try to insert [owner.get_active_held_item()] into [src], but it won't fit!")) // make it kill you if you shove a crayon inside or something else // no inhand item, assume removal - var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(/obj/item/organ/internal/brain) + var/obj/item/organ/brain/chippy_brain = owner.get_organ_by_type(/obj/item/organ/brain) if(!chippy_brain) CRASH("we using a brain implant wit no brain") remove_skillchip(chippy_brain) -/obj/item/organ/internal/cyberimp/brain/connector/proc/insert_skillchip(obj/item/skillchip/skillchip) +/obj/item/organ/cyberimp/brain/connector/proc/insert_skillchip(obj/item/skillchip/skillchip) var/fail_string = owner.implant_skillchip(skillchip, force = FALSE) if(fail_string) to_chat(owner, span_warning(fail_string)) @@ -229,7 +229,7 @@ // success! playsound(owner, 'sound/machines/chime.ogg', 10, vary = TRUE) -/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_skillchip(obj/item/organ/internal/brain/chippy_brain) +/obj/item/organ/cyberimp/brain/connector/proc/remove_skillchip(obj/item/organ/brain/chippy_brain) var/obj/item/skillchip/skillchip = show_radial_menu(owner, owner, chippy_brain.skillchips) if(skillchip) owner.remove_skillchip(skillchip, silent = FALSE) @@ -241,7 +241,7 @@ to_chat(owner, span_warning("Your brain is empty!")) // heh -/obj/item/organ/internal/cyberimp/brain/connector/emp_act(severity) +/obj/item/organ/cyberimp/brain/connector/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return @@ -253,7 +253,7 @@ // you either lose a chip or a bit of your brain owner.visible_message(span_warning("Something falls to the ground from behind [owner]'s head."),\ span_boldwarning("You feel something fall off from behind your head.")) - var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/chippy_brain = owner.get_organ_by_type(ORGAN_SLOT_BRAIN) var/obj/item/skillchip/skillchip = chippy_brain?.skillchips[1] if(skillchip) owner.remove_skillchip(skillchip, silent = TRUE) @@ -263,7 +263,7 @@ remove_brain() addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) -/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_brain(obj/item/organ/internal/brain/chippy_brain, severity = 1) +/obj/item/organ/cyberimp/brain/connector/proc/remove_brain(obj/item/organ/brain/chippy_brain, severity = 1) playsound(owner, 'sound/effects/meatslap.ogg', 25, TRUE) if(!chippy_brain) return @@ -277,21 +277,21 @@ new /obj/effect/decal/cleanable/blood/gibs/up(get_turf(owner)) return FALSE -/obj/item/organ/internal/cyberimp/brain/connector/proc/reboot() +/obj/item/organ/cyberimp/brain/connector/proc/reboot() organ_flags &= ~ORGAN_FAILING //[[[[MOUTH]]]] -/obj/item/organ/internal/cyberimp/mouth +/obj/item/organ/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH -/obj/item/organ/internal/cyberimp/mouth/breathing_tube +/obj/item/organ/cyberimp/mouth/breathing_tube name = "breathing tube implant" desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." icon_state = "implant_mask" slot = ORGAN_SLOT_BREATHING_TUBE w_class = WEIGHT_CLASS_TINY -/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) +/obj/item/organ/cyberimp/mouth/breathing_tube/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index bbc45b093998c..f565fc3b42cd4 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/ears +/obj/item/organ/ears name = "ears" icon_state = "ears" desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." @@ -26,7 +26,7 @@ /// Multiplier for both long term and short term ear damage var/damage_multiplier = 1 -/obj/item/organ/internal/ears/on_life(seconds_per_tick, times_fired) +/obj/item/organ/ears/on_life(seconds_per_tick, times_fired) // only inform when things got worse, needs to happen before we heal if((damage > low_threshold && prev_damage < low_threshold) || (damage > high_threshold && prev_damage < high_threshold)) to_chat(owner, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment.")) @@ -44,20 +44,20 @@ adjustEarDamage(0, 4) SEND_SOUND(owner, sound('sound/items/weapons/flash_ring.ogg')) -/obj/item/organ/internal/ears/apply_organ_damage(damage_amount, maximum, required_organ_flag) +/obj/item/organ/ears/apply_organ_damage(damage_amount, maximum, required_organ_flag) . = ..() update_temp_deafness() -/obj/item/organ/internal/ears/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/ears/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() update_temp_deafness() -/obj/item/organ/internal/ears/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/ears/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_MOB_SAY) REMOVE_TRAIT(organ_owner, TRAIT_DEAF, EAR_DAMAGE) -/obj/item/organ/internal/ears/get_status_appendix(advanced, add_tooltips) +/obj/item/organ/ears/get_status_appendix(advanced, add_tooltips) if(owner.stat == DEAD || !HAS_TRAIT(owner, TRAIT_DEAF)) return if(advanced) @@ -69,7 +69,7 @@ return conditional_tooltip("Subject is [(organ_flags & ORGAN_FAILING) ? "permanently": "temporarily"] deaf from ear damage.", "Repair surgically, use medication such as [/datum/reagent/medicine/inacusiate::name], or protect ears with earmuffs.", add_tooltips) return "Subject is deaf." -/obj/item/organ/internal/ears/show_on_condensed_scans() +/obj/item/organ/ears/show_on_condensed_scans() // Always show if we have an appendix return ..() || (owner.stat != DEAD && HAS_TRAIT(owner, TRAIT_DEAF)) @@ -79,7 +79,7 @@ * * ddmg: Handles normal organ damage * * ddeaf: Handles temporary deafness, 1 ddeaf = 2 seconds of deafness, by default (with no multiplier) */ -/obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0) +/obj/item/organ/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0) if(HAS_TRAIT(owner, TRAIT_GODMODE)) update_temp_deafness() return @@ -93,7 +93,7 @@ update_temp_deafness() /// Updates status of deafness -/obj/item/organ/internal/ears/proc/update_temp_deafness() +/obj/item/organ/ears/proc/update_temp_deafness() // if we're failing we always have at least some deaf stacks (and thus deafness) if(organ_flags & ORGAN_FAILING) deaf = max(deaf, 1 * damage_multiplier) @@ -113,7 +113,7 @@ UnregisterSignal(owner, COMSIG_MOB_SAY) /// Being deafened by loud noises makes you shout -/obj/item/organ/internal/ears/proc/adjust_speech(datum/source, list/speech_args) +/obj/item/organ/ears/proc/adjust_speech(datum/source, list/speech_args) SIGNAL_HANDLER if(HAS_TRAIT_NOT_FROM(source, TRAIT_DEAF, EAR_DAMAGE)) @@ -141,11 +141,11 @@ speech_args[SPEECH_MESSAGE] = message return COMPONENT_UPPERCASE_SPEECH -/obj/item/organ/internal/ears/invincible +/obj/item/organ/ears/invincible damage_multiplier = 0 -/obj/item/organ/internal/ears/cat +/obj/item/organ/ears/cat name = "cat ears" icon = 'icons/obj/clothing/head/costume.dmi' worn_icon = 'icons/mob/clothing/head/costume.dmi' @@ -164,6 +164,7 @@ layers = EXTERNAL_FRONT | EXTERNAL_BEHIND color_source = ORGAN_COLOR_HAIR feature_key = "ears" + dyable = TRUE /// Layer upon which we add the inner ears overlay var/inner_layer = EXTERNAL_FRONT @@ -192,21 +193,21 @@ base_ears.overlays += inner_ears return base_ears -/obj/item/organ/internal/ears/penguin +/obj/item/organ/ears/penguin name = "penguin ears" desc = "The source of a penguin's happy feet." -/obj/item/organ/internal/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner) +/obj/item/organ/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner) . = ..() to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) ear_owner.AddElementTrait(TRAIT_WADDLING, ORGAN_TRAIT, /datum/element/waddling) -/obj/item/organ/internal/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner) +/obj/item/organ/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner) . = ..() to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) REMOVE_TRAIT(ear_owner, TRAIT_WADDLING, ORGAN_TRAIT) -/obj/item/organ/internal/ears/cybernetic +/obj/item/organ/ears/cybernetic name = "basic cybernetic ears" icon_state = "ears-c" desc = "A basic cybernetic organ designed to mimic the operation of ears." @@ -214,13 +215,13 @@ organ_flags = ORGAN_ROBOTIC failing_desc = "seems to be broken." -/obj/item/organ/internal/ears/cybernetic/upgraded +/obj/item/organ/ears/cybernetic/upgraded name = "cybernetic ears" icon_state = "ears-c-u" desc = "An advanced cybernetic ear, surpassing the performance of organic ears." damage_multiplier = 0.5 -/obj/item/organ/internal/ears/cybernetic/whisper +/obj/item/organ/ears/cybernetic/whisper name = "whisper-sensitive cybernetic ears" icon_state = "ears-c-u" desc = "Allows the user to more easily hear whispers. The user becomes extra vulnerable to loud noises, however" @@ -229,31 +230,31 @@ // The original idea was to use signals to do this not traits. Unfortunately, the star effect used for whispers applies before any relevant signals // This seems like the least invasive solution -/obj/item/organ/internal/ears/cybernetic/whisper/on_mob_insert(mob/living/carbon/ear_owner) +/obj/item/organ/ears/cybernetic/whisper/on_mob_insert(mob/living/carbon/ear_owner) . = ..() ADD_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) -/obj/item/organ/internal/ears/cybernetic/whisper/on_mob_remove(mob/living/carbon/ear_owner) +/obj/item/organ/ears/cybernetic/whisper/on_mob_remove(mob/living/carbon/ear_owner) . = ..() REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) // "X-ray ears" that let you hear through walls -/obj/item/organ/internal/ears/cybernetic/xray +/obj/item/organ/ears/cybernetic/xray name = "wall-penetrating cybernetic ears" icon_state = "ears-c-u" desc = "Throguh the power of modern engineering, allows the user to hear speech through walls. The user becomes extra vulnerable to loud noises, however" // Same sensitivity as felinid ears damage_multiplier = 2 -/obj/item/organ/internal/ears/cybernetic/xray/on_mob_insert(mob/living/carbon/ear_owner) +/obj/item/organ/ears/cybernetic/xray/on_mob_insert(mob/living/carbon/ear_owner) . = ..() ADD_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) -/obj/item/organ/internal/ears/cybernetic/xray/on_mob_remove(mob/living/carbon/ear_owner) +/obj/item/organ/ears/cybernetic/xray/on_mob_remove(mob/living/carbon/ear_owner) . = ..() REMOVE_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT) -/obj/item/organ/internal/ears/cybernetic/emp_act(severity) +/obj/item/organ/ears/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 99647f4b40548..4ba48b77e7121 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/eyes +/obj/item/organ/eyes name = BODY_ZONE_PRECISE_EYES icon_state = "eyes" desc = "I see you!" @@ -54,7 +54,7 @@ /// Scarring on this organ var/scarring = NONE -/obj/item/organ/internal/eyes/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/eyes/mob_insert(mob/living/carbon/receiver, special, movement_flags) // If we don't do this before everything else, heterochromia will be reset leading to eye_color_right no longer being accurate if(ishuman(receiver)) var/mob/living/carbon/human/human_recipient = receiver @@ -70,7 +70,7 @@ /// Refreshes the visuals of the eyes /// If call_update is TRUE, we also will call update_body -/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE) +/obj/item/organ/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE) owner.update_sight() owner.update_tint() @@ -94,7 +94,7 @@ if(call_update) affected_human.update_body() -/obj/item/organ/internal/eyes/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/eyes/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() if(ishuman(organ_owner)) @@ -122,7 +122,7 @@ organ_owner.update_sight() UnregisterSignal(organ_owner, COMSIG_ATOM_BULLET_ACT) -/obj/item/organ/internal/eyes/proc/on_bullet_act(datum/source, obj/projectile/proj, def_zone) +/obj/item/organ/eyes/proc/on_bullet_act(datum/source, obj/projectile/proj, def_zone) SIGNAL_HANDLER // Once-a-dozen-rounds level of rare @@ -149,7 +149,7 @@ #define OFFSET_Y 2 /// Similar to get_status_text, but appends the text after the damage report, for additional status info -/obj/item/organ/internal/eyes/get_status_appendix(advanced, add_tooltips) +/obj/item/organ/eyes/get_status_appendix(advanced, add_tooltips) if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_KNOCKEDOUT)) return if(owner.is_blind()) @@ -178,13 +178,13 @@ return "Subject is nearsighted." return "" -/obj/item/organ/internal/eyes/show_on_condensed_scans() +/obj/item/organ/eyes/show_on_condensed_scans() // Always show if we have an appendix return ..() || (owner.stat != DEAD && !HAS_TRAIT(owner, TRAIT_KNOCKEDOUT) && (owner.is_blind() || owner.is_nearsighted())) /// This proc generates a list of overlays that the eye should be displayed using for the given parent -/obj/item/organ/internal/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) - if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/internal/eyes) != src) +/obj/item/organ/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) + if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/eyes) != src) CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") if(isnull(eye_icon_state)) @@ -234,14 +234,14 @@ return overlays -/obj/item/organ/internal/eyes/update_overlays() +/obj/item/organ/eyes/update_overlays() . = ..() if (scarring & RIGHT_EYE_SCAR) . += mutable_appearance('icons/obj/medical/organs/organs.dmi', "eye_scar_right") if (scarring & LEFT_EYE_SCAR) . += mutable_appearance('icons/obj/medical/organs/organs.dmi', "eye_scar_left") -/obj/item/organ/internal/eyes/proc/apply_scar(side) +/obj/item/organ/eyes/proc/apply_scar(side) if (scarring & side) return scarring |= side @@ -249,7 +249,7 @@ update_appearance() apply_scarring_effects() -/obj/item/organ/internal/eyes/proc/apply_scarring_effects() +/obj/item/organ/eyes/proc/apply_scarring_effects() if (!owner) return var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted() @@ -265,7 +265,7 @@ owner.become_blind(EYE_SCARRING_TRAIT) owner.update_body() -/obj/item/organ/internal/eyes/proc/fix_scar(side) +/obj/item/organ/eyes/proc/fix_scar(side) if (!(scarring & side)) return scarring &= ~side @@ -277,12 +277,12 @@ owner.cure_blind(EYE_SCARRING_TRAIT) owner.update_body() -/obj/item/organ/internal/eyes/on_mob_insert(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/on_mob_insert(mob/living/carbon/eye_owner) . = ..() if (scarring) apply_scarring_effects() -/obj/item/organ/internal/eyes/on_mob_remove(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/on_mob_remove(mob/living/carbon/eye_owner) . = ..() if (scarring) eye_owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR) @@ -293,19 +293,19 @@ #undef OFFSET_Y //Gotta reset the eye color, because that persists -/obj/item/organ/internal/eyes/enter_wardrobe() +/obj/item/organ/eyes/enter_wardrobe() . = ..() eye_color_left = initial(eye_color_left) eye_color_right = initial(eye_color_right) -/obj/item/organ/internal/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) +/obj/item/organ/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) . = ..() if(!owner) return FALSE apply_damaged_eye_effects() /// Applies effects to our owner based on how damaged our eyes are -/obj/item/organ/internal/eyes/proc/apply_damaged_eye_effects() +/obj/item/organ/eyes/proc/apply_damaged_eye_effects() // we're in healthy threshold, either try to heal (if damaged) or do nothing if(damage <= low_threshold) if(damaged) @@ -342,7 +342,7 @@ #define NIGHTVISION_LIGHT_MID 2 #define NIGHTVISION_LIGHT_HIG 3 -/obj/item/organ/internal/eyes/night_vision +/obj/item/organ/eyes/night_vision actions_types = list(/datum/action/item_action/organ_action/use) // These lists are used as the color cutoff for the eye @@ -352,16 +352,16 @@ var/list/high_light_cutoff var/light_level = NIGHTVISION_LIGHT_OFF -/obj/item/organ/internal/eyes/night_vision/Initialize(mapload) +/obj/item/organ/eyes/night_vision/Initialize(mapload) . = ..() - if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/internal/eyes/night_vision) + if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/eyes/night_vision) if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) stack_trace("[type] did not have fully filled out color cutoff lists") if(low_light_cutoff) color_cutoffs = low_light_cutoff.Copy() light_level = NIGHTVISION_LIGHT_LOW -/obj/item/organ/internal/eyes/night_vision/ui_action_click() +/obj/item/organ/eyes/night_vision/ui_action_click() sight_flags = initial(sight_flags) switch(light_level) if (NIGHTVISION_LIGHT_OFF) @@ -383,25 +383,25 @@ #undef NIGHTVISION_LIGHT_MID #undef NIGHTVISION_LIGHT_HIG -/obj/item/organ/internal/eyes/night_vision/mushroom +/obj/item/organ/eyes/night_vision/mushroom name = "fung-eye" desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." low_light_cutoff = list(0, 15, 20) medium_light_cutoff = list(0, 20, 35) high_light_cutoff = list(0, 40, 50) -/obj/item/organ/internal/eyes/zombie +/obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." color_cutoffs = list(25, 35, 5) -/obj/item/organ/internal/eyes/alien +/obj/item/organ/eyes/alien name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS color_cutoffs = list(25, 5, 42) -/obj/item/organ/internal/eyes/golem +/obj/item/organ/eyes/golem name = "resonating crystal" icon_state = "adamantine_cords" eye_icon_state = null @@ -427,14 +427,14 @@ ///Robotic -/obj/item/organ/internal/eyes/robotic +/obj/item/organ/eyes/robotic name = "robotic eyes" icon_state = "cybernetic_eyeballs" desc = "Your vision is augmented." organ_flags = ORGAN_ROBOTIC failing_desc = "seems to be broken." -/obj/item/organ/internal/eyes/robotic/emp_act(severity) +/obj/item/organ/eyes/robotic/emp_act(severity) . = ..() if((. & EMP_PROTECT_SELF) || !owner) return @@ -443,14 +443,14 @@ to_chat(owner, span_warning("Static obfuscates your vision!")) owner.flash_act(visual = 1) -/obj/item/organ/internal/eyes/robotic/basic +/obj/item/organ/eyes/robotic/basic name = "basic robotic eyes" desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light." eye_color_left = "5500ff" eye_color_right = "5500ff" flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/basic/emp_act(severity) +/obj/item/organ/eyes/robotic/basic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -460,22 +460,22 @@ do_sparks(2, TRUE, owner) owner.emote("scream") -/obj/item/organ/internal/eyes/robotic/xray +/obj/item/organ/eyes/robotic/xray name = "\improper X-ray eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color_left = "000" eye_color_right = "000" sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS -/obj/item/organ/internal/eyes/robotic/xray/on_mob_insert(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/robotic/xray/on_mob_insert(mob/living/carbon/eye_owner) . = ..() ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) -/obj/item/organ/internal/eyes/robotic/xray/on_mob_remove(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/robotic/xray/on_mob_remove(mob/living/carbon/eye_owner) . = ..() REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) -/obj/item/organ/internal/eyes/robotic/thermals +/obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." eye_color_left = "FC0" @@ -485,7 +485,7 @@ sight_flags = SEE_MOBS flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/flashlight +/obj/item/organ/eyes/robotic/flashlight name = "flashlight eyes" desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" eye_color_left ="fee5a3" @@ -496,11 +496,11 @@ tint = INFINITY var/obj/item/flashlight/eyelight/eye -/obj/item/organ/internal/eyes/robotic/flashlight/Initialize(mapload) +/obj/item/organ/eyes/robotic/flashlight/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) -/obj/item/organ/internal/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim) +/obj/item/organ/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim) . = ..() if(!eye) eye = new /obj/item/flashlight/eyelight() @@ -509,7 +509,7 @@ eye.update_brightness(victim) victim.become_blind(FLASHLIGHT_EYES) -/obj/item/organ/internal/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim) +/obj/item/organ/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim) . = ..() eye.set_light_on(FALSE) eye.update_brightness(victim) @@ -517,12 +517,12 @@ victim.cure_blind(FLASHLIGHT_EYES) // Welding shield implant -/obj/item/organ/internal/eyes/robotic/shield +/obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." flash_protect = FLASH_PROTECTION_WELDER -/obj/item/organ/internal/eyes/robotic/shield/Initialize(mapload) +/obj/item/organ/eyes/robotic/shield/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) @@ -532,7 +532,7 @@ #define UPDATE_EYES_LEFT 1 #define UPDATE_EYES_RIGHT 2 -/obj/item/organ/internal/eyes/robotic/glow +/obj/item/organ/eyes/robotic/glow name = "High Luminosity Eyes" desc = "Special glowing eyes, used by snowflakes who want to be special." eye_color_left = "000" @@ -551,43 +551,43 @@ /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color var/right_eye_color_string -/obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload) +/obj/item/organ/eyes/robotic/glow/Initialize(mapload) . = ..() eye = new /obj/item/flashlight/eyelight/glow -/obj/item/organ/internal/eyes/robotic/glow/Destroy() +/obj/item/organ/eyes/robotic/glow/Destroy() . = ..() deactivate(close_ui = TRUE) QDEL_NULL(eye) -/obj/item/organ/internal/eyes/robotic/glow/emp_act(severity) +/obj/item/organ/eyes/robotic/glow/emp_act(severity) . = ..() if(!eye.light_on || . & EMP_PROTECT_SELF) return deactivate(close_ui = TRUE) /// Set the initial color of the eyes on insert to be the mob's previous eye color. -/obj/item/organ/internal/eyes/robotic/glow/mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags = DELETE_IF_REPLACED) +/obj/item/organ/eyes/robotic/glow/mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags = DELETE_IF_REPLACED) . = ..() left_eye_color_string = old_eye_color_left right_eye_color_string = old_eye_color_right update_mob_eye_color(eye_recipient) -/obj/item/organ/internal/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient) +/obj/item/organ/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient) . = ..() deactivate(close_ui = TRUE) eye.forceMove(eye_recipient) -/obj/item/organ/internal/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner) deactivate(eye_owner, close_ui = TRUE) if(!QDELETED(eye)) eye.forceMove(src) return ..() -/obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user) +/obj/item/organ/eyes/robotic/glow/ui_state(mob/user) return GLOB.default_state -/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state) +/obj/item/organ/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state) if(!QDELETED(owner)) if(owner == user) return min( @@ -597,14 +597,14 @@ else return UI_CLOSE return ..() -/obj/item/organ/internal/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) +/obj/item/organ/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "HighLuminosityEyesMenu") ui.autoupdate = FALSE ui.open() -/obj/item/organ/internal/eyes/robotic/glow/ui_data(mob/user) +/obj/item/organ/eyes/robotic/glow/ui_data(mob/user) var/list/data = list() data["eyeColor"] = list( @@ -618,7 +618,7 @@ return data -/obj/item/organ/internal/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) +/obj/item/organ/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return @@ -652,7 +652,7 @@ toggle_eye_color_mode() return TRUE -/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(mob/user, action) +/obj/item/organ/eyes/robotic/glow/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/organ_action/toggle)) toggle_active() else if(istype(action, /datum/action/item_action/organ_action/use)) @@ -663,7 +663,7 @@ * * Turns on the attached flashlight object, updates the mob overlay to be added. */ -/obj/item/organ/internal/eyes/robotic/glow/proc/activate() +/obj/item/organ/eyes/robotic/glow/proc/activate() if(eye.light_range) eye.set_light_on(TRUE) else @@ -678,7 +678,7 @@ * * mob/living/carbon/eye_owner - the mob who the eyes belong to * * close_ui - whether or not to close the ui */ -/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) +/obj/item/organ/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) if(close_ui) SStgui.close_uis(src) eye.set_light_on(FALSE) @@ -691,7 +691,7 @@ * Arguments: * * to_update - whether we are setting the color for the light beam itself, or the individual eyes */ -/obj/item/organ/internal/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) +/obj/item/organ/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) var/new_color = "#" for(var/i in 1 to 3) new_color += num2hex(rand(0, 255), 2) @@ -705,7 +705,7 @@ * Arguments: * * new_range - the new range to set */ -/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_range(new_range) +/obj/item/organ/eyes/robotic/glow/proc/set_beam_range(new_range) var/old_light_range = eye.light_range if(old_light_range == 0 && new_range > 0 && eye.light_on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. @@ -721,7 +721,7 @@ * * to_update - whether we are setting the color for the light beam itself, or the individual eyes * * sanitize - whether the hex string should be sanitized */ -/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) +/obj/item/organ/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) var/newcolor_string if(sanitize) newcolor_string = sanitize_hexcolor(newcolor) @@ -741,7 +741,7 @@ /** * Toggle the attached flashlight object on or off */ -/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active() +/obj/item/organ/eyes/robotic/glow/proc/toggle_active() if(eye.light_on) deactivate() else @@ -752,7 +752,7 @@ * * Toggles the eye color mode on or off and then calls an update on the mob's eye color */ -/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_eye_color_mode() +/obj/item/organ/eyes/robotic/glow/proc/toggle_eye_color_mode() eye_color_mode = !eye_color_mode update_mob_eye_color() @@ -763,7 +763,7 @@ * Arguments: * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of */ -/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) +/obj/item/organ/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) switch(eye_color_mode) if(MATCH_LIGHT_COLOR) eye_color_left = light_color_string @@ -794,39 +794,39 @@ #undef UPDATE_EYES_LEFT #undef UPDATE_EYES_RIGHT -/obj/item/organ/internal/eyes/moth +/obj/item/organ/eyes/moth name = "moth eyes" desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision." eye_icon_state = "motheyes" icon_state = "eyeballs-moth" flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/moth +/obj/item/organ/eyes/robotic/moth name = "robotic moth eyes" eye_icon_state = "motheyes" icon_state = "eyeballs-cybermoth" desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights." flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/basic/moth +/obj/item/organ/eyes/robotic/basic/moth name = "basic robotic moth eyes" eye_icon_state = "motheyes" icon_state = "eyeballs-cybermoth" flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/xray/moth +/obj/item/organ/eyes/robotic/xray/moth name = "robotic eyes" eye_icon_state = "motheyes" icon_state = "eyeballs-cybermoth" desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights." flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/shield/moth +/obj/item/organ/eyes/robotic/shield/moth name = "shielded robotic moth eyes" eye_icon_state = "motheyes" icon_state = "eyeballs-cybermoth" -/obj/item/organ/internal/eyes/robotic/glow/moth +/obj/item/organ/eyes/robotic/glow/moth name = "High Luminosity Moth Eyes" eye_icon_state = "motheyes" base_eye_state = "eyes_mothglow" @@ -834,24 +834,24 @@ desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights." flash_protect = FLASH_PROTECTION_SENSITIVE -/obj/item/organ/internal/eyes/robotic/thermals/moth //we inherit flash weakness from thermals +/obj/item/organ/eyes/robotic/thermals/moth //we inherit flash weakness from thermals name = "thermal moth eyes" eye_icon_state = "motheyes" icon_state = "eyeballs-cybermoth" -/obj/item/organ/internal/eyes/snail +/obj/item/organ/eyes/snail name = "snail eyes" desc = "These eyes seem to have a large range, but might be cumbersome with glasses." eye_icon_state = "snail_eyes" icon_state = "snail_eyeballs" -/obj/item/organ/internal/eyes/jelly +/obj/item/organ/eyes/jelly name = "jelly eyes" desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them." eye_icon_state = "jelleyes" icon_state = "eyeballs-jelly" -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted +/obj/item/organ/eyes/night_vision/maintenance_adapted name = "adapted eyes" desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark." flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE @@ -864,11 +864,11 @@ medium_light_cutoff = list(15, 20, 30) high_light_cutoff = list(30, 35, 50) -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner) +/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner) . = ..() ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) +/obj/item/organ/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) if(!owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes to_chat(owner, span_danger("Your eyes! They burn in the light!")) apply_organ_damage(10) //blind quickly @@ -877,6 +877,6 @@ apply_organ_damage(-10) //heal quickly . = ..() -/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE) +/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE) REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) return ..() diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index 36eb9c7bf996e..efc060967c611 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart +/obj/item/organ/heart name = "heart" desc = "I feel bad for the heartless bastard who lost this." icon_state = "heart-on" @@ -32,18 +32,18 @@ /// whether the heart's been operated on to fix some of its damages var/operated = FALSE -/obj/item/organ/internal/heart/update_icon_state() +/obj/item/organ/heart/update_icon_state() . = ..() icon_state = "[base_icon_state]-[beating ? "on" : "off"]" -/obj/item/organ/internal/heart/Remove(mob/living/carbon/heartless, special, movement_flags) +/obj/item/organ/heart/Remove(mob/living/carbon/heartless, special, movement_flags) . = ..() if(!special) addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 12 SECONDS) beat = BEAT_NONE owner?.stop_sound_channel(CHANNEL_HEARTBEAT) -/obj/item/organ/internal/heart/proc/stop_if_unowned() +/obj/item/organ/heart/proc/stop_if_unowned() if(QDELETED(src)) return if(IS_ROBOTIC_ORGAN(src)) @@ -51,7 +51,7 @@ if(isnull(owner)) Stop() -/obj/item/organ/internal/heart/attack_self(mob/user) +/obj/item/organ/heart/attack_self(mob/user) . = ..() if(.) return @@ -65,7 +65,7 @@ addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 8 SECONDS) return TRUE -/obj/item/organ/internal/heart/proc/Stop() +/obj/item/organ/heart/proc/Stop() if(!beating) return FALSE @@ -75,7 +75,7 @@ owner?.stop_sound_channel(CHANNEL_HEARTBEAT) return TRUE -/obj/item/organ/internal/heart/proc/Restart() +/obj/item/organ/heart/proc/Restart() if(beating) return FALSE @@ -83,25 +83,25 @@ update_appearance() return TRUE -/obj/item/organ/internal/heart/OnEatFrom(eater, feeder) +/obj/item/organ/heart/OnEatFrom(eater, feeder) . = ..() Stop() /// Checks if the heart is beating. /// Can be overridden to add more conditions for more complex hearts. -/obj/item/organ/internal/heart/proc/is_beating() +/obj/item/organ/heart/proc/is_beating() return beating -/obj/item/organ/internal/heart/get_status_text(advanced, add_tooltips) +/obj/item/organ/heart/get_status_text(advanced, add_tooltips) if(!beating && !(organ_flags & ORGAN_FAILING) && owner.needs_heart() && owner.stat != DEAD) return conditional_tooltip("Cardiac Arrest", "Apply defibrillation immediately. Similar electric shocks may work in emergencies.", add_tooltips) return ..() -/obj/item/organ/internal/heart/show_on_condensed_scans() +/obj/item/organ/heart/show_on_condensed_scans() // Always show if the guy needs a heart (so its status can be monitored) return ..() || owner.needs_heart() -/obj/item/organ/internal/heart/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/on_life(seconds_per_tick, times_fired) ..() // If the owner doesn't need a heart, we don't need to do anything with it. @@ -135,10 +135,10 @@ owner.stop_sound_channel(CHANNEL_HEARTBEAT) beat = BEAT_NONE -/obj/item/organ/internal/heart/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/heart/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantheart -/obj/item/organ/internal/heart/cursed +/obj/item/organ/heart/cursed name = "cursed heart" desc = "A heart that, when inserted, will force you to pump it manually." icon_state = "cursedheart-off" @@ -150,7 +150,7 @@ var/heal_burn = 0 var/heal_oxy = 0 -/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target) +/obj/item/organ/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target) if(accursed == user && istype(accursed)) playsound(user,'sound/effects/singlebeat.ogg',40,TRUE) user.temporarilyRemoveItemFromInventory(src, TRUE) @@ -158,17 +158,17 @@ else return ..() -/obj/item/organ/internal/heart/cursed/on_mob_insert(mob/living/carbon/accursed) +/obj/item/organ/heart/cursed/on_mob_insert(mob/living/carbon/accursed) . = ..() accursed.AddComponent(/datum/component/manual_heart, pump_delay = pump_delay, blood_loss = blood_loss, heal_brute = heal_brute, heal_burn = heal_burn, heal_oxy = heal_oxy) -/obj/item/organ/internal/heart/cursed/on_mob_remove(mob/living/carbon/accursed, special = FALSE) +/obj/item/organ/heart/cursed/on_mob_remove(mob/living/carbon/accursed, special = FALSE) . = ..() qdel(accursed.GetComponent(/datum/component/manual_heart)) -/obj/item/organ/internal/heart/cybernetic +/obj/item/organ/heart/cybernetic name = "basic cybernetic heart" desc = "A basic electronic device designed to mimic the functions of an organic human heart." icon_state = "heart-c-on" @@ -192,7 +192,7 @@ /// Chance of permanent effects if emp-ed. var/emp_vulnerability = 80 -/obj/item/organ/internal/heart/cybernetic/emp_act(severity) +/obj/item/organ/heart/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -214,7 +214,7 @@ span_userdanger("You feel a terrible pain in your chest, as if your heart has stopped!"), ) -/obj/item/organ/internal/heart/cybernetic/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/cybernetic/on_life(seconds_per_tick, times_fired) . = ..() if(organ_flags & ORGAN_EMP) @@ -238,7 +238,7 @@ if(bloodiest_wound) bloodiest_wound.adjust_blood_flow(-1 * seconds_per_tick) -/obj/item/organ/internal/heart/cybernetic/proc/stabilize_heart() +/obj/item/organ/heart/cybernetic/proc/stabilize_heart() ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT) stabilization_available = FALSE @@ -247,12 +247,12 @@ addtimer(VARSET_CALLBACK(src, stabilization_available, TRUE), 5 MINUTES, TIMER_DELETE_ME) // Largely a sanity check -/obj/item/organ/internal/heart/cybernetic/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE) +/obj/item/organ/heart/cybernetic/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE) . = ..() if(HAS_TRAIT_FROM(heart_owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT)) REMOVE_TRAIT(heart_owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT) -/obj/item/organ/internal/heart/cybernetic/tier2 +/obj/item/organ/heart/cybernetic/tier2 name = "cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. In case of lacerations or haemorrhaging, the heart rapidly begins self-replicating \ artificial blood. However, this can cause toxins to build up in the bloodstream to the imperfect replication process." @@ -262,7 +262,7 @@ bleed_prevention = TRUE emp_vulnerability = 40 -/obj/item/organ/internal/heart/cybernetic/tier3 +/obj/item/organ/heart/cybernetic/tier3 name = "upgraded cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. In case of physical trauma, the heart has temporary failsafes to maintain patient stability \ and mobility for a brief moment. In addition, the heart is able to safely self-replicate blood without risk of toxin buildup." @@ -273,7 +273,7 @@ toxification_probability = 0 emp_vulnerability = 20 -/obj/item/organ/internal/heart/cybernetic/surplus +/obj/item/organ/heart/cybernetic/surplus name = "surplus prosthetic heart" desc = "A fragile mockery of a human heart that resembles a water pump more than an actual heart. \ Offers no protection against EMPs." @@ -283,18 +283,18 @@ emp_vulnerability = 100 //surplus organs are so awful that they explode when removed, unless failing -/obj/item/organ/internal/heart/cybernetic/surplus/Initialize(mapload) +/obj/item/organ/heart/cybernetic/surplus/Initialize(mapload) . = ..() AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE) -/obj/item/organ/internal/heart/freedom +/obj/item/organ/heart/freedom name = "heart of freedom" desc = "This heart pumps with the passion to give... something freedom." organ_flags = ORGAN_ROBOTIC //the power of freedom prevents heart attacks /// The cooldown until the next time this heart can give the host an adrenaline boost. COOLDOWN_DECLARE(adrenaline_cooldown) -/obj/item/organ/internal/heart/freedom/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/freedom/on_life(seconds_per_tick, times_fired) . = ..() if(owner.health < 5 && COOLDOWN_FINISHED(src, adrenaline_cooldown)) COOLDOWN_START(src, adrenaline_cooldown, rand(25 SECONDS, 1 MINUTES)) diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm index 31e9e64750c92..df60b8243ef72 100644 --- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm +++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm @@ -3,7 +3,7 @@ */ #define DOAFTER_IMPLANTING_HEART "implanting" -/obj/item/organ/internal/heart/cybernetic/anomalock +/obj/item/organ/heart/cybernetic/anomalock name = "voltaic combat cyberheart" desc = "A cutting-edge cyberheart, originally designed for Nanotrasen killsquad usage but later declassified for normal research. Voltaic technology allows the heart to keep the body upright in dire circumstances, alongside redirecting anomalous flux energy to fully shield the user from shocks and electro-magnetic pulses. Requires a refined Flux core as a power source." icon_state = "anomalock_heart" @@ -28,7 +28,7 @@ ///If the core is removable once socketed. var/core_removable = TRUE -/obj/item/organ/internal/heart/cybernetic/anomalock/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/heart/cybernetic/anomalock/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) . = ..() if(!core) return @@ -39,7 +39,7 @@ RegisterSignal(organ_owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(activate_survival)) RegisterSignal(organ_owner, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) -/obj/item/organ/internal/heart/cybernetic/anomalock/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/heart/cybernetic/anomalock/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() if(!core) return @@ -49,7 +49,7 @@ tesla_zap(source = organ_owner, zap_range = 20, power = 2.5e5, cutoff = 1e3) qdel(src) -/obj/item/organ/internal/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, params) +/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, params) if(target_mob != user || !istype(target_mob) || !core) return ..() @@ -66,11 +66,11 @@ user.emote("scream") return TRUE -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/on_emp_act(severity) +/obj/item/organ/heart/cybernetic/anomalock/proc/on_emp_act(severity) SIGNAL_HANDLER add_lightning_overlay(10 SECONDS) -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/add_lightning_overlay(time_to_last = 10 SECONDS) +/obj/item/organ/heart/cybernetic/anomalock/proc/add_lightning_overlay(time_to_last = 10 SECONDS) if(lightning_overlay) lightning_timer = addtimer(CALLBACK(src, PROC_REF(clear_lightning_overlay)), time_to_last, (TIMER_UNIQUE|TIMER_OVERRIDE)) return @@ -78,11 +78,11 @@ owner.add_overlay(lightning_overlay) lightning_timer = addtimer(CALLBACK(src, PROC_REF(clear_lightning_overlay)), time_to_last, (TIMER_UNIQUE|TIMER_OVERRIDE)) -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/clear_lightning_overlay() +/obj/item/organ/heart/cybernetic/anomalock/proc/clear_lightning_overlay() owner.cut_overlay(lightning_overlay) lightning_overlay = null -/obj/item/organ/internal/heart/cybernetic/anomalock/attack_self(mob/user, modifiers) +/obj/item/organ/heart/cybernetic/anomalock/attack_self(mob/user, modifiers) . = ..() if(.) return @@ -90,7 +90,7 @@ if(core) return attack(user, user, modifiers) -/obj/item/organ/internal/heart/cybernetic/anomalock/on_life(seconds_per_tick, times_fired) +/obj/item/organ/heart/cybernetic/anomalock/on_life(seconds_per_tick, times_fired) . = ..() if(owner.blood_volume <= BLOOD_VOLUME_NORMAL) owner.blood_volume += 5 * seconds_per_tick @@ -98,7 +98,7 @@ activate_survival(owner) ///Does a few things to try to help you live whatever you may be going through -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/activate_survival(mob/living/carbon/organ_owner) +/obj/item/organ/heart/cybernetic/anomalock/proc/activate_survival(mob/living/carbon/organ_owner) if(!COOLDOWN_FINISHED(src, survival_cooldown)) return @@ -108,15 +108,15 @@ addtimer(CALLBACK(src, PROC_REF(notify_cooldown), organ_owner), COOLDOWN_TIMELEFT(src, survival_cooldown)) ///Alerts our owner that the organ is ready to do its thing again -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/notify_cooldown(mob/living/carbon/organ_owner) +/obj/item/organ/heart/cybernetic/anomalock/proc/notify_cooldown(mob/living/carbon/organ_owner) balloon_alert(organ_owner, "your heart strenghtens") playsound(organ_owner, 'sound/items/eshield_recharge.ogg', 40) ///Returns the mob we are implanted in so that the electricity effect doesn't runtime -/obj/item/organ/internal/heart/cybernetic/anomalock/proc/get_held_mob() +/obj/item/organ/heart/cybernetic/anomalock/proc/get_held_mob() return owner -/obj/item/organ/internal/heart/cybernetic/anomalock/item_interaction(mob/living/user, obj/item/tool, list/modifiers) +/obj/item/organ/heart/cybernetic/anomalock/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(!istype(tool, required_anomaly)) return NONE if(core) @@ -131,7 +131,7 @@ update_icon_state() return ITEM_INTERACT_SUCCESS -/obj/item/organ/internal/heart/cybernetic/anomalock/screwdriver_act(mob/living/user, obj/item/tool) +/obj/item/organ/heart/cybernetic/anomalock/screwdriver_act(mob/living/user, obj/item/tool) . = ..() if(!core) balloon_alert(user, "no core!") @@ -151,11 +151,11 @@ remove_organ_trait(TRAIT_SHOCKIMMUNE) update_icon_state() -/obj/item/organ/internal/heart/cybernetic/anomalock/update_icon_state() +/obj/item/organ/heart/cybernetic/anomalock/update_icon_state() . = ..() icon_state = initial(icon_state) + (core ? "-core" : "") -/obj/item/organ/internal/heart/cybernetic/anomalock/prebuilt/Initialize(mapload) +/obj/item/organ/heart/cybernetic/anomalock/prebuilt/Initialize(mapload) . = ..() core = new /obj/item/assembly/signaler/anomaly/flux(src) update_icon_state() diff --git a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm index 781df0dceb1f3..5c6602834cb07 100644 --- a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm +++ b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/heart/ethereal +/obj/item/organ/heart/ethereal name = "crystal core" icon_state = "ethereal_heart-on" base_icon_state = "ethereal_heart" @@ -16,38 +16,38 @@ ///Color of the heart, is set by the species on gain var/ethereal_color = "#9c3030" -/obj/item/organ/internal/heart/ethereal/Initialize(mapload) +/obj/item/organ/heart/ethereal/Initialize(mapload) . = ..() add_atom_colour(ethereal_color, FIXED_COLOUR_PRIORITY) update_appearance() -/obj/item/organ/internal/heart/ethereal/mob_insert(mob/living/carbon/heart_owner, special = FALSE, movement_flags) +/obj/item/organ/heart/ethereal/mob_insert(mob/living/carbon/heart_owner, special = FALSE, movement_flags) . = ..() RegisterSignal(heart_owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) RegisterSignal(heart_owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_owner_fully_heal)) RegisterSignal(heart_owner, COMSIG_QDELETING, PROC_REF(owner_deleted)) -/obj/item/organ/internal/heart/ethereal/mob_remove(mob/living/carbon/heart_owner, special, movement_flags) +/obj/item/organ/heart/ethereal/mob_remove(mob/living/carbon/heart_owner, special, movement_flags) UnregisterSignal(heart_owner, list(COMSIG_MOB_STATCHANGE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_QDELETING)) REMOVE_TRAIT(heart_owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) stop_crystalization_process(heart_owner) QDEL_NULL(current_crystal) return ..() -/obj/item/organ/internal/heart/ethereal/update_overlays() +/obj/item/organ/heart/ethereal/update_overlays() . = ..() var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[base_icon_state]_overlay-[beating ? "on" : "off"]") shine.appearance_flags = RESET_COLOR //No color on this, just pure white . += shine -/obj/item/organ/internal/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags) +/obj/item/organ/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags) SIGNAL_HANDLER QDEL_NULL(current_crystal) //Kicks out the ethereal ///Ran when examined while crystalizing, gives info about the amount of time left -/obj/item/organ/internal/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) +/obj/item/organ/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) SIGNAL_HANDLER if(!crystalize_timer_id) @@ -62,7 +62,7 @@ examine_list += span_notice("Some crystals are coming out of [examined_human]. ") ///On stat changes, if the victim is no longer dead but they're crystalizing, cancel it, if they become dead, start the crystalizing process if possible -/obj/item/organ/internal/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) +/obj/item/organ/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) SIGNAL_HANDLER if(new_stat != DEAD) @@ -92,7 +92,7 @@ RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) ///Ran when disarmed, prevents the ethereal from reviving -/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone, obj/item/weapon) +/obj/item/organ/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone, obj/item/weapon) SIGNAL_HANDLER defender.visible_message( span_notice("The crystals on [defender] are gently broken off."), @@ -102,7 +102,7 @@ crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), defender), CRYSTALIZE_DISARM_WAIT_TIME, TIMER_STOPPABLE) //Lets us restart the timer on disarm ///Actually spawns the crystal which puts the ethereal in it. -/obj/item/organ/internal/heart/ethereal/proc/crystalize(mob/living/ethereal) +/obj/item/organ/heart/ethereal/proc/crystalize(mob/living/ethereal) var/location = ethereal.loc @@ -118,7 +118,7 @@ stop_crystalization_process(ethereal, TRUE) ///Stop the crystalization process, unregistering any signals and resetting any variables. -/obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) +/obj/item/organ/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) UnregisterSignal(ethereal, COMSIG_LIVING_DISARM_HIT) UnregisterSignal(ethereal, COMSIG_ATOM_EXAMINE) UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE) @@ -133,14 +133,14 @@ deltimer(crystalize_timer_id) crystalize_timer_id = null -/obj/item/organ/internal/heart/ethereal/proc/owner_deleted(datum/source) +/obj/item/organ/heart/ethereal/proc/owner_deleted(datum/source) SIGNAL_HANDLER stop_crystalization_process(owner) return ///Lets you stop the process with enough brute damage -/obj/item/organ/internal/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone, ...) +/obj/item/organ/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone, ...) SIGNAL_HANDLER if(damagetype != BRUTE) return @@ -170,7 +170,7 @@ density = TRUE anchored = TRUE ///The organ this crystal belongs to - var/obj/item/organ/internal/heart/ethereal/ethereal_heart + var/obj/item/organ/heart/ethereal/ethereal_heart ///Timer for the healing process. Stops if destroyed. var/crystal_heal_timer ///Is the crystal still being built? True by default, gets changed after a timer. @@ -179,7 +179,7 @@ /obj/structure/ethereal_crystal/relaymove() return -/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/internal/heart/ethereal/ethereal_heart) +/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/heart/ethereal/ethereal_heart) . = ..() if(!ethereal_heart) stack_trace("Our crystal has no related heart") diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index 27b53404f8156..0464bfca993d7 100755 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -2,7 +2,7 @@ #define LIVER_DEFAULT_TOX_RESISTANCE 1 //lower values lower how harmful toxins are to the liver #define LIVER_FAILURE_STAGE_SECONDS 60 //amount of seconds before liver failure reaches a new stage -/obj/item/organ/internal/liver +/obj/item/organ/liver name = "liver" desc = "Pairing suggestion: chianti and fava beans." icon_state = "liver" @@ -27,7 +27,7 @@ var/filterToxins = TRUE //whether to filter toxins var/operated = FALSE //whether the liver's been repaired with surgery and can be fixed again or not -/obj/item/organ/internal/liver/Initialize(mapload) +/obj/item/organ/liver/Initialize(mapload) . = ..() // If the liver handles foods like a clown, it honks like a bike horn // Don't think about it too much. @@ -43,7 +43,7 @@ * The removal of the component, if this liver loses that trait, is handled * by the component itself. */ -/obj/item/organ/internal/liver/proc/on_add_comedy_metabolism() +/obj/item/organ/liver/proc/on_add_comedy_metabolism() SIGNAL_HANDLER // Are clown "bike" horns made from the livers of ex-clowns? @@ -54,18 +54,18 @@ * * Basically just removes squeak component */ -/obj/item/organ/internal/liver/proc/on_remove_comedy_metabolism() +/obj/item/organ/liver/proc/on_remove_comedy_metabolism() SIGNAL_HANDLER qdel(GetComponent(/datum/component/squeak)) /// Registers COMSIG_SPECIES_HANDLE_CHEMICAL from owner -/obj/item/organ/internal/liver/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL, PROC_REF(handle_chemical)) /// Unregisters COMSIG_SPECIES_HANDLE_CHEMICAL from owner -/obj/item/organ/internal/liver/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/liver/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL) @@ -76,10 +76,10 @@ * * NOTE: If you return COMSIG_MOB_STOP_REAGENT_CHECK, that reagent will not be removed like normal! You must handle it manually. **/ -/obj/item/organ/internal/liver/proc/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) +/obj/item/organ/liver/proc/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) SIGNAL_HANDLER -/obj/item/organ/internal/liver/examine(mob/user) +/obj/item/organ/liver/examine(mob/user) . = ..() if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER) || isobserver(user)) @@ -108,7 +108,7 @@ else if(HAS_TRAIT(src, TRAIT_PRETENDER_ROYAL_METABOLISM)) . += span_info("A diet of imitation caviar, and signs of insomnia, implies that this is the liver of someone who wants to be a head of staff.") -/obj/item/organ/internal/liver/before_organ_replacement(obj/item/organ/replacement) +/obj/item/organ/liver/before_organ_replacement(obj/item/organ/replacement) . = ..() if(!istype(replacement, type)) return @@ -123,7 +123,7 @@ continue ADD_TRAIT(replacement, readded_trait, JOB_TRAIT) -/obj/item/organ/internal/liver/on_life(seconds_per_tick, times_fired) +/obj/item/organ/liver/on_life(seconds_per_tick, times_fired) . = ..() //If your liver is failing, then we use the liverless version of metabolize if((organ_flags & ORGAN_FAILING) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) @@ -133,12 +133,12 @@ owner.reagents?.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE) -/obj/item/organ/internal/liver/handle_failing_organs(seconds_per_tick) +/obj/item/organ/liver/handle_failing_organs(seconds_per_tick) if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) return return ..() -/obj/item/organ/internal/liver/organ_failure(seconds_per_tick) +/obj/item/organ/liver/organ_failure(seconds_per_tick) switch(failure_time/LIVER_FAILURE_STAGE_SECONDS) if(1) to_chat(owner, span_userdanger("You feel stabbing pain in your abdomen!")) @@ -188,7 +188,7 @@ if(SPT_PROB(3, seconds_per_tick)) owner.emote("drool") -/obj/item/organ/internal/liver/on_owner_examine(datum/source, mob/user, list/examine_list) +/obj/item/organ/liver/on_owner_examine(datum/source, mob/user, list/examine_list) if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING)) return @@ -203,18 +203,18 @@ if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) examine_list += span_danger("[owner]'s eyes are completely yellow and swelling with pus. [owner.p_They()] [owner.p_do()]n't look like [owner.p_they()] will be alive for much longer.") -/obj/item/organ/internal/liver/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/liver/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantliver // alien livers can ignore up to 15u of toxins, but they take x3 liver damage -/obj/item/organ/internal/liver/alien +/obj/item/organ/liver/alien name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage desc = "A liver that used to belong to a killer alien, who knows what it used to eat." icon_state = "liver-x" // Same sprite as fly-person liver. liver_resistance = 0.333 * LIVER_DEFAULT_TOX_RESISTANCE // -66% toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful -/obj/item/organ/internal/liver/cybernetic +/obj/item/organ/liver/cybernetic name = "basic cybernetic liver" desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." failing_desc = "seems to be broken." @@ -225,7 +225,7 @@ liver_resistance = 0.9 * LIVER_DEFAULT_TOX_RESISTANCE // -10% var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/internal/liver/cybernetic/emp_act(severity) +/obj/item/organ/liver/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -235,7 +235,7 @@ if(prob(emp_vulnerability/severity)) //Chance of permanent effects organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. -/obj/item/organ/internal/liver/cybernetic/tier2 +/obj/item/organ/liver/cybernetic/tier2 name = "cybernetic liver" desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." icon_state = "liver-c-u" @@ -244,7 +244,7 @@ liver_resistance = 1.2 * LIVER_DEFAULT_TOX_RESISTANCE // +20% emp_vulnerability = 40 -/obj/item/organ/internal/liver/cybernetic/tier3 +/obj/item/organ/liver/cybernetic/tier3 name = "upgraded cybernetic liver" desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." icon_state = "liver-c-u2" @@ -254,7 +254,7 @@ liver_resistance = 1.5 * LIVER_DEFAULT_TOX_RESISTANCE // +50% emp_vulnerability = 20 -/obj/item/organ/internal/liver/cybernetic/surplus +/obj/item/organ/liver/cybernetic/surplus name = "surplus prosthetic liver" desc = "A very cheap prosthetic liver, mass produced for low-functioning alcoholics... It looks more like a water filter than \ an actual liver. \ @@ -268,7 +268,7 @@ emp_vulnerability = 100 //surplus organs are so awful that they explode when removed, unless failing -/obj/item/organ/internal/liver/cybernetic/surplus/Initialize(mapload) +/obj/item/organ/liver/cybernetic/surplus/Initialize(mapload) . = ..() AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE) diff --git a/code/modules/surgery/organs/internal/liver/liver_golem.dm b/code/modules/surgery/organs/internal/liver/liver_golem.dm index 1ab3eabcd9cc5..d9c3d4632cfec 100644 --- a/code/modules/surgery/organs/internal/liver/liver_golem.dm +++ b/code/modules/surgery/organs/internal/liver/liver_golem.dm @@ -3,16 +3,16 @@ * Basically only exists to remove the nutriment factor from consumables, * so golems can only consume minerals even when injecting reagents. * - * Actually consuming golem food is handled by /obj/item/organ/internal/stomach/golem! + * Actually consuming golem food is handled by /obj/item/organ/stomach/golem! **/ -/obj/item/organ/internal/liver/golem +/obj/item/organ/liver/golem name = "porous rock" desc = "A spongy rock capable of absorbing chemicals." icon_state = "liver-p" organ_flags = ORGAN_MINERAL color = COLOR_GOLEM_GRAY -/obj/item/organ/internal/liver/golem/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) +/obj/item/organ/liver/golem/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) . = ..() // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) diff --git a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm index be21968d659b8..714916d183ea2 100644 --- a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm +++ b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm @@ -2,7 +2,7 @@ * Plasmaman liver * Makes plasma and hot ice heal wounds, also makes gunpowder a hallucinogen. **/ -/obj/item/organ/internal/liver/bone/plasmaman +/obj/item/organ/liver/bone/plasmaman name = "reagent processing crystal" desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." icon_state = "liver-p" @@ -10,7 +10,7 @@ organ_traits = list(TRAIT_PLASMA_LOVER_METABOLISM) milk_burn_healing = 0 -/obj/item/organ/internal/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) +/obj/item/organ/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) . = ..() // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm index b57afd245f587..8ff1f0c3cf327 100644 --- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -3,7 +3,7 @@ * Gives the owner liverless metabolism, makes them vulnerable to bone hurting juice and * makes milk heal them through meme magic. **/ -/obj/item/organ/internal/liver/bone +/obj/item/organ/liver/bone name = "mass of bones" desc = "You have no idea what this strange ball of bones does." icon_state = "liver-bone" @@ -13,7 +13,7 @@ ///Var for burn healing via milk var/milk_burn_healing = 2.5 -/obj/item/organ/internal/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) +/obj/item/organ/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) . = ..() // parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING)) diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index fc3e8109461e5..d20cb4968b2bb 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/lungs +/obj/item/organ/lungs name = "lungs" icon_state = "lungs" @@ -105,7 +105,7 @@ var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine // assign the respiration_type -/obj/item/organ/internal/lungs/Initialize(mapload) +/obj/item/organ/lungs/Initialize(mapload) . = ..() breath_out = new(BREATH_VOLUME) @@ -154,7 +154,7 @@ add_gas_reaction(/datum/gas/zauker, while_present = PROC_REF(too_much_zauker)) ///Simply exists so that you don't keep any alerts from your previous lack of lungs. -/obj/item/organ/internal/lungs/mob_insert(mob/living/carbon/receiver, special = FALSE, movement_flags) +/obj/item/organ/lungs/mob_insert(mob/living/carbon/receiver, special = FALSE, movement_flags) . = ..() receiver.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) @@ -163,7 +163,7 @@ receiver.clear_alert(ALERT_NOT_ENOUGH_PLASMA) receiver.clear_alert(ALERT_NOT_ENOUGH_N2O) -/obj/item/organ/internal/lungs/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/lungs/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() // This is very "manual" I realize, but it's useful to ensure cleanup for gases we're removing happens // Avoids stuck alerts and such @@ -188,7 +188,7 @@ * while_present and always get the same arguments (mob/living/carbon/breather, datum/gas_mixture/breath, pp, old_pp) * on_loss is almost exactly the same, except it doesn't pass in a current partial pressure, since one isn't avalible */ -/obj/item/organ/internal/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null) +/obj/item/organ/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null) if(always) breathe_always[gas_type] = always @@ -208,7 +208,7 @@ * Takes the gas to check for as an argument, alongside the gas to convert and the multiplier to use * These act in the order of insertion, use that how you will */ -/obj/item/organ/internal/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier) +/obj/item/organ/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier) if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) return @@ -219,7 +219,7 @@ treat_as += list(add) /// Clears away a gas relationship. Takes the same args as the initial addition -/obj/item/organ/internal/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier) +/obj/item/organ/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier) if(isnull(gas_type) || isnull(convert_to) || multiplier == 0) return @@ -234,7 +234,7 @@ return /// Handles oxygen breathing. Always called by things that need o2, no matter what -/obj/item/organ/internal/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) +/obj/item/organ/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) if(o2_pp < safe_oxygen_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) // Not safe to check the old pp because of can_breath_vacuum breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) @@ -256,7 +256,7 @@ breather.adjustOxyLoss(-5) /// Maximum Oxygen effects. "Too much O2!" -/obj/item/organ/internal/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) +/obj/item/organ/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp) // If too much Oxygen is poisonous. if(o2_pp <= safe_oxygen_max) if(old_o2_pp > safe_oxygen_max) @@ -269,11 +269,11 @@ breather.throw_alert(ALERT_TOO_MUCH_OXYGEN, /atom/movable/screen/alert/too_much_oxy) /// Handles NOT having too much o2. only relevant if safe_oxygen_max has a value -/obj/item/organ/internal/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp) +/obj/item/organ/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp) breather.clear_alert(ALERT_TOO_MUCH_OXYGEN) /// Behaves like Oxygen with 8X efficacy, but metabolizes into a reagent. -/obj/item/organ/internal/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp) +/obj/item/organ/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp) breathe_gas_volume(breath, /datum/gas/pluoxium) // Metabolize to reagent. if(pluoxium_pp > gas_stimulation_min) @@ -281,7 +281,7 @@ breather.reagents.add_reagent(/datum/reagent/pluoxium, max(0, 1 - existing)) /// If the lungs need Nitrogen to breathe properly, N2 is exchanged with CO2. -/obj/item/organ/internal/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp) +/obj/item/organ/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp) if(nitro_pp < safe_nitro_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) // Suffocation side-effects. // Not safe to check the old pp because of can_breath_vacuum @@ -303,7 +303,7 @@ breather.adjustOxyLoss(-5) /// Maximum CO2 effects. "Too much CO2!" -/obj/item/organ/internal/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp) +/obj/item/organ/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp) if(co2_pp <= safe_co2_max) if(old_co2_pp > safe_co2_max) return BREATH_LOST @@ -329,13 +329,13 @@ breather.apply_damage(8, co2_damage_type, spread_damage = TRUE) /// Handles NOT having too much co2. only relevant if safe_co2_max has a value -/obj/item/organ/internal/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp) +/obj/item/organ/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp) // Reset side-effects. breather.co2overloadtime = 0 breather.clear_alert(ALERT_TOO_MUCH_CO2) /// If the lungs need Plasma to breathe properly, Plasma is exchanged with CO2. -/obj/item/organ/internal/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) +/obj/item/organ/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) // Suffocation side-effects. if(plasma_pp < safe_plasma_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING)) // Could check old_plasma_pp but vacuum breathing hates me @@ -357,7 +357,7 @@ breather.adjustOxyLoss(-5) /// Maximum Plasma effects. "Too much Plasma!" -/obj/item/organ/internal/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) +/obj/item/organ/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp) if(plasma_pp <= safe_plasma_max) if(old_plasma_pp > safe_plasma_max) return BREATH_LOST @@ -372,11 +372,11 @@ breather.apply_damage(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type, spread_damage = TRUE) /// Resets plasma side effects -/obj/item/organ/internal/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp) +/obj/item/organ/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp) breather.clear_alert(ALERT_TOO_MUCH_PLASMA) /// Too much funny gas, time to get brain damage -/obj/item/organ/internal/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp) +/obj/item/organ/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp) if(bz_pp > BZ_trip_balls_min) breather.adjust_hallucinations(20 SECONDS) breather.reagents.add_reagent(/datum/reagent/bz_metabolites, 5) @@ -384,7 +384,7 @@ breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC) /// Breathing in refridgerator coolent, shit's caustic -/obj/item/organ/internal/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp) +/obj/item/organ/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp) // Inhale Freon. Exhale nothing. breathe_gas_volume(breath, /datum/gas/freon) if (freon_pp > gas_stimulation_min) @@ -401,7 +401,7 @@ breather.adjustFireLoss(freon_pp / 4) /// Breathing in halon, convert it to a reagent -/obj/item/organ/internal/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp) +/obj/item/organ/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp) // Inhale Halon. Exhale nothing. breathe_gas_volume(breath, /datum/gas/halon) // Metabolize to reagent. @@ -410,7 +410,7 @@ breather.reagents.add_reagent(/datum/reagent/halon, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/halon))) /// Sleeping gas with healing properties. -/obj/item/organ/internal/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp) +/obj/item/organ/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp) breathe_gas_volume(breath, /datum/gas/healium) // Euphoria side-effect. if(healium_pp > gas_stimulation_min) @@ -428,11 +428,11 @@ breather.reagents.add_reagent(/datum/reagent/healium, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/healium))) /// Lose healium side effects -/obj/item/organ/internal/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp) +/obj/item/organ/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp) healium_euphoria = EUPHORIA_INACTIVE /// Activates helium speech when partial pressure gets high enough -/obj/item/organ/internal/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp) +/obj/item/organ/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp) breathe_gas_volume(breath, /datum/gas/helium) if(helium_pp > helium_speech_min) if(old_helium_pp <= helium_speech_min) @@ -442,23 +442,23 @@ UnregisterSignal(breather, COMSIG_MOB_SAY) /// Lose helium high pitched voice -/obj/item/organ/internal/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp) +/obj/item/organ/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp) UnregisterSignal(breather, COMSIG_MOB_SAY) /// React to speach while hopped up on the high pitched voice juice -/obj/item/organ/internal/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args) +/obj/item/organ/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args) SIGNAL_HANDLER speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE /// Gain hypernob effects if we have enough of the stuff -/obj/item/organ/internal/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp) +/obj/item/organ/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp) breathe_gas_volume(breath, /datum/gas/hypernoblium) if (hypernob_pp > gas_stimulation_min) var/existing = breather.reagents.get_reagent_amount(/datum/reagent/hypernoblium) breather.reagents.add_reagent(/datum/reagent/hypernoblium,max(0, 1 - existing)) /// Breathing in the stink gas -/obj/item/organ/internal/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp) +/obj/item/organ/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp) // Inhale Miasma. Exhale nothing. breathe_gas_volume(breath, /datum/gas/miasma) // Miasma side effects @@ -494,12 +494,12 @@ breather.adjust_disgust(0.1 * miasma_pp) /// We're free from the stick, clear out its impacts -/obj/item/organ/internal/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp) +/obj/item/organ/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp) // Clear out moods when immune to miasma, or if there's no miasma at all. breather.clear_mood_event("smell") /// Causes random euphoria and giggling. Large amounts knock you down -/obj/item/organ/internal/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp) +/obj/item/organ/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp) if(n2o_pp < n2o_para_min) // Small amount of N2O, small side-effects. if(n2o_pp <= n2o_detect_min) @@ -532,12 +532,12 @@ breather.Sleeping(min(breather.AmountSleeping() + 100, 200)) /// N2O side-effects. "Too much N2O!" -/obj/item/organ/internal/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp) +/obj/item/organ/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp) n2o_euphoria = EUPHORIA_INACTIVE breather.clear_alert(ALERT_TOO_MUCH_N2O) // Breathe in nitrium. It's helpful, but has nasty side effects -/obj/item/organ/internal/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp) +/obj/item/organ/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp) breathe_gas_volume(breath, /datum/gas/nitrium) if(prob(20)) @@ -557,7 +557,7 @@ breather.reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, max(0, 1 - existing)) /// Radioactive, green gas. Toxin damage, and a radiation chance -/obj/item/organ/internal/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp) +/obj/item/organ/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp) var/gas_breathed = breathe_gas_volume(breath, /datum/gas/tritium) var/moles_visible = GLOB.meta_gas_info[/datum/gas/tritium][META_GAS_MOLES_VISIBLE] * BREATH_PERCENTAGE // Tritium side-effects. @@ -572,7 +572,7 @@ breather.AddComponent(/datum/component/irradiated) /// Really toxic stuff, very much trying to kill you -/obj/item/organ/internal/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp) +/obj/item/organ/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp) breathe_gas_volume(breath, /datum/gas/zauker) // Metabolize to reagent. if(zauker_pp > gas_stimulation_min) @@ -591,7 +591,7 @@ * * breath: A gas mixture to test, or null. * * breather: A carbon mob that is using the lungs to breathe. */ -/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) +/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) if(HAS_TRAIT(breather, TRAIT_GODMODE)) breather.failed_last_breath = FALSE breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) @@ -711,7 +711,7 @@ /// Remove gas from breath. If output_gas is given, transfers the removed gas to the lung's gas_mixture. /// Removes 100% of the given gas type unless given a volume argument. /// Returns the amount of gas theoretically removed. -/obj/item/organ/internal/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY) +/obj/item/organ/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY) var/list/breath_gases = breath.gases volume = min(volume, breath_gases[remove_id][MOLES]) breath_gases[remove_id][MOLES] -= volume @@ -722,7 +722,7 @@ /// Applies suffocation side-effects to a given Human, scaling based on ratio of required pressure VS "true" pressure. /// If pressure is greater than 0, the return value will represent the amount of gas successfully breathed. -/obj/item/organ/internal/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0) +/obj/item/organ/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0) . = 0 // Can't suffocate without a Human, or without minimum breath pressure. if(!suffocator || !safe_breath_min) @@ -752,7 +752,7 @@ suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) -/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures +/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures var/breath_temperature = breath.temperature if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE @@ -801,7 +801,7 @@ breath.temperature = breather.bodytemperature /// Creates a particle effect off the mouth of the passed mob. -/obj/item/organ/internal/lungs/proc/emit_breath_particle(mob/living/carbon/human/breather, particle_type) +/obj/item/organ/lungs/proc/emit_breath_particle(mob/living/carbon/human/breather, particle_type) ASSERT(ispath(particle_type, /particles)) var/obj/effect/abstract/particle_holder/holder = new(breather, particle_type) @@ -836,7 +836,7 @@ QDEL_IN(holder, breath_particle.lifespan) -/obj/item/organ/internal/lungs/on_life(seconds_per_tick, times_fired) +/obj/item/organ/lungs/on_life(seconds_per_tick, times_fired) . = ..() if(failed && !(organ_flags & ORGAN_FAILING)) failed = FALSE @@ -849,13 +849,13 @@ owner.visible_message(span_danger("[owner] grabs [owner.p_their()] throat, struggling for breath!"), span_userdanger("You suddenly feel like you can't breathe!")) failed = TRUE -/obj/item/organ/internal/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantlungs #define SMOKER_ORGAN_HEALTH (STANDARD_ORGAN_THRESHOLD * 0.75) #define SMOKER_LUNG_HEALING (STANDARD_ORGAN_HEALING * 0.75) -/obj/item/organ/internal/lungs/plasmaman +/obj/item/organ/lungs/plasmaman name = "plasma filter" desc = "A spongy rib-shaped mass for filtering plasma from the air." icon_state = "lungs-plasma" @@ -865,7 +865,7 @@ safe_plasma_min = 4 //We breathe THIS! safe_plasma_max = 0 -/obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker +/obj/item/organ/lungs/plasmaman/plasmaman_smoker name = "smoker plasma filter" desc = "A plasma filter that look discolored, a result from smoking a lot." icon_state = "lungs_plasma_smoker" @@ -873,19 +873,19 @@ maxHealth = SMOKER_ORGAN_HEALTH healing_factor = SMOKER_LUNG_HEALING -/obj/item/organ/internal/lungs/slime +/obj/item/organ/lungs/slime name = "vacuole" desc = "A large organelle designed to store oxygen and other important gasses." safe_plasma_max = 0 //We breathe this to gain POWER. -/obj/item/organ/internal/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) +/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) . = ..() if (breath?.gases[/datum/gas/plasma]) var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma][MOLES]) breather_slime.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. -/obj/item/organ/internal/lungs/smoker_lungs +/obj/item/organ/lungs/smoker_lungs name = "smoker lungs" desc = "A pair of lungs that look sickly, a result from smoking a lot." icon_state = "lungs_smoker" @@ -893,7 +893,7 @@ maxHealth = SMOKER_ORGAN_HEALTH healing_factor = SMOKER_LUNG_HEALING -/obj/item/organ/internal/lungs/cybernetic +/obj/item/organ/lungs/cybernetic name = "basic cybernetic lungs" desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." failing_desc = "seems to be broken." @@ -902,7 +902,7 @@ maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/internal/lungs/cybernetic/emp_act(severity) +/obj/item/organ/lungs/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -912,7 +912,7 @@ if(prob(emp_vulnerability/severity)) //Chance of permanent effects organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. -/obj/item/organ/internal/lungs/cybernetic/tier2 +/obj/item/organ/lungs/cybernetic/tier2 name = "cybernetic lungs" desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure." icon_state = "lungs-c-u" @@ -920,7 +920,7 @@ safe_oxygen_min = 13 emp_vulnerability = 40 -/obj/item/organ/internal/lungs/cybernetic/tier3 +/obj/item/organ/lungs/cybernetic/tier3 name = "upgraded cybernetic lungs" desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out lower levels of plasma and carbon dioxide." icon_state = "lungs-c-u2" @@ -934,7 +934,7 @@ cold_level_2_threshold = 140 cold_level_3_threshold = 100 -/obj/item/organ/internal/lungs/cybernetic/surplus +/obj/item/organ/lungs/cybernetic/surplus name = "surplus prosthetic lungs" desc = "Two fragile, inflatable sacks of air that only barely mimic the function of human lungs. \ Offer no protection against EMPs." @@ -943,11 +943,11 @@ emp_vulnerability = 100 //surplus organs are so awful that they explode when removed, unless failing -/obj/item/organ/internal/lungs/cybernetic/surplus/Initialize(mapload) +/obj/item/organ/lungs/cybernetic/surplus/Initialize(mapload) . = ..() AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE) -/obj/item/organ/internal/lungs/lavaland +/obj/item/organ/lungs/lavaland name = "blackened frilled lungs" // blackened from necropolis exposure desc = "Exposure to the necropolis has mutated these lungs to breathe the air of Indecipheres, the lava-covered moon." icon_state = "lungs-ashwalker" @@ -956,7 +956,7 @@ // to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules. #define GAS_TOLERANCE 5 -/obj/item/organ/internal/lungs/lavaland/Initialize(mapload) +/obj/item/organ/lungs/lavaland/Initialize(mapload) var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] if(!mix?.total_moles()) // this typically means we didn't load lavaland, like if we're using the LOWMEMORYMODE define @@ -1007,7 +1007,7 @@ #undef GAS_TOLERANCE -/obj/item/organ/internal/lungs/ethereal +/obj/item/organ/lungs/ethereal name = "aeration reticulum" desc = "These exotic lungs seem crunchier than most." icon_state = "lungs_ethereal" @@ -1015,7 +1015,7 @@ heat_level_2_threshold = 473 heat_level_3_threshold = 1073 -/obj/item/organ/internal/lungs/ethereal/ethereal_smoker +/obj/item/organ/lungs/ethereal/ethereal_smoker name = "smoker aeration reticulum" desc = "A pair of exotic lungs that look pale and sickly, a result from smoking a lot." icon_state = "lungs_ethereal_smoker" @@ -1023,12 +1023,12 @@ maxHealth = SMOKER_ORGAN_HEALTH healing_factor = SMOKER_LUNG_HEALING -/obj/item/organ/internal/lungs/ethereal/Initialize(mapload) +/obj/item/organ/lungs/ethereal/Initialize(mapload) . = ..() add_gas_reaction(/datum/gas/water_vapor, while_present = PROC_REF(consume_water)) /// H2O electrolysis -/obj/item/organ/internal/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp) +/obj/item/organ/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp) var/gas_breathed = breath.gases[/datum/gas/water_vapor][MOLES] breath.gases[/datum/gas/water_vapor][MOLES] -= gas_breathed breath_out.assert_gases(/datum/gas/oxygen, /datum/gas/hydrogen) diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm index e3c52ae30881d..d57ea9680bf1a 100644 --- a/code/modules/surgery/organs/internal/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -1,7 +1,7 @@ //The contant in the rate of reagent transfer on life ticks #define STOMACH_METABOLISM_CONSTANT 0.25 -/obj/item/organ/internal/stomach +/obj/item/organ/stomach name = "stomach" desc = "Onaka ga suite imasu." icon_state = "stomach" @@ -35,7 +35,7 @@ var/operated = FALSE //whether the stomach's been repaired with surgery and can be fixed again or not -/obj/item/organ/internal/stomach/Initialize(mapload) +/obj/item/organ/stomach/Initialize(mapload) . = ..() //None edible organs do not get a reagent holder by default if(!reagents) @@ -43,7 +43,7 @@ else reagents.flags |= REAGENT_HOLDER_ALIVE -/obj/item/organ/internal/stomach/on_life(seconds_per_tick, times_fired) +/obj/item/organ/stomach/on_life(seconds_per_tick, times_fired) . = ..() //Manage species digestion @@ -119,7 +119,7 @@ body.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = damage) to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!")) -/obj/item/organ/internal/stomach/proc/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) +/obj/item/organ/stomach/proc/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) if(HAS_TRAIT(human, TRAIT_NOHUNGER)) return //hunger is for BABIES @@ -185,21 +185,21 @@ handle_hunger_slowdown(human) ///for when mood is disabled and hunger should handle slowdowns -/obj/item/organ/internal/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human) +/obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human) var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80 if(hungry >= 70) human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50)) else human.remove_movespeed_modifier(/datum/movespeed_modifier/hunger) -/obj/item/organ/internal/stomach/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/stomach/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutantstomach ///This gets called after the owner takes a bite of food -/obj/item/organ/internal/stomach/proc/after_eat(atom/edible) +/obj/item/organ/stomach/proc/after_eat(atom/edible) return -/obj/item/organ/internal/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, seconds_per_tick, times_fired) +/obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, seconds_per_tick, times_fired) var/old_disgust = disgusted.old_disgust var/disgust = disgusted.disgust @@ -246,11 +246,11 @@ disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/disgusted) disgusted.add_mood_event("disgust", /datum/mood_event/disgusted) -/obj/item/organ/internal/stomach/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/stomach/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() receiver.hud_used?.hunger?.update_appearance() -/obj/item/organ/internal/stomach/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags) +/obj/item/organ/stomach/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags) if(ishuman(stomach_owner)) var/mob/living/carbon/human/human_owner = owner human_owner.clear_alert(ALERT_DISGUST) @@ -258,21 +258,21 @@ stomach_owner.hud_used?.hunger?.update_appearance() return ..() -/obj/item/organ/internal/stomach/bone +/obj/item/organ/stomach/bone name = "mass of bones" desc = "You have no idea what this strange ball of bones does." icon_state = "stomach-bone" metabolism_efficiency = 0.025 //very bad organ_traits = list(TRAIT_NOHUNGER) -/obj/item/organ/internal/stomach/bone/plasmaman +/obj/item/organ/stomach/bone/plasmaman name = "digestive crystal" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." icon_state = "stomach-p" metabolism_efficiency = 0.06 organ_traits = null -/obj/item/organ/internal/stomach/cybernetic +/obj/item/organ/stomach/cybernetic name = "basic cybernetic stomach" desc = "A basic device designed to mimic the functions of a human stomach" failing_desc = "seems to be broken." @@ -282,7 +282,7 @@ metabolism_efficiency = 0.035 // not as good at digestion var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/internal/stomach/cybernetic/emp_act(severity) +/obj/item/organ/stomach/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -292,7 +292,7 @@ if(prob(emp_vulnerability/severity)) //Chance of permanent effects organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon. -/obj/item/organ/internal/stomach/cybernetic/tier2 +/obj/item/organ/stomach/cybernetic/tier2 name = "cybernetic stomach" desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better." icon_state = "stomach-c-u" @@ -301,7 +301,7 @@ emp_vulnerability = 40 metabolism_efficiency = 0.07 -/obj/item/organ/internal/stomach/cybernetic/tier3 +/obj/item/organ/stomach/cybernetic/tier3 name = "upgraded cybernetic stomach" desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well." icon_state = "stomach-c-u2" @@ -310,7 +310,7 @@ emp_vulnerability = 20 metabolism_efficiency = 0.1 -/obj/item/organ/internal/stomach/cybernetic/surplus +/obj/item/organ/stomach/cybernetic/surplus name = "surplus prosthetic stomach" desc = "A mechanical plastic oval that utilizes sulfuric acid instead of stomach acid. \ Very fragile, with painfully slow metabolism.\ @@ -321,7 +321,7 @@ metabolism_efficiency = 0.025 //surplus organs are so awful that they explode when removed, unless failing -/obj/item/organ/internal/stomach/cybernetic/surplus/Initialize(mapload) +/obj/item/organ/stomach/cybernetic/surplus/Initialize(mapload) . = ..() AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE) diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm index d340edbecea64..80082cf47a595 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/stomach/ethereal +/obj/item/organ/stomach/ethereal name = "biological battery" icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy. desc = "A crystal-like organ that stores the electric charge of ethereals." @@ -8,25 +8,25 @@ ///used to keep ethereals from spam draining power sources var/drain_time = 0 -/obj/item/organ/internal/stomach/ethereal/Initialize(mapload) +/obj/item/organ/stomach/ethereal/Initialize(mapload) . = ..() cell = new /obj/item/stock_parts/power_store/cell/ethereal(src) -/obj/item/organ/internal/stomach/ethereal/Destroy() +/obj/item/organ/stomach/ethereal/Destroy() QDEL_NULL(cell) return ..() -/obj/item/organ/internal/stomach/ethereal/on_life(seconds_per_tick, times_fired) +/obj/item/organ/stomach/ethereal/on_life(seconds_per_tick, times_fired) . = ..() adjust_charge(-ETHEREAL_DISCHARGE_RATE * seconds_per_tick) handle_charge(owner, seconds_per_tick, times_fired) -/obj/item/organ/internal/stomach/ethereal/on_mob_insert(mob/living/carbon/stomach_owner) +/obj/item/organ/stomach/ethereal/on_mob_insert(mob/living/carbon/stomach_owner) . = ..() RegisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) RegisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute)) -/obj/item/organ/internal/stomach/ethereal/on_mob_remove(mob/living/carbon/stomach_owner) +/obj/item/organ/stomach/ethereal/on_mob_remove(mob/living/carbon/stomach_owner) . = ..() UnregisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) UnregisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT) @@ -34,15 +34,15 @@ stomach_owner.clear_alert(ALERT_ETHEREAL_CHARGE) stomach_owner.clear_alert(ALERT_ETHEREAL_OVERCHARGE) -/obj/item/organ/internal/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human) +/obj/item/organ/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human) human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - cell.charge() / 100))) -/obj/item/organ/internal/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick) +/obj/item/organ/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick) SIGNAL_HANDLER charge_cell.Invoke(cell, seconds_per_tick / 3.5) // Ethereals don't have NT designed charging ports, so they charge slower. -/obj/item/organ/internal/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, flags = NONE) +/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, flags = NONE) SIGNAL_HANDLER if(flags & SHOCK_ILLUSION) return @@ -54,11 +54,11 @@ * - amount: The change of the energy, in joules. * Returns: The amount of energy that actually got changed in joules. **/ -/obj/item/organ/internal/stomach/ethereal/proc/adjust_charge(amount) +/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount) var/amount_changed = clamp(amount, ETHEREAL_CHARGE_NONE - cell.charge(), ETHEREAL_CHARGE_DANGEROUS - cell.charge()) return cell.change(amount_changed) -/obj/item/organ/internal/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired) +/obj/item/organ/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired) switch(cell.charge()) if(-INFINITY to ETHEREAL_CHARGE_NONE) carbon.add_mood_event("charge", /datum/mood_event/decharged) @@ -90,7 +90,7 @@ carbon.clear_alert(ALERT_ETHEREAL_CHARGE) carbon.clear_alert(ALERT_ETHEREAL_OVERCHARGE) -/obj/item/organ/internal/stomach/ethereal/proc/discharge_process(mob/living/carbon/carbon) +/obj/item/organ/stomach/ethereal/proc/discharge_process(mob/living/carbon/carbon) to_chat(carbon, span_warning("You begin to lose control over your charge!")) carbon.visible_message(span_danger("[carbon] begins to spark violently!")) diff --git a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm index a1f5ce6c70ea8..c4fa888f6cb6d 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/stomach/golem +/obj/item/organ/stomach/golem name = "silicate grinder" icon_state = "stomach-p" desc = "A rocklike organ which grinds and processes nutrition from minerals." @@ -11,18 +11,18 @@ /// How slow are you if you have absolutely nothing in the tank? var/max_hunger_slowdown = 4 -/obj/item/organ/internal/stomach/golem/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/stomach/golem/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(owner, COMSIG_CARBON_ATTEMPT_EAT, PROC_REF(try_eating)) -/obj/item/organ/internal/stomach/golem/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/stomach/golem/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_CARBON_ATTEMPT_EAT) organ_owner.remove_movespeed_modifier(/datum/movespeed_modifier/golem_hunger) organ_owner.remove_status_effect(/datum/status_effect/golem_statued) /// Reject food, rocks only -/obj/item/organ/internal/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating) +/obj/item/organ/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating) SIGNAL_HANDLER if(istype(eating, /obj/item/food/golem_food)) return @@ -30,7 +30,7 @@ return COMSIG_CARBON_BLOCK_EAT /// Golem stomach cannot process nutriment except from minerals -/obj/item/organ/internal/stomach/golem/on_life(delta_time, times_fired) +/obj/item/organ/stomach/golem/on_life(delta_time, times_fired) for(var/datum/reagent/consumable/food in reagents.reagent_list) if (istype(food, /datum/reagent/consumable/nutriment/mineral)) continue @@ -38,7 +38,7 @@ return ..() /// Slow down based on how full you are -/obj/item/organ/internal/stomach/golem/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired) +/obj/item/organ/stomach/golem/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired) // the effects are all negative, so just don't run them if you have the trait . = ..() if(HAS_TRAIT(human, TRAIT_NOHUNGER)) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 9486389aa516a..b94d434a18601 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/tongue +/obj/item/organ/tongue name = "tongue" desc = "A fleshy muscle mostly used for lying." icon_state = "tongue" @@ -14,7 +14,7 @@ * Relates to a mob's ability to speak a language - a mob must be able to speak the language * and have a tongue able to speak the language (or omnitongue) in order to actually speak said language * - * To modify this list for subtypes, see [/obj/item/organ/internal/tongue/proc/get_possible_languages]. Do not modify directly. + * To modify this list for subtypes, see [/obj/item/organ/tongue/proc/get_possible_languages]. Do not modify directly. */ VAR_PRIVATE/list/languages_possible /** @@ -44,7 +44,7 @@ /// Whether this tongue modifies speech via signal var/modifies_speech = FALSE -/obj/item/organ/internal/tongue/Initialize(mapload) +/obj/item/organ/tongue/Initialize(mapload) . = ..() // Setup the possible languages list // - get_possible_languages gives us a list of language paths @@ -52,7 +52,7 @@ // this results in tongues with identical possible languages sharing a cached list instance languages_possible = string_list(get_possible_languages()) -/obj/item/organ/internal/tongue/examine(mob/user) +/obj/item/organ/tongue/examine(mob/user) . = ..() if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER)|| isobserver(user)) if(liked_foodtypes) @@ -71,7 +71,7 @@ * While a user may be theoretically capable of speaking a language, they cannot physically speak it * UNLESS they have a tongue with that language possible, UNLESS UNLESS they have omnitongue enabled. */ -/obj/item/organ/internal/tongue/proc/get_possible_languages() +/obj/item/organ/tongue/proc/get_possible_languages() RETURN_TYPE(/list) // This is the default list of languages most humans should be capable of speaking return list( @@ -91,20 +91,20 @@ /datum/language/nekomimetic, ) -/obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER if(should_modify_speech(source, speech_args)) modify_speech(source, speech_args) -/obj/item/organ/internal/tongue/proc/should_modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/proc/should_modify_speech(datum/source, list/speech_args) if(speech_args[SPEECH_LANGUAGE] in languages_native) // Speaking a native language? return FALSE // Don't modify speech if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) // No modifiers for signers - I hate this but I simply cannot get these to combine into one statement return FALSE // Don't modify speech return TRUE -/obj/item/organ/internal/tongue/proc/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/proc/modify_speech(datum/source, list/speech_args) return speech_args[SPEECH_MESSAGE] /** @@ -114,7 +114,7 @@ * Can be overriden by subtypes for more complex behavior. * Does not get called if the owner has ageusia. **/ -/obj/item/organ/internal/tongue/proc/get_food_taste_reaction(obj/item/food, foodtypes = NONE) +/obj/item/organ/tongue/proc/get_food_taste_reaction(obj/item/food, foodtypes = NONE) var/food_taste_reaction if(foodtypes & toxic_foodtypes) food_taste_reaction = FOOD_TOXIC @@ -124,7 +124,7 @@ food_taste_reaction = FOOD_LIKED return food_taste_reaction -/obj/item/organ/internal/tongue/mob_insert(mob/living/carbon/receiver, special, movement_flags) +/obj/item/organ/tongue/mob_insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(modifies_speech) @@ -138,7 +138,7 @@ REMOVE_TRAIT(receiver, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) apply_tongue_effects() -/obj/item/organ/internal/tongue/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) +/obj/item/organ/tongue/mob_remove(mob/living/carbon/organ_owner, special, movement_flags) . = ..() temp_say_mod = "" @@ -149,14 +149,14 @@ ADD_TRAIT(organ_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) organ_owner.voice_filter = initial(organ_owner.voice_filter) -/obj/item/organ/internal/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) +/obj/item/organ/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag) . = ..() if(!owner) return FALSE apply_tongue_effects() /// Applies effects to our owner based on how damaged our tongue is -/obj/item/organ/internal/tongue/proc/apply_tongue_effects() +/obj/item/organ/tongue/proc/apply_tongue_effects() if(sense_of_taste) //tongues can't taste food when they are failing if(organ_flags & ORGAN_FAILING) @@ -171,13 +171,13 @@ else ADD_TRAIT(owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) -/obj/item/organ/internal/tongue/could_speak_language(datum/language/language_path) +/obj/item/organ/tongue/could_speak_language(datum/language/language_path) return (language_path in languages_possible) -/obj/item/organ/internal/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob) +/obj/item/organ/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob) return owner_species.mutanttongue -/obj/item/organ/internal/tongue/lizard +/obj/item/organ/tongue/lizard name = "forked tongue" desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose." icon_state = "tonguelizard" @@ -197,11 +197,11 @@ new /regex(@"\bX([\-|r|R]|\b)", "g") = "ECKS$1", ) -/obj/item/organ/internal/tongue/lizard/New(class, timer, datum/mutation/human/copymut) +/obj/item/organ/tongue/lizard/New(class, timer, datum/mutation/human/copymut) . = ..() AddComponent(/datum/component/speechmod, replacements = speech_replacements, should_modify_speech = CALLBACK(src, PROC_REF(should_modify_speech))) -/obj/item/organ/internal/tongue/lizard/silver +/obj/item/organ/tongue/lizard/silver name = "silver tongue" desc = "A genetic branch of the high society Silver Scales that gives them their silverizing properties. To them, it is everything, and society traitors have their tongue forcibly revoked. Oddly enough, it itself is just blue." icon_state = "silvertongue" @@ -221,7 +221,7 @@ /datum/action/cooldown/turn_to_statue/New(Target) . = ..() - if(!istype(Target, /obj/item/organ/internal/tongue/lizard/silver)) + if(!istype(Target, /obj/item/organ/tongue/lizard/silver)) stack_trace("Non-silverscale tongue initialized a turn to statue action.") qdel(src) return @@ -239,7 +239,7 @@ if(!isliving(owner)) return FALSE - var/obj/item/organ/internal/tongue/lizard/silver/tongue_target = target + var/obj/item/organ/tongue/lizard/silver/tongue_target = target if(tongue_target.owner != owner) return FALSE @@ -350,7 +350,7 @@ bomb = 50 fire = 100 -/obj/item/organ/internal/tongue/abductor +/obj/item/organ/tongue/abductor name = "superlingual matrix" desc = "A mysterious structure that allows for instant communication between users. Pretty impressive until you need to eat something." icon_state = "tongueayylmao" @@ -359,11 +359,11 @@ modifies_speech = TRUE var/mothership -/obj/item/organ/internal/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) +/obj/item/organ/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) if(!istype(tongue_holder)) return - var/obj/item/organ/internal/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE) if(!istype(tongue)) return @@ -375,7 +375,7 @@ to_chat(tongue_holder, span_notice("You attune [src] to your own channel.")) mothership = tongue.mothership -/obj/item/organ/internal/tongue/abductor/examine(mob/examining_mob) +/obj/item/organ/tongue/abductor/examine(mob/examining_mob) . = ..() if(HAS_MIND_TRAIT(examining_mob, TRAIT_ABDUCTOR_TRAINING) || isobserver(examining_mob)) . += span_notice("It can be attuned to a different channel by using it inhand.") @@ -384,14 +384,14 @@ else . += span_notice("It is attuned to [mothership].") -/obj/item/organ/internal/tongue/abductor/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/abductor/modify_speech(datum/source, list/speech_args) //Hacks var/message = speech_args[SPEECH_MESSAGE] var/mob/living/carbon/human/user = source var/rendered = span_abductor("[user.real_name]: [message]") user.log_talk(message, LOG_SAY, tag=SPECIES_ABDUCTOR) for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list) - var/obj/item/organ/internal/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE) if(!istype(tongue)) continue if(mothership == tongue.mothership) @@ -403,7 +403,7 @@ speech_args[SPEECH_MESSAGE] = "" -/obj/item/organ/internal/tongue/zombie +/obj/item/organ/tongue/zombie name = "rotting tongue" desc = "Between the decay and the fact that it's just lying there you doubt a tongue has ever seemed less sexy." icon_state = "tonguezombie" @@ -416,14 +416,14 @@ // List of english words that translate to zombie phrases GLOBAL_LIST_INIT(english_to_zombie, list()) -/obj/item/organ/internal/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word) +/obj/item/organ/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word) GLOB.english_to_zombie[english_word] = zombie_word // zombies don't care about grammar (any tense or form is all translated to the same word) GLOB.english_to_zombie[english_word + plural_s(english_word)] = zombie_word GLOB.english_to_zombie[english_word + "ing"] = zombie_word GLOB.english_to_zombie[english_word + "ed"] = zombie_word -/obj/item/organ/internal/tongue/zombie/proc/load_zombie_translations() +/obj/item/organ/tongue/zombie/proc/load_zombie_translations() var/list/zombie_translation = strings("zombie_replacement.json", "zombie") for(var/zombie_word in zombie_translation) // since zombie words are a reverse list, we gotta do this backwards @@ -432,7 +432,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) add_word_to_translations(english_word, zombie_word) GLOB.english_to_zombie = sort_list(GLOB.english_to_zombie) // Alphabetizes the list (for debugging) -/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/zombie/modify_speech(datum/source, list/speech_args) var/message = speech_args[SPEECH_MESSAGE] if(message[1] != "*") // setup the global list for translation if it hasn't already been done @@ -470,7 +470,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) message = capitalize(message) speech_args[SPEECH_MESSAGE] = message -/obj/item/organ/internal/tongue/alien +/obj/item/organ/tongue/alien name = "alien tongue" desc = "According to leading xenobiologists the evolutionary benefit of having a second mouth in your mouth is \"that it looks badass\"." icon_state = "tonguexeno" @@ -479,7 +479,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) modifies_speech = TRUE // not really, they just hiss voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.8,aresample=%SAMPLE_RATE%,atempo=1/0.8,aformat=channel_layouts=mono [p0]; [out2] asetrate=%SAMPLE_RATE%*1.2,aresample=%SAMPLE_RATE%,atempo=1/1.2,aformat=channel_layouts=mono[p2]; [p0][0][p2] amix=inputs=3"} // Aliens can only speak alien and a few other languages. -/obj/item/organ/internal/tongue/alien/get_possible_languages() +/obj/item/organ/tongue/alien/get_possible_languages() return list( /datum/language/xenocommon, /datum/language/common, @@ -488,14 +488,14 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) /datum/language/monkey, ) -/obj/item/organ/internal/tongue/alien/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/alien/modify_speech(datum/source, list/speech_args) var/datum/saymode/xeno/hivemind = speech_args[SPEECH_SAYMODE] if(hivemind) return playsound(owner, SFX_HISS, 25, TRUE, TRUE) -/obj/item/organ/internal/tongue/bone +/obj/item/organ/tongue/bone name = "bone \"tongue\"" desc = "Apparently skeletons alter the sounds they produce through oscillation of their teeth, hence their characteristic rattling." icon_state = "tonguebone" @@ -510,15 +510,15 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) var/phomeme_type = "sans" var/list/phomeme_types = list("sans", "papyrus") -/obj/item/organ/internal/tongue/bone/Initialize(mapload) +/obj/item/organ/tongue/bone/Initialize(mapload) . = ..() phomeme_type = pick(phomeme_types) // Bone tongues can speak all default + calcic -/obj/item/organ/internal/tongue/bone/get_possible_languages() +/obj/item/organ/tongue/bone/get_possible_languages() return ..() + /datum/language/calcic -/obj/item/organ/internal/tongue/bone/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/bone/modify_speech(datum/source, list/speech_args) if (chattering) chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source) switch(phomeme_type) @@ -527,7 +527,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) if("papyrus") speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS -/obj/item/organ/internal/tongue/bone/plasmaman +/obj/item/organ/tongue/bone/plasmaman name = "plasma bone \"tongue\"" desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." icon_state = "tongueplasma" @@ -535,7 +535,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) liked_foodtypes = VEGETABLES disliked_foodtypes = FRUIT | CLOTH -/obj/item/organ/internal/tongue/robot +/obj/item/organ/tongue/robot name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." failing_desc = "seems to be broken." @@ -549,20 +549,20 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) organ_traits = list(TRAIT_SILICON_EMOTES_ALLOWED) voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" -/obj/item/organ/internal/tongue/robot/could_speak_language(datum/language/language_path) +/obj/item/organ/tongue/robot/could_speak_language(datum/language/language_path) return TRUE // THE MAGIC OF ELECTRONICS -/obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/robot/modify_speech(datum/source, list/speech_args) speech_args[SPEECH_SPANS] |= SPAN_ROBOT -/obj/item/organ/internal/tongue/snail +/obj/item/organ/tongue/snail name = "radula" desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue modifies_speech = TRUE voice_filter = "atempo=0.5" // makes them talk really slow -/obj/item/organ/internal/tongue/snail/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/snail/modify_speech(datum/source, list/speech_args) var/new_message var/message = speech_args[SPEECH_MESSAGE] for(var/i in 1 to length(message)) @@ -572,7 +572,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) new_message += message[i] speech_args[SPEECH_MESSAGE] = new_message -/obj/item/organ/internal/tongue/ethereal +/obj/item/organ/tongue/ethereal name = "electric discharger" desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." icon_state = "electrotongue" @@ -586,10 +586,10 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.99,aresample=%SAMPLE_RATE%,volume=0.3 [p0]; [p0][out2] amix=inputs=2"} // Ethereal tongues can speak all default + voltaic -/obj/item/organ/internal/tongue/ethereal/get_possible_languages() +/obj/item/organ/tongue/ethereal/get_possible_languages() return ..() + /datum/language/voltaic -/obj/item/organ/internal/tongue/cat +/obj/item/organ/tongue/cat name = "felinid tongue" desc = "A fleshy muscle mostly used for meowing." say_mod = "meows" @@ -597,7 +597,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) disliked_foodtypes = GROSS | CLOTH | RAW organ_traits = list(TRAIT_WOUND_LICKER, TRAIT_FISH_EATER) -/obj/item/organ/internal/tongue/jelly +/obj/item/organ/tongue/jelly name = "jelly tongue" desc = "Ah... That's not the sound I expected it to make. Sounds like a Space Autumn Bird." say_mod = "chirps" @@ -605,20 +605,20 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) disliked_foodtypes = GROSS toxic_foodtypes = NONE -/obj/item/organ/internal/tongue/jelly/get_food_taste_reaction(obj/item/food, foodtypes = NONE) +/obj/item/organ/tongue/jelly/get_food_taste_reaction(obj/item/food, foodtypes = NONE) // a silver slime created this? what a delicacy! if(HAS_TRAIT(food, TRAIT_FOOD_SILVER)) return FOOD_LIKED return ..() -/obj/item/organ/internal/tongue/monkey +/obj/item/organ/tongue/monkey name = "primitive tongue" desc = "For aggressively chimpering. And consuming bananas." say_mod = "chimpers" liked_foodtypes = MEAT | FRUIT | BUGS disliked_foodtypes = CLOTH -/obj/item/organ/internal/tongue/moth +/obj/item/organ/tongue/moth name = "moth tongue" desc = "Moths don't have tongues. Someone get god on the phone, tell them I'm not happy." say_mod = "flutters" @@ -626,26 +626,26 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) disliked_foodtypes = FRUIT | GROSS | BUGS | GORE toxic_foodtypes = MEAT | RAW | SEAFOOD -/obj/item/organ/internal/tongue/zombie +/obj/item/organ/tongue/zombie name = "rotting tongue" desc = "Makes you speak like you're at the dentist and you just absolutely refuse to spit because you forgot to mention you were allergic to space shellfish." say_mod = "moans" -/obj/item/organ/internal/tongue/mush +/obj/item/organ/tongue/mush name = "mush-tongue-room" desc = "You poof with this. Got it?" icon = 'icons/obj/service/hydroponics/seeds.dmi' icon_state = "mycelium-angel" say_mod = "poofs" -/obj/item/organ/internal/tongue/pod +/obj/item/organ/tongue/pod name = "pod tongue" desc = "A plant-like organ used for speaking and eating." say_mod = "whistles" liked_foodtypes = VEGETABLES | FRUIT | GRAIN disliked_foodtypes = GORE | MEAT | DAIRY | SEAFOOD | BUGS -/obj/item/organ/internal/tongue/golem +/obj/item/organ/tongue/golem name = "golem tongue" desc = "This silicate plate doesn't seem particularly mobile, but golems use it to form sounds." color = COLOR_WEBSAFE_DARK_GRAY diff --git a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm index f6fed86a90d60..8dfee79693736 100644 --- a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm +++ b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel +/obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel name = "vocal cords" icon_state = "appendix" zone = BODY_ZONE_PRECISE_MOUTH @@ -8,17 +8,17 @@ healing_factor = 0 var/list/spans = null -/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords +/obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords return TRUE -/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does +/obj/item/organ/vocal_cords/proc/speak_with(message) //do what the organ does return -/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //actually say the message +/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) //Colossus drop, forces the listeners to obey certain commands -/obj/item/organ/internal/vocal_cords/colossus +/obj/item/organ/vocal_cords/colossus name = "divine vocal cords" desc = "They carry the voice of an ancient god." icon_state = "voice_of_god" @@ -30,7 +30,7 @@ /datum/action/item_action/organ_action/colossus name = "Voice of God" - var/obj/item/organ/internal/vocal_cords/colossus/cords = null + var/obj/item/organ/vocal_cords/colossus/cords = null /datum/action/item_action/organ_action/colossus/New() ..() @@ -67,7 +67,7 @@ return owner.say(".x[command]") -/obj/item/organ/internal/vocal_cords/colossus/can_speak_with() +/obj/item/organ/vocal_cords/colossus/can_speak_with() if(!owner) return FALSE @@ -77,22 +77,22 @@ return owner.can_speak() -/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message) +/obj/item/organ/vocal_cords/colossus/handle_speech(message) playsound(get_turf(owner), 'sound/effects/magic/clockwork/invoke_general.ogg', 300, TRUE, 5) return //voice of god speaks for us -/obj/item/organ/internal/vocal_cords/colossus/speak_with(message) +/obj/item/organ/vocal_cords/colossus/speak_with(message) var/cooldown = voice_of_god(uppertext(message), owner, spans, base_multiplier) next_command = world.time + (cooldown * cooldown_mod) -/obj/item/organ/internal/adamantine_resonator +/obj/item/organ/adamantine_resonator name = "adamantine resonator" desc = "Fragments of adamantine exist in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders." zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_ADAMANTINE_RESONATOR icon_state = "adamantine_resonator" -/obj/item/organ/internal/vocal_cords/adamantine +/obj/item/organ/vocal_cords/adamantine name = "adamantine vocal cords" desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Golems containing these formations use this to broadcast messages to nearby golems." actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) @@ -108,7 +108,7 @@ return owner.say(".x[message]") -/obj/item/organ/internal/vocal_cords/adamantine/handle_speech(message) +/obj/item/organ/vocal_cords/adamantine/handle_speech(message) var/msg = span_resonate("[span_name("[owner.real_name]")] resonates, \"[message]\"") for(var/player in GLOB.player_list) if(iscarbon(player)) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 76689032fb6a4..65c8116769d0f 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -147,7 +147,7 @@ surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB /datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient) - var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN) return !isnull(target_brain) /datum/surgery_step/revive/carbon diff --git a/code/modules/surgery/sleeper_protocol.dm b/code/modules/surgery/sleeper_protocol.dm index 23b02aeda801d..fd697240eed1e 100644 --- a/code/modules/surgery/sleeper_protocol.dm +++ b/code/modules/surgery/sleeper_protocol.dm @@ -37,7 +37,7 @@ . = ..() if(!.) return FALSE - var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index 4880f9329646f..47f25074c3acd 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -23,7 +23,7 @@ ) /datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH) if(HAS_TRAIT(target, TRAIT_HUSK)) return FALSE if(!target_stomach) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index fc6480e923908..753979c3feb73 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -536,7 +536,7 @@ return var/candidate_name - var/obj/item/organ/external/tail_snip_candidate + var/obj/item/organ/tail_snip_candidate var/obj/item/bodypart/limb_snip_candidate if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) diff --git a/code/modules/unit_tests/blindness.dm b/code/modules/unit_tests/blindness.dm index 88f5eece5758b..1d1093b7581a7 100644 --- a/code/modules/unit_tests/blindness.dm +++ b/code/modules/unit_tests/blindness.dm @@ -105,7 +105,7 @@ /datum/unit_test/eye_damage/Run() var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - var/obj/item/organ/internal/eyes/eyes = dummy.get_organ_slot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/eyes = dummy.get_organ_slot(ORGAN_SLOT_EYES) TEST_ASSERT_NOTNULL(eyes, "Eye damage unit test spawned a dummy without eyes!") // Test blindness due to eye damage diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 8ed2b999e7ffb..e21b3fec4c041 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -455,7 +455,7 @@ TEST_ASSERT_EQUAL(fish.status, FISH_DEAD, "The fish is not dead, despite having sustained enough damage that it should. health: [fish.health]") - var/obj/item/organ/internal/stomach/belly = gourmet.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = gourmet.get_organ_slot(ORGAN_SLOT_STOMACH) belly.reagents.clear_reagents() fish.set_status(FISH_ALIVE) diff --git a/code/modules/unit_tests/full_heal.dm b/code/modules/unit_tests/full_heal.dm index f5d247d7a10e6..7449d2aeb4cc4 100644 --- a/code/modules/unit_tests/full_heal.dm +++ b/code/modules/unit_tests/full_heal.dm @@ -4,12 +4,12 @@ /datum/unit_test/full_heal_heals_organs/Run() var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - for(var/obj/item/organ/internal/organ in dummy.organs) + for(var/obj/item/organ/organ in dummy.organs) organ.apply_organ_damage(50) dummy.fully_heal(HEAL_ORGANS) - for(var/obj/item/organ/internal/organ in dummy.organs) + for(var/obj/item/organ/organ in dummy.organs) if(organ.damage <= 0) continue TEST_FAIL("Organ [organ] did not get healed by fullyheal flag HEAL_ORGANS.") @@ -22,7 +22,7 @@ var/list/we_started_with = list() - for(var/obj/item/organ/internal/organ in dummy.organs) + for(var/obj/item/organ/organ in dummy.organs) if(organ.organ_flags & ORGAN_VITAL) // leave this for now continue we_started_with += organ.type diff --git a/code/modules/unit_tests/ling_decap.dm b/code/modules/unit_tests/ling_decap.dm index 4c8c7e4e03124..d6c8d244a8d18 100644 --- a/code/modules/unit_tests/ling_decap.dm +++ b/code/modules/unit_tests/ling_decap.dm @@ -9,12 +9,12 @@ var/obj/item/bodypart/head/noggin = ling.get_bodypart(BODY_ZONE_HEAD) noggin.dismember() TEST_ASSERT_NULL(ling.get_bodypart(BODY_ZONE_HEAD), "Changeling failed to be decapitated.") - var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin + var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in noggin TEST_ASSERT_NULL(brain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation, but it should have remained in their body.") - var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin + var/obj/item/organ/brain/oldbrain = locate(/obj/item/organ/brain) in noggin noggin.drop_organs() - TEST_ASSERT_NULL(locate(/obj/item/organ/internal/brain) in noggin, "Changeling's head failed to drop its brain.") + TEST_ASSERT_NULL(locate(/obj/item/organ/brain) in noggin, "Changeling's head failed to drop its brain.") TEST_ASSERT_NULL(oldbrain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation and organ dropping, but it should have remained in their body.") TEST_ASSERT_EQUAL(ling.stat, CONSCIOUS, "Changeling was not conscious after losing their head.") @@ -34,10 +34,10 @@ var/obj/item/bodypart/head/noggin = normal_guy.get_bodypart(BODY_ZONE_HEAD) noggin.dismember() - var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin + var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in noggin TEST_ASSERT_EQUAL(brain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after decapitation.") - var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin + var/obj/item/organ/brain/oldbrain = locate(/obj/item/organ/brain) in noggin noggin.drop_organs() TEST_ASSERT_EQUAL(oldbrain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after being removed from their head.") diff --git a/code/modules/unit_tests/liver.dm b/code/modules/unit_tests/liver.dm index 80c3ecf35b9a2..f2f5dcfd00f7a 100644 --- a/code/modules/unit_tests/liver.dm +++ b/code/modules/unit_tests/liver.dm @@ -12,7 +12,7 @@ var/datum/reagent/toxin/bonehurtingjuice/bonehurting = /datum/reagent/toxin/bonehurtingjuice var/datum/reagent/consumable/milk/calcium = /datum/reagent/consumable/milk - TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone)), "Skeleton does not have a bone liver") + TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/liver/bone)), "Skeleton does not have a bone liver") TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/toxin/bonehurtingjuice), FALSE, "Skeleton somehow has bone hurting juice before drinking") TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/consumable/milk), FALSE, "Skeleton somehow has milk before drinking") @@ -67,7 +67,7 @@ // Testing plasma/hot ice healing on wounds - TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone/plasmaman)), "Plasmaman does not have a plasmaman bone liver") + TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/liver/bone/plasmaman)), "Plasmaman does not have a plasmaman bone liver") TEST_ASSERT_EQUAL(mrbones.has_reagent(plasma), FALSE, "Plasmaman somehow has plasma before drinking") TEST_ASSERT_EQUAL(mrbones.has_reagent(hot_ice), FALSE, "Plasmaman somehow has hot ice before drinking") diff --git a/code/modules/unit_tests/lungs.dm b/code/modules/unit_tests/lungs.dm index 4f9b7ceb44296..c8338b6dec889 100644 --- a/code/modules/unit_tests/lungs.dm +++ b/code/modules/unit_tests/lungs.dm @@ -13,27 +13,27 @@ // 2500 Litres of O2/N2 gas mix, ideal for life. var/datum/gas_mixture/test_mix = create_standard_mix() var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) - var/obj/item/organ/internal/lungs/test_lungs = allocate(/obj/item/organ/internal/lungs) + var/obj/item/organ/lungs/test_lungs = allocate(/obj/item/organ/lungs) // Test one breath of O2/N2 mix. lungs_test_check_breath("standard gas mixture", lab_rat, test_lungs, test_mix) // Suffocation with an empty gas mix. var/datum/gas_mixture/empty_test_mix = allocate(/datum/gas_mixture) lab_rat = allocate(/mob/living/carbon/human/consistent) - test_lungs = allocate(/obj/item/organ/internal/lungs) + test_lungs = allocate(/obj/item/organ/lungs) // Test one breath of nothing. Suffocate due to the breath being empty. lungs_test_check_breath("empty gas mixture", lab_rat, test_lungs, empty_test_mix, expect_failure = TRUE) // Suffocation with null. This does indeed happen normally. lab_rat = allocate(/mob/living/carbon/human/consistent) - test_lungs = allocate(/obj/item/organ/internal/lungs) + test_lungs = allocate(/obj/item/organ/lungs) // Test one breath of nothing. Suffocate due to the breath being null. lungs_test_check_breath("null", lab_rat, test_lungs, null, expect_failure = TRUE) // Suffocation with Nitrogen. var/datum/gas_mixture/nitro_test_mix = create_nitrogen_mix() lab_rat = allocate(/mob/living/carbon/human/consistent) - test_lungs = allocate(/obj/item/organ/internal/lungs) + test_lungs = allocate(/obj/item/organ/lungs) // Test one breath of Nitrogen. Suffocate due to the breath being 100% N2. lungs_test_check_breath("pure Nitrogen", lab_rat, test_lungs, nitro_test_mix, expect_failure = TRUE) @@ -44,14 +44,14 @@ // 2500 Litres of pure Plasma. var/datum/gas_mixture/plasma_test_mix = create_plasma_mix() var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) - var/obj/item/organ/internal/lungs/plasmaman/test_lungs = allocate(/obj/item/organ/internal/lungs/plasmaman) + var/obj/item/organ/lungs/plasmaman/test_lungs = allocate(/obj/item/organ/lungs/plasmaman) // Test one breath of Plasma on Plasmaman lungs. lungs_test_check_breath("pure Plasma", lab_rat, test_lungs, plasma_test_mix) // Tests suffocation with Nitrogen. var/datum/gas_mixture/nitro_test_mix = create_nitrogen_mix() lab_rat = allocate(/mob/living/carbon/human/consistent) - test_lungs = allocate(/obj/item/organ/internal/lungs/plasmaman) + test_lungs = allocate(/obj/item/organ/lungs/plasmaman) // Test one breath of Nitrogen on Plasmaman lungs. lungs_test_check_breath("pure Nitrogen", lab_rat, test_lungs, nitro_test_mix, expect_failure = TRUE) @@ -62,15 +62,15 @@ /datum/unit_test/lungs/lungs_sanity_ashwalker/Run() // Gas mix resembling one cell of lavaland's atmosphere. var/datum/gas_mixture/lavaland_test_mix = create_lavaland_mix() - var/obj/item/organ/internal/lungs/lavaland/test_lungs = allocate(/obj/item/organ/internal/lungs/lavaland) + var/obj/item/organ/lungs/lavaland/test_lungs = allocate(/obj/item/organ/lungs/lavaland) var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) // Test one breath of Lavaland gas mix on Ashwalker lungs. lungs_test_check_breath("Lavaland air mixture", lab_rat, test_lungs, lavaland_test_mix) -/// Comprehensive unit test for [/obj/item/organ/internal/lungs/proc/check_breath()] +/// Comprehensive unit test for [/obj/item/organ/lungs/proc/check_breath()] /// If "expect_failure" is set to TRUE, the test ensures the given Human suffocated. /// A "test_name" string is required to contextualize test logs. Describe the gas you're testing. -/datum/unit_test/lungs/proc/lungs_test_check_breath(test_name, mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, datum/gas_mixture/test_mix, expect_failure = FALSE) +/datum/unit_test/lungs/proc/lungs_test_check_breath(test_name, mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, datum/gas_mixture/test_mix, expect_failure = FALSE) // Setup a small volume of gas which represents one "breath" from test_mix. var/datum/gas_mixture/test_breath @@ -155,14 +155,14 @@ TEST_ASSERT(molar_cmp_equals(GET_MOLES(test_breath, /datum/gas/carbon_dioxide), expected_co2), TEST_CHECK_BREATH_MESSAGE(test_lungs, "should convert Plasma into an equivalent volume of CO2.")) /// Tests minimum gas alerts by comparing gas pressure. -/datum/unit_test/lungs/proc/lungs_test_alert_min(mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, alert_name, min_pressure, pressure) +/datum/unit_test/lungs/proc/lungs_test_alert_min(mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, alert_name, min_pressure, pressure) var/alert_thrown = lab_rat.has_alert(alert_name) var/pressure_safe = (pressure >= min_pressure) || (min_pressure == 0) TEST_ASSERT(!pressure_safe && alert_thrown || pressure_safe, TEST_ALERT_THROW_MESSAGE(test_lungs, alert_name)) TEST_ASSERT(pressure_safe && !alert_thrown || !pressure_safe, TEST_ALERT_INHIBIT_MESSAGE(test_lungs, alert_name)) /// Tests maximum gas alerts by comparing gas pressure. -/datum/unit_test/lungs/proc/lungs_test_alert_max(mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, alert_name, max_pressure, pressure) +/datum/unit_test/lungs/proc/lungs_test_alert_max(mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, alert_name, max_pressure, pressure) var/alert_thrown = lab_rat.has_alert(alert_name) var/pressure_safe = (pressure <= max_pressure) || (max_pressure == 0) TEST_ASSERT(!pressure_safe && alert_thrown || pressure_safe, TEST_ALERT_THROW_MESSAGE(test_lungs, alert_name)) diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index 53250def309f7..53bd3277dc485 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -80,7 +80,7 @@ pill.attack(pill_user, pill_user) // Set the metabolism efficiency to 1.0 so it transfers all reagents to the body in one go. - var/obj/item/organ/internal/stomach/pill_belly = pill_user.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/pill_belly = pill_user.get_organ_slot(ORGAN_SLOT_STOMACH) pill_belly.metabolism_efficiency = 1 pill_user.Life() diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm index 1da3808ba3908..8f05a28405898 100644 --- a/code/modules/unit_tests/organs.dm +++ b/code/modules/unit_tests/organs.dm @@ -8,20 +8,20 @@ // List of organ typepaths which cause species change. // Species change swaps out all the organs, making test_organ un-usable after insertion. var/static/list/species_changing_organs = typecacheof(list( - /obj/item/organ/internal/brain/shadow/nightmare, + /obj/item/organ/brain/shadow/nightmare, )) // List of organ typepaths which are not test-able, such as certain class prototypes. var/static/list/test_organ_blacklist = typecacheof(list( - /obj/item/organ/internal, - /obj/item/organ/external, - /obj/item/organ/external/wings, - /obj/item/organ/internal/cyberimp, - /obj/item/organ/internal/cyberimp/brain, - /obj/item/organ/internal/cyberimp/mouth, - /obj/item/organ/internal/cyberimp/arm, - /obj/item/organ/internal/cyberimp/chest, - /obj/item/organ/internal/cyberimp/eyes, - /obj/item/organ/internal/alien, + /obj/item/organ, + /obj/item/organ, + /obj/item/organ/wings, + /obj/item/organ/cyberimp, + /obj/item/organ/cyberimp/brain, + /obj/item/organ/cyberimp/mouth, + /obj/item/organ/cyberimp/arm, + /obj/item/organ/cyberimp/chest, + /obj/item/organ/cyberimp/eyes, + /obj/item/organ/alien, )) /datum/unit_test/organ_sanity/Run() @@ -85,10 +85,10 @@ /datum/unit_test/organ_damage/Run() var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - for(var/obj/item/organ/internal/organ_to_test in dummy.organs) + for(var/obj/item/organ/organ_to_test in dummy.organs) test_organ(dummy, organ_to_test) -/datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/internal/test_organ) +/datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/test_organ) var/slot_to_use = test_organ.slot // Tests [mob/living/proc/adjustOrganLoss] diff --git a/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm b/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm index 1e2c10c2f2952..85c557b18108a 100644 --- a/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm +++ b/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm @@ -4,7 +4,7 @@ /// Tests to make sure no punks have broken high luminosity eyes /datum/unit_test/screenshot_high_luminosity_eyes var/mob/living/carbon/human/test_subject - var/obj/item/organ/internal/eyes/robotic/glow/test_eyes + var/obj/item/organ/eyes/robotic/glow/test_eyes /datum/unit_test/screenshot_high_luminosity_eyes/Run() // Create a mob with red and blue eyes. This is to test that high luminosity eyes properly default to the old eye color. @@ -14,7 +14,7 @@ test_subject.eye_color_right = COLOR_BLUE // Create our eyes, and insert them into the mob - test_eyes = allocate(/obj/item/organ/internal/eyes/robotic/glow) + test_eyes = allocate(/obj/item/organ/eyes/robotic/glow) test_eyes.Insert(test_subject) // This should be 4, but just in case it ever changes in the future diff --git a/code/modules/unit_tests/species_change_organs.dm b/code/modules/unit_tests/species_change_organs.dm index 41d55047f0346..96ade09bf626f 100644 --- a/code/modules/unit_tests/species_change_organs.dm +++ b/code/modules/unit_tests/species_change_organs.dm @@ -11,10 +11,10 @@ // Give a trauma dummy.gain_trauma(/datum/brain_trauma/severe/blindness) // Give a cyber heart - var/obj/item/organ/internal/heart/cybernetic/cyber_heart = allocate(/obj/item/organ/internal/heart/cybernetic) + var/obj/item/organ/heart/cybernetic/cyber_heart = allocate(/obj/item/organ/heart/cybernetic) cyber_heart.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED) // Give one of their organs a bit of damage - var/obj/item/organ/internal/appendix/existing_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/appendix/existing_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX) existing_appendix.set_organ_damage(25) // Changing species should @@ -36,7 +36,7 @@ // Grab the lizard's appendix for comparison later // They should've been given a new one, but our damage should also have transferred over - var/obj/item/organ/internal/appendix/lizard_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/appendix/lizard_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX) // They should have the trauma still TEST_ASSERT(dummy.has_trauma_type(/datum/brain_trauma/severe/blindness), "Dummy, upon changing species, did not carry over their brain trauma!") diff --git a/code/modules/unit_tests/stomach.dm b/code/modules/unit_tests/stomach.dm index 782e74788a6ab..5d2b948e82b36 100644 --- a/code/modules/unit_tests/stomach.dm +++ b/code/modules/unit_tests/stomach.dm @@ -5,7 +5,7 @@ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent) var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug) - var/obj/item/organ/internal/stomach/belly = human.get_organ_slot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/belly = human.get_organ_slot(ORGAN_SLOT_STOMACH) var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill) var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine diff --git a/code/modules/unit_tests/tail_wag.dm b/code/modules/unit_tests/tail_wag.dm index cd82dfdfd50c9..595e31895210b 100644 --- a/code/modules/unit_tests/tail_wag.dm +++ b/code/modules/unit_tests/tail_wag.dm @@ -5,7 +5,7 @@ /datum/unit_test/tail_wag/Run() var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) - var/obj/item/organ/external/tail/cat/dummy_tail = allocate(/obj/item/organ/external/tail/cat) + var/obj/item/organ/tail/cat/dummy_tail = allocate(/obj/item/organ/tail/cat) dummy_tail.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED) // SANITY TEST diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index b8b2b542f1881..a7af7b168e2cb 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -253,9 +253,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) /obj/merge_conflict_marker, //briefcase launchpads erroring /obj/machinery/launchpad/briefcase, - //Both are abstract types meant to scream bloody murder if spawned in raw - /obj/item/organ/external, - /obj/item/organ/external/wings, + //Wings abstract path + /obj/item/organ/wings, //Not meant to spawn without the machine wand /obj/effect/bug_moving, ) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 287c9e3cf0e20..b29c5501a7959 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -211,7 +211,7 @@ to_chat(M, "HONK") M.SetSleeping(0) M.adjust_stutter(40 SECONDS) - var/obj/item/organ/internal/ears/ears = M.get_organ_slot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = M.get_organ_slot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) M.Paralyze(60) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3d8a1f6cf60e2..1c8560f65dc8c 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -241,7 +241,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) contraband = list( /obj/item/clothing/under/costume/mech_suit = 2, /obj/item/clothing/suit/hooded/techpriest = 2, - /obj/item/organ/internal/tongue/robot = 2, + /obj/item/organ/tongue/robot = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe extra_price = PAYCHECK_COMMAND * 1.2 diff --git a/code/modules/wiremod/components/action/equpiment_action.dm b/code/modules/wiremod/components/action/equpiment_action.dm index 641722c595b60..f313d1f487064 100644 --- a/code/modules/wiremod/components/action/equpiment_action.dm +++ b/code/modules/wiremod/components/action/equpiment_action.dm @@ -1,7 +1,7 @@ /obj/item/circuit_component/equipment_action display_name = "Equipment Action" desc = "Represents an action the user can take when using supported shells." - required_shells = list(/obj/item/organ/internal/cyberimp/bci, /obj/item/mod/module/circuit) + required_shells = list(/obj/item/organ/cyberimp/bci, /obj/item/mod/module/circuit) /// The icon of the button var/datum/port/input/option/icon_options diff --git a/code/modules/wiremod/components/atom/remotecam.dm b/code/modules/wiremod/components/atom/remotecam.dm index d5a8506c5cf04..bbbab6043affc 100644 --- a/code/modules/wiremod/components/atom/remotecam.dm +++ b/code/modules/wiremod/components/atom/remotecam.dm @@ -281,7 +281,7 @@ desc = "Digitizes user's sight for surveillance-on-the-go. User must have fully functional eyes for digitizer to work. Camera range input is either 0 (near) or 1 (far). Network field is used for camera network." category = "BCI" camera_prefix = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) /// BCIs are organs, and thus the signal must be assigned ONLY when the shell has been installed in a mob - otherwise the camera will never update position camera_signal_move_override = TRUE @@ -314,13 +314,13 @@ /obj/item/circuit_component/remotecam/bci/register_shell(atom/movable/shell) . = ..() - if(!istype(shell_parent, /obj/item/organ/internal/cyberimp/bci)) + if(!istype(shell_parent, /obj/item/organ/cyberimp/bci)) return shell_camera = new /obj/machinery/camera (shell_parent) init_camera() RegisterSignal(shell_parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_implanted)) RegisterSignal(shell_parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) - var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent + var/obj/item/organ/cyberimp/bci/bci = shell_parent if(bci.owner) //If somehow the camera was added while shell is already installed inside a mob, assign signals if(bciuser) //This should never happen... But if it does, unassign move signal from old mob UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) @@ -388,7 +388,7 @@ if (current_camera_emp) close_camera() return - var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent + var/obj/item/organ/cyberimp/bci/bci = shell_parent //If shell is not currently inside a head, or user is currently blind, or user is dead if(!bci.owner || bci.owner.is_blind() || bci.owner.stat >= UNCONSCIOUS) close_camera() diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index a0f83b6f72eff..aaf70826f4bb0 100644 --- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm @@ -10,7 +10,7 @@ desc = "A component that shows an three digit counter. Requires a BCI shell." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/input/counter_number @@ -19,7 +19,7 @@ var/datum/port/input/signal_update - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci var/list/numbers = list() var/datum/weakref/counter_appearance @@ -32,7 +32,7 @@ image_pixel_y = add_input_port("Y-Axis Shift", PORT_TYPE_NUMBER) /obj/item/circuit_component/counter_overlay/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) diff --git a/code/modules/wiremod/components/bci/hud/object_overlay.dm b/code/modules/wiremod/components/bci/hud/object_overlay.dm index 07e0f76761e55..4f09a4d9fab3b 100644 --- a/code/modules/wiremod/components/bci/hud/object_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/object_overlay.dm @@ -12,7 +12,7 @@ desc = "Requires a BCI shell. A component that shows an overlay on top of an object." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/input/option/object_overlay_options @@ -28,7 +28,7 @@ var/datum/port/input/signal_off /// Reference to the BCI we're implanted inside - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci /// Assoc list of REF to the target atom to the overlay alt appearance it is using var/list/active_overlays = list() @@ -66,7 +66,7 @@ options_map = component_options /obj/item/circuit_component/object_overlay/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) diff --git a/code/modules/wiremod/components/bci/hud/target_intercept.dm b/code/modules/wiremod/components/bci/hud/target_intercept.dm index 2ee37e8ff4f3d..016f677f10e78 100644 --- a/code/modules/wiremod/components/bci/hud/target_intercept.dm +++ b/code/modules/wiremod/components/bci/hud/target_intercept.dm @@ -10,11 +10,11 @@ desc = "Requires a BCI shell. When activated, this component will allow user to target an object using their brain and will output the reference to said object." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/output/clicked_atom - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci var/intercept_cooldown = 1 SECONDS /obj/item/circuit_component/target_intercept/populate_ports() @@ -23,7 +23,7 @@ clicked_atom = add_output_port("Targeted Object", PORT_TYPE_ATOM) /obj/item/circuit_component/target_intercept/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) diff --git a/code/modules/wiremod/components/bci/install_detector.dm b/code/modules/wiremod/components/bci/install_detector.dm index 0d39e01214e67..123ff9d516294 100644 --- a/code/modules/wiremod/components/bci/install_detector.dm +++ b/code/modules/wiremod/components/bci/install_detector.dm @@ -10,13 +10,13 @@ desc = "A component that detects when a BCI is installed or removed from its user." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/output/implanted var/datum/port/output/removed var/datum/port/output/current_state - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci /obj/item/circuit_component/install_detector/populate_ports() . = ..() @@ -26,7 +26,7 @@ /obj/item/circuit_component/install_detector/register_shell(atom/movable/shell) . = ..() - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_implanted)) RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) diff --git a/code/modules/wiremod/components/bci/reagent_injector.dm b/code/modules/wiremod/components/bci/reagent_injector.dm index ef9188d7bdc8b..73b685a39dbf8 100644 --- a/code/modules/wiremod/components/bci/reagent_injector.dm +++ b/code/modules/wiremod/components/bci/reagent_injector.dm @@ -11,12 +11,12 @@ category = "BCI" circuit_flags = CIRCUIT_NO_DUPLICATES - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/input/inject var/datum/port/output/injected - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci /obj/item/circuit_component/reagent_injector/Initialize(mapload) . = ..() @@ -41,7 +41,7 @@ /obj/item/circuit_component/reagent_injector/register_shell(atom/movable/shell) . = ..() - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell bci.create_reagents(15, OPENCONTAINER) if(reagents.total_volume) diff --git a/code/modules/wiremod/components/bci/thought_listener.dm b/code/modules/wiremod/components/bci/thought_listener.dm index ed6226a4e491f..f76f53b6ba202 100644 --- a/code/modules/wiremod/components/bci/thought_listener.dm +++ b/code/modules/wiremod/components/bci/thought_listener.dm @@ -10,7 +10,7 @@ desc = "A component that allows the user to input a string using their mind. Requires a BCI shell." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/input/input_name var/datum/port/input/input_desc @@ -20,7 +20,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci var/ready = TRUE /obj/item/circuit_component/thought_listener/populate_ports() @@ -31,7 +31,7 @@ failure = add_output_port("On Failure", PORT_TYPE_SIGNAL) /obj/item/circuit_component/thought_listener/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell /obj/item/circuit_component/thought_listener/unregister_shell(atom/movable/shell) diff --git a/code/modules/wiremod/components/bci/vox.dm b/code/modules/wiremod/components/bci/vox.dm index 420140a7fdedb..8749d1b72b667 100644 --- a/code/modules/wiremod/components/bci/vox.dm +++ b/code/modules/wiremod/components/bci/vox.dm @@ -10,7 +10,7 @@ desc = "A component that plays a local VOX Announcement for the user. Requires a BCI shell." category = "BCI" - required_shells = list(/obj/item/organ/internal/cyberimp/bci) + required_shells = list(/obj/item/organ/cyberimp/bci) var/datum/port/input/option/type_option var/current_type @@ -19,7 +19,7 @@ circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci /obj/item/circuit_component/vox/populate_options() type_option = add_option_port("VOX Type", list(PORT_TYPE_LIST(PORT_TYPE_STRING), PORT_TYPE_STRING)) @@ -28,7 +28,7 @@ word_list = add_input_port("Word List", PORT_TYPE_LIST(PORT_TYPE_STRING)) /obj/item/circuit_component/vox/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) + if(istype(shell, /obj/item/organ/cyberimp/bci)) bci = shell /obj/item/circuit_component/vox/unregister_shell(atom/movable/shell) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index e3ddf54135af8..29147aefa9458 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/cyberimp/bci +/obj/item/organ/cyberimp/bci name = "brain-computer interface" desc = "An implant that can be placed in a user's head to control circuits using their brain." icon = 'icons/obj/science/circuits.dmi' @@ -6,7 +6,7 @@ zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY -/obj/item/organ/internal/cyberimp/bci/Initialize(mapload) +/obj/item/organ/cyberimp/bci/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_CIRCUIT_ACTION_COMPONENT_REGISTERED, PROC_REF(action_comp_registered)) @@ -19,7 +19,7 @@ new /obj/item/circuit_component/bci_core, ), SHELL_CAPACITY_SMALL, starting_circuit = circuit) -/obj/item/organ/internal/cyberimp/bci/say( +/obj/item/organ/cyberimp/bci/say( message, bubble_type, list/spans = list(), @@ -43,11 +43,11 @@ return ..() -/obj/item/organ/internal/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp) +/obj/item/organ/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp) SIGNAL_HANDLER LAZYADD(actions, new/datum/action/innate/bci_action(src, action_comp)) -/obj/item/organ/internal/cyberimp/bci/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp) +/obj/item/organ/cyberimp/bci/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp) SIGNAL_HANDLER var/datum/action/innate/bci_action/action = action_comp.granted_to[REF(src)] if(!istype(action)) @@ -61,10 +61,10 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "bci_power" - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci var/obj/item/circuit_component/equipment_action/circuit_component -/datum/action/innate/bci_action/New(obj/item/organ/internal/cyberimp/bci/_bci, obj/item/circuit_component/equipment_action/circuit_component) +/datum/action/innate/bci_action/New(obj/item/organ/cyberimp/bci/_bci, obj/item/circuit_component/equipment_action/circuit_component) ..() bci = _bci circuit_component.granted_to[REF(_bci)] = src @@ -95,7 +95,7 @@ var/datum/weakref/user - var/obj/item/organ/internal/cyberimp/bci/bci + var/obj/item/organ/cyberimp/bci/bci /obj/item/circuit_component/bci_core/populate_ports() @@ -290,7 +290,7 @@ var/busy_icon_state var/locked = FALSE - var/obj/item/organ/internal/cyberimp/bci/bci_to_implant + var/obj/item/organ/cyberimp/bci/bci_to_implant COOLDOWN_DECLARE(message_cooldown) @@ -365,13 +365,13 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, params) - var/obj/item/organ/internal/cyberimp/bci/new_bci = weapon + var/obj/item/organ/cyberimp/bci/new_bci = weapon if (istype(new_bci)) if (!(locate(/obj/item/integrated_circuit) in new_bci)) balloon_alert(user, "bci has no circuit!") return - var/obj/item/organ/internal/cyberimp/bci/previous_bci_to_implant = bci_to_implant + var/obj/item/organ/cyberimp/bci/previous_bci_to_implant = bci_to_implant user.transferItemToLoc(weapon, src) bci_to_implant = weapon @@ -428,7 +428,7 @@ playsound(loc, 'sound/machines/ping.ogg', 30, FALSE) - var/obj/item/organ/internal/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/internal/cyberimp/bci) + var/obj/item/organ/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/cyberimp/bci) if (bci_organ) bci_organ.Remove(carbon_occupant) @@ -460,7 +460,7 @@ var/mob/living/carbon/carbon_occupant = occupant if (istype(occupant)) - var/obj/item/organ/internal/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/internal/cyberimp/bci) + var/obj/item/organ/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/cyberimp/bci) if (isnull(bci_organ) && isnull(bci_to_implant)) say("No brain-computer interface inserted, and occupant does not have one. Insert a BCI to implant one.") playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE) diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm index bad787033f967..0db08ab7bb815 100644 --- a/code/modules/wiremod/shell/shell_items.dm +++ b/code/modules/wiremod/shell/shell_items.dm @@ -63,7 +63,7 @@ /obj/item/shell/bci name = "brain-computer interface assembly" icon_state = "bci-open" - shell_to_spawn = /obj/item/organ/internal/cyberimp/bci + shell_to_spawn = /obj/item/organ/cyberimp/bci w_class = WEIGHT_CLASS_TINY /obj/item/shell/scanner_gate diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 894eeeeeb2183..db7257dc957a4 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -51,7 +51,7 @@ if(limb_armor > limb_damage) return - var/obj/item/organ/internal/zombie_infection/infection + var/obj/item/organ/zombie_infection/infection infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index bd8646ccb780d..f6f21b7e1eed1 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/zombie_infection +/obj/item/organ/zombie_infection name = "festering ooze" desc = "A black web of pus and viscera." zone = BODY_ZONE_HEAD @@ -13,22 +13,22 @@ var/revive_time_max = 700 var/timer_id -/obj/item/organ/internal/zombie_infection/Initialize(mapload) +/obj/item/organ/zombie_infection/Initialize(mapload) . = ..() if(iscarbon(loc)) Insert(loc) GLOB.zombie_infection_list += src -/obj/item/organ/internal/zombie_infection/Destroy() +/obj/item/organ/zombie_infection/Destroy() GLOB.zombie_infection_list -= src . = ..() -/obj/item/organ/internal/zombie_infection/on_mob_insert(mob/living/carbon/M, special = FALSE, movement_flags) +/obj/item/organ/zombie_infection/on_mob_insert(mob/living/carbon/M, special = FALSE, movement_flags) . = ..() START_PROCESSING(SSobj, src) -/obj/item/organ/internal/zombie_infection/on_mob_remove(mob/living/carbon/M, special = FALSE) +/obj/item/organ/zombie_infection/on_mob_remove(mob/living/carbon/M, special = FALSE) . = ..() STOP_PROCESSING(SSobj, src) if(iszombie(M) && old_species && !special) @@ -36,25 +36,25 @@ if(timer_id) deltimer(timer_id) -/obj/item/organ/internal/zombie_infection/on_mob_insert(mob/living/carbon/organ_owner, special) +/obj/item/organ/zombie_infection/on_mob_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(organ_owner_died)) -/obj/item/organ/internal/zombie_infection/on_mob_remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/zombie_infection/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH) -/obj/item/organ/internal/zombie_infection/proc/organ_owner_died(mob/living/carbon/source, gibbed) +/obj/item/organ/zombie_infection/proc/organ_owner_died(mob/living/carbon/source, gibbed) SIGNAL_HANDLER if(iszombie(source)) qdel(src) // Congrats you somehow died so hard you stopped being a zombie -/obj/item/organ/internal/zombie_infection/on_find(mob/living/finder) +/obj/item/organ/zombie_infection/on_find(mob/living/finder) to_chat(finder, span_warning("Inside the head is a disgusting black \ web of pus and viscera, bound tightly around the brain like some \ biological harness.")) -/obj/item/organ/internal/zombie_infection/process(seconds_per_tick, times_fired) +/obj/item/organ/zombie_infection/process(seconds_per_tick, times_fired) if(!owner) return if(!(src in owner.organs)) @@ -65,7 +65,7 @@ owner.adjustToxLoss(0.5 * seconds_per_tick) if (SPT_PROB(5, seconds_per_tick)) to_chat(owner, span_danger("You feel sick...")) - if(timer_id || HAS_TRAIT(owner, TRAIT_SUICIDED) || !owner.get_organ_by_type(/obj/item/organ/internal/brain)) + if(timer_id || HAS_TRAIT(owner, TRAIT_SUICIDED) || !owner.get_organ_by_type(/obj/item/organ/brain)) return if(owner.stat != DEAD && !converts_living) return @@ -77,7 +77,7 @@ var/flags = TIMER_STOPPABLE timer_id = addtimer(CALLBACK(src, PROC_REF(zombify), owner), revive_time, flags) -/obj/item/organ/internal/zombie_infection/proc/zombify(mob/living/carbon/target) +/obj/item/organ/zombie_infection/proc/zombify(mob/living/carbon/target) timer_id = null if(!converts_living && owner.stat != DEAD) @@ -99,5 +99,5 @@ target.do_jitter_animation(living_transformation_time) target.Stun(living_transformation_time) -/obj/item/organ/internal/zombie_infection/nodamage +/obj/item/organ/zombie_infection/nodamage causes_damage = FALSE diff --git a/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt b/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt new file mode 100644 index 0000000000000..153f7dff82c03 --- /dev/null +++ b/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt @@ -0,0 +1,2 @@ +/obj/item/organ/internal/@SUBTYPES : /obj/item/organ/@SUBTYPES{@OLD} +/obj/item/organ/external/@SUBTYPES : /obj/item/organ/@SUBTYPES{@OLD} From cf28c1e19c73acd1b0c51ea460bfb3c8258be207 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 07:03:22 +0000 Subject: [PATCH 55/64] Automatic changelog for PR #87434 [ci skip] --- html/changelogs/AutoChangeLog-pr-87434.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87434.yml diff --git a/html/changelogs/AutoChangeLog-pr-87434.yml b/html/changelogs/AutoChangeLog-pr-87434.yml new file mode 100644 index 0000000000000..a59dd32cdf15d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87434.yml @@ -0,0 +1,7 @@ +author: "Ghommie" +delete-after: True +changes: + - code_imp: "Removed internal/external pathing from organs in favor of a bit flag. Hopefully this shouldn't break anything about organs." + - bugfix: "Fixed invisible fox ears." + - bugfix: "Fixed mushpeople caps not being colored red by default." + - rscadd: "You can now dye most tails, podpeople hair, mushpeople caps etc. with a hair dye spray." \ No newline at end of file From 438fd159d1dc8f56164b6bd6277b36256e928808 Mon Sep 17 00:00:00 2001 From: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com> Date: Wed, 30 Oct 2024 01:06:36 -0600 Subject: [PATCH 56/64] Prevents Xenobio from putting any mob into a closet, and adds fail feedback to two xenobio extracts (#87553) ## About The Pull Request Regenerative extracts heal, and then do an effect. The metal, puts the target into a closet. Just. Forces them in. No size check. Just crams them in there. Including megafauna. This just adds a size check to it - it force opens the locker and puts a fail message. It does not ever actually put the mob into the locker; I tested this. It broke actions really bad. NODE Drone immediately completing their vent type of bad. Also added a fail message to the Regenerative Bluespace for mobs with no-teleport, because feedback's nice. ## Why It's Good For The Game I don't think gift-wrapping Bubblegum is something that you're meant to be able to do. Also feedback is good for users. ## Changelog :cl: qol: added fail feedback to xenobio Regenerative Metal/Bluespace Extracts fix: fixed Regenerative Metal Extract not checking for mob size when moving them into the spawned closet /:cl: --- .../research/xenobiology/crossbreeding/regenerative.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 6cf8d2745ce6c..a2c5698fbb192 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -75,7 +75,11 @@ Regenerative extracts: var/obj/structure/closet/C = new /obj/structure/closet(target.loc) C.name = "slimy closet" C.desc = "Looking closer, it seems to be made of a sort of solid, opaque, metal-like goo." - target.forceMove(C) + if(target.mob_size > C.max_mob_size) //Prevents capturing megafauna or other large mobs in the closets + C.bust_open() + C.visible_message(span_warning("[target] is too big, and immediately breaks \the [C.name] open!")) + else //This can't be allowed to actually happen to the too-big mobs or it breaks some actions + target.forceMove(C) /obj/item/slimecross/regenerative/yellow colour = SLIME_TYPE_YELLOW @@ -151,6 +155,8 @@ Regenerative extracts: old_location.visible_message(span_warning("[target] disappears in a shower of sparks!")) to_chat(target, span_danger("The milky goo teleports you somewhere it remembers!")) + if(HAS_TRAIT(target, TRAIT_NO_TELEPORT)) + old_location.visible_message(span_warning("[target] sparks briefly, but is prevented from teleporting!")) /obj/item/slimecross/regenerative/bluespace/Initialize(mapload) . = ..() From f555c55b66e52552a724aafe908d6d5611494e48 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 07:06:56 +0000 Subject: [PATCH 57/64] Automatic changelog for PR #87553 [ci skip] --- html/changelogs/AutoChangeLog-pr-87553.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87553.yml diff --git a/html/changelogs/AutoChangeLog-pr-87553.yml b/html/changelogs/AutoChangeLog-pr-87553.yml new file mode 100644 index 0000000000000..52b4139e05563 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87553.yml @@ -0,0 +1,5 @@ +author: "OrionTheFox" +delete-after: True +changes: + - qol: "added fail feedback to xenobio Regenerative Metal/Bluespace Extracts" + - bugfix: "fixed Regenerative Metal Extract not checking for mob size when moving them into the spawned closet" \ No newline at end of file From bf92b098804c14bd772131e9a4fd6c641f664d67 Mon Sep 17 00:00:00 2001 From: larentoun <31931237+larentoun@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:07:58 +0300 Subject: [PATCH 58/64] Bitrunning: falling into chasms returns back to body (#87512) ## About The Pull Request fixes https://github.com/tgstation/tgstation/issues/87419 When the avatar is qdel'd, the player returns to original body ## Why It's Good For The Game Less bugs good ## Changelog :cl: fix: Bitrunning: falling into chasms and other ways of destroying your virtual body instead of killing it, WILL now return you to your body /:cl: --- code/modules/bitrunning/components/avatar_connection.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 15c267cf0c8dd..7925461652a00 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -95,7 +95,7 @@ */ RegisterSignals(parent, list(COMSIG_BITRUNNER_ALERT_SEVER, COMSIG_BITRUNNER_CACHE_SEVER, COMSIG_BITRUNNER_LADDER_SEVER), PROC_REF(on_safe_disconnect)) RegisterSignal(parent, COMSIG_LIVING_PILL_CONSUMED, PROC_REF(disconnect_if_red_pill)) - RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection)) + RegisterSignals(parent, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(on_sever_connection)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_linked_damage)) From c148dde3c48d2878f9dd793d689e89e7e6d13218 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 07:08:18 +0000 Subject: [PATCH 59/64] Automatic changelog for PR #87512 [ci skip] --- html/changelogs/AutoChangeLog-pr-87512.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87512.yml diff --git a/html/changelogs/AutoChangeLog-pr-87512.yml b/html/changelogs/AutoChangeLog-pr-87512.yml new file mode 100644 index 0000000000000..11a390c638036 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87512.yml @@ -0,0 +1,4 @@ +author: "larentoun" +delete-after: True +changes: + - bugfix: "Bitrunning: falling into chasms and other ways of destroying your virtual body instead of killing it, WILL now return you to your body" \ No newline at end of file From f5099185c8dd87ee3692aaeff541c1b233bcd9c7 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Wed, 30 Oct 2024 23:24:43 +1100 Subject: [PATCH 60/64] Adds a new INHALE reagent transfer method and applies it to smoking and smoke inhalation. Nitrous oxide (the reagent version) inhalation causes brain damage. (#87306) ## About The Pull Request Adds the ``INHALE`` transfer method. Smoking and smoke exposure now uses this method. Makes a few sensible inhalation effects for current behaviours. Adds a unit test amongst the rest of the exposure method tests. Nitrous oxide does brain damage on inhalation based on volume inhaled. ## Why It's Good For The Game Smoke and smoking being based on ingestion rather than inhaling was always weird to me. It'd be nice to have a specific method for smoking instead of a method shared by drinking. Many of our smokables make sense as indigestibles, obviously, but maybe we'd like a chem you can ONLY smoke. ~~Also, I walked out of a job interview and up the street to see a guy throwing his empty nitrous canisters around and yelling at passerbys, so shout out to that fucking guy with this PR.~~ ## Changelog :cl: code: Introduces a INHALE method for reagent transfer. Cigarettes and smoke reactions use this new method. balance: Nitrous oxide now brain damage if you inhale it. So don't do that. /:cl: --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/reagents.dm | 4 +++- .../fluid_spread/effects_smoke.dm | 2 +- code/game/objects/items/cigarettes.dm | 6 +++--- code/game/objects/items/drug_items.dm | 2 ++ code/modules/mob/living/living_defense.dm | 4 ++-- .../reagents/chemistry/holder/holder.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 6 +++--- .../chemistry/reagents/medicine_reagents.dm | 4 ++-- .../chemistry/reagents/other_reagents.dm | 19 +++++++++++-------- .../chemistry/reagents/toxin_reagents.dm | 10 +++++----- .../reagents/reagent_containers/cups/_cup.dm | 8 ++++++-- code/modules/unit_tests/reagent_mob_expose.dm | 7 +++++++ 12 files changed, 46 insertions(+), 28 deletions(-) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 314d8f5ecf2ee..28172587e795a 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -25,7 +25,7 @@ // Reagent exposure methods. /// Used for splashing. #define TOUCH (1<<0) -/// Used for ingesting the reagents. Food, drinks, inhaling smoke. +/// Used for ingesting the reagents. Food and drinks. #define INGEST (1<<1) /// Used by foams, sprays, and blob attacks. #define VAPOR (1<<2) @@ -35,6 +35,8 @@ #define INJECT (1<<4) /// Exclusive to just plumbing. if set we use the round robin technique else we use proportional #define LINEAR (1<<5) +/// Used by smoke or inhaling from a source. Smoke and cigarettes. +#define INHALE (1<<6) /// When returned by on_mob_life(), on_mob_dead(), overdose_start() or overdose_processed(), will cause the mob to updatehealth() afterwards #define UPDATE_MOB_HEALTH 1 diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index e651c8a3e2402..0bc59ded98d3f 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -391,7 +391,7 @@ var/fraction = (seconds_per_tick SECONDS) / initial(lifetime) reagents.copy_to(smoker, reagents.total_volume, fraction) - reagents.expose(smoker, INGEST, fraction) + reagents.expose(smoker, INHALE, fraction) return TRUE /// Helper to quickly create a cloud of reagent smoke diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 74f2ae417c853..aab4f59fce338 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -444,12 +444,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM return how_long_have_we_been_smokin += seconds_per_tick * (1 SECONDS) - reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) + reagents.expose(smoker, INHALE, min(to_smoke / reagents.total_volume, 1)) var/obj/item/organ/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) if(lungs && IS_ORGANIC_ORGAN(lungs)) var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1 smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance) - if(!reagents.trans_to(smoker, to_smoke, methods = INGEST, ignore_stomach = TRUE)) + if(!reagents.trans_to(smoker, to_smoke, methods = INHALE, ignore_stomach = TRUE)) reagents.remove_all(to_smoke) /obj/item/cigarette/process(seconds_per_tick) @@ -992,7 +992,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM e.start(src) qdel(src) - if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INGEST, ignore_stomach = TRUE)) + if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INHALE, ignore_stomach = TRUE)) reagents.remove_all(REAGENTS_METABOLISM) /obj/item/vape/process(seconds_per_tick) diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm index d25c957145561..7f31b155a2650 100644 --- a/code/game/objects/items/drug_items.dm +++ b/code/game/objects/items/drug_items.dm @@ -44,6 +44,8 @@ reagent_flags = TRANSPARENT spillable = FALSE list_reagents = list(/datum/reagent/drug/blastoff = 10) + reagent_consumption_method = INHALE + consumption_sound = 'sound/effects/spray2.ogg' /obj/item/reagent_containers/cup/blastoff_ampoule/update_icon_state() . = ..() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ff8406ac4ca15..ca6096914fd40 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -622,7 +622,7 @@ /** Handles exposing a mob to reagents. * - * If the methods include INGEST the mob tastes the reagents. + * If the methods include INGEST or INHALE, the mob tastes the reagents. * If the methods include VAPOR it incorporates permiability protection. */ /mob/living/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) @@ -630,7 +630,7 @@ if(. & COMPONENT_NO_EXPOSE_REAGENTS) return - if(methods & INGEST) + if(methods & (INGEST | INHALE)) taste(source) var/touch_protection = (methods & VAPOR) ? getarmor(null, BIO) * 0.01 : 0 diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index 625d4e118075a..09d0554691b32 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -779,7 +779,7 @@ * * Arguments * - Atom/target: What mob/turf/object is being exposed to reagents? This is your reaction target. - * - Methods: What reaction type is the reagent itself going to call on the reaction target? Types are TOUCH, INGEST, VAPOR, PATCH, and INJECT. + * - Methods: What reaction type is the reagent itself going to call on the reaction target? Types are TOUCH, INGEST, VAPOR, PATCH, INJECT and INHALE. * - Volume_modifier: What is the reagent volume multiplied by when exposed? Note that this is called on the volume of EVERY reagent in the base body, so factor in your Maximum_Volume if necessary! * - Show_message: Whether to display anything to mobs when they are exposed. * - list/datum/reagent/r_to_expose: list of reagents to expose. if null will expose the reagents present in this holder instead diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b0ee1e35ffa85..f17dbf7fe9e6c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -422,7 +422,7 @@ return var/mob/living/carbon/victim = exposed_mob - if(methods & (TOUCH|VAPOR)) + if(methods & (TOUCH|VAPOR|INHALE)) //check for protection //actually handle the pepperspray effects if (!victim.is_pepper_proof()) // you need both eye and mouth protection @@ -562,7 +562,7 @@ return var/mob/living/carbon/victim = exposed_mob - if(methods & (TOUCH | VAPOR)) + if(methods & (TOUCH | VAPOR | INHALE)) var/tear_proof = victim.is_eyes_covered() if (!tear_proof) to_chat(exposed_mob, span_warning("Your eyes sting!")) @@ -948,7 +948,7 @@ /datum/reagent/consumable/liquidelectricity/enriched/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. . = ..() - if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + if(!(methods & (INGEST|INJECT|PATCH|INHALE)) || !iscarbon(exposed_mob)) return var/mob/living/carbon/exposed_carbon = exposed_mob diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d0fe8be21359f..87866b354e3f0 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -355,7 +355,7 @@ if(!iscarbon(exposed_mob) || (exposed_mob.stat == DEAD)) return - if(methods & (INGEST|VAPOR|INJECT)) + if(methods & (INGEST|VAPOR|INJECT|INHALE)) exposed_mob.adjust_nutrition(-5) if(show_message) to_chat(exposed_mob, span_warning("Your stomach feels empty and cramps!")) @@ -954,7 +954,7 @@ exposed_mob.visible_message(span_warning("[exposed_mob]'s body does not react...")) return - if(iscarbon(exposed_mob) && !(methods & INGEST)) //simplemobs can still be splashed + if(iscarbon(exposed_mob) && !(methods & (INGEST|INHALE))) //simplemobs can still be splashed return ..() if(HAS_TRAIT(exposed_mob, TRAIT_HUSK)) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 36492caacdcd1..68f5dca1e43c5 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -42,7 +42,7 @@ continue exposed_mob.ForceContractDisease(strain) - else if((methods & VAPOR) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + else if((methods & (VAPOR|INHALE)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_LUNGS)) continue @@ -51,7 +51,7 @@ exposed_mob.ContactContractDisease(strain) if(data && data["resistances"]) - if(methods & (INGEST|INJECT)) //have to inject or ingest it. no curefoam/cheap curesprays + if(methods & (INGEST|INJECT|INHALE)) //have to inject, inhale or ingest it. no curefoam/cheap curesprays for(var/stuff in exposed_mob.diseases) var/datum/disease/infection = stuff if(infection.GetDiseaseID() in data["resistances"]) @@ -1452,7 +1452,7 @@ var/obj/item/organ/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) /datum/reagent/xenomicrobes @@ -1464,7 +1464,7 @@ /datum/reagent/xenomicrobes/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) /datum/reagent/fungalspores @@ -1477,7 +1477,7 @@ /datum/reagent/fungalspores/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) /datum/reagent/snail @@ -1490,7 +1490,7 @@ /datum/reagent/snail/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new /datum/disease/gastrolosis(), FALSE, TRUE) /datum/reagent/fluorosurfactant//foam precursor @@ -1586,10 +1586,13 @@ /datum/reagent/nitrous_oxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() - if(methods & VAPOR) + if(methods & (VAPOR|INHALE)) // apply 2 seconds of drowsiness per unit applied, with a min duration of 4 seconds var/drowsiness_to_apply = max(round(reac_volume, 1) * 2 SECONDS, 4 SECONDS) exposed_mob.adjust_drowsiness(drowsiness_to_apply) + if(methods & INHALE) + exposed_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * reac_volume, required_organ_flag = affected_organ_flags) + exposed_mob.adjust_hallucinations(10 SECONDS * reac_volume) /datum/reagent/nitrous_oxide/on_mob_metabolize(mob/living/affected_mob) . = ..() @@ -2612,7 +2615,7 @@ /datum/reagent/gondola_mutation_toxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) + if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) exposed_mob.ForceContractDisease(new gondola_disease, FALSE, TRUE) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 6160f9a419618..1c340cbc657a7 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -54,7 +54,7 @@ . = ..() if(!exposed_mob.can_mutate()) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|PATCH|INJECT))) + if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|PATCH|INJECT|INHALE))) exposed_mob.random_mutate_unique_identity() exposed_mob.random_mutate_unique_features() if(prob(98)) @@ -258,7 +258,7 @@ /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) . = ..() holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - if((data?["method"] & INGEST) && holder_mob.stat != DEAD) + if((data?["method"] & (INGEST|INHALE)) && holder_mob.stat != DEAD) holder_mob.fakedeath(type) /datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob) @@ -268,10 +268,10 @@ /datum/reagent/toxin/zombiepowder/on_transfer(atom/target_atom, methods, trans_volume) . = ..() var/datum/reagent/zombiepowder = target_atom.reagents.has_reagent(/datum/reagent/toxin/zombiepowder) - if(!zombiepowder || !(methods & INGEST)) + if(!zombiepowder || !(methods & (INGEST|INHALE))) return LAZYINITLIST(zombiepowder.data) - zombiepowder.data["method"] |= INGEST + zombiepowder.data["method"] |= (INGEST|INHALE) /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() @@ -1089,7 +1089,7 @@ if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM)) return reac_volume = round(reac_volume,0.1) - if(methods & INGEST) + if(methods & (INGEST|INHALE)) exposed_carbon.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype) return if(methods & INJECT) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 368d299fb406f..b4493eb2ae4ab 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -19,6 +19,10 @@ var/gulp_size = 5 ///Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it. var/isGlass = FALSE + ///What kind of chem transfer method does this cup use. Defaults to INGEST + var/reagent_consumption_method = INGEST + ///What sound does our consumption play on consuming from the container? + var/consumption_sound = 'sound/items/drink.ogg' /obj/item/reagent_containers/cup/examine(mob/user) . = ..() @@ -86,9 +90,9 @@ SEND_SIGNAL(src, COMSIG_GLASS_DRANK, target_mob, user) var/fraction = min(gulp_size/reagents.total_volume, 1) - reagents.trans_to(target_mob, gulp_size, transferred_by = user, methods = INGEST) + reagents.trans_to(target_mob, gulp_size, transferred_by = user, methods = reagent_consumption_method) checkLiked(fraction, target_mob) - playsound(target_mob.loc,'sound/items/drink.ogg', rand(10,50), TRUE) + playsound(target_mob.loc, consumption_sound, rand(10,50), TRUE) if(!iscarbon(target_mob)) return var/mob/living/carbon/carbon_drinker = target_mob diff --git a/code/modules/unit_tests/reagent_mob_expose.dm b/code/modules/unit_tests/reagent_mob_expose.dm index 844b863c0374b..d6ed81292a97d 100644 --- a/code/modules/unit_tests/reagent_mob_expose.dm +++ b/code/modules/unit_tests/reagent_mob_expose.dm @@ -58,6 +58,13 @@ syringe.melee_attack_chain(human, human) TEST_ASSERT_EQUAL(human.health, 80, "Human health did not update after injection from syringe") + // INHALE + TEST_ASSERT_NULL(human.has_status_effect(/datum/status_effect/hallucination), "Human is drowsy at the start of testing") + drink.reagents.clear_reagents() + drink.reagents.add_reagent(/datum/reagent/nitrous_oxide, 10) + drink.reagents.trans_to(human, 10, methods = INHALE) + TEST_ASSERT_NOTNULL(human.has_status_effect(/datum/status_effect/hallucination), "Human is not drowsy after exposure to vapors") + /datum/unit_test/reagent_mob_expose/Destroy() SSmobs.ignite() return ..() From 0282c2ab5d9ae232a764323f273ceabe9f3696c9 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:25:21 +0000 Subject: [PATCH 61/64] Automatic changelog for PR #87306 [ci skip] --- html/changelogs/AutoChangeLog-pr-87306.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87306.yml diff --git a/html/changelogs/AutoChangeLog-pr-87306.yml b/html/changelogs/AutoChangeLog-pr-87306.yml new file mode 100644 index 0000000000000..5117e29fac88c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87306.yml @@ -0,0 +1,5 @@ +author: "necromanceranne" +delete-after: True +changes: + - code_imp: "Introduces a INHALE method for reagent transfer. Cigarettes and smoke reactions use this new method." + - balance: "Nitrous oxide now brain damage if you inhale it. So don't do that." \ No newline at end of file From 1448248edc72bdce3eb995cccf3fd818e7398b52 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 30 Oct 2024 15:15:30 +0100 Subject: [PATCH 62/64] Fixes green raptor corpses being able to mine rocks (#87558) ## About The Pull Request Closes #87554 ## Changelog :cl: fix: Fixed green raptor corpses being able to mine rocks /:cl: --- code/datums/elements/proficient_miner.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/elements/proficient_miner.dm b/code/datums/elements/proficient_miner.dm index 0d7a43528f5ac..a35b3951d4418 100644 --- a/code/datums/elements/proficient_miner.dm +++ b/code/datums/elements/proficient_miner.dm @@ -9,8 +9,10 @@ /datum/element/proficient_miner/proc/on_bump(mob/living/source, atom/target) SIGNAL_HANDLER - if(!ismineralturf(target)) + + if(!ismineralturf(target) || (istype(source) && source.stat != CONSCIOUS)) return + var/turf/closed/mineral/mineral_wall = target if(!istype(mineral_wall, /turf/closed/mineral/gibtonite)) @@ -21,8 +23,6 @@ if(gibtonite_wall.stage == GIBTONITE_UNSTRUCK) mineral_wall.gets_drilled(source) - - /datum/element/proficient_miner/Detach(datum/source, ...) UnregisterSignal(source, COMSIG_MOVABLE_BUMP) return ..() From a1e2db1a16d197c990f896c2ae8ac4fa4a18ea63 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:15:50 +0000 Subject: [PATCH 63/64] Automatic changelog for PR #87558 [ci skip] --- html/changelogs/AutoChangeLog-pr-87558.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-87558.yml diff --git a/html/changelogs/AutoChangeLog-pr-87558.yml b/html/changelogs/AutoChangeLog-pr-87558.yml new file mode 100644 index 0000000000000..f0d76132ff01f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-87558.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed green raptor corpses being able to mine rocks" \ No newline at end of file From e078f41ba60a39691d4043cf3987ecc50c7856a6 Mon Sep 17 00:00:00 2001 From: larentoun <31931237+larentoun@users.noreply.github.com> Date: Wed, 30 Oct 2024 21:25:52 +0300 Subject: [PATCH 64/64] speech mod --- .../dna_infuser/organ_sets/fly_organs.dm | 6 ++++ .../surgery/organs/internal/tongue/_tongue.dm | 6 ++++ .../autohiss/code/autohiss.dm | 34 +------------------ 3 files changed, 13 insertions(+), 33 deletions(-) diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index 0ca652c3ab92c..422ab917731f3 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -47,6 +47,12 @@ new /regex("Z+", "g") = "ZZZ", "s" = "z", "S" = "Z", + // BANDASTATION EDIT START - speech mod + new /regex("з+", "g") = "ззз", + new /regex("З+", "g") = "ЗЗЗ", + "с" = "з", + "С" = "З", + // BANDASTATION END ) /obj/item/organ/tongue/fly/New(class, timer, datum/mutation/human/copymut) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index b94d434a18601..93565fe663c6e 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -195,6 +195,12 @@ new /regex(@"(\w)X", "g") = "$1KSSS", new /regex(@"\bx([\-|r|R]|\b)", "g") = "ecks$1", new /regex(@"\bX([\-|r|R]|\b)", "g") = "ECKS$1", + // BANDASTATION EDIT START - speech mod + new /regex("с+", "g") = "ссс", + new /regex("C+", "g") = "ССС", + new /regex("ч+", "g") = "щ", + new /regex("Ч+", "g") = "Щ", + // BANDASTATION END ) /obj/item/organ/tongue/lizard/New(class, timer, datum/mutation/human/copymut) diff --git a/modular_bandastation/autohiss/code/autohiss.dm b/modular_bandastation/autohiss/code/autohiss.dm index 2d2eb567ac46d..96094fdb431f4 100644 --- a/modular_bandastation/autohiss/code/autohiss.dm +++ b/modular_bandastation/autohiss/code/autohiss.dm @@ -1,41 +1,9 @@ // TODO: Prefs for autohiss? -/obj/item/organ/internal/tongue/rat/modify_speech(datum/source, list/speech_args) +/obj/item/organ/tongue/rat/modify_speech(datum/source, list/speech_args) . = ..() var/message = lowertext(speech_args[SPEECH_MESSAGE]) if(message == "привет" || message == "привет.") speech_args[SPEECH_MESSAGE] = "Сыррретствую вас!" if(message == "привет?") speech_args[SPEECH_MESSAGE] = "Мм... сыррретствую вас?" - -/obj/item/organ/internal/tongue/fly/modify_speech(datum/source, list/speech_args) - . = ..() - var/static/regex/fly_buzz = new("з+", "g") - var/static/regex/fly_buZZ = new("З+", "g") - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = fly_buzz.Replace(message, "ззз") - message = fly_buZZ.Replace(message, "ЗЗЗ") - message = replacetext(message, "с", "з") - message = replacetext(message, "С", "З") - speech_args[SPEECH_MESSAGE] = message - -/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) - . = ..() - var/static/regex/lizard_hiss = new("с+", "g") - var/static/regex/lizard_hiSS = new("С+", "g") - var/static/regex/lizard_che = new("ч+", "g") - var/static/regex/lizard_cHE = new("Ч+", "g") - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = lizard_hiss.Replace(message, "ссс") - message = lizard_hiSS.Replace(message, "ССС") - message = lizard_che.Replace(message, "щ") - message = lizard_cHE.Replace(message, "Щ") - speech_args[SPEECH_MESSAGE] = message - -/* TODO: Do these someday later -/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args) - -/obj/item/organ/internal/tongue/snail/modify_speech(datum/source, list/speech_args) -*/