From 6d470992cb649d363f7a2c009a3ebd94f628bf31 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 31 May 2022 00:18:34 -0400 Subject: [PATCH] This tail refactor turned into an organ refactor. Funny how that works. (#67017) * Fuck you (refactors ur tails) * Errors * Wow. Pain. * Fixes up probably everything * finish up here * Fixes hard del maybe * original owner hard del * garbage collection runtime * suck my peen byond * Mapped tails * motherfucker. * motherrfucker. again. * Whooopppppsie * yeah bad idea * Turns out external organs literally just sat in nullspace forever if their parent was deleted, and didnt Remove() themselves, causing harddels. * So anyways I repathed all organs * Fixes * really. * unit test... test * unit test-test but it passes linters this time because im a moh-ron * I've lost track of what im doing at this point * Hopefully fixes hard del? * meh * Update code/datums/dna.dm * things n stuff * repath from master pull --- .../icemoon_underground_abandoned_village.dmm | 2 +- .../lavaland_surface_elephant_graveyard.dmm | 16 +- .../RandomRuins/SpaceRuins/caravanambush.dmm | 6 +- .../SpaceRuins/mrow_thats_right.dmm | 28 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- _maps/RandomZLevels/caves.dmm | 6 +- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 4 +- _maps/map_files/KiloStation/KiloStation.dmm | 10 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/debug/runtimestation.dmm | 6 +- _maps/map_files/generic/CentCom.dmm | 4 +- _maps/shuttles/emergency_luxury.dmm | 2 +- _maps/shuttles/emergency_zeta.dmm | 4 +- _maps/shuttles/whiteship_kilo.dmm | 2 +- code/__DEFINES/DNA.dm | 19 +- .../signals/signals_mob/signals_mob_living.dm | 4 +- code/__DEFINES/external_organs.dm | 10 + code/__DEFINES/is_helpers.dm | 4 + code/__DEFINES/traits.dm | 4 +- code/__HELPERS/global_lists.dm | 8 +- code/__HELPERS/honkerblast.dm | 6 +- code/__HELPERS/mobs.dm | 34 +- code/_globalvars/lists/flavor_misc.dm | 8 +- code/_globalvars/phobias.dm | 8 +- code/datums/brain_damage/brain_trauma.dm | 2 +- code/datums/brain_damage/split_personality.dm | 2 +- code/datums/components/crafting/recipes.dm | 20 +- code/datums/components/cult_ritual_item.dm | 2 +- code/datums/components/manual_blinking.dm | 10 +- code/datums/components/manual_breathing.dm | 10 +- code/datums/components/phylactery.dm | 4 +- code/datums/components/squeak.dm | 2 +- code/datums/components/supermatter_crystal.dm | 2 +- code/datums/components/tackle.dm | 5 +- .../diseases/advance/symptoms/deafness.dm | 2 +- .../diseases/advance/symptoms/sensory.dm | 4 +- .../diseases/advance/symptoms/vision.dm | 2 +- code/datums/diseases/brainrot.dm | 2 +- code/datums/diseases/gastrolisis.dm | 16 +- code/datums/diseases/heart_failure.dm | 2 +- code/datums/diseases/parasitic_infection.dm | 4 +- code/datums/diseases/tuberculosis.dm | 2 +- code/datums/dna.dm | 26 +- code/datums/elements/earhealing.dm | 2 +- code/datums/elements/eyestab.dm | 2 +- code/datums/elements/kneejerk.dm | 2 +- .../mood_events/generic_negative_events.dm | 5 +- code/datums/mutations/actions.dm | 4 +- code/datums/mutations/body.dm | 6 +- .../mutations/holy_mutation/burdened.dm | 8 +- code/datums/mutations/hulk.dm | 2 +- code/datums/quirks/good.dm | 2 +- code/datums/quirks/negative.dm | 2 +- code/datums/quirks/neutral.dm | 8 +- code/datums/saymode.dm | 2 +- code/datums/status_effects/neutral.dm | 2 +- .../dynamic/dynamic_rulesets_midround.dm | 2 +- code/game/gamemodes/objective.dm | 2 +- code/game/machinery/dna_scanner.dm | 2 +- code/game/machinery/medical_kiosk.dm | 2 +- code/game/machinery/recycler.dm | 2 +- .../objects/effects/spawners/random/exotic.dm | 1 - .../effects/spawners/random/medical.dm | 56 ++-- 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/cigs_lighters.dm | 2 +- code/game/objects/items/defib.dm | 4 +- code/game/objects/items/devices/flashlight.dm | 4 +- .../items/devices/scanners/health_analyzer.dm | 8 +- code/game/objects/items/dualsaber.dm | 2 +- code/game/objects/items/hand_items.dm | 4 +- code/game/objects/items/melee/baton.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 7 +- code/game/objects/items/storage/medkit.dm | 24 +- code/game/objects/structures/aliens.dm | 4 +- .../structures/beds_chairs/alien_nest.dm | 6 +- .../structures/icemoon/cave_entrance.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/admin/create_mob.dm | 1 + 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_gear.dm | 4 +- .../abductor/equipment/abduction_surgery.dm | 6 +- .../antagonists/abductor/equipment/gland.dm | 24 +- .../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 | 4 +- .../changeling/powers/augmented_eyesight.dm | 6 +- .../antagonists/changeling/powers/headcrab.dm | 2 +- .../antagonists/changeling/powers/panacea.dm | 4 +- .../changeling/powers/regenerate.dm | 2 +- .../antagonists/changeling/powers/shriek.dm | 2 +- code/modules/antagonists/creep/creep.dm | 2 +- code/modules/antagonists/cult/runes.dm | 2 +- .../antagonists/fugitive/fugitive_outfits.dm | 2 +- .../antagonists/heretic/heretic_knowledge.dm | 18 +- .../antagonists/heretic/knowledge/ash_lore.dm | 2 +- .../heretic/knowledge/flesh_lore.dm | 8 +- .../heretic/knowledge/side_ash_flesh.dm | 2 +- .../heretic/knowledge/side_rust_ash.dm | 2 +- .../heretic/knowledge/side_void_blade.dm | 2 +- .../heretic/knowledge/starting_lore.dm | 10 +- .../heretic/mobs/maid_in_mirror.dm | 2 +- .../antagonists/nightmare/nightmare_organs.dm | 22 +- .../nightmare/nightmare_species.dm | 6 +- code/modules/antagonists/nukeop/clownop.dm | 4 +- .../antagonists/revolution/revolution.dm | 4 +- .../antagonists/slaughter/slaughter.dm | 14 +- .../traitor/objectives/sleeper_protocol.dm | 2 +- .../antagonists/wizard/equipment/artefact.dm | 2 +- code/modules/assembly/flash.dm | 4 +- code/modules/cargo/bounties/medical.dm | 42 +-- code/modules/cargo/bounties/special.dm | 12 +- code/modules/cargo/exports/lavaland.dm | 4 +- code/modules/cargo/exports/organs.dm | 24 +- .../modules/client/preferences/_preference.dm | 6 +- .../preferences/species_features/basic.dm | 2 +- .../preferences/species_features/felinid.dm | 4 +- .../preferences/species_features/lizard.dm | 6 +- code/modules/client/verbs/suicide.dm | 4 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/head/tinfoilhat.dm | 2 +- code/modules/clothing/neck/_neck.dm | 4 +- code/modules/events/brain_trauma.dm | 2 +- code/modules/events/creep_awakening.dm | 2 +- code/modules/events/holiday/halloween.dm | 2 +- .../exploration_events/trader.dm | 2 +- .../recipes/tablecraft/recipes_bread.dm | 4 +- .../recipes/tablecraft/recipes_burger.dm | 8 +- .../recipes/tablecraft/recipes_cake.dm | 6 +- .../recipes/tablecraft/recipes_drink.dm | 4 +- .../recipes/tablecraft/recipes_lizard.dm | 16 +- .../recipes/tablecraft/recipes_meat.dm | 2 +- .../recipes/tablecraft/recipes_misc.dm | 4 +- .../recipes/tablecraft/recipes_soup.dm | 2 +- code/modules/jobs/job_types/_job.dm | 2 +- .../library/skill_learning/skill_station.dm | 6 +- .../library/skill_learning/skillchip.dm | 10 +- .../ruins/lavalandruin_code/syndicate_base.dm | 18 +- code/modules/meteors/meteors.dm | 8 +- .../mining/lavaland/necropolis_chests.dm | 6 +- code/modules/mining/lavaland/tendril_loot.dm | 8 +- .../mob/dead/new_player/sprite_accessories.dm | 44 +-- code/modules/mob/dead/observer/observer.dm | 4 +- code/modules/mob/living/brain/MMI.dm | 14 +- code/modules/mob/living/brain/brain.dm | 12 +- code/modules/mob/living/brain/brain_item.dm | 46 +-- code/modules/mob/living/brain/death.dm | 2 +- code/modules/mob/living/brain/life.dm | 4 +- code/modules/mob/living/brain/skillchip.dm | 20 +- code/modules/mob/living/carbon/alien/alien.dm | 14 +- .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../mob/living/carbon/alien/alien_say.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 4 +- .../carbon/alien/humanoid/caste/drone.dm | 8 +- .../carbon/alien/humanoid/caste/hunter.dm | 2 +- .../carbon/alien/humanoid/caste/praetorian.dm | 10 +- .../carbon/alien/humanoid/caste/sentinel.dm | 6 +- .../mob/living/carbon/alien/humanoid/death.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 10 +- .../mob/living/carbon/alien/larva/larva.dm | 2 +- .../mob/living/carbon/alien/larva/life.dm | 2 +- .../modules/mob/living/carbon/alien/organs.dm | 44 +-- .../carbon/alien/special/alien_embryo.dm | 18 +- .../living/carbon/alien/special/facehugger.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 25 +- .../mob/living/carbon/carbon_context.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 12 +- .../mob/living/carbon/carbon_defines.dm | 4 + code/modules/mob/living/carbon/carbon_say.dm | 2 +- .../mob/living/carbon/carbon_update_icons.dm | 2 +- code/modules/mob/living/carbon/death.dm | 8 +- code/modules/mob/living/carbon/examine.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 2 +- code/modules/mob/living/carbon/human/dummy.dm | 4 +- code/modules/mob/living/carbon/human/emote.dm | 29 +- .../mob/living/carbon/human/examine.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../living/carbon/human/human_update_icons.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/carbon/human/species.dm | 138 +-------- .../carbon/human/species_types/abductors.dm | 2 +- .../carbon/human/species_types/android.dm | 2 +- .../carbon/human/species_types/dullahan.dm | 26 +- .../carbon/human/species_types/ethereal.dm | 10 +- .../carbon/human/species_types/felinid.dm | 59 +--- .../carbon/human/species_types/flypeople.dm | 48 +-- .../carbon/human/species_types/golems.dm | 18 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../human/species_types/lizardpeople.dm | 71 +---- .../carbon/human/species_types/monkeys.dm | 9 +- .../carbon/human/species_types/mothmen.dm | 2 +- .../carbon/human/species_types/mushpeople.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 8 +- .../carbon/human/species_types/podpeople.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- .../carbon/human/species_types/skeletons.dm | 4 +- .../carbon/human/species_types/snail.dm | 4 +- .../carbon/human/species_types/vampire.dm | 10 +- .../carbon/human/species_types/zombies.dm | 10 +- code/modules/mob/living/carbon/life.dm | 27 +- code/modules/mob/living/carbon/skillchip.dm | 8 +- .../modules/mob/living/carbon/status_procs.dm | 12 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 8 +- .../living/simple_animal/friendly/penguin.dm | 6 +- .../living/simple_animal/heretic_monsters.dm | 2 +- .../mob/living/simple_animal/hostile/bear.dm | 4 +- .../simple_animal/hostile/cat_butcher.dm | 4 +- .../living/simple_animal/hostile/headcrab.dm | 8 +- .../hostile/megafauna/bubblegum.dm | 2 +- code/modules/mob/living/taste.dm | 2 +- code/modules/mod/mod_core.dm | 10 +- code/modules/paperwork/paperplane.dm | 4 +- code/modules/power/apc/apc_attack.dm | 8 +- code/modules/power/cell.dm | 6 +- code/modules/power/lighting/light.dm | 6 +- .../supermatter_cascade_components.dm | 2 +- .../supermatter/supermatter_hit_procs.dm | 2 +- code/modules/power/tesla/energy_ball.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 18 +- .../reagents/cat2_medicine_reagents.dm | 4 +- .../chemistry/reagents/drink_reagents.dm | 4 +- .../chemistry/reagents/food_reagents.dm | 6 +- .../chemistry/reagents/impure_reagents.dm | 2 +- .../impure_medicine_reagents.dm | 44 +-- .../impure_reagents/impure_toxin_reagents.dm | 4 +- .../chemistry/reagents/medicine_reagents.dm | 24 +- .../chemistry/reagents/other_reagents.dm | 4 +- .../chemistry/reagents/unique/eigenstasium.dm | 2 +- .../reagents/withdrawal/generic_addictions.dm | 6 +- code/modules/religion/religion_sects.dm | 2 +- code/modules/religion/rites.dm | 18 +- .../research/designs/limbgrower_designs.dm | 42 +-- .../research/designs/medical_designs.dm | 64 ++-- code/modules/spells/spell_types/lichdom.dm | 2 +- code/modules/station_goals/dna_vault.dm | 4 +- .../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 +- code/modules/surgery/bodyparts/_bodyparts.dm | 18 +- .../surgery/bodyparts/dismemberment.dm | 43 +-- code/modules/surgery/bodyparts/head.dm | 10 +- code/modules/surgery/brain_surgery.dm | 2 +- code/modules/surgery/coronary_bypass.dm | 4 +- code/modules/surgery/eye_surgery.dm | 6 +- code/modules/surgery/gastrectomy.dm | 2 +- code/modules/surgery/hepatectomy.dm | 2 +- code/modules/surgery/lobectomy.dm | 4 +- code/modules/surgery/organs/_organ.dm | 291 ++++++++++++++++++ code/modules/surgery/organs/appendix.dm | 29 +- code/modules/surgery/organs/augments_arms.dm | 66 ++-- code/modules/surgery/organs/augments_chest.dm | 46 +-- code/modules/surgery/organs/augments_eyes.dm | 16 +- .../surgery/organs/augments_internal.dm | 40 +-- code/modules/surgery/organs/autosurgeon.dm | 12 +- code/modules/surgery/organs/ears.dm | 28 +- .../organs/external/_external_organs.dm | 142 +++++++-- .../modules/surgery/organs/external/spines.dm | 29 ++ code/modules/surgery/organs/external/tails.dm | 133 ++++++++ code/modules/surgery/organs/external/wings.dm | 4 +- code/modules/surgery/organs/eyes.dm | 124 ++++---- code/modules/surgery/organs/heart.dm | 82 ++--- code/modules/surgery/organs/helpers.dm | 11 +- code/modules/surgery/organs/liver.dm | 32 +- code/modules/surgery/organs/lungs.dm | 45 +-- code/modules/surgery/organs/organ_internal.dm | 291 ++---------------- .../surgery/organs/stomach/_stomach.dm | 30 +- .../organs/stomach/stomach_ethereal.dm | 20 +- code/modules/surgery/organs/tails.dm | 123 -------- code/modules/surgery/organs/tongue.dm | 82 ++--- code/modules/surgery/organs/vocal_cords.dm | 24 +- code/modules/surgery/revival.dm | 2 +- code/modules/surgery/stomachpump.dm | 2 +- code/modules/surgery/tools.dm | 4 +- code/modules/unit_tests/metabolizing.dm | 2 +- code/modules/unit_tests/stomach.dm | 2 +- .../mecha/equipment/weapons/weapons.dm | 2 +- code/modules/vending/wardrobes.dm | 2 +- .../components/bci/hud/counter_overlay.dm | 6 +- .../components/bci/hud/object_overlay.dm | 6 +- .../components/bci/hud/target_intercept.dm | 6 +- .../components/bci/thought_listener.dm | 6 +- code/modules/wiremod/components/bci/vox.dm | 6 +- .../wiremod/shell/brain_computer_interface.dm | 32 +- code/modules/wiremod/shell/shell_items.dm | 2 +- code/modules/zombie/items.dm | 2 +- code/modules/zombie/organs.dm | 20 +- icons/mob/mutant_bodyparts.dmi | Bin 34375 -> 34432 bytes tgstation.dme | 5 +- 317 files changed, 2090 insertions(+), 2118 deletions(-) create mode 100644 code/__DEFINES/external_organs.dm create mode 100644 code/modules/surgery/organs/_organ.dm create mode 100644 code/modules/surgery/organs/external/spines.dm create mode 100644 code/modules/surgery/organs/external/tails.dm delete mode 100644 code/modules/surgery/organs/tails.dm diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 232a936dd97..aec8b2f9a78 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -470,7 +470,7 @@ pixel_y = 4 }, /obj/item/bodypart/chest, -/obj/item/organ/heart, +/obj/item/organ/internal/heart, /obj/item/multitool, /turf/open/floor/iron/freezer, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 373e921fab9..94ebab0e4d2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -286,7 +286,7 @@ "oL" = ( /obj/structure/bonfire/prelit, /obj/effect/decal/cleanable/ash, -/obj/item/organ/tail/lizard, +/obj/item/organ/external/tail/lizard, /obj/effect/decal/cleanable/blood/old, /obj/structure/stone_tile/slab/cracked, /turf/open/misc/asteroid/basalt/wasteland, @@ -343,7 +343,7 @@ /area/ruin/unpowered/elephant_graveyard) "wp" = ( /obj/item/knife/combat/bone, -/obj/item/organ/tongue, +/obj/item/organ/internal/tongue, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) @@ -402,8 +402,8 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface) "Di" = ( -/obj/item/organ/lungs, -/obj/item/organ/liver, +/obj/item/organ/internal/lungs, +/obj/item/organ/internal/liver, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) @@ -422,7 +422,7 @@ /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "Eh" = ( -/obj/item/organ/brain, +/obj/item/organ/internal/brain, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "EI" = ( @@ -465,9 +465,9 @@ /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "Kj" = ( -/obj/item/organ/heart, -/obj/item/organ/eyes, -/obj/item/organ/ears, +/obj/item/organ/internal/heart, +/obj/item/organ/internal/eyes, +/obj/item/organ/internal/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 0f8fa5f5f77..6ea109dd643 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -929,9 +929,9 @@ "ja" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/secure/engineering, -/obj/item/organ/cyberimp/arm/toolset, -/obj/item/organ/cyberimp/eyes/hud/medical, -/obj/item/organ/cyberimp/brain/anti_stun, +/obj/item/organ/internal/cyberimp/arm/toolset, +/obj/item/organ/internal/cyberimp/eyes/hud/medical, +/obj/item/organ/internal/cyberimp/brain/anti_stun, /turf/open/floor/iron/dark/airless, /area/shuttle/caravan/freighter3) "jb" = ( diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 4f1ffc139de..11f1a6422cf 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -353,7 +353,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/powered/cat_man) "be" = ( -/obj/item/organ/tail/cat, +/obj/item/organ/external/tail/cat, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/white/corner, /area/ruin/space/has_grav/powered/cat_man) @@ -444,7 +444,7 @@ "bt" = ( /obj/structure/table/optable, /obj/effect/mob_spawn/corpse/human/damaged, -/obj/item/organ/ears/cat, +/obj/item/organ/internal/ears/cat, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/white, /area/ruin/space/has_grav/powered/cat_man) @@ -835,12 +835,12 @@ /obj/structure/closet/crate/freezer{ name = "cat ears" }, -/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, +/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, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/powered/cat_man) "cv" = ( @@ -889,12 +889,12 @@ /obj/structure/closet/crate/freezer{ name = "cat tails" }, -/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, +/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, /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 2106f0531da..600f424cd89 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -5234,7 +5234,7 @@ pixel_x = 17; pixel_y = 12 }, -/obj/item/organ/cyberimp/arm/toolset{ +/obj/item/organ/internal/cyberimp/arm/toolset{ pixel_y = 2; pixel_x = 6 }, diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 623d4786459..fd1ce01e24c 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/heart/demon, +/obj/item/organ/internal/heart/demon, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1414,7 +1414,7 @@ icon_state = "crateopen" }, /obj/item/paper/fluff/awaymissions/caves/shipment_receipt, -/obj/item/organ/eyes/robotic/thermals, +/obj/item/organ/internal/eyes/robotic/thermals, /obj/item/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/misc/asteroid/basalt{ @@ -2118,7 +2118,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_three) "YG" = ( -/obj/item/organ/brain/alien, +/obj/item/organ/internal/brain/alien, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ffc73868bab..e8ab64fea54 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -18778,7 +18778,7 @@ /obj/structure/table/wood/fancy, /obj/item/book/granter/spell/smoke/lesser, /obj/item/nullrod, -/obj/item/organ/heart, +/obj/item/organ/internal/heart, /obj/item/reagent_containers/food/drinks/bottle/holywater, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 52697ff2d8a..c7d49160fec 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -50839,7 +50839,7 @@ /turf/closed/wall, /area/station/engineering/storage) "qtu" = ( -/obj/item/organ/tail/monkey, +/obj/item/organ/external/tail/monkey, /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) @@ -67589,7 +67589,7 @@ pixel_y = 4 }, /obj/item/bodypart/chest, -/obj/item/organ/heart, +/obj/item/organ/internal/heart, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) "vQG" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 2ddafb28acb..7e333e6e419 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -11496,11 +11496,11 @@ /obj/structure/closet/crate/freezer{ name = "organ storage" }, -/obj/item/organ/tail/cat, -/obj/item/organ/tail/cat, -/obj/item/organ/ears/cat, -/obj/item/organ/ears/cat, -/obj/item/organ/heart, +/obj/item/organ/external/tail/cat, +/obj/item/organ/external/tail/cat, +/obj/item/organ/internal/ears/cat, +/obj/item/organ/internal/ears/cat, +/obj/item/organ/internal/heart, /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron/dark, /area/station/maintenance/fore) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5f75476a56f..0ce082ddee6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -13369,7 +13369,7 @@ /obj/item/nullrod{ pixel_x = 4 }, -/obj/item/organ/heart, +/obj/item/organ/internal/heart, /obj/item/soulstone/anybody/chaplain, /turf/open/floor/cult, /area/station/service/chapel/office) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 476b8d701c2..fb3f3bed263 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2613,13 +2613,13 @@ /area/station/science) "XN" = ( /obj/structure/table, -/obj/item/organ/cyberimp/bci{ +/obj/item/organ/internal/cyberimp/bci{ pixel_y = 5 }, -/obj/item/organ/cyberimp/bci{ +/obj/item/organ/internal/cyberimp/bci{ pixel_y = 5 }, -/obj/item/organ/cyberimp/bci{ +/obj/item/organ/internal/cyberimp/bci{ pixel_y = 5 }, /turf/open/floor/iron/dark, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 5a29dd74332..474fdb22aa2 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -17376,8 +17376,8 @@ /obj/item/reagent_containers/medigel/synthflesh, /obj/item/reagent_containers/medigel/synthflesh, /obj/item/reagent_containers/medigel/synthflesh, -/obj/item/organ/heart/cybernetic/tier2, -/obj/item/organ/heart/cybernetic/tier2, +/obj/item/organ/internal/heart/cybernetic/tier2, +/obj/item/organ/internal/heart/cybernetic/tier2, /obj/item/defibrillator, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 79f01da58e1..1c47bddf832 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -720,7 +720,7 @@ /obj/item/stack/medical/gauze, /obj/item/reagent_containers/food/drinks/bottle/whiskey, /obj/item/reagent_containers/glass/bottle/ethanol, -/obj/item/organ/stomach, +/obj/item/organ/internal/stomach, /obj/item/clothing/mask/surgical, /turf/open/floor/iron, /area/shuttle/escape/luxury) diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index 05d1626fded..9406acd1186 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/heart/gland/access{ +/obj/item/organ/internal/heart/gland/access{ pixel_x = 10 }, -/obj/item/organ/heart/gland/egg, +/obj/item/organ/internal/heart/gland/egg, /turf/open/floor/plating/abductor, /area/shuttle/escape) "JK" = ( diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 12a91bf16c9..6d011258f29 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -1199,7 +1199,7 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, /obj/item/trash/syndi_cakes, -/obj/item/organ/stomach, +/obj/item/organ/internal/stomach, /obj/machinery/firealarm/directional/north, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/showroomfloor, diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a4e48ac9b72..9e24b265142 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -40,24 +40,23 @@ #define DNA_UNI_IDENTITY_BLOCKS 7 /// This number needs to equal the total number of DNA blocks -#define DNA_FEATURE_BLOCKS 16 +#define DNA_FEATURE_BLOCKS 15 #define DNA_MUTANT_COLOR_BLOCK 1 #define DNA_ETHEREAL_COLOR_BLOCK 2 #define DNA_LIZARD_MARKINGS_BLOCK 3 -#define DNA_LIZARD_TAIL_BLOCK 4 -#define DNA_SNOUT_BLOCK 5 -#define DNA_HORNS_BLOCK 6 -#define DNA_FRILLS_BLOCK 7 -#define DNA_SPINES_BLOCK 8 -#define DNA_HUMAN_TAIL_BLOCK 9 +#define DNA_TAIL_BLOCK 4 +#define DNA_LIZARD_TAIL_BLOCK 5 +#define DNA_SNOUT_BLOCK 6 +#define DNA_HORNS_BLOCK 7 +#define DNA_FRILLS_BLOCK 8 +#define DNA_SPINES_BLOCK 9 #define DNA_EARS_BLOCK 10 #define DNA_MOTH_WINGS_BLOCK 11 #define DNA_MOTH_ANTENNAE_BLOCK 12 #define DNA_MOTH_MARKINGS_BLOCK 13 #define DNA_MUSHROOM_CAPS_BLOCK 14 -#define DNA_MONKEY_TAIL_BLOCK 15 -#define DNA_POD_HAIR_BLOCK 16 +#define DNA_POD_HAIR_BLOCK 15 #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 @@ -115,7 +114,6 @@ #define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" //This one ignores alphabetical order cause the arms should be together #define ORGAN_SLOT_STOMACH "stomach" #define ORGAN_SLOT_STOMACH_AID "stomach_aid" -#define ORGAN_SLOT_TAIL "tail" #define ORGAN_SLOT_THRUSTERS "thrusters" #define ORGAN_SLOT_TONGUE "tongue" #define ORGAN_SLOT_VOICE "vocal_cords" @@ -180,7 +178,6 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_HEART_AID, ORGAN_SLOT_BRAIN_ANTIDROP, ORGAN_SLOT_BRAIN_ANTISTUN, - ORGAN_SLOT_TAIL, ORGAN_SLOT_PARASITE_EGG, ORGAN_SLOT_REGENERATIVE_CORE, ORGAN_SLOT_XENO_PLASMAVESSEL, diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index e2cb1e01554..ff46eb8131f 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -6,9 +6,11 @@ // Organ signals /// Called on the organ when it is implanted into someone (mob/living/carbon/receiver) #define COMSIG_ORGAN_IMPLANTED "comsig_organ_implanted" - +/// Called when using the *wag emote +#define COMSIG_ORGAN_WAG_TAIL "comsig_wag_tail" /// Called on the organ when it is removed from someone (mob/living/carbon/old_owner) #define COMSIG_ORGAN_REMOVED "comsig_organ_removed" + ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm new file mode 100644 index 00000000000..da8c4ddc272 --- /dev/null +++ b/code/__DEFINES/external_organs.dm @@ -0,0 +1,10 @@ +///Uses the parent limb's drawcolor value. +#define ORGAN_COLOR_INHERIT (1<<0) +///Uses /organ/external/proc/override_color()'s return value +#define ORGAN_COLOR_OVERRIDE (1<<1) +///Uses the parent's haircolor +#define ORGAN_COLOR_HAIR (1<<2) + +///Tail wagging +#define WAG_ABLE (1<<0) +#define WAG_WAGGING (1<<1) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 93a62e81354..24db52be639 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -201,6 +201,10 @@ GLOBAL_LIST_INIT(turfs_openspace, 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/traits.dm b/code/__DEFINES/traits.dm index c8b68b61440..28fa7107458 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -416,7 +416,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/liver +// These traits are applied to /obj/item/organ/internal/liver #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism" #define TRAIT_CULINARY_METABOLISM "culinary_metabolism" #define TRAIT_COMEDY_METABOLISM "comedy_metabolism" @@ -810,7 +810,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /** * Trait granted by [/mob/living/carbon/Initialize] and -* granted/removed by [/obj/item/organ/tongue] +* granted/removed by [/obj/item/organ/internal/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/global_lists.dm b/code/__HELPERS/global_lists.dm index 3c3bc0ee86c..47a9b3755cf 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,10 +15,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, GLOB.animated_tails_list_human) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, GLOB.tails_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE) init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/horns,GLOB.horns_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.ears_list) @@ -32,7 +31,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey) init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) //Species diff --git a/code/__HELPERS/honkerblast.dm b/code/__HELPERS/honkerblast.dm index c8b9ab17ef5..0e82125cfc0 100644 --- a/code/__HELPERS/honkerblast.dm +++ b/code/__HELPERS/honkerblast.dm @@ -23,7 +23,7 @@ victim.Stun(100) victim.adjust_timed_status_effect(30 SECONDS, /datum/status_effect/speech/stutter) victim.set_timed_status_effect(1000 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = victim.getorganslot(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_timed_status_effect(500 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = victim.getorganslot(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_timed_status_effect(200 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS) ears?.adjustEarDamage(4, 5) to_chat(victim, "HONK") diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 4590fcdf7be..ee69288b222 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -59,10 +59,12 @@ return pick(GLOB.backpacklist) /proc/random_features() + if(!GLOB.tails_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/, GLOB.tails_list, add_blank = TRUE) if(!GLOB.tails_list_human.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) if(!GLOB.tails_list_lizard.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE) if(!GLOB.snouts_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) if(!GLOB.horns_list.len) @@ -88,12 +90,12 @@ if(!GLOB.pod_hair_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) - //For now we will always return none for tail_human and ears. + //For now we will always return none for tail_human and ears. | "For now" he says. return(list( "mcolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]", "ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], - "tail_lizard" = pick(GLOB.tails_list_lizard), - "tail_human" = "None", + "tail_cat" = "None", + "tail_lizard" = "Smooth", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), @@ -786,9 +788,29 @@ GLOBAL_LIST_EMPTY(species_list) return "left foot" if(BODY_ZONE_PRECISE_R_FOOT) return "right foot" + if(BODY_ZONE_PRECISE_GROIN) + return "groin" else return zone +///Takes a zone and returns it's "parent" zone, if it has one. +/proc/deprecise_zone(precise_zone) + switch(precise_zone) + if(BODY_ZONE_PRECISE_GROIN) + return BODY_ZONE_CHEST + if(BODY_ZONE_PRECISE_EYES) + return BODY_ZONE_HEAD + if(BODY_ZONE_PRECISE_R_HAND) + return BODY_ZONE_R_ARM + if(BODY_ZONE_PRECISE_L_HAND) + return BODY_ZONE_L_ARM + if(BODY_ZONE_PRECISE_L_FOOT) + return BODY_ZONE_L_LEG + if(BODY_ZONE_PRECISE_R_FOOT) + return BODY_ZONE_R_LEG + else + return precise_zone + ///Returns the direction that the initiator and the target are facing /proc/check_target_facings(mob/living/initiator, mob/living/target) /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. @@ -817,7 +839,7 @@ GLOBAL_LIST_EMPTY(species_list) mob_occupant = head.brainmob else if(isorgan(occupant)) - var/obj/item/organ/brain/brain = occupant + var/obj/item/organ/internal/brain/brain = occupant mob_occupant = brain.brainmob return mob_occupant diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 6c6c8344655..85bf981d522 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -20,8 +20,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name //Lizard Bits (all datum lists indexed by name) GLOBAL_LIST_EMPTY(body_markings_list) -GLOBAL_LIST_EMPTY(tails_list_lizard) -GLOBAL_LIST_EMPTY(animated_tails_list_lizard) GLOBAL_LIST_EMPTY(snouts_list) GLOBAL_LIST_EMPTY(horns_list) GLOBAL_LIST_EMPTY(frills_list) @@ -30,8 +28,9 @@ GLOBAL_LIST_EMPTY(legs_list) GLOBAL_LIST_EMPTY(animated_spines_list) //Mutant Human bits -GLOBAL_LIST_EMPTY(tails_list_human) -GLOBAL_LIST_EMPTY(animated_tails_list_human) +GLOBAL_LIST_EMPTY(tails_list) +GLOBAL_LIST_EMPTY(tails_list_human) //Only exists for preference choices. Use "tails_list" otherwise. +GLOBAL_LIST_EMPTY(tails_list_lizard) //See above! GLOBAL_LIST_EMPTY(ears_list) GLOBAL_LIST_EMPTY(wings_list) GLOBAL_LIST_EMPTY(wings_open_list) @@ -39,7 +38,6 @@ GLOBAL_LIST_EMPTY(moth_wings_list) GLOBAL_LIST_EMPTY(moth_antennae_list) GLOBAL_LIST_EMPTY(moth_markings_list) GLOBAL_LIST_EMPTY(caps_list) -GLOBAL_LIST_EMPTY(tails_list_monkey) GLOBAL_LIST_EMPTY(pod_hair_list) GLOBAL_LIST_INIT(color_list_ethereal, list( diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index ff238c73c5d..5745f3bc8bb 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/head/lizard, /obj/item/clothing/shoes/cowboy/lizard, /obj/item/food/kebab/tail, - /obj/item/organ/tail/lizard, + /obj/item/organ/external/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine, /obj/item/toy/plush/lizard_plushie, )), @@ -181,7 +181,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/tongue/bone, + /obj/item/organ/internal/tongue/bone, /obj/item/stack/sheet/bone, )), @@ -344,8 +344,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/gun/energy/alien, /obj/item/hemostat/alien, /obj/item/melee/baton/abductor, - /obj/item/organ/body_egg/alien_embryo, - /obj/item/organ/heart/gland, + /obj/item/organ/internal/body_egg/alien_embryo, + /obj/item/organ/internal/heart/gland, /obj/item/radio/headset/abductor, /obj/item/retractor/alien, /obj/item/scalpel/alien, diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 75aa5953fc8..e9d5b3adb52 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/brain/brain //the poor bastard's brain + var/obj/item/organ/internal/brain/brain //the poor bastard's brain var/gain_text = "You feel traumatized." var/lose_text = "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 f635ba70484..a5dd9101463 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -182,7 +182,7 @@ var/codeword var/objective -/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/brain/B, _permanent, _codeword, _objective) +/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/internal/brain/B, _permanent, _codeword, _objective) ..() if(_codeword) codeword = _codeword diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 8ab842790b8..4a2cfc036d0 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -143,9 +143,9 @@ /datum/crafting_recipe/tailclub name = "Tail Club" result = /obj/item/tailclub - reqs = list(/obj/item/organ/tail/lizard = 1, + reqs = list(/obj/item/organ/external/tail/lizard = 1, /obj/item/stack/sheet/iron = 1) - blacklist = list(/obj/item/organ/tail/lizard/fake) + blacklist = list(/obj/item/organ/external/tail/lizard/fake) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -153,9 +153,9 @@ /datum/crafting_recipe/tailwhip name = "Liz O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip - reqs = list(/obj/item/organ/tail/lizard = 1, + reqs = list(/obj/item/organ/external/tail/lizard = 1, /obj/item/stack/cable_coil = 1) - blacklist = list(/obj/item/organ/tail/lizard/fake) + blacklist = list(/obj/item/organ/external/tail/lizard/fake) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -163,7 +163,7 @@ /datum/crafting_recipe/catwhip name = "Cat O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip/kitty - reqs = list(/obj/item/organ/tail/cat = 1, + reqs = list(/obj/item/organ/external/tail/cat = 1, /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY @@ -635,7 +635,7 @@ name = "Lizard Cloche Hat" result = /obj/item/clothing/head/lizard time = 10 - reqs = list(/obj/item/organ/tail/lizard = 1) + reqs = list(/obj/item/organ/external/tail/lizard = 1) category = CAT_CLOTHING /datum/crafting_recipe/lizardhat_alternate @@ -649,8 +649,8 @@ name = "Kitty Ears" result = /obj/item/clothing/head/kitty/genuine time = 10 - reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/organ/ears/cat = 1) + reqs = list(/obj/item/organ/external/tail/cat = 1, + /obj/item/organ/internal/ears/cat = 1) category = CAT_CLOTHING @@ -760,7 +760,7 @@ /datum/crafting_recipe/flashlight_eyes name = "Flashlight Eyes" - result = /obj/item/organ/eyes/robotic/flashlight + result = /obj/item/organ/internal/eyes/robotic/flashlight time = 10 reqs = list( /obj/item/flashlight = 2, @@ -1288,7 +1288,7 @@ reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, /obj/item/stack/sheet/glass = 1, - /obj/item/organ/heart/ethereal = 1, + /obj/item/organ/internal/heart/ethereal = 1, ) category = CAT_MISC diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 44483cd0e37..4dd01422f45 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -160,7 +160,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/stomach/belly = carbon_target.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = carbon_target.getorganslot(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/manual_blinking.dm b/code/datums/components/manual_blinking.dm index a47f003e275..07075cddf27 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/eyes/E + var/obj/item/organ/internal/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/eyes/new_eyes = O + var/obj/item/organ/internal/eyes/new_eyes = O - if(istype(new_eyes,/obj/item/organ/eyes)) + if(istype(new_eyes,/obj/item/organ/internal/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/eyes/bye_beyes = O // oh come on, that's pretty good + var/obj/item/organ/internal/eyes/bye_beyes = O // oh come on, that's pretty good - if(istype(bye_beyes, /obj/item/organ/eyes)) + if(istype(bye_beyes, /obj/item/organ/internal/eyes)) E = null STOP_PROCESSING(SSdcs, src) diff --git a/code/datums/components/manual_breathing.dm b/code/datums/components/manual_breathing.dm index 9de66565362..4c47794b809 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/lungs/L + var/obj/item/organ/internal/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/eyes/new_lungs = O + var/obj/item/organ/internal/eyes/new_lungs = O - if(istype(new_lungs,/obj/item/organ/lungs)) + if(istype(new_lungs,/obj/item/organ/internal/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/lungs/old_lungs = O + var/obj/item/organ/internal/lungs/old_lungs = O - if(istype(old_lungs, /obj/item/organ/lungs)) + if(istype(old_lungs, /obj/item/organ/internal/lungs)) L = null STOP_PROCESSING(SSdcs, src) diff --git a/code/datums/components/phylactery.dm b/code/datums/components/phylactery.dm index 45d9a034b72..e0b0c0897e8 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/brain/new_lich_brain = lich.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/new_lich_brain = lich.getorganslot(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.internal_organs) // Skip the brain - it can disappear, we don't need it anymore - if(istype(to_drop, /obj/item/organ/brain)) + if(istype(to_drop, /obj/item/organ/internal/brain)) continue // For the rest, drop all the organs onto the floor (for style) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index a8fc6725d80..c8427ee980d 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/use_squeak) - if(istype(parent, /obj/item/organ/liver)) + if(istype(parent, /obj/item/organ/internal/liver)) // Liver squeaking is depending on them functioning like a clown's liver RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), .proc/on_comedy_metabolism_removal) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index d5c1ac2c4a0..51c7e8e8a1d 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -110,7 +110,7 @@ ) return - var/obj/item/organ/tongue/licking_tongue = user.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/licking_tongue = user.getorganslot(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 e55755111e4..f09638867ed 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -288,9 +288,10 @@ defense_mod += 2 if(islizard(T)) - if(!T.getorganslot(ORGAN_SLOT_TAIL)) // lizards without tails are off-balance + var/obj/item/organ/external/tail/el_tail = T.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!el_tail) // lizards without tails are off-balance defense_mod -= 1 - else if(T.dna.species.is_wagging_tail()) // lizard tail wagging is robust and can swat away assailants! + else if(el_tail.wag_flags & WAG_WAGGING) // lizard tail wagging is robust and can swat away assailants! defense_mod += 1 // OF-FENSE diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index c4176614054..2febbed6e91 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -37,7 +37,7 @@ if(!.) return var/mob/living/carbon/M = A.affected_mob - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) if(!ears) return //cutting off your ears to cure the deafness: the ultimate own switch(A.stage) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 30acb6e92b6..2eab2b6a5bb 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -90,12 +90,12 @@ var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(4, 5) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(-4, -4) M.adjust_blindness(-2) M.adjust_blurriness(-2) - var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(!eyes) // only dealing with eye stuff from here on out return eyes.applyOrganDamage(-2) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index c171a0a2c39..eb8ca5e8762 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -38,7 +38,7 @@ if(!.) return var/mob/living/carbon/M = A.affected_mob - var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(eyes) switch(A.stage) if(1, 2) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 89e6b085a23..44cb3d7256e 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 7.5 //higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/brain) + required_organs = list(/obj/item/organ/internal/brain) severity = DISEASE_SEVERITY_HARMFUL diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index f5c26ea744f..8a2c3992d15 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -36,9 +36,9 @@ if(isopenturf(OT)) OT.MakeSlippery(TURF_WET_LUBE, 100) if(4) - var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.internal_organs + var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in affected_mob.internal_organs if(!eyes && DT_PROB(2.5, delta_time)) - var/obj/item/organ/eyes/snail/new_eyes = new() + var/obj/item/organ/internal/eyes/snail/new_eyes = new() new_eyes.Insert(affected_mob, drop_if_replaced = TRUE) 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!")) @@ -56,9 +56,9 @@ affected_mob.emote("scream") return - var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.internal_organs + var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in affected_mob.internal_organs if(!tongue && DT_PROB(2.5, delta_time)) - var/obj/item/organ/tongue/snail/new_tongue = new() + var/obj/item/organ/internal/tongue/snail/new_tongue = new() new_tongue.Insert(affected_mob) to_chat(affected_mob, span_userdanger("You feel your speech slow down...")) return @@ -83,13 +83,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/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.internal_organs + var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in H.internal_organs if(tongue) - var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue () + var/obj/item/organ/internal/tongue/new_tongue = new H.dna.species.mutanttongue () new_tongue.Insert(H) - var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in H.internal_organs + var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in H.internal_organs if(eyes) - var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes () + var/obj/item/organ/internal/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/heart_failure.dm b/code/datums/diseases/heart_failure.dm index e5fe2820770..57be48b5879 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -12,7 +12,7 @@ disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC - required_organs = list(/obj/item/organ/heart) + required_organs = list(/obj/item/organ/internal/heart) bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus var/sound = FALSE diff --git a/code/datums/diseases/parasitic_infection.dm b/code/datums/diseases/parasitic_infection.dm index 9fc8dccb971..fe9cffaaa4e 100644 --- a/code/datums/diseases/parasitic_infection.dm +++ b/code/datums/diseases/parasitic_infection.dm @@ -11,7 +11,7 @@ severity = DISEASE_SEVERITY_HARMFUL disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS - required_organs = list(/obj/item/organ/liver) + required_organs = list(/obj/item/organ/internal/liver) bypasses_immunity = TRUE @@ -20,7 +20,7 @@ if(!.) return - var/obj/item/organ/liver/affected_liver = affected_mob.getorgan(/obj/item/organ/liver) + var/obj/item/organ/internal/liver/affected_liver = affected_mob.getorgan(/obj/item/organ/internal/liver) if(!affected_liver) affected_mob.visible_message(span_notice("[affected_mob]'s liver is covered in tiny larva! They quickly shrivel and die after being exposed to the open air.")) cure() diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index aba287ee6b1..55d039e7e32 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 2.5 //like hell are you getting out of hell desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/lungs) + required_organs = list(/obj/item/organ/internal/lungs) severity = DISEASE_SEVERITY_BIOHAZARD bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. diff --git a/code/datums/dna.dm b/code/datums/dna.dm index e2e5e4ee855..532acf5a58d 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -195,6 +195,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) L[DNA_ETHEREAL_COLOR_BLOCK] = sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE) if(features["body_markings"]) L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len) + if(features["tail_cat"]) + L[DNA_TAIL_BLOCK] = construct_block(GLOB.tails_list_human.Find(features["tail_cat"]), GLOB.tails_list_human.len) if(features["tail_lizard"]) L[DNA_LIZARD_TAIL_BLOCK] = construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list_lizard.len) if(features["snout"]) @@ -205,8 +207,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) L[DNA_FRILLS_BLOCK] = construct_block(GLOB.frills_list.Find(features["frills"]), GLOB.frills_list.len) if(features["spines"]) L[DNA_SPINES_BLOCK] = construct_block(GLOB.spines_list.Find(features["spines"]), GLOB.spines_list.len) - if(features["tail_human"]) - L[DNA_HUMAN_TAIL_BLOCK] = construct_block(GLOB.tails_list_human.Find(features["tail_human"]), GLOB.tails_list_human.len) if(features["ears"]) L[DNA_EARS_BLOCK] = construct_block(GLOB.ears_list.Find(features["ears"]), GLOB.ears_list.len) if(features["moth_wings"] != "Burnt Off") @@ -217,8 +217,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) L[DNA_MOTH_MARKINGS_BLOCK] = construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len) if(features["caps"]) L[DNA_MUSHROOM_CAPS_BLOCK] = construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len) - if(features["tail_monkey"]) - L[DNA_MONKEY_TAIL_BLOCK] = construct_block(GLOB.tails_list_monkey.Find(features["tail_monkey"]), GLOB.tails_list_monkey.len) if(features["pod_hair"]) L[DNA_POD_HAIR_BLOCK] = construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len) @@ -331,8 +329,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)) if(DNA_LIZARD_MARKINGS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len)) - if(DNA_LIZARD_TAIL_BLOCK) - set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list_lizard.len)) + if(DNA_TAIL_BLOCK) + set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list.Find(features["tail_lizard"]), GLOB.tails_list.len)) if(DNA_SNOUT_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.snouts_list.Find(features["snout"]), GLOB.snouts_list.len)) if(DNA_HORNS_BLOCK) @@ -341,8 +339,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, construct_block(GLOB.frills_list.Find(features["frills"]), GLOB.frills_list.len)) if(DNA_SPINES_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.spines_list.Find(features["spines"]), GLOB.spines_list.len)) - if(DNA_HUMAN_TAIL_BLOCK) - set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_human.Find(features["tail_human"]), GLOB.tails_list_human.len)) if(DNA_EARS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.ears_list.Find(features["ears"]), GLOB.ears_list.len)) if(DNA_MOTH_WINGS_BLOCK) @@ -353,8 +349,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len)) if(DNA_MUSHROOM_CAPS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len)) - if(DNA_MONKEY_TAIL_BLOCK) - set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_monkey.Find(features["tail_monkey"]), GLOB.tails_list_monkey.len)) if(DNA_POD_HAIR_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)) @@ -578,8 +572,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.features["ethcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_ETHEREAL_COLOR_BLOCK)) if(dna.features["body_markings"]) dna.features["body_markings"] = GLOB.body_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), GLOB.body_markings_list.len)] - if(dna.features["tail_lizard"]) - dna.features["tail_lizard"] = GLOB.tails_list_lizard[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_TAIL_BLOCK), GLOB.tails_list_lizard.len)] if(dna.features["snout"]) dna.features["snout"] = GLOB.snouts_list[deconstruct_block(get_uni_feature_block(features, DNA_SNOUT_BLOCK), GLOB.snouts_list.len)] if(dna.features["horns"]) @@ -588,8 +580,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.features["frills"] = GLOB.frills_list[deconstruct_block(get_uni_feature_block(features, DNA_FRILLS_BLOCK), GLOB.frills_list.len)] if(dna.features["spines"]) dna.features["spines"] = GLOB.spines_list[deconstruct_block(get_uni_feature_block(features, DNA_SPINES_BLOCK), GLOB.spines_list.len)] - if(dna.features["tail_human"]) - dna.features["tail_human"] = GLOB.tails_list_human[deconstruct_block(get_uni_feature_block(features, DNA_HUMAN_TAIL_BLOCK), GLOB.tails_list_human.len)] + if(dna.features["tail_cat"]) + dna.features["tail_cat"] = GLOB.tails_list_human[deconstruct_block(get_uni_feature_block(features, DNA_TAIL_BLOCK), GLOB.tails_list_human.len)] + if(dna.features["tail_lizard"]) + dna.features["tail_cat"] = GLOB.tails_list_lizard[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_TAIL_BLOCK), GLOB.tails_list_lizard.len)] if(dna.features["ears"]) dna.features["ears"] = GLOB.ears_list[deconstruct_block(get_uni_feature_block(features, DNA_EARS_BLOCK), GLOB.ears_list.len)] if(dna.features["moth_wings"]) @@ -604,8 +598,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.features["moth_markings"] = GLOB.moth_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_MOTH_MARKINGS_BLOCK), GLOB.moth_markings_list.len)] if(dna.features["caps"]) dna.features["caps"] = GLOB.caps_list[deconstruct_block(get_uni_feature_block(features, DNA_MUSHROOM_CAPS_BLOCK), GLOB.caps_list.len)] - if(dna.features["tail_monkey"]) - dna.features["tail_monkey"] = GLOB.tails_list_monkey[deconstruct_block(get_uni_feature_block(features, DNA_MONKEY_TAIL_BLOCK), GLOB.tails_list_monkey.len)] if(dna.features["pod_hair"]) dna.features["pod_hair"] = GLOB.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), GLOB.pod_hair_list.len)] @@ -869,7 +861,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/eyes/eyes = locate(/obj/item/organ/eyes) in internal_organs + var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in internal_organs if(!eyes) return eyes.Remove(src) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index c487500dc7b..6d748f7e28e 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -28,7 +28,7 @@ /datum/element/earhealing/process(delta_time) for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] - var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) if(!ears || HAS_TRAIT_NOT_FROM(user, TRAIT_DEAF, EAR_DAMAGE)) continue ears.deaf = max(ears.deaf - 0.25 * delta_time, (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 b7d73867ea8..8fb57149734 100644 --- a/code/datums/elements/eyestab.dm +++ b/code/datums/elements/eyestab.dm @@ -80,7 +80,7 @@ log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])") - var/obj/item/organ/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm index 4b4eff75e3e..e0b443f28a9 100644 --- a/code/datums/elements/kneejerk.dm +++ b/code/datums/elements/kneejerk.dm @@ -29,7 +29,7 @@ var/selected_zone = user.zone_selected var/obj/item/bodypart/r_leg = target.get_bodypart(BODY_ZONE_R_LEG) var/obj/item/bodypart/l_leg = target.get_bodypart(BODY_ZONE_L_LEG) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(!ishuman(target)) return diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 9eb1e961bc7..050ff5ca169 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -92,10 +92,9 @@ timeout = 2 MINUTES /datum/mood_event/table/add_effects() - if(isfelinid(owner)) + if(isfelinid(owner)) //Holy snowflake batman! var/mob/living/carbon/human/H = owner - H.dna.species.start_wagging_tail(H) - addtimer(CALLBACK(H.dna.species, /datum/species.proc/stop_wagging_tail, H), 3 SECONDS) + SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS) description = "They want to play on the table!" mood_change = 2 diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 57b40b12476..48e8c41b078 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -280,9 +280,9 @@ var/mob/living/carbon/C = user if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) return - var/obj/item/organ/tongue/tongue + var/obj/item/organ/internal/tongue/tongue for(var/org in C.internal_organs) - if(istype(org, /obj/item/organ/tongue)) + if(istype(org, /obj/item/organ/internal/tongue)) tongue = org break diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 4836b61b732..0abb77a6a2d 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -459,7 +459,7 @@ explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) for(var/mob/living/carbon/human/H in view(2,owner)) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(eyes) to_chat(H, span_userdanger("You are blinded by a shower of blood!")) else @@ -484,7 +484,7 @@ . = ..() if(.)//cant add return TRUE - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) if(brain) brain.zone = BODY_ZONE_CHEST @@ -502,7 +502,7 @@ . = ..() if(.) return TRUE - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) if(brain) //so this doesn't instantly kill you. we could delete the brain, but it lets people cure brain issues they /really/ shouldn't be brain.zone = BODY_ZONE_HEAD UnregisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB) diff --git a/code/datums/mutations/holy_mutation/burdened.dm b/code/datums/mutations/holy_mutation/burdened.dm index 955b0a9f8b6..404688ad750 100644 --- a/code/datums/mutations/holy_mutation/burdened.dm +++ b/code/datums/mutations/holy_mutation/burdened.dm @@ -107,8 +107,8 @@ if(special) //aheals return - if(istype(new_organ, /obj/item/organ/eyes)) - var/obj/item/organ/eyes/new_eyes = new_organ + if(istype(new_organ, /obj/item/organ/internal/eyes)) + var/obj/item/organ/internal/eyes/new_eyes = new_organ if(new_eyes.tint < TINT_BLIND) //unless you added unworking eyes (flashlight eyes), this is removing burden update_burden(FALSE) return @@ -121,8 +121,8 @@ if(special) //aheals return - if(istype(old_organ, /obj/item/organ/eyes)) - var/obj/item/organ/eyes/old_eyes = old_organ + if(istype(old_organ, /obj/item/organ/internal/eyes)) + var/obj/item/organ/internal/eyes/old_eyes = old_organ if(old_eyes.tint < TINT_BLIND) //unless you were already blinded by them (flashlight eyes), this is adding burden! update_burden(TRUE) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index c279e2fdf90..64b3c07d3c5 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -109,7 +109,7 @@ return var/mob/living/carbon/possible_throwable = user.pulling - if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL)) + if(!possible_throwable.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL)) return if(ishuman(possible_throwable)) diff --git a/code/datums/quirks/good.dm b/code/datums/quirks/good.dm index 3ee2fb8b44f..ccb66016440 100644 --- a/code/datums/quirks/good.dm +++ b/code/datums/quirks/good.dm @@ -166,7 +166,7 @@ /datum/quirk/night_vision/proc/refresh_quirk_holder_eyes() var/mob/living/carbon/human/human_quirk_holder = quirk_holder - var/obj/item/organ/eyes/eyes = human_quirk_holder.getorgan(/obj/item/organ/eyes) + var/obj/item/organ/internal/eyes/eyes = human_quirk_holder.getorgan(/obj/item/organ/internal/eyes) if(!eyes || eyes.lighting_alpha) return // We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes. diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm index 4b94351014b..8579d956ba5 100644 --- a/code/datums/quirks/negative.dm +++ b/code/datums/quirks/negative.dm @@ -724,7 +724,7 @@ var/brand = initial(drug_container_type.name) quirk_holder.mind.add_memory(MEMORY_QUIRK_DRUG, list(DETAIL_FAV_BRAND = brand), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT) // smoker lungs have 25% less health and healing - var/obj/item/organ/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS) if (smoker_lungs && !(smoker_lungs.organ_flags & ORGAN_SYNTHETIC)) // robotic lungs aren't affected smoker_lungs.maxHealth = smoker_lungs.maxHealth * 0.75 smoker_lungs.healing_factor = smoker_lungs.healing_factor * 0.75 diff --git a/code/datums/quirks/neutral.dm b/code/datums/quirks/neutral.dm index 788ea1b941c..53cf158d4dd 100644 --- a/code/datums/quirks/neutral.dm +++ b/code/datums/quirks/neutral.dm @@ -207,7 +207,7 @@ // We set override to TRUE as link to holder will be called whenever the preference is applied, given this quirk exists on the mob RegisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN, .proc/check_eye_removal, override=TRUE) - var/obj/item/organ/eyes/eyes_of_the_holder = quirk_holder.getorgan(/obj/item/organ/eyes) + var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.getorgan(/obj/item/organ/internal/eyes) if(!eyes_of_the_holder) return @@ -215,7 +215,7 @@ eyes_of_the_holder.old_eye_color_right = color eyes_of_the_holder.refresh() -/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed) +/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed) SIGNAL_HANDLER if(!istype(removed)) @@ -342,11 +342,11 @@ /datum/quirk/item_quirk/tongue_tied/add_unique() var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/organ/tongue/old_tongue = human_holder.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/old_tongue = human_holder.getorganslot(ORGAN_SLOT_TONGUE) old_tongue.Remove(human_holder) qdel(old_tongue) - var/obj/item/organ/tongue/tied/new_tongue = new(get_turf(human_holder)) + var/obj/item/organ/internal/tongue/tied/new_tongue = new(get_turf(human_holder)) new_tongue.Insert(human_holder) // Only tongues of people with this quirk can't be removed. Manually spawned or found tongues can be. new_tongue.organ_flags |= ORGAN_UNREMOVABLE diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 1533bdef7e3..154cf644016 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -26,7 +26,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/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE) + var/obj/item/organ/internal/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE) if(V?.can_speak_with()) V.handle_speech(message) //message V.speak_with(message) //action diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 7c60346b175..e188b31c8d0 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -421,7 +421,7 @@ if(QDELETED(human_mob)) return if(prob(1))//low chance of the alternative reality returning to monkey - var/obj/item/organ/tail/monkey/monkey_tail = new () + var/obj/item/organ/external/tail/monkey/monkey_tail = new () monkey_tail.Insert(human_mob, drop_if_replaced = FALSE) var/datum/species/human_species = human_mob.dna?.species if(human_species) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index f2fa353a51b..10edebaefcb 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -946,7 +946,7 @@ candidates = living_players for(var/mob/living/carbon/human/candidate in candidates) if( \ - !candidate.getorgan(/obj/item/organ/brain) \ + !candidate.getorgan(/obj/item/organ/internal/brain) \ || candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \ || candidate.stat == DEAD \ || !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \ diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index d9ea2ff4722..93e787e1503 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -282,7 +282,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list /datum/objective/protect/check_completion() - var/obj/item/organ/brain/brain_target + var/obj/item/organ/internal/brain/brain_target if(human_check) brain_target = target.current?.getorganslot(ORGAN_SLOT_BRAIN) //Protect will always suceed when someone suicides diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index cbc1c1106b1..ce27c85bf93 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -6,7 +6,7 @@ base_icon_state = "scanner" density = TRUE obj_flags = NO_BUILD // Becomes undense when the door is open - occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain) + occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/internal/brain) circuit = /obj/item/circuitboard/machine/dnascanner var/locked = FALSE var/damage_coeff diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index a1b73287b5d..629f5073918 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -262,7 +262,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/stomach/belly = patient.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = patient.getorganslot(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 a8a28b71d33..33ea2c265da 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -134,7 +134,7 @@ if(istype(AM, /obj/item)) var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM - if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) + if(istype(AM, /obj/item/organ/internal/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) living_detected = TRUE nom += AM else if(isliving(AM)) diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index 4c4bb77dcd9..80e9b103ba8 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -59,7 +59,6 @@ name = "antag gear" icon_state = "esword" loot = list( - /obj/item/clothing/glasses/science/night = 15, /obj/item/shield/riot = 12, /obj/item/stack/sheet/mineral/diamond{amount = 15} = 5, diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index 6e23e5189ed..6786d62dce8 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -25,18 +25,18 @@ icon_state = "eyes" spawn_loot_count = 3 loot = list( - /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/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/regenerative_core = 2, - /obj/item/organ/heart/gland/ventcrawling = 1, - /obj/item/organ/body_egg/alien_embryo = 1, + /obj/item/organ/internal/heart/gland/ventcrawling = 1, + /obj/item/organ/internal/body_egg/alien_embryo = 1, ) /obj/effect/spawner/random/medical/memeorgans @@ -44,23 +44,23 @@ icon_state = "eyes" spawn_loot_count = 5 loot = list( - /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/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/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 a25f570dcda..b5231f7ad75 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -65,7 +65,7 @@ return TRUE /obj/item/airlock_painter/suicide_act(mob/user) - var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/L = user.getorganslot(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 296aebc40a7..0d0fa2a4fef 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -1,4 +1,4 @@ -/obj/item/organ/body_egg +/obj/item/organ/internal/body_egg name = "body egg" desc = "All slimy and yuck." icon_state = "innards" @@ -6,23 +6,23 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_PARASITE_EGG -/obj/item/organ/body_egg/on_find(mob/living/finder) +/obj/item/organ/internal/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/body_egg/Initialize(mapload) +/obj/item/organ/internal/body_egg/Initialize(mapload) . = ..() if(iscarbon(loc)) Insert(loc) -/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/body_egg/Insert(mob/living/carbon/M, special = FALSE) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, ORGAN_TRAIT) ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, ORGAN_TRAIT) owner.med_hud_set_status() INVOKE_ASYNC(src, .proc/AddInfectionImages, owner) -/obj/item/organ/body_egg/Remove(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/body_egg/Remove(mob/living/carbon/M, special = FALSE) if(owner) REMOVE_TRAIT(owner, TRAIT_XENO_HOST, ORGAN_TRAIT) REMOVE_TRAIT(owner, TRAIT_XENO_IMMUNE, ORGAN_TRAIT) @@ -30,25 +30,25 @@ INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner) ..() -/obj/item/organ/body_egg/on_death(delta_time, times_fired) +/obj/item/organ/internal/body_egg/on_death(delta_time, times_fired) . = ..() if(!owner) return egg_process(delta_time, times_fired) -/obj/item/organ/body_egg/on_life(delta_time, times_fired) +/obj/item/organ/internal/body_egg/on_life(delta_time, times_fired) . = ..() egg_process(delta_time, times_fired) -/obj/item/organ/body_egg/proc/egg_process(delta_time, times_fired) +/obj/item/organ/internal/body_egg/proc/egg_process(delta_time, times_fired) return -/obj/item/organ/body_egg/proc/RefreshInfectionImage() +/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage() RemoveInfectionImages() AddInfectionImages() -/obj/item/organ/body_egg/proc/AddInfectionImages() +/obj/item/organ/internal/body_egg/proc/AddInfectionImages() return -/obj/item/organ/body_egg/proc/RemoveInfectionImages() +/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages() return diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm index e0e08943bd6..9d641b126cd 100644 --- a/code/game/objects/items/choice_beacon.dm +++ b/code/game/objects/items/choice_beacon.dm @@ -96,12 +96,12 @@ if(!augment_list) augment_list = list() var/list/templist = list( - /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) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof + /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) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof for(var/V in templist) var/atom/A = V augment_list[initial(A.name)] = A diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index e965b5809d2..c0eea35bc65 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -303,7 +303,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) - var/obj/item/organ/lungs/lungs = smoker.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/lungs = smoker.getorganslot(ORGAN_SLOT_LUNGS) if(lungs && !(lungs.organ_flags & ORGAN_SYNTHETIC)) 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/defib.dm b/code/game/objects/items/defib.dm index b3dcf263b20..3b12c6f3dde 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -571,7 +571,7 @@ if(do_after(user, 3 SECONDS, H)) //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_charge.ogg', 75, FALSE) - var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) + var/obj/item/organ/internal/heart = H.getorgan(/obj/item/organ/internal/heart) if(do_after(user, 2 SECONDS, H)) //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()) @@ -640,7 +640,7 @@ log_combat(user, H, "revived", defib) do_success() return - else if (!H.getorgan(/obj/item/organ/heart)) + else if (!H.getorgan(/obj/item/organ/internal/heart)) user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's heart is missing. Operation aborted.")) playsound(src, 'sound/machines/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 a62c116c8dc..f073327bfe9 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -75,7 +75,7 @@ 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/eyes/E = M.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = M.getorganslot(ORGAN_SLOT_EYES) if(!E) to_chat(user, span_warning("[M] doesn't have any eyes!")) return @@ -527,7 +527,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/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = user.getorganslot(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 6aa456eb316..2ee066cbcd5 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -196,7 +196,7 @@ var/mob/living/carbon/carbontarget = target // Ear status - var/obj/item/organ/ears/ears = carbontarget.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = carbontarget.getorganslot(ORGAN_SLOT_EARS) if(istype(ears)) if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, GENETIC_MUTATION)) render_list = "Subject is genetically deaf.\n" @@ -211,7 +211,7 @@ render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.\n" // Eye status - var/obj/item/organ/eyes/eyes = carbontarget.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = carbontarget.getorganslot(ORGAN_SLOT_EYES) if(istype(eyes)) if(carbontarget.is_blind()) render_list += "Subject is blind.\n" @@ -365,7 +365,7 @@ if(iscarbon(target)) var/mob/living/carbon/carbontarget = target var/cyberimp_detect - for(var/obj/item/organ/cyberimp/CI in carbontarget.internal_organs) + for(var/obj/item/organ/internal/cyberimp/CI in carbontarget.internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" if(cyberimp_detect) @@ -397,7 +397,7 @@ render_list += "Subject contains no reagents in their blood.\n" // Stomach reagents - var/obj/item/organ/stomach/belly = target.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = target.getorganslot(ORGAN_SLOT_STOMACH) if(belly) if(belly.reagents.reagent_list.len) render_list += "Subject contains the following reagents in their stomach:\n" diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 3f6c3fc1694..91d84bf6f84 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -73,7 +73,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/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = user.getorganslot(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/hand_items.dm b/code/game/objects/items/hand_items.dm index 0ff2eff7efa..b372e6d22f7 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -217,7 +217,7 @@ if(ishuman(slapped)) var/mob/living/carbon/human/human_slapped = slapped - human_slapped.dna?.species?.stop_wagging_tail(slapped) + SEND_SIGNAL(human_slapped, COMSIG_ORGAN_WAG_TAIL, FALSE) user.do_attack_animation(slapped) var/slap_volume = 50 @@ -569,7 +569,7 @@ if(!iscarbon(target)) return var/mob/living/carbon/heartbreakee = target - var/obj/item/organ/heart/dont_go_breakin_my_heart = heartbreakee.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.getorganslot(ORGAN_SLOT_HEART) dont_go_breakin_my_heart.applyOrganDamage(999) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 3886d40d78d..1781dd4db22 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -312,7 +312,7 @@ /obj/item/melee/baton/telescopic/suicide_act(mob/user) var/mob/living/carbon/human/human_user = user - var/obj/item/organ/brain/our_brain = human_user.getorgan(/obj/item/organ/brain) + var/obj/item/organ/internal/brain/our_brain = human_user.getorgan(/obj/item/organ/internal/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/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 1d0e70fec06..7fd57c3289b 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -220,10 +220,9 @@ else if(istype(W, /obj/item/bodypart/head/robot)) var/obj/item/bodypart/head/robot/HD = W - for(var/X in HD.contents) - if(istype(X, /obj/item/organ)) - to_chat(user, span_warning("There are organs inside [HD]!")) - return + if(locate(/obj/item/organ/internal) in HD) + to_chat(user, span_warning("There are organs inside [HD]!")) + return if(head) return if(HD.flash2 && HD.flash1) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 2e178b05d49..76c2d3f6ab7 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -577,30 +577,26 @@ ///freezes the organ and loops bodyparts like heads /obj/item/storage/organbox/proc/freeze(datum/source, obj/item/I) SIGNAL_HANDLER - if(isorgan(I)) - var/obj/item/organ/organ = I - organ.organ_flags |= ORGAN_FROZEN + if(isinternalorgan(I)) + var/obj/item/organ/internal/int_organ = I + int_organ.organ_flags |= ORGAN_FROZEN return if(istype(I, /obj/item/bodypart)) var/obj/item/bodypart/B = I - for(var/O in B.contents) - if(isorgan(O)) - var/obj/item/organ/organ = O - organ.organ_flags |= ORGAN_FROZEN + for(var/obj/item/organ/internal/int_organ in B.contents) + int_organ.organ_flags |= ORGAN_FROZEN ///unfreezes the organ and loops bodyparts like heads /obj/item/storage/organbox/proc/unfreeze(datum/source, obj/item/I) SIGNAL_HANDLER - if(isorgan(I)) - var/obj/item/organ/organ = I - organ.organ_flags &= ~ORGAN_FROZEN + if(isinternalorgan(I)) + var/obj/item/organ/internal/int_organ = I + int_organ.organ_flags &= ~ORGAN_FROZEN return if(istype(I, /obj/item/bodypart)) var/obj/item/bodypart/B = I - for(var/O in B.contents) - if(isorgan(O)) - var/obj/item/organ/organ = O - organ.organ_flags &= ~ORGAN_FROZEN + for(var/obj/item/organ/internal/int_organ in B.contents) + int_organ.organ_flags &= ~ORGAN_FROZEN /obj/item/storage/organbox/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index a59bfebb0be..154b67ac96f 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -375,7 +375,7 @@ . = ..() if(.) return - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) + if(user.getorgan(/obj/item/organ/internal/alien/plasmavessel)) switch(status) if(BURSTING) to_chat(user, span_notice("The child is hatching out.")) @@ -443,7 +443,7 @@ return var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/body_egg/alien_embryo)) + if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/internal/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 1a96710aefb..5705a8aa634 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -21,7 +21,7 @@ for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore var/mob/living/M = buck - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) + if(user.getorgan(/obj/item/organ/internal/alien/plasmavessel)) unbuckle_mob(M) add_fingerprint(user) return @@ -51,9 +51,9 @@ if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled ) return - if(M.getorgan(/obj/item/organ/alien/plasmavessel)) + if(M.getorgan(/obj/item/organ/internal/alien/plasmavessel)) return - if(!user.getorgan(/obj/item/organ/alien/plasmavessel)) + if(!user.getorgan(/obj/item/organ/internal/alien/plasmavessel)) return if(has_buckled_mobs()) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 4a4767f13a4..8400cdff964 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -143,7 +143,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(3) new /obj/item/reagent_containers/glass/bottle/potion/flight(loc) if(4) - new /obj/item/organ/heart/cursed/wizard(loc) + new /obj/item/organ/internal/heart/cursed/wizard(loc) if(5) new /obj/item/jacobs_ladder(loc) if(6) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6b943c33832..65ed7ab5264 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -636,7 +636,7 @@ GLOBAL_LIST_EMPTY(station_turfs) clear_reagents_to_vomit_pool(M, V, 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/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH) if(!belly?.reagents.total_volume) return var/chemicals_lost = belly.reagents.total_volume * purge_ratio diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 1b0a89f22a8..90fe3927c53 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -30,6 +30,7 @@ // Mutant randomizing, doesn't affect the mob appearance unless it's the specific mutant. human.dna.features["mcolor"] = "#[random_color()]" human.dna.features["ethcolor"] = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)] + human.dna.features["tail_cat"] = pick(GLOB.tails_list_human) human.dna.features["tail_lizard"] = pick(GLOB.tails_list_lizard) human.dna.features["snout"] = pick(GLOB.snouts_list) human.dna.features["horns"] = pick(GLOB.horns_list) diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index e6d26ed2099..1bb8e566ead 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -143,7 +143,7 @@ for(var/i in GLOB.human_list) var/mob/living/carbon/human/H = i - new /obj/item/organ/zombie_infection/nodamage(H) + new /obj/item/organ/internal/zombie_infection/nodamage(H) message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.") log_admin("[key_name(usr)] added a latent zombie infection to all humans.") @@ -160,7 +160,7 @@ if(confirm != "Yes") return - for(var/obj/item/organ/zombie_infection/nodamage/I in GLOB.zombie_infection_list) + for(var/obj/item/organ/internal/zombie_infection/nodamage/I in GLOB.zombie_infection_list) qdel(I) message_admins("[key_name_admin(usr)] cured all zombies.") diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 4068f6284b1..870dfad66a0 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -501,8 +501,8 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if(H.dna.species.id == SPECIES_HUMAN) if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") - var/obj/item/organ/ears/cat/ears = new - var/obj/item/organ/tail/cat/tail = new + var/obj/item/organ/internal/ears/cat/ears = new + var/obj/item/organ/external/tail/cat/tail = new ears.Insert(H, drop_if_replaced=FALSE) tail.Insert(H, drop_if_replaced=FALSE) 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 876435e4c7b..01cd7f13c20 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -216,7 +216,7 @@ for(var/obj/item/item in human_target.get_equipped_items(delete_pocket)) qdel(item) - var/obj/item/organ/brain/human_brain = human_target.getorganslot(BRAIN) + var/obj/item/organ/internal/brain/human_brain = human_target.getorganslot(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 041c471c169..6afff188fff 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E //Equip var/mob/living/carbon/human/H = owner.current H.set_species(/datum/species/abductor) - var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) T.mothership = "[team.name]" H.real_name = "[team.name] [sub_role]" diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 57d9229be43..631226b25b3 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -321,7 +321,7 @@ /obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) if(iscarbon(target)) var/mob/living/carbon/C = target - var/obj/item/organ/heart/gland/G = C.getorganslot("heart") + var/obj/item/organ/internal/heart/gland/G = C.getorganslot("heart") if(!istype(G)) to_chat(user, span_warning("Your target does not have an experimental gland!")) return @@ -590,7 +590,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} species = span_notice("[H.dna.species.name]") if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling)) species = span_warning("Changeling lifeform") - var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs + var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs if(temp) helptext = span_warning("Experimental gland detected!") else diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index 478332c993f..218921df80c 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -20,7 +20,7 @@ accept_hand = 1 time = 32 var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/heart) + var/list/organ_types = list(/obj/item/organ/internal/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.internal_organs) @@ -41,7 +41,7 @@ /datum/surgery_step/gland_insert name = "insert gland" - implements = list(/obj/item/organ/heart/gland = 100) + implements = list(/obj/item/organ/internal/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) @@ -50,6 +50,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/heart/gland/gland = tool + var/obj/item/organ/internal/heart/gland/gland = tool gland.Insert(target, 2) return 1 diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index 0b775e77a5e..956371f18b4 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -1,4 +1,4 @@ -/obj/item/organ/heart/gland +/obj/item/organ/internal/heart/gland name = "fleshy mass" desc = "A nausea-inducing hunk of twisting flesh and metal." icon = 'icons/obj/abductor.dmi' @@ -24,27 +24,27 @@ var/mind_control_duration = 1800 var/active_mind_control = FALSE -/obj/item/organ/heart/gland/Initialize(mapload) +/obj/item/organ/internal/heart/gland/Initialize(mapload) . = ..() icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral")) -/obj/item/organ/heart/gland/examine(mob/user) +/obj/item/organ/internal/heart/gland/examine(mob/user) . = ..() if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) . += span_notice("It is \a [abductor_hint]") -/obj/item/organ/heart/gland/proc/ownerCheck() +/obj/item/organ/internal/heart/gland/proc/ownerCheck() if(ishuman(owner)) return TRUE if(!human_only && iscarbon(owner)) return TRUE return FALSE -/obj/item/organ/heart/gland/proc/Start() +/obj/item/organ/internal/heart/gland/proc/Start() active = 1 COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high)) -/obj/item/organ/heart/gland/proc/update_gland_hud() +/obj/item/organ/internal/heart/gland/proc/update_gland_hud() if(!owner) return var/image/holder = owner.hud_list[GLAND_HUD] @@ -57,7 +57,7 @@ else holder.icon_state = "hudgland_spent" -/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) +/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user) if(!ownerCheck() || !mind_control_uses || active_mind_control) return FALSE mind_control_uses-- @@ -72,7 +72,7 @@ addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) return TRUE -/obj/item/organ/heart/gland/proc/clear_mind_control() +/obj/item/organ/internal/heart/gland/proc/clear_mind_control() if(!ownerCheck() || !active_mind_control) return FALSE to_chat(owner, span_userdanger("You feel the compulsion fade, and you completely forget about your previous orders.")) @@ -80,7 +80,7 @@ active_mind_control = FALSE return TRUE -/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/heart/gland/Remove(mob/living/carbon/M, special = FALSE) active = FALSE if(initial(uses) == 1) uses = initial(uses) @@ -89,7 +89,7 @@ clear_mind_control() ..() -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/heart/gland/Insert(mob/living/carbon/M, special = FALSE) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() @@ -97,7 +97,7 @@ hud.add_atom_to_hud(owner) update_gland_hud() -/obj/item/organ/heart/gland/on_life(delta_time, times_fired) +/obj/item/organ/internal/heart/gland/on_life(delta_time, times_fired) if(!beating) // alien glands are immune to stopping. beating = TRUE @@ -113,5 +113,5 @@ if(!uses) active = FALSE -/obj/item/organ/heart/gland/proc/activate() +/obj/item/organ/internal/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 29be30c0cfc..8e8ff9a7ef9 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/heart/gland/access +/obj/item/organ/internal/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/heart/gland/access/activate() +/obj/item/organ/internal/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 c5154ba47b7..e5ffd025da7 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/heart/gland/blood +/obj/item/organ/internal/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/heart/gland/blood/activate() +/obj/item/organ/internal/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 682e58a92e8..47868841c85 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/heart/gland/chem +/obj/item/organ/internal/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/heart/gland/chem/Initialize(mapload) +/obj/item/organ/internal/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/heart/gland/chem/activate() +/obj/item/organ/internal/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) owner.reagents.add_reagent(chem_to_add, 2) owner.adjustToxLoss(-5, TRUE, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm index 1d4400966c0..b8e5fceda0d 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/heart/gland/egg +/obj/item/organ/internal/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/heart/gland/egg/activate() +/obj/item/organ/internal/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 b7969cd4be7..960c00edcb4 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/heart/gland/electric +/obj/item/organ/internal/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/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") ..() -/obj/item/organ/heart/gland/electric/activate() +/obj/item/organ/internal/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/zap), rand(30, 100)) -/obj/item/organ/heart/gland/electric/proc/zap() +/obj/item/organ/internal/heart/gland/electric/proc/zap() tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/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 45783167ff9..ac366f55ab6 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -1,4 +1,4 @@ -/obj/item/organ/heart/gland/heal +/obj/item/organ/internal/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 @@ -8,7 +8,7 @@ mind_control_uses = 3 mind_control_duration = 3000 -/obj/item/organ/heart/gland/heal/activate() +/obj/item/organ/internal/heart/gland/heal/activate() if(!(owner.mob_biotypes & MOB_ORGANIC)) return @@ -17,31 +17,31 @@ return for(var/organ in owner.internal_organs) - if(istype(organ, /obj/item/organ/cyberimp)) + if(istype(organ, /obj/item/organ/internal/cyberimp)) reject_cyberimp(organ) return - var/obj/item/organ/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/internal/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX) if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || (appendix.organ_flags & ORGAN_SYNTHETIC)))) replace_appendix(appendix) return - var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC)))) replace_liver(liver) return - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || (lungs.organ_flags & ORGAN_SYNTHETIC)))) replace_lungs(lungs) return - var/obj/item/organ/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH) if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || (stomach.organ_flags & ORGAN_SYNTHETIC)))) replace_stomach(stomach) return - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || (eyes.organ_flags & ORGAN_SYNTHETIC)))) replace_eyes(eyes) return @@ -76,19 +76,19 @@ replace_chest(chest) return -/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/implant/implant) +/obj/item/organ/internal/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(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) implant.removed(owner) qdel(implant) -/obj/item/organ/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/cyberimp/implant) +/obj/item/organ/internal/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/internal/cyberimp/implant) owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_userdanger("You suddenly vomit up your [implant.name]!")) owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) implant.Remove(owner) implant.forceMove(owner.drop_location()) -/obj/item/organ/heart/gland/heal/proc/replace_appendix(obj/item/organ/appendix/appendix) +/obj/item/organ/internal/heart/gland/heal/proc/replace_appendix(obj/item/organ/internal/appendix/appendix) if(appendix) owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) appendix.Remove(owner) @@ -97,13 +97,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/appendix_type = /obj/item/organ/appendix + var/appendix_type = /obj/item/organ/internal/appendix if(owner?.dna?.species?.mutantappendix) appendix_type = owner.dna.species.mutantappendix - var/obj/item/organ/appendix/new_appendix = new appendix_type() + var/obj/item/organ/internal/appendix/new_appendix = new appendix_type() new_appendix.Insert(owner) -/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver) +/obj/item/organ/internal/heart/gland/heal/proc/replace_liver(obj/item/organ/internal/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(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) @@ -112,13 +112,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/liver_type = /obj/item/organ/liver + var/liver_type = /obj/item/organ/internal/liver if(owner?.dna?.species?.mutantliver) liver_type = owner.dna.species.mutantliver - var/obj/item/organ/liver/new_liver = new liver_type() + var/obj/item/organ/internal/liver/new_liver = new liver_type() new_liver.Insert(owner) -/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs) +/obj/item/organ/internal/heart/gland/heal/proc/replace_lungs(obj/item/organ/internal/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(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) @@ -127,13 +127,13 @@ else to_chat(owner, span_warning("You feel a weird rumble inside your chest...")) - var/lung_type = /obj/item/organ/lungs + var/lung_type = /obj/item/organ/internal/lungs if(owner.dna.species && owner.dna.species.mutantlungs) lung_type = owner.dna.species.mutantlungs - var/obj/item/organ/lungs/new_lungs = new lung_type() + var/obj/item/organ/internal/lungs/new_lungs = new lung_type() new_lungs.Insert(owner) -/obj/item/organ/heart/gland/heal/proc/replace_stomach(obj/item/organ/stomach/stomach) +/obj/item/organ/internal/heart/gland/heal/proc/replace_stomach(obj/item/organ/internal/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(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) @@ -142,13 +142,13 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/stomach_type = /obj/item/organ/stomach + var/stomach_type = /obj/item/organ/internal/stomach if(owner?.dna?.species?.mutantstomach) stomach_type = owner.dna.species.mutantstomach - var/obj/item/organ/stomach/new_stomach = new stomach_type() + var/obj/item/organ/internal/stomach/new_stomach = new stomach_type() new_stomach.Insert(owner) -/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes) +/obj/item/organ/internal/heart/gland/heal/proc/replace_eyes(obj/item/organ/internal/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) @@ -159,15 +159,15 @@ addtimer(CALLBACK(src, .proc/finish_replace_eyes), rand(100, 200)) -/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() - var/eye_type = /obj/item/organ/eyes +/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_eyes() + var/eye_type = /obj/item/organ/internal/eyes if(owner.dna.species && owner.dna.species.mutanteyes) eye_type = owner.dna.species.mutanteyes - var/obj/item/organ/eyes/new_eyes = new eye_type() + var/obj/item/organ/internal/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/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) +/obj/item/organ/internal/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) @@ -177,18 +177,18 @@ addtimer(CALLBACK(src, .proc/finish_replace_limb, body_zone), rand(150, 300)) -/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone) +/obj/item/organ/internal/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/magic/demon_consume.ogg', 50, TRUE) owner.regenerate_limb(body_zone) -/obj/item/organ/heart/gland/heal/proc/replace_blood() +/obj/item/organ/internal/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/heart/gland/heal/proc/keep_replacing_blood() +/obj/item/organ/internal/heart/gland/heal/proc/keep_replacing_blood() var/keep_going = FALSE owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE) owner.Stun(15) @@ -207,7 +207,7 @@ if(keep_going) addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30) -/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) +/obj/item/organ/internal/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/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 9529444ca23..19db2828bd2 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/heart/gland/mindshock +/obj/item/organ/internal/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/heart/gland/mindshock/activate() +/obj/item/organ/internal/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.hallucination += 60 -/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) +/obj/item/organ/internal/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/heart/gland/mindshock/clear_mind_control() +/obj/item/organ/internal/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 9dc1cc0f9c7..ecc4ca3988c 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/heart/gland/plasma +/obj/item/organ/internal/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/heart/gland/plasma/activate() +/obj/item/organ/internal/heart/gland/plasma/activate() to_chat(owner, span_warning("You feel bloated.")) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, span_userdanger("A massive stomachache overcomes you.")), 150) addtimer(CALLBACK(src, .proc/vomit_plasma), 200) -/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() +/obj/item/organ/internal/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 b43552085de..39f3d5b1966 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/heart/gland/quantum +/obj/item/organ/internal/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/heart/gland/quantum/activate() +/obj/item/organ/internal/heart/gland/quantum/activate() if(entangled_mob) return for(var/mob/M in oview(owner, 7)) @@ -18,7 +18,7 @@ addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400)) return -/obj/item/organ/heart/gland/quantum/proc/quantum_swap() +/obj/item/organ/internal/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/heart/gland/quantum/mind_control(command, mob/living/user) +/obj/item/organ/internal/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 @@ log_game("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") update_gland_hud() -/obj/item/organ/heart/gland/quantum/clear_mind_control() +/obj/item/organ/internal/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 f7a0bc6e3a5..91362ba1e19 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/heart/gland/slime +/obj/item/organ/internal/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/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) ..() owner.faction |= "slime" owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) -/obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/gland/slime/Remove(mob/living/carbon/M, special = 0) owner.faction -= "slime" owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) ..() -/obj/item/organ/heart/gland/slime/activate() +/obj/item/organ/internal/heart/gland/slime/activate() to_chat(owner, span_warning("You feel nauseated!")) owner.vomit(20) diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index 8e8306911d6..cf67b04c5a6 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/heart/gland/spiderman +/obj/item/organ/internal/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/heart/gland/spiderman/activate() +/obj/item/organ/internal/heart/gland/spiderman/activate() to_chat(owner, span_warning("You feel something crawling in your skin.")) owner.faction |= "spiders" var/obj/structure/spider/spiderling/S = 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 8d5e8e274f8..97f437234e5 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/heart/gland/transform +/obj/item/organ/internal/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/heart/gland/transform/activate() +/obj/item/organ/internal/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 844cc795a94..5fab30332ef 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/heart/gland/trauma +/obj/item/organ/internal/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/heart/gland/trauma/activate() +/obj/item/organ/internal/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 ed0cc5bbed2..c7e3a74e4f9 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/heart/gland/ventcrawling +/obj/item/organ/internal/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/heart/gland/ventcrawling/activate() +/obj/item/organ/internal/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 9aa4a26e549..c3d82af9674 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/heart/gland/viral +/obj/item/organ/internal/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/heart/gland/viral/activate() +/obj/item/organ/internal/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/heart/gland/viral/proc/random_virus(max_symptoms, max_level) +/obj/item/organ/internal/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 976b1f84284..4d0562ca35b 100644 --- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -49,7 +49,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 = /obj/item/organ/tongue/abductor + build_path = /obj/item/organ/internal/tongue/abductor category = "Advanced 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 512f9155f6a..de6d945035a 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/heart/gland) + gland_types = subtypesof(/obj/item/organ/internal/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/heart/gland)) + if(istype(W, /obj/item/organ/internal/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 74028e3522a..afeab486104 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -132,7 +132,7 @@ if(H.stat == DEAD) say("Specimen deceased - please provide fresh sample.") return "Specimen deceased." - var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs + var/obj/item/organ/internal/heart/gland/GlandTest = locate() in H.internal_organs if(!GlandTest) say("Experimental dissection not detected!") return "No glands detected!" @@ -153,7 +153,7 @@ user_abductor.team.abductees += H.mind H.mind.add_antag_datum(/datum/antagonist/abductee) - for(var/obj/item/organ/heart/gland/G in H.internal_organs) + for(var/obj/item/organ/internal/heart/gland/G in H.internal_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 73bb37d91f9..8bbff39cc0a 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -148,7 +148,7 @@ RegisterSignal(living_mob, COMSIG_MOB_HUD_CREATED, .proc/on_hud_created) // Brains are optional for lings. - var/obj/item/organ/brain/our_ling_brain = living_mob.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/our_ling_brain = living_mob.getorganslot(ORGAN_SLOT_BRAIN) if(our_ling_brain) our_ling_brain.organ_flags &= ~ORGAN_VITAL our_ling_brain.decoy_override = TRUE @@ -186,7 +186,7 @@ if(!iscarbon(owner.current)) return var/mob/living/carbon/carbon_owner = owner.current - var/obj/item/organ/brain/not_ling_brain = carbon_owner.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/not_ling_brain = carbon_owner.getorganslot(ORGAN_SLOT_BRAIN) if(not_ling_brain && (not_ling_brain.decoy_override != initial(not_ling_brain.decoy_override))) not_ling_brain.organ_flags |= ORGAN_VITAL not_ling_brain.decoy_override = FALSE diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index 19f211014a8..29ce2f94113 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -12,7 +12,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/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if (E) E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to protect them from bright lights.") @@ -23,7 +23,7 @@ if(!istype(user)) return ..() - var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if(!active) E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes @@ -42,7 +42,7 @@ /datum/action/changeling/augmented_eyesight/Remove(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability - var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if (active) E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index ee926dca605..507842ac63d 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -19,7 +19,7 @@ explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) for(var/mob/living/carbon/human/blinded_humans in range(2, user)) - var/obj/item/organ/eyes/eyes = blinded_humans.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = blinded_humans.getorganslot(ORGAN_SLOT_EYES) if(!eyes || blinded_humans.is_blind()) continue to_chat(blinded_humans, span_userdanger("You are blinded by a shower of blood!")) diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index ae35c5f61f0..c4806e65e67 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -12,8 +12,8 @@ to_chat(user, span_notice("We cleanse impurities from our form.")) ..() var/list/bad_organs = list( - user.getorgan(/obj/item/organ/body_egg), - user.getorgan(/obj/item/organ/zombie_infection)) + user.getorgan(/obj/item/organ/internal/body_egg), + user.getorgan(/obj/item/organ/internal/zombie_infection)) for(var/o in bad_organs) var/obj/item/organ/O = o diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index 01109161dca..94a90bb6725 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -25,7 +25,7 @@ C.emote("scream") C.regenerate_limbs() if(!user.getorganslot(ORGAN_SLOT_BRAIN)) - var/obj/item/organ/brain/B + var/obj/item/organ/internal/brain/B if(C.has_dna() && C.dna.species.mutantbrain) B = new C.dna.species.mutantbrain() else diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 9d2dfc3858b..dd99b5c2e92 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -14,7 +14,7 @@ if(iscarbon(M)) var/mob/living/carbon/C = M if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling)) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) C.adjust_timed_status_effect(25 SECONDS, /datum/status_effect/confusion) diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index 07618c4239d..9d485013c08 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -17,7 +17,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.getorgan(/obj/item/organ/brain)) // If only I had a brain + if(!C.getorgan(/obj/item/organ/internal/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/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 7dfa69651a0..763b8bc28ac 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -909,7 +909,7 @@ structure_check() searches for nearby cultist structures required for the invoca /mob/living/carbon/human/cult_ghost/getorganszone(zone, subzones = 0) . = ..() - for(var/obj/item/organ/brain/B in .) //they're not that smart, really + for(var/obj/item/organ/internal/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 feedd65db99..0b2fe890e87 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -62,7 +62,7 @@ /datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/organ/eyes/robotic/glow/eyes = new() + var/obj/item/organ/internal/eyes/robotic/glow/eyes = new() eyes.Insert(H, drop_if_replaced = FALSE) /datum/outfit/spacepol diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 8f0ded9411a..694cdc3bdbf 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -489,15 +489,15 @@ /datum/heretic_knowledge/knowledge_ritual/New() . = ..() var/static/list/potential_organs = list( - /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, + /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, ) var/static/list/potential_easy_items = list( diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index f9ec6a2df1e..9b0b0e50275 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -124,7 +124,7 @@ /datum/heretic_knowledge/curse/paralysis, ) required_atoms = list( - /obj/item/organ/liver = 1, + /obj/item/organ/internal/liver = 1, /obj/item/melee/baton/security = 1, // Technically means a cattleprod is valid /obj/item/clothing/mask = 1, /obj/item/candle = 4, diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 2e7b46b8acc..09b6e601ac8 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -236,7 +236,7 @@ /datum/heretic_knowledge/curse/paralysis, ) required_atoms = list( - /obj/item/organ/eyes = 1, + /obj/item/organ/internal/eyes = 1, /obj/effect/decal/cleanable/blood = 1, /obj/item/bodypart/l_arm = 1, ) @@ -273,9 +273,9 @@ /datum/heretic_knowledge/spell/cleave, ) required_atoms = list( - /obj/item/organ/tail = 1, - /obj/item/organ/stomach = 1, - /obj/item/organ/tongue = 1, + /obj/item/organ/external/tail = 1, + /obj/item/organ/internal/stomach = 1, + /obj/item/organ/internal/tongue = 1, /obj/item/pen = 1, /obj/item/paper = 1, ) diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm index 70bad2865c2..ac9dcdf4f73 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm @@ -9,7 +9,7 @@ /datum/heretic_knowledge/limited_amount/flesh_ghoul, ) required_atoms = list( - /obj/item/organ/eyes = 1, + /obj/item/organ/internal/eyes = 1, /obj/item/shard = 1, /obj/item/candle = 1, ) diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm b/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm index d48b382a704..f276c503476 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm @@ -32,7 +32,7 @@ required_atoms = list( /obj/item/wirecutters = 1, /obj/effect/decal/cleanable/vomit = 1, - /obj/item/organ/heart = 1, + /obj/item/organ/internal/heart = 1, ) duration = 2 MINUTES cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index be22e2513b9..4a0f993dc54 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -177,7 +177,7 @@ /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/clothing/suit/armor = 1, /obj/item/assembly/flash = 1, - /obj/item/organ/lungs = 1, + /obj/item/organ/internal/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 4bdc0450401..afb7c8e2608 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) priority = MAX_KNOWLEDGE_PRIORITY - 1 // Knowing how to remake your heart is important route = PATH_START /// The typepath of the organ type required for our heart. - var/required_organ_type = /obj/item/organ/heart + var/required_organ_type = /obj/item/organ/internal/heart /datum/heretic_knowledge/living_heart/on_research(mob/user) . = ..() @@ -60,9 +60,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/lungs, - ORGAN_SLOT_LIVER = /obj/item/organ/liver, - ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs, + ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver, + ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach, ) for(var/backup_slot in backup_organs) @@ -178,7 +178,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/eyes = 1, + /obj/item/organ/internal/eyes = 1, /obj/item/stack/sheet/glass = 1, ) result_atoms = list(/obj/item/clothing/neck/heretic_focus) diff --git a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm b/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm index c2ef2536027..205ed6d2ce6 100644 --- a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm +++ b/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm @@ -20,7 +20,7 @@ /obj/item/shard, /obj/effect/decal/cleanable/ash, /obj/item/clothing/suit/armor, - /obj/item/organ/lungs, + /obj/item/organ/internal/lungs, ) spells_to_add = list(/obj/effect/proc_holder/spell/targeted/mirror_walk) diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index 711cbef4ac7..dbd8932ac38 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -4,13 +4,13 @@ #define HEART_SPECIAL_SHADOWIFY 2 -/obj/item/organ/brain/nightmare +/obj/item/organ/internal/brain/nightmare name = "tumorous mass" desc = "A fleshy growth that was dug out of the skull of a Nightmare." icon_state = "brain-x-d" var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk -/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/brain/nightmare/Insert(mob/living/carbon/M, special = FALSE) . = ..() if(M.dna.species.id != SPECIES_NIGHTMARE) M.set_species(/datum/species/shadow/nightmare) @@ -19,13 +19,13 @@ M.AddSpell(SW) shadowwalk = SW -/obj/item/organ/brain/nightmare/Remove(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/brain/nightmare/Remove(mob/living/carbon/M, special = FALSE) if(shadowwalk) M.RemoveSpell(shadowwalk) return ..() -/obj/item/organ/heart/nightmare +/obj/item/organ/internal/heart/nightmare name = "heart of darkness" desc = "An alien organ that twists and writhes when exposed to light." icon = 'icons/obj/surgery.dmi' @@ -38,11 +38,11 @@ /// The armblade granted to the host of this heart. var/obj/item/light_eater/blade -/obj/item/organ/heart/nightmare/ComponentInitialize() +/obj/item/organ/internal/heart/nightmare/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) +/obj/item/organ/internal/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) if(M != user) return ..() user.visible_message( @@ -58,23 +58,23 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/heart/nightmare/Insert(mob/living/carbon/M, special = FALSE) . = ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater M.put_in_hands(blade) -/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = FALSE) +/obj/item/organ/internal/heart/nightmare/Remove(mob/living/carbon/M, special = FALSE) respawn_progress = 0 if(blade && special != HEART_SPECIAL_SHADOWIFY) M.visible_message(span_warning("\The [blade] disintegrates!")) QDEL_NULL(blade) return ..() -/obj/item/organ/heart/nightmare/Stop() +/obj/item/organ/internal/heart/nightmare/Stop() return 0 -/obj/item/organ/heart/nightmare/on_death(delta_time, times_fired) +/obj/item/organ/internal/heart/nightmare/on_death(delta_time, times_fired) if(!owner) return var/turf/T = get_turf(owner) @@ -98,7 +98,7 @@ playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, TRUE) respawn_progress = 0 -/obj/item/organ/heart/nightmare/get_availability(datum/species/S) +/obj/item/organ/internal/heart/nightmare/get_availability(datum/species/S) if(istype(S,/datum/species/shadow/nightmare)) return TRUE return ..() diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 5b448b72187..9ee82e1c592 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -22,9 +22,9 @@ TRAIT_NODISMEMBER, TRAIT_NOHUNGER, ) - mutanteyes = /obj/item/organ/eyes/night_vision/nightmare - mutantheart = /obj/item/organ/heart/nightmare - mutantbrain = /obj/item/organ/brain/nightmare + mutanteyes = /obj/item/organ/internal/eyes/night_vision/nightmare + mutantheart = /obj/item/organ/internal/heart/nightmare + mutantbrain = /obj/item/organ/internal/brain/nightmare /datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 9f02656e793..f0c476c2838 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -29,7 +29,7 @@ /datum/antagonist/nukeop/clownop/equip_op() . = ..() var/mob/living/current_mob = owner.current - var/obj/item/organ/liver/liver = current_mob.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = current_mob.getorganslot(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/liver/liver = L.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = L.getorganslot(ORGAN_SLOT_LIVER) if(liver) ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 4d6061b7cec..0d97f21ce8e 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -176,7 +176,7 @@ /datum/antagonist/rev/head/on_removal() if(give_hud) var/mob/living/carbon/C = owner.current - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = C.getorganslot(ORGAN_SLOT_HUD) + var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/S = C.getorganslot(ORGAN_SLOT_HUD) if(S) S.Remove(C) return ..() @@ -325,7 +325,7 @@ to_chat(C, "The flash in your [where] will help you to persuade the crew to join your cause.") if(give_hud) - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new() + var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/S = new() S.Insert(C) to_chat(C, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index b1414bdefb2..4cef95818b1 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -61,7 +61,7 @@ loot = list(/obj/effect/decal/cleanable/blood, \ /obj/effect/decal/cleanable/blood/innards, \ - /obj/item/organ/heart/demon) + /obj/item/organ/internal/heart/demon) del_on_death = 1 ///Sound played when consuming a body var/feast_sound = 'sound/magic/demon_consume.ogg' @@ -140,18 +140,18 @@ addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) //The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl -/obj/item/organ/heart/demon +/obj/item/organ/internal/heart/demon name = "demon heart" desc = "Still it beats furiously, emanating an aura of utter hate." icon = 'icons/obj/surgery.dmi' icon_state = "demon_heart-on" decay_factor = 0 -/obj/item/organ/heart/demon/ComponentInitialize() +/obj/item/organ/internal/heart/demon/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_blocker) -/obj/item/organ/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) +/obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) if(M != user) return ..() user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \ @@ -167,17 +167,17 @@ 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/heart/demon/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/demon/Insert(mob/living/carbon/M, special = 0) ..() if(M.mind) M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) -/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/heart/demon/Remove(mob/living/carbon/M, special = 0) ..() if(M.mind) M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) -/obj/item/organ/heart/demon/Stop() +/obj/item/organ/internal/heart/demon/Stop() return 0 // Always beating. /mob/living/simple_animal/hostile/imp/slaughter/laughter diff --git a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm index 2161346f22e..c2935110d5a 100644 --- a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm +++ b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm @@ -86,7 +86,7 @@ /datum/surgery/advanced/brainwashing_sleeper/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 06c9933710c..1c6314c3f17 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -293,7 +293,7 @@ H.equip_to_slot_or_del(new /obj/item/spear(H), ITEM_SLOT_BACK) //Provides a decent heal, need to pump every 6 seconds -/obj/item/organ/heart/cursed/wizard +/obj/item/organ/internal/heart/cursed/wizard pump_delay = 60 heal_brute = 25 heal_burn = 25 diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 668eca7924e..0180acba7cd 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -336,7 +336,7 @@ var/datum/weakref/arm /obj/item/assembly/flash/armimplant/burn_out() - var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/internal/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() @@ -345,7 +345,7 @@ /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) if(overheat) - var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/internal/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/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 15cb2e1a437..9cb2723ef72 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 better cybernetic one, if need be." reward = CARGO_CRATE_VALUE * 5 wanted_types = list( - /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, + /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, ) /datum/bounty/item/medical/lung @@ -15,17 +15,17 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /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, + /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, ) /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. We'll take a better cybernetic one, if need be." reward = CARGO_CRATE_VALUE * 5 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix = TRUE) + wanted_types = list(/obj/item/organ/internal/appendix = TRUE) /datum/bounty/item/medical/ears name = "Ears" @@ -33,9 +33,9 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/ears = TRUE, - /obj/item/organ/ears/cybernetic = FALSE, - /obj/item/organ/ears/cybernetic/upgraded = TRUE, + /obj/item/organ/internal/ears = TRUE, + /obj/item/organ/internal/ears/cybernetic = FALSE, + /obj/item/organ/internal/ears/cybernetic/upgraded = TRUE, ) /datum/bounty/item/medical/liver @@ -44,10 +44,10 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /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, + /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, ) /datum/bounty/item/medical/eye @@ -56,8 +56,8 @@ reward = CARGO_CRATE_VALUE * 10 required_count = 3 wanted_types = list( - /obj/item/organ/eyes = TRUE, - /obj/item/organ/eyes/robotic = FALSE, + /obj/item/organ/internal/eyes = TRUE, + /obj/item/organ/internal/eyes/robotic = FALSE, ) /datum/bounty/item/medical/tongue @@ -65,19 +65,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/tongue = TRUE) + wanted_types = list(/obj/item/organ/internal/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/tail/lizard = TRUE) + wanted_types = list(/obj/item/organ/external/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/tail/cat = TRUE) + wanted_types = list(/obj/item/organ/external/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 0619f8fd97f..4924abeb711 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/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/night_vision/alien = TRUE, + /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/night_vision/alien = TRUE, ) /datum/bounty/item/syndicate_documents diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index e6dd51e1a3b..d4017646a79 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -11,7 +11,7 @@ /obj/item/clothing/glasses/godeye, /obj/item/melee/ghost_sword, /obj/item/clothing/neck/necklace/memento_mori, - /obj/item/organ/heart/cursed/wizard, + /obj/item/organ/internal/heart/cursed/wizard, /obj/item/clothing/suit/hooded/cloak/drake, /obj/item/ship_in_a_bottle, /obj/item/clothing/shoes/clown_shoes/banana_shoes, @@ -43,7 +43,7 @@ unit_name = "major lava planet artifact" export_types = list(/obj/item/hierophant_club, /obj/item/melee/cleaving_saw, - /obj/item/organ/vocal_cords/colossus, + /obj/item/organ/internal/vocal_cords/colossus, /obj/machinery/anomalous_crystal, /obj/item/mayhem, /obj/item/gun/magic/staff/spellblade, diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm index de4d8429df3..784af1c8574 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/heart) + export_types = list(/obj/item/organ/internal/heart) /datum/export/organ/eyes cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid eyes" - export_types = list(/obj/item/organ/eyes) + export_types = list(/obj/item/organ/internal/eyes) /datum/export/organ/ears cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid ears" - export_types = list(/obj/item/organ/ears) + export_types = list(/obj/item/organ/internal/ears) /datum/export/organ/liver cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid liver" - export_types = list(/obj/item/organ/liver) + export_types = list(/obj/item/organ/internal/liver) /datum/export/organ/lungs cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid lungs" - export_types = list(/obj/item/organ/lungs) + export_types = list(/obj/item/organ/internal/lungs) /datum/export/organ/stomach cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid stomach" - export_types = list(/obj/item/organ/stomach) + export_types = list(/obj/item/organ/internal/stomach) /datum/export/organ/tongue cost = CARGO_CRATE_VALUE * 0.1 unit_name = "humanoid tounge" - export_types = list(/obj/item/organ/tongue) + export_types = list(/obj/item/organ/internal/tongue) -/datum/export/organ/tail/lizard +/datum/export/organ/external/tail/lizard cost = CARGO_CRATE_VALUE * 1.25 unit_name = "lizard tail" - export_types = list(/obj/item/organ/tail/lizard) + export_types = list(/obj/item/organ/external/tail/lizard) -/datum/export/organ/tail/cat +/datum/export/organ/external/tail/cat cost = CARGO_CRATE_VALUE * 1.5 unit_name = "cat tail" - export_types = list(/obj/item/organ/tail/cat) + export_types = list(/obj/item/organ/external/tail/cat) /datum/export/organ/ears/cat cost = CARGO_CRATE_VALUE unit_name = "cat ears" - export_types = list(/obj/item/organ/ears/cat) + export_types = list(/obj/item/organ/internal/ears/cat) diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 756cd9d0853..27d987b9b74 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -105,6 +105,10 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// will show the feature as selectable. var/relevant_species_trait = null + /// If the selected species has this in its /datum/species/var/external_organs, + /// will show the feature as selectable. + var/relevant_external_organ = null + /// Called on the saved input when retrieving. /// Also called by the value sent from the user through UI. Do not trust it. /// Input is the value inside the savefile, output is to tell other code @@ -318,7 +322,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) SHOULD_CALL_PARENT(TRUE) SHOULD_NOT_SLEEP(TRUE) - if (!isnull(relevant_mutant_bodypart) || !isnull(relevant_species_trait)) + if (!isnull(relevant_mutant_bodypart) || !isnull(relevant_species_trait) || !isnull(relevant_external_organ)) var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 0a9ba1b53a5..1d6351313ad 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -34,7 +34,7 @@ if(!hetero) target.eye_color_right = value - var/obj/item/organ/eyes/eyes_organ = target.getorgan(/obj/item/organ/eyes) + var/obj/item/organ/internal/eyes/eyes_organ = target.getorgan(/obj/item/organ/internal/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 bc5445cd2fd..18bd9553acf 100644 --- a/code/modules/client/preferences/species_features/felinid.dm +++ b/code/modules/client/preferences/species_features/felinid.dm @@ -3,13 +3,13 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_mutant_bodypart = "tail_human" + relevant_external_organ = /obj/item/organ/external/tail/cat /datum/preference/choiced/tail_human/init_possible_values() return assoc_to_keys(GLOB.tails_list_human) /datum/preference/choiced/tail_human/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features["tail_human"] = value + target.dna.features["tail_cat"] = value /datum/preference/choiced/tail_human/create_default_value() var/datum/sprite_accessory/tails/human/cat/tail = /datum/sprite_accessory/tails/human/cat diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index 267425ab94a..08940476e47 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -131,10 +131,14 @@ savefile_key = "feature_lizard_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_mutant_bodypart = "tail_lizard" + relevant_external_organ = /obj/item/organ/external/tail/lizard /datum/preference/choiced/lizard_tail/init_possible_values() return assoc_to_keys(GLOB.tails_list_lizard) /datum/preference/choiced/lizard_tail/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["tail_lizard"] = value + +/datum/preference/choiced/lizard_tail/create_default_value() + var/datum/sprite_accessory/tails/lizard/smooth/tail = /datum/sprite_accessory/tails/lizard/smooth + return initial(tail.name) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 089c1658b7d..9aa1aaa2339 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -7,7 +7,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/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) B.suicided = suicide_state @@ -85,7 +85,7 @@ var/suicide_message if(!combat_mode) - var/obj/item/organ/brain/userbrain = getorgan(/obj/item/organ/brain) + var/obj/item/organ/internal/brain/userbrain = getorgan(/obj/item/organ/internal/brain) if(userbrain?.damage >= 75) suicide_message = "[src] pulls both arms outwards in front of [p_their()] chest and pumps them behind [p_their()] back, repeats this motion in a smaller range of motion \ down to [p_their()] hips two times once more all while sliding [p_their()] legs in a faux walking motion, claps [p_their()] hands together \ diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 1cf888f74d0..f509c8625ed 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -56,7 +56,7 @@ /obj/item/clothing/glasses/proc/thermal_overload() if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(!H.is_blind()) if(H.glasses == src) to_chat(H, span_danger("[src] overloads and blinds you!")) diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index ce2e3c74734..a970107b8fa 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -98,7 +98,7 @@ ";WE REPEAT OUR LIVES DAILY WITHOUT FURTHER QUESTIONS!!" ) user.say(pick(conspiracy_line), forced=type) - var/obj/item/organ/brain/brain = user.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = user.getorganslot(ORGAN_SLOT_BRAIN) if(brain) brain.setOrganDamage(BRAIN_DAMAGE_DEATH) return OXYLOSS diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 0f9963342db..249e6f1ebfe 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -74,8 +74,8 @@ var/heart_strength = span_danger("no") var/lung_strength = span_danger("no") - var/obj/item/organ/heart/heart = carbon_patient.getorganslot(ORGAN_SLOT_HEART) - var/obj/item/organ/lungs/lungs = carbon_patient.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/heart/heart = carbon_patient.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/lungs/lungs = carbon_patient.getorganslot(ORGAN_SLOT_LUNGS) if(carbon_patient.stat != DEAD && !(HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH))) if(istype(heart)) diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 09d61633600..ecb0dd00790 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -12,7 +12,7 @@ continue if(H.stat == DEAD) // What are you doing in this list continue - if(!H.getorgan(/obj/item/organ/brain)) // If only I had a brain + if(!H.getorgan(/obj/item/organ/internal/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 6e9720ea1fc..ad2b86720a1 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -17,7 +17,7 @@ continue if(H.mind.has_antag_datum(/datum/antagonist/obsessed)) continue - if(!H.getorgan(/obj/item/organ/brain)) + if(!H.getorgan(/obj/item/organ/internal/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 40c66868358..978b122d777 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -53,5 +53,5 @@ /obj/item/food/candy, /obj/item/food/candiedapple, /obj/item/food/chocolatebar, - /obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY! + /obj/item/organ/internal/brain ) // OH GOD THIS ISN'T CANDY! new type(src) diff --git a/code/modules/explorer_drone/exploration_events/trader.dm b/code/modules/explorer_drone/exploration_events/trader.dm index fccfbb7e9c9..c4e43519329 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/heart,/obj/item/organ/liver,/obj/item/organ/stomach,/obj/item/organ/eyes) + required_path = list(/obj/item/organ/internal/heart,/obj/item/organ/internal/liver,/obj/item/organ/internal/stomach,/obj/item/organ/internal/eyes) traded_path = list(/obj/item/implanter/explosive) amount = 1 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 841a042140f..edfd6bcf749 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -173,8 +173,8 @@ name = "Bread cat/bread hybrid" reqs = list( /obj/item/food/bread/plain = 1, - /obj/item/organ/ears/cat = 1, - /obj/item/organ/tail/cat = 1, + /obj/item/organ/internal/ears/cat = 1, + /obj/item/organ/external/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 8ec7cb53855..86e59327791 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/appendix = 1, + /obj/item/organ/internal/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/brain = 1, + /obj/item/organ/internal/brain = 1, /obj/item/food/bun = 1 ) result = /obj/item/food/burger/brain @@ -314,8 +314,8 @@ reqs = list( /obj/item/food/bun = 1, /obj/item/food/patty/plain = 1, - /obj/item/organ/ears/cat = 1, - /obj/item/organ/tail/cat = 1, + /obj/item/organ/internal/ears/cat = 1, + /obj/item/organ/external/tail/cat = 1, ) result = /obj/item/food/burger/catburger subcategory = 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 bd638208e71..69a80bc1062 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/brain = 1, + /obj/item/organ/internal/brain = 1, /obj/item/food/cake/plain = 1 ) result = /obj/item/food/cake/brain @@ -222,8 +222,8 @@ /datum/crafting_recipe/food/cak name = "Living cat/cake hybrid" reqs = list( - /obj/item/organ/brain = 1, - /obj/item/organ/heart = 1, + /obj/item/organ/internal/brain = 1, + /obj/item/organ/internal/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 11e1726fe63..641ec4ae8db 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -7,10 +7,10 @@ name = "Lizard Wine" time = 40 reqs = list( - /obj/item/organ/tail/lizard = 1, + /obj/item/organ/external/tail/lizard = 1, /datum/reagent/consumable/ethanol = 100 ) - blacklist = list(/obj/item/organ/tail/lizard/fake) + blacklist = list(/obj/item/organ/external/tail/lizard/fake) result = /obj/item/reagent_containers/food/drinks/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 6ec6c434855..22a1e4ac434 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -22,7 +22,7 @@ /datum/crafting_recipe/food/shredded_lungs name = "Crispy shredded lung stirfry" reqs = list( - /obj/item/organ/lungs = 1, + /obj/item/organ/internal/lungs = 1, /obj/item/food/grown/onion = 1, /obj/item/food/grown/carrot = 1, /obj/item/food/grown/chili = 1 @@ -33,10 +33,10 @@ /datum/crafting_recipe/food/tsatsikh name = "Tsatsikh" reqs = list( - /obj/item/organ/heart = 1, - /obj/item/organ/liver = 1, - /obj/item/organ/lungs = 1, - /obj/item/organ/stomach = 1, + /obj/item/organ/internal/heart = 1, + /obj/item/organ/internal/liver = 1, + /obj/item/organ/internal/lungs = 1, + /obj/item/organ/internal/stomach = 1, /datum/reagent/consumable/salt = 2, /datum/reagent/consumable/blackpepper = 2 ) @@ -46,7 +46,7 @@ /datum/crafting_recipe/food/liver_pate name = "Liver pate" reqs = list( - /obj/item/organ/liver = 1, + /obj/item/organ/internal/liver = 1, /obj/item/food/meat/rawcutlet = 1, /obj/item/food/grown/onion = 1 ) @@ -97,8 +97,8 @@ /datum/crafting_recipe/food/brain_pate name = "Eyeball-and-brain pate" reqs = list( - /obj/item/organ/brain = 1, - /obj/item/organ/eyes = 1, + /obj/item/organ/internal/brain = 1, + /obj/item/organ/internal/eyes = 1, /obj/item/food/grown/onion = 1, /datum/reagent/consumable/salt = 3 ) 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 f04cbeb8872..d7cd367568b 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/tail/lizard = 1 + /obj/item/organ/external/tail/lizard = 1 ) result = /obj/item/food/kebab/tail subcategory = CAT_MEAT 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 0815aa6433e..249307c8e91 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -162,8 +162,8 @@ /datum/crafting_recipe/food/butterbear //ITS ALIVEEEEEE! name = "Living bear/butter hybrid" reqs = list( - /obj/item/organ/brain = 1, - /obj/item/organ/heart = 1, + /obj/item/organ/internal/brain = 1, + /obj/item/organ/internal/heart = 1, /obj/item/food/butter = 10, /obj/item/food/meat/slab = 5, /datum/reagent/blood = 50, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 8d79e6957c5..7637b7e1db7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -109,7 +109,7 @@ /datum/reagent/water = 10, /obj/item/reagent_containers/glass/bowl = 1, /obj/item/food/grown/tomato = 2, - /obj/item/organ/eyes = 1 + /obj/item/organ/internal/eyes = 1 ) result = /obj/item/food/soup/tomato/eyeball subcategory = CAT_SOUP diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 1a5bfea10d2..c7d387d2e73 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -144,7 +144,7 @@ for(var/trait in mind_traits) ADD_TRAIT(spawned.mind, trait, JOB_TRAIT) - var/obj/item/organ/liver/liver = spawned.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = spawned.getorganslot(ORGAN_SLOT_LIVER) if(liver) for(var/trait in liver_traits) ADD_TRAIT(liver, trait, JOB_TRAIT) diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm index d9ff110b0c5..580bd3116aa 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/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.getorganslot(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/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.getorganslot(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/brain/occupant_brain = carbon_occupant.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.getorganslot(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 56b827311f4..88a668a8028 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -47,7 +47,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/brain/holding_brain + var/obj/item/organ/internal/brain/holding_brain /obj/item/skillchip/Initialize(mapload, is_removable = TRUE) . = ..() @@ -132,7 +132,7 @@ * Arguments: * * owner_brain - The brain that this skillchip was implanted in to. */ -/obj/item/skillchip/proc/on_implant(obj/item/organ/brain/owner_brain) +/obj/item/skillchip/proc/on_implant(obj/item/organ/internal/brain/owner_brain) if(holding_brain) CRASH("Skillchip is trying to be implanted into [owner_brain], but it's already implanted in [holding_brain]") @@ -198,7 +198,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/brain/brain) +/obj/item/skillchip/proc/has_activate_incompatibility(obj/item/organ/internal/brain/brain) if(QDELETED(brain)) return "No brain detected." @@ -248,7 +248,7 @@ return "Incompatible lifeform detected." // No brain - var/obj/item/organ/brain/brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(QDELETED(brain)) return "No brain detected." @@ -267,7 +267,7 @@ * Arguments: * * brain - The brain to check for implantability with. */ -/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/brain/brain) +/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/internal/brain/brain) if(!istype(brain)) stack_trace("Attempted to check incompatibility with invalid brain object [brain].") return "Incompatible brain." diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm index 1fd36f7a7d1..23aff0759c0 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm @@ -27,7 +27,7 @@ /obj/item/autosurgeon/organ/syndicate/commsagent desc = "A device that automatically - painfully - inserts an implant. It seems someone's specially \ modified this one to only insert... tongues. Horrifying." - organ_type = /obj/item/organ/tongue + organ_type = /obj/item/organ/internal/tongue /obj/structure/closet/crate/secure/freezer/commsagent name = "Assorted Tongues And Tongue Accessories" @@ -35,14 +35,14 @@ /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/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/organ/tongue/tied(src) + 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/internal/tongue/tied(src) new /obj/item/autosurgeon/organ/syndicate/commsagent(src) new /obj/item/clothing/gloves/radio(src) diff --git a/code/modules/meteors/meteors.dm b/code/modules/meteors/meteors.dm index 2df987aa3cb..2e843f2303b 100644 --- a/code/modules/meteors/meteors.dm +++ b/code/modules/meteors/meteors.dm @@ -298,7 +298,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust=1)) //for space dust eve hits = 2 heavy = TRUE meteorsound = 'sound/effects/blobattack.ogg' - 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/) + 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/) var/meteorgibs = /obj/effect/gibspawner/generic threat = 2 @@ -309,7 +309,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust=1)) //for space dust eve meteordrop += pick(subtypesof(path)) for(var/path in meteordrop) - if(path == /obj/item/organ/tongue) + if(path == /obj/item/organ/internal/tongue) meteordrop -= path meteordrop += pick(typesof(path)) return ..() @@ -330,11 +330,11 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust=1)) //for space dust eve //Meaty Ore Xeno edition /obj/effect/meteor/meaty/xeno color = "#5EFF00" - meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/tongue/alien) + meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/internal/tongue/alien) meteorgibs = /obj/effect/gibspawner/xeno /obj/effect/meteor/meaty/xeno/Initialize(mapload) - meteordrop += subtypesof(/obj/item/organ/alien) + meteordrop += subtypesof(/obj/item/organ/internal/alien) return ..() /obj/effect/meteor/meaty/xeno/ram_turf(turf/T) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 556d8267b85..c3c0ec33b46 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -29,7 +29,7 @@ if(2) new /obj/item/soulstone/anybody/mining(src) if(3) - new /obj/item/organ/cyberimp/arm/katana(src) + new /obj/item/organ/internal/cyberimp/arm/katana(src) if(4) new /obj/item/clothing/glasses/godeye(src) if(5) @@ -50,7 +50,7 @@ if(8) new /obj/item/rod_of_asclepius(src) if(9) - new /obj/item/organ/heart/cursed/wizard(src) + new /obj/item/organ/internal/heart/cursed/wizard(src) if(10) new /obj/item/ship_in_a_bottle(src) if(11) @@ -139,7 +139,7 @@ var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) var/random_crystal = pick(choices) new random_crystal(src) - new /obj/item/organ/vocal_cords/colossus(src) + new /obj/item/organ/internal/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 6ead373107b..407c6cf5a9b 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -811,7 +811,7 @@ name = "Scan Target" desc = "Contact may or may not be close." -/obj/item/organ/cyberimp/arm/katana +/obj/item/organ/internal/cyberimp/arm/katana name = "dark shard" desc = "An eerie metal shard surrounded by dark energies." icon = 'icons/obj/lavaland/artefacts.dmi' @@ -822,7 +822,7 @@ extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' -/obj/item/organ/cyberimp/arm/katana/attack_self(mob/user, modifiers) +/obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/user, modifiers) . = ..() to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!")) playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) @@ -832,10 +832,10 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/cyberimp/arm/katana/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/internal/cyberimp/arm/katana/screwdriver_act(mob/living/user, obj/item/screwtool) return -/obj/item/organ/cyberimp/arm/katana/Retract() +/obj/item/organ/internal/cyberimp/arm/katana/Retract() var/obj/item/cursed_katana/katana = active_item if(!katana || katana.shattered) return FALSE diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index ba50472bc99..1dee3d9a61d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -16,7 +16,7 @@ from doing this unless you absolutely know what you are doing, and have defined a conversion in savefile.dm */ -/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked +/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,roundstart = FALSE, add_blank)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked if(!istype(L)) L = list() if(!istype(male)) @@ -44,6 +44,9 @@ else male += D.name female += D.name + if(add_blank) + L["None"] = new /datum/sprite_accessory/blank + return L /datum/sprite_accessory @@ -77,6 +80,10 @@ /// Should this sprite block emissives? var/em_block = FALSE +/datum/sprite_accessory/blank + name = "None" + icon_state = "None" + ////////////////////// // Hair Definitions // ////////////////////// @@ -1698,61 +1705,28 @@ icon = 'icons/mob/mutant_bodyparts.dmi' em_block = TRUE -/datum/sprite_accessory/tails_animated - icon = 'icons/mob/mutant_bodyparts.dmi' - em_block = TRUE - /datum/sprite_accessory/tails/lizard/smooth name = "Smooth" icon_state = "smooth" -/datum/sprite_accessory/tails_animated/lizard/smooth - name = "Smooth" - icon_state = "smooth" - /datum/sprite_accessory/tails/lizard/dtiger name = "Dark Tiger" icon_state = "dtiger" -/datum/sprite_accessory/tails_animated/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - /datum/sprite_accessory/tails/lizard/ltiger name = "Light Tiger" icon_state = "ltiger" -/datum/sprite_accessory/tails_animated/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - /datum/sprite_accessory/tails/lizard/spikes name = "Spikes" icon_state = "spikes" -/datum/sprite_accessory/tails_animated/lizard/spikes - name = "Spikes" - icon_state = "spikes" - -/datum/sprite_accessory/tails/human/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/tails_animated/human/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/tails/human/cat name = "Cat" icon_state = "cat" color_src = HAIR -/datum/sprite_accessory/tails_animated/human/cat - name = "Cat" - icon_state = "cat" - color_src = HAIR - -/datum/sprite_accessory/tails/monkey/default +/datum/sprite_accessory/tails/monkey name = "Monkey" icon_state = "monkey" color_src = FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index bf0912e70cf..d0fb28fbf8e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -292,8 +292,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.getorganslot(ORGAN_SLOT_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 + 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 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/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index e65541efb58..17e3e31749a 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/brain/brain = null //The actual brain + var/obj/item/organ/internal/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. @@ -36,7 +36,7 @@ if(!brain) icon_state = "[base_icon_state]_off" return ..() - icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/brain/alien) ? "_alien" : null]" + icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/internal/brain/alien) ? "_alien" : null]" return ..() /obj/item/mmi/update_overlays() @@ -52,8 +52,8 @@ /obj/item/mmi/attackby(obj/item/O, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) - if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO - var/obj/item/organ/brain/newbrain = O + 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(brain) to_chat(user, span_warning("There's already a brain in the MMI!")) return @@ -88,7 +88,7 @@ name = "[initial(name)]: [brainmob.real_name]" update_appearance() - if(istype(brain, /obj/item/organ/brain/alien)) + if(istype(brain, /obj/item/organ/internal/brain/alien)) braintype = "Xenoborg" //HISS....Beep. else braintype = "Cyborg" @@ -141,7 +141,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L - var/obj/item/organ/brain/newbrain = H.getorgan(/obj/item/organ/brain) + var/obj/item/organ/internal/brain/newbrain = H.getorgan(/obj/item/organ/internal/brain) newbrain.forceMove(src) brain = newbrain else if(!brain) @@ -151,7 +151,7 @@ name = "[initial(name)]: [brainmob.real_name]" update_appearance() - if(istype(brain, /obj/item/organ/brain/alien)) + if(istype(brain, /obj/item/organ/internal/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 a800591e8ee..aa13a0f59a3 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -12,7 +12,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/brain/OB = new(loc) //we create a new brain organ for it. + var/obj/item/organ/internal/brain/OB = new(loc) //we create a new brain organ for it. OB.brainmob = src forceMove(OB) if(!container?.mecha) //Unless inside a mecha, brains are rather helpless. @@ -66,10 +66,10 @@ /mob/living/brain/forceMove(atom/destination) if(container) return container.forceMove(destination) - else if (istype(loc, /obj/item/organ/brain)) - var/obj/item/organ/brain/B = loc + else if (istype(loc, /obj/item/organ/internal/brain)) + var/obj/item/organ/internal/brain/B = loc B.forceMove(destination) - else if (istype(destination, /obj/item/organ/brain)) + else if (istype(destination, /obj/item/organ/internal/brain)) doMove(destination) else if (istype(destination, /obj/item/mmi)) doMove(destination) @@ -91,8 +91,8 @@ /mob/living/brain/proc/get_traumas() . = list() - if(istype(loc, /obj/item/organ/brain)) - var/obj/item/organ/brain/B = loc + if(istype(loc, /obj/item/organ/internal/brain)) + var/obj/item/organ/internal/brain/B = loc . = B.traumas /mob/living/brain/get_policy_keywords() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 538e660a651..5f7f8eb6729 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/brain +/obj/item/organ/internal/brain name = "brain" desc = "A piece of juicy meat found in a person's head." icon_state = "brain" @@ -37,7 +37,7 @@ /// Maximum skillchip slots available. Do not reference this var directly and instead call get_max_skillchip_slots() var/max_skillchip_slots = 5 -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) +/obj/item/organ/internal/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) . = ..() name = "brain" @@ -73,7 +73,7 @@ //Update the body's icon so it doesnt appear debrained anymore C.update_hair() -/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) +/obj/item/organ/internal/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) // Delete skillchips first as parent proc sets owner to null, and skillchips need to know the brain's owner. if(!QDELETED(C) && length(skillchips)) to_chat(C, span_notice("You feel your skillchips enable emergency power saving mode, deactivating as your brain leaves your body...")) @@ -93,7 +93,7 @@ transfer_identity(C) C.update_hair() -/obj/item/organ/brain/proc/transfer_identity(mob/living/L) +/obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s brain" if(brainmob || decoy_override) return @@ -115,7 +115,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/brain/attackby(obj/item/O, mob/user, params) +/obj/item/organ/internal/brain/attackby(obj/item/O, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) if(istype(O, /obj/item/borg/apparatus/organ_storage)) @@ -175,7 +175,7 @@ visible_message(span_danger("[user] hits [src] with [O]!")) to_chat(user, span_danger("You hit [src] with [O]!")) -/obj/item/organ/brain/examine(mob/user) +/obj/item/organ/internal/brain/examine(mob/user) . = ..() if(length(skillchips)) . += span_info("It has a skillchip embedded in it.") @@ -192,7 +192,7 @@ else . += span_info("This one is completely devoid of life.") -/obj/item/organ/brain/attack(mob/living/carbon/C, mob/user) +/obj/item/organ/internal/brain/attack(mob/living/carbon/C, mob/user) if(!istype(C)) return ..() @@ -201,7 +201,7 @@ if(user.zone_selected != BODY_ZONE_HEAD) return ..() - var/target_has_brain = C.getorgan(/obj/item/organ/brain) + var/target_has_brain = C.getorgan(/obj/item/organ/internal/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!")) @@ -229,7 +229,7 @@ else ..() -/obj/item/organ/brain/Destroy() //copypasted from MMIs. +/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs. if(brainmob) QDEL_NULL(brainmob) QDEL_LIST(traumas) @@ -239,12 +239,12 @@ owner.mind.set_current(null) return ..() -/obj/item/organ/brain/on_life(delta_time, times_fired) +/obj/item/organ/internal/brain/on_life(delta_time, times_fired) if(damage >= BRAIN_DAMAGE_DEATH) //rip to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out...")) owner.death() -/obj/item/organ/brain/check_damage_thresholds(mob/M) +/obj/item/organ/internal/brain/check_damage_thresholds(mob/M) . = ..() //if we're not more injured than before, return without gambling for a trauma if(damage <= prev_damage) @@ -277,9 +277,9 @@ else return brain_message -/obj/item/organ/brain/before_organ_replacement(obj/item/organ/replacement) +/obj/item/organ/internal/brain/before_organ_replacement(obj/item/organ/replacement) . = ..() - var/obj/item/organ/brain/replacement_brain = replacement + var/obj/item/organ/internal/brain/replacement_brain = replacement if(!istype(replacement_brain)) return @@ -309,7 +309,7 @@ // Any skillchips has been transferred over, time to empty the list. LAZYCLEARLIST(skillchips) -/obj/item/organ/brain/machine_wash(obj/machinery/washing_machine/brainwasher) +/obj/item/organ/internal/brain/machine_wash(obj/machinery/washing_machine/brainwasher) . = ..() if(HAS_TRAIT(brainwasher, TRAIT_BRAINWASHING)) setOrganDamage(0) @@ -317,7 +317,7 @@ else setOrganDamage(BRAIN_DAMAGE_DEATH) -/obj/item/organ/brain/alien +/obj/item/organ/internal/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" @@ -325,20 +325,20 @@ ////////////////////////////////////TRAUMAS//////////////////////////////////////// -/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) +/obj/item/organ/internal/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/brain/proc/get_traumas_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) +/obj/item/organ/internal/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/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) +/obj/item/organ/internal/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) @@ -374,14 +374,14 @@ return TRUE //Proc to use when directly adding a trauma to the brain, so extra args can be given -/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...) +/obj/item/organ/internal/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) //Direct trauma gaining proc. Necessary to assign a trauma to its brain. Avoid using directly. -/obj/item/organ/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments) +/obj/item/organ/internal/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments) if(!can_gain_trauma(trauma, resilience)) return FALSE @@ -410,7 +410,7 @@ return actual_trauma //Add a random trauma of a certain subtype -/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE) +/obj/item/organ/internal/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 @@ -424,12 +424,12 @@ return gain_trauma(trauma_type, resilience) //Cure a random trauma of a certain resilience level -/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC) +/obj/item/organ/internal/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/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC) +/obj/item/organ/internal/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) diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm index 8166e9f8446..60487aa0c35 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/brain)) + if(istype(loc, /obj/item/organ/internal/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 bc463dfc4fe..aa034e33dbd 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -14,10 +14,10 @@ return if(stat != DEAD) death() - var/obj/item/organ/brain/BR + var/obj/item/organ/internal/brain/BR if(container?.brain) BR = container.brain - else if(istype(loc, /obj/item/organ/brain)) + else if(istype(loc, /obj/item/organ/internal/brain)) BR = loc if(BR) BR.setOrganDamage(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 4bab004c685..2c066c7e735 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/brain/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE) +/obj/item/organ/internal/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/brain/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE) +/obj/item/organ/internal/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/brain/proc/clone_skillchip_list(not_removable = FALSE) +/obj/item/organ/internal/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/brain/proc/destroy_all_skillchips(silent = TRUE) +/obj/item/organ/internal/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/brain/proc/get_max_skillchip_complexity() +/obj/item/organ/internal/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/brain/proc/get_used_skillchip_complexity() +/obj/item/organ/internal/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/brain/proc/get_max_skillchip_slots() +/obj/item/organ/internal/brain/proc/get_max_skillchip_slots() return max_skillchip_slots /** * Returns the total current skillchip slot capacity used in this brain. */ -/obj/item/organ/brain/proc/get_used_skillchip_slots() +/obj/item/organ/internal/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/brain/proc/activate_skillchip_failsafe(silent = TRUE) +/obj/item/organ/internal/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/brain/proc/update_skillchips() +/obj/item/organ/internal/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/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f74e7af5f82..22d263e7c63 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -39,12 +39,12 @@ . = ..() /mob/living/carbon/alien/create_internal_organs() - internal_organs += new /obj/item/organ/brain/alien - internal_organs += new /obj/item/organ/alien/hivenode - internal_organs += new /obj/item/organ/tongue/alien - internal_organs += new /obj/item/organ/eyes/night_vision/alien - internal_organs += new /obj/item/organ/liver/alien - internal_organs += new /obj/item/organ/ears + internal_organs += new /obj/item/organ/internal/brain/alien + internal_organs += new /obj/item/organ/internal/alien/hivenode + internal_organs += new /obj/item/organ/internal/tongue/alien + internal_organs += new /obj/item/organ/internal/eyes/night_vision/alien + internal_organs += new /obj/item/organ/internal/liver/alien + internal_organs += new /obj/item/organ/internal/ears ..() /mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums @@ -92,7 +92,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/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/body_egg/alien_embryo) + var/obj/item/organ/internal/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/internal/body_egg/alien_embryo) if(A) var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[A.stage]") client.images += I diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 34a7ba420a4..2b2ede04d64 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -108,7 +108,7 @@ In all, this is a lot like the monkey code. /N if(QDELETED(src)) return - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = getorganslot(ORGAN_SLOT_EARS) switch (severity) if (EXPLODE_DEVASTATE) gib() diff --git a/code/modules/mob/living/carbon/alien/alien_say.dm b/code/modules/mob/living/carbon/alien/alien_say.dm index 9a76e3b26fd..33e7cdfea10 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/alien/hivenode/N = getorgan(/obj/item/organ/alien/hivenode) + var/obj/item/organ/internal/alien/hivenode/N = getorgan(/obj/item/organ/internal/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/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 8711d0968c2..268f0664229 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -317,14 +317,14 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/proc/getPlasma() - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) + var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(!vessel) return 0 return vessel.storedPlasma /mob/living/carbon/proc/adjustPlasma(amount) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) + var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(!vessel) return FALSE vessel.storedPlasma = max(vessel.storedPlasma + amount,0) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 1087709e07e..ba7a76c8b0a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -10,9 +10,9 @@ . = ..() /mob/living/carbon/alien/humanoid/drone/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid + internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large + internal_organs += new /obj/item/organ/internal/alien/resinspinner + internal_organs += new /obj/item/organ/internal/alien/acid ..() /obj/effect/proc_holder/alien/evolve @@ -23,7 +23,7 @@ action_icon_state = "alien_evolve_drone" /obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) + var/obj/item/organ/internal/alien/hivenode/node = user.getorgan(/obj/item/organ/internal/alien/hivenode) if(!node) //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. to_chat(user, span_danger("Without the hivemind, you can't possibly hold the responsibility of leadership!")) return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index df117dd7b56..a6a6527c6f2 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -7,7 +7,7 @@ var/atom/movable/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small + internal_organs += new /obj/item/organ/internal/alien/plasmavessel/small ..() //Hunter verbs diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index d907fb271eb..c4dd26aa62e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -12,10 +12,10 @@ . = ..() /mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin + internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large + internal_organs += new /obj/item/organ/internal/alien/resinspinner + internal_organs += new /obj/item/organ/internal/alien/acid + internal_organs += new /obj/item/organ/internal/alien/neurotoxin ..() /obj/effect/proc_holder/alien/royal/praetorian/evolve @@ -26,7 +26,7 @@ action_icon_state = "alien_evolve_praetorian" /obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) + var/obj/item/organ/internal/alien/hivenode/node = user.getorgan(/obj/item/organ/internal/alien/hivenode) if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr. to_chat(user, span_warning("Without the hivemind, you would be unfit to rule as queen!")) return FALSE diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 3816aac0136..df449a1d790 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -10,7 +10,7 @@ . = ..() /mob/living/carbon/alien/humanoid/sentinel/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin + internal_organs += new /obj/item/organ/internal/alien/plasmavessel + internal_organs += new /obj/item/organ/internal/alien/acid + internal_organs += new /obj/item/organ/internal/alien/neurotoxin ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm index a70600b81ef..66817296cc8 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/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/alien/hivenode/node = C.getorgan(/obj/item/organ/alien/hivenode) + var/obj/item/organ/internal/alien/hivenode/node = C.getorgan(/obj/item/organ/internal/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/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 30f8dbaebf2..dccce537542 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -58,11 +58,11 @@ return ..() /mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - internal_organs += new /obj/item/organ/alien/eggsac + internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large/queen + internal_organs += new /obj/item/organ/internal/alien/resinspinner + internal_organs += new /obj/item/organ/internal/alien/acid + internal_organs += new /obj/item/organ/internal/alien/neurotoxin + internal_organs += new /obj/item/organ/internal/alien/eggsac ..() //Queen verbs diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 8f04b809a85..734a5ef3e3c 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -37,7 +37,7 @@ . = ..() /mob/living/carbon/alien/larva/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny + internal_organs += new /obj/item/organ/internal/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 ef5a4ad51f0..976fdc38e2f 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(status_flags & GODMODE) return if(stat != DEAD) - if(health<= -maxHealth || !getorgan(/obj/item/organ/brain)) + if(health<= -maxHealth || !getorgan(/obj/item/organ/internal/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 7479f983612..16be0609d14 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,33 +1,33 @@ -/obj/item/organ/alien +/obj/item/organ/internal/alien icon_state = "xgibmid2" visual = FALSE food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/list/alien_powers = list() -/obj/item/organ/alien/Initialize(mapload) +/obj/item/organ/internal/alien/Initialize(mapload) . = ..() for(var/A in alien_powers) if(ispath(A)) alien_powers -= A alien_powers += new A(src) -/obj/item/organ/alien/Destroy() +/obj/item/organ/internal/alien/Destroy() QDEL_LIST(alien_powers) return ..() -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/Insert(mob/living/carbon/M, special = 0) ..() for(var/obj/effect/proc_holder/alien/P in alien_powers) M.AddAbility(P) -/obj/item/organ/alien/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/Remove(mob/living/carbon/M, special = 0) for(var/obj/effect/proc_holder/alien/P in alien_powers) M.RemoveAbility(P) ..() -/obj/item/organ/alien/plasmavessel +/obj/item/organ/internal/alien/plasmavessel name = "plasma vessel" icon_state = "plasma" w_class = WEIGHT_CLASS_NORMAL @@ -45,7 +45,7 @@ /// The rate this organ regenerates plasma at per second. var/plasma_rate = 5 -/obj/item/organ/alien/plasmavessel/large +/obj/item/organ/internal/alien/plasmavessel/large name = "large plasma vessel" icon_state = "plasma_large" w_class = WEIGHT_CLASS_BULKY @@ -53,10 +53,10 @@ max_plasma = 500 plasma_rate = 7.5 -/obj/item/organ/alien/plasmavessel/large/queen +/obj/item/organ/internal/alien/plasmavessel/large/queen plasma_rate = 10 -/obj/item/organ/alien/plasmavessel/small +/obj/item/organ/internal/alien/plasmavessel/small name = "small plasma vessel" icon_state = "plasma_small" w_class = WEIGHT_CLASS_SMALL @@ -64,14 +64,14 @@ max_plasma = 150 plasma_rate = 2.5 -/obj/item/organ/alien/plasmavessel/small/tiny +/obj/item/organ/internal/alien/plasmavessel/small/tiny name = "tiny plasma vessel" icon_state = "plasma_tiny" w_class = WEIGHT_CLASS_TINY max_plasma = 100 alien_powers = list(/obj/effect/proc_holder/alien/transfer) -/obj/item/organ/alien/plasmavessel/on_life(delta_time, times_fired) +/obj/item/organ/internal/alien/plasmavessel/on_life(delta_time, times_fired) //If there are alien weeds on the ground then heal if needed or give some plasma if(locate(/obj/structure/alien/weeds) in owner.loc) if(owner.health >= owner.maxHealth) @@ -88,13 +88,13 @@ else owner.adjustPlasma(0.1 * plasma_rate * delta_time) -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M A.updatePlasmaDisplay() -/obj/item/organ/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M @@ -102,7 +102,7 @@ #define QUEEN_DEATH_DEBUFF_DURATION 2400 -/obj/item/organ/alien/hivenode +/obj/item/organ/internal/alien/hivenode name = "hive node" icon_state = "hivenode" zone = BODY_ZONE_HEAD @@ -112,18 +112,18 @@ var/recent_queen_death = FALSE alien_powers = list(/obj/effect/proc_holder/alien/whisper) -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/hivenode/Insert(mob/living/carbon/M, special = 0) ..() M.faction |= ROLE_ALIEN ADD_TRAIT(M, TRAIT_XENO_IMMUNE, ORGAN_TRAIT) -/obj/item/organ/alien/hivenode/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/alien/hivenode/Remove(mob/living/carbon/M, special = 0) M.faction -= ROLE_ALIEN REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, ORGAN_TRAIT) ..() //When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her. -/obj/item/organ/alien/hivenode/proc/queen_death() +/obj/item/organ/internal/alien/hivenode/proc/queen_death() if(!owner|| owner.stat == DEAD) return if(isalien(owner)) //Different effects for aliens than humans @@ -146,7 +146,7 @@ addtimer(CALLBACK(src, .proc/clear_queen_death), QUEEN_DEATH_DEBUFF_DURATION) -/obj/item/organ/alien/hivenode/proc/clear_queen_death() +/obj/item/organ/internal/alien/hivenode/proc/clear_queen_death() if(QDELETED(src)) //In case the node is deleted return recent_queen_death = FALSE @@ -157,7 +157,7 @@ #undef QUEEN_DEATH_DEBUFF_DURATION -/obj/item/organ/alien/resinspinner +/obj/item/organ/internal/alien/resinspinner name = "resin spinner" icon_state = "stomach-x" zone = BODY_ZONE_PRECISE_MOUTH @@ -165,7 +165,7 @@ alien_powers = list(/obj/effect/proc_holder/alien/resin) -/obj/item/organ/alien/acid +/obj/item/organ/internal/alien/acid name = "acid gland" icon_state = "acid" zone = BODY_ZONE_PRECISE_MOUTH @@ -173,7 +173,7 @@ alien_powers = list(/obj/effect/proc_holder/alien/acid) -/obj/item/organ/alien/neurotoxin +/obj/item/organ/internal/alien/neurotoxin name = "neurotoxin gland" icon_state = "neurotox" zone = BODY_ZONE_PRECISE_MOUTH @@ -181,7 +181,7 @@ alien_powers = list(/obj/effect/proc_holder/alien/neurotoxin) -/obj/item/organ/alien/eggsac +/obj/item/organ/internal/alien/eggsac name = "egg sac" icon_state = "eggsac" zone = BODY_ZONE_PRECISE_GROIN 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 03300d57422..c2eeb6947f9 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/body_egg/alien_embryo +/obj/item/organ/internal/body_egg/alien_embryo name = "alien embryo" icon = 'icons/mob/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/body_egg/alien_embryo/Initialize(mapload) +/obj/item/organ/internal/body_egg/alien_embryo/Initialize(mapload) . = ..() advance_embryo_stage() -/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder) +/obj/item/organ/internal/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)) AttemptGrow(0) -/obj/item/organ/body_egg/alien_embryo/on_life(delta_time, times_fired) +/obj/item/organ/internal/body_egg/alien_embryo/on_life(delta_time, times_fired) . = ..() switch(stage) if(3, 4) @@ -55,14 +55,14 @@ owner.adjustToxLoss(5 * delta_time) // 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/body_egg/alien_embryo/proc/advance_embryo_stage() +/obj/item/organ/internal/body_egg/alien_embryo/proc/advance_embryo_stage() if(stage >= 6) return if(++stage < 6) INVOKE_ASYNC(src, .proc/RefreshInfectionImage) addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time) -/obj/item/organ/body_egg/alien_embryo/egg_process() +/obj/item/organ/internal/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) for(var/datum/surgery/S in owner.surgeries) if(S.location == BODY_ZONE_CHEST && istype(S.get_surgery_step(), /datum/surgery_step/manipulate_organs)) @@ -71,7 +71,7 @@ AttemptGrow() -/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE) +/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE) if(!owner || bursting) return @@ -128,7 +128,7 @@ Proc: AddInfectionImages(C) Des: Adds the infection image to all aliens for this embryo ----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/AddInfectionImages() +/obj/item/organ/internal/body_egg/alien_embryo/AddInfectionImages() for(var/mob/living/carbon/alien/alien in GLOB.player_list) var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") alien.client?.images += I @@ -137,7 +137,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/body_egg/alien_embryo/RemoveInfectionImages() +/obj/item/organ/internal/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 2f6eb869f3b..535be8eeae0 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -202,8 +202,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.getorgan(/obj/item/organ/body_egg/alien_embryo)) - new /obj/item/organ/body_egg/alien_embryo(target) + if((!LC || IS_ORGANIC_LIMB(LC)) && !target.getorgan(/obj/item/organ/internal/body_egg/alien_embryo)) + new /obj/item/organ/internal/body_egg/alien_embryo(target) var/turf/T = get_turf(target) log_game("[key_name(target)] was impregnated by a facehugger at [loc_name(T)]") @@ -245,7 +245,7 @@ return FALSE if(M.stat == DEAD) return FALSE - if(M.getorgan(/obj/item/organ/alien/hivenode)) + if(M.getorgan(/obj/item/organ/internal/alien/hivenode)) return FALSE var/mob/living/carbon/C = M if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5da11ab51b4..df647f214ef 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -398,10 +398,10 @@ /mob/living/carbon/get_status_tab_items() . = ..() - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) + var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel) if(vessel) . += "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]" - var/obj/item/organ/heart/vampire/darkheart = getorgan(/obj/item/organ/heart/vampire) + var/obj/item/organ/internal/heart/vampire/darkheart = getorgan(/obj/item/organ/internal/heart/vampire) if(darkheart) . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." if(locate(/obj/item/assembly/health) in src) @@ -562,7 +562,7 @@ sight = initial(sight) lighting_alpha = initial(lighting_alpha) - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) update_tint() else @@ -634,7 +634,7 @@ if(isclothing(wear_mask)) . += wear_mask.tint - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(E) . += E.tint @@ -887,7 +887,7 @@ /mob/living/carbon/can_be_revived() . = ..() - if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK)) + if(!getorgan(/obj/item/organ/internal/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE /mob/living/carbon/proc/can_defib() @@ -907,7 +907,7 @@ // Only check for a heart if they actually need a heart. Who would've thunk if (needs_heart()) - var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) + var/obj/item/organ/internal/heart = getorgan(/obj/item/organ/internal/heart) if (!heart) return DEFIB_FAIL_NO_HEART @@ -915,7 +915,7 @@ if (heart.organ_flags & ORGAN_FAILING) return DEFIB_FAIL_FAILING_HEART - var/obj/item/organ/brain/current_brain = getorgan(/obj/item/organ/brain) + var/obj/item/organ/internal/brain/current_brain = getorgan(/obj/item/organ/internal/brain) if (QDELETED(current_brain)) return DEFIB_FAIL_NO_BRAIN @@ -999,15 +999,6 @@ var/obj/item/organ/I = X I.Insert(src) -/// Takes an organ to slot in, and the slot to put it in, and puts in inside our lists properly -/// To be called once the organ is actually inside us. NOT a helper proc -/mob/living/carbon/proc/slot_in_organ(obj/item/organ/insert, slot) - internal_organs |= insert - internal_organs_slot[slot] = insert - /// internal_organs_slot must ALWAYS be ordered in the same way as organ_process_order - /// Otherwise life processing breaks down - sortTim(internal_organs_slot, /proc/cmp_organ_slot_asc) - /proc/cmp_organ_slot_asc(slot_a, slot_b) return GLOB.organ_process_order.Find(slot_a) - GLOB.organ_process_order.Find(slot_b) @@ -1276,7 +1267,7 @@ /mob/living/carbon/proc/adjust_skillchip_complexity_modifier(delta) skillchip_complexity_modifier += delta - var/obj/item/organ/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) if(!brain) return diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm index a27ae5f7b3d..0cee1c542cf 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(getorgan(/obj/item/organ/tail))) + else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(getorgan(/obj/item/organ/external/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 201da5c4dbe..d2b4e52e165 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -4,7 +4,7 @@ . = ..() if(HAS_TRAIT_NOT_FROM(src, TRAIT_BLIND, list(UNCONSCIOUS_TRAIT, HYPNOCHAIR_TRAIT))) return INFINITY //For all my homies that can not see in the world - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) return INFINITY //Can't get flashed without eyes 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/ears/E = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/E = getorganslot(ORGAN_SLOT_EARS) if(!E) return INFINITY else @@ -425,7 +425,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.getorgan(/obj/item/organ/tail))) + else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.getorgan(/obj/item/organ/external/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!")) @@ -515,7 +515,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/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if(!eyes) //can't flash what can't see! return @@ -567,7 +567,7 @@ SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) intensity = reflist[1] var/ear_safety = get_ear_protection() - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = getorganslot(ORGAN_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) @@ -609,7 +609,7 @@ /mob/living/carbon/can_hear() . = FALSE - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = getorganslot(ORGAN_SLOT_EARS) if(ears && !HAS_TRAIT(src, TRAIT_DEAF)) . = TRUE if(health <= hardcrit_threshold) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 3116ddb3ec2..15559695147 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -15,6 +15,10 @@ var/list/internal_organs = list() ///Same as [above][/mob/living/carbon/var/internal_organs], but stores "slot ID" - "organ" pairs for easy access. var/list/internal_organs_slot = list() + ///External organs. This is mostly here for the purposes of mass-updating organ colors. + var/list/external_organs = list() + ///Same as [above][/mob/living/carbon/var/external_organs], but stores "ID" = "organ" pairs. + var/list/external_organs_slot = list() ///Can't talk. Value goes down every life proc. NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. var/silent = 0 ///How many dream images we have left to send diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm index 7ce6fca9030..86c16ae73ca 100644 --- a/code/modules/mob/living/carbon/carbon_say.dm +++ b/code/modules/mob/living/carbon/carbon_say.dm @@ -18,7 +18,7 @@ return ..() /mob/living/carbon/could_speak_language(datum/language/language) - var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) return T.could_speak_language(language) else diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 39867c4a3a2..cc91b75eef4 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -364,7 +364,7 @@ for(var/obj/item/organ/external/external_organ as anything in external_organs) if(!external_organ.can_draw_on_bodypart(owner)) continue - . += "-[external_organ.generate_icon_cache()]" + . += "-[jointext(external_organ.generate_icon_cache(), "-")]" return . diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index a5dc063cc58..d97666615eb 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -44,12 +44,12 @@ if(!no_bodyparts) if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop. for(var/X in internal_organs) - if(no_brain || !istype(X, /obj/item/organ/brain)) + if(no_brain || !istype(X, /obj/item/organ/internal/brain)) qdel(X) else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it. for(var/X in internal_organs) var/obj/item/organ/O = X - if(no_brain && istype(O, /obj/item/organ/brain)) + if(no_brain && istype(O, /obj/item/organ/internal/brain)) qdel(O) //so the brain isn't transfered to the head when the head drops. continue var/org_zone = check_zone(O.zone) //both groin and chest organs. @@ -60,10 +60,10 @@ else for(var/X in internal_organs) var/obj/item/organ/I = X - if(no_brain && istype(I, /obj/item/organ/brain)) + if(no_brain && istype(I, /obj/item/organ/internal/brain)) qdel(I) continue - if(no_organs && !istype(I, /obj/item/organ/brain)) + if(no_organs && !istype(I, /obj/item/organ/internal/brain)) qdel(I) continue I.Remove(src) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index f5d81b956f2..44597895437 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -27,7 +27,7 @@ var/appears_dead = FALSE if (stat == DEAD) appears_dead = TRUE - if(getorgan(/obj/item/organ/brain)) + if(getorgan(/obj/item/organ/internal/brain)) . += span_deadsay("[t_He] [t_is] limp and unresponsive, with no signs of life.") else if(get_bodypart(BODY_ZONE_HEAD)) . += span_deadsay("It appears that [t_his] brain is missing...") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 08ec454c611..eeba74c1fbb 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) if(stat == DEAD) return stop_sound_channel(CHANNEL_HEARTBEAT) - var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/H = getorganslot(ORGAN_SLOT_HEART) if(H) H.beat = BEAT_NONE diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 4b13f71cf3a..c8cc678f10d 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -101,8 +101,8 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) dna.features["moth_wings"] = "Plain" dna.features["snout"] = "Round" dna.features["spines"] = "None" - dna.features["tail_human"] = "None" - dna.features["tail_lizard"] = "Smooth" + dna.features["tail_cat"] = "None" + dna.features["tail_lizard"] = "Light" //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 7e90be1468c..ec09a241f66 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -104,28 +104,17 @@ . = ..() if(!.) return - var/mob/living/carbon/human/H = user - if(!istype(H) || !H.dna || !H.dna.species || !H.dna.species.can_wag_tail(H)) - return - if(!H.dna.species.is_wagging_tail()) - H.dna.species.start_wagging_tail(H) + var/obj/item/organ/external/tail/oranges_accessory = user.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) + if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote() + SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, FALSE) else - H.dna.species.stop_wagging_tail(H) - -/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check = TRUE , intentional) - if(!..()) - return FALSE - var/mob/living/carbon/human/H = user - return H.dna && H.dna.species && H.dna.species.can_wag_tail(user) - -/datum/emote/living/carbon/human/wag/select_message_type(mob/user, intentional) - . = ..() - var/mob/living/carbon/human/H = user - if(!H.dna || !H.dna.species) - return - if(H.dna.species.is_wagging_tail()) - . = null + SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, TRUE) +/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check, intentional) + var/obj/item/organ/external/tail/tail = user.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) + if(tail?.wag_flags & WAG_ABLE) + return ..() + return FALSE /datum/emote/living/carbon/human/wing key = "wing" key_third_person = "wings" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 4ad62a57204..6645cc24649 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -117,7 +117,7 @@ . += generate_death_examine_text() - if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain)) + if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/internal/brain)) . += span_deadsay("It appears that [t_his] brain is missing...") var/list/msg = list() @@ -327,7 +327,7 @@ if(CONSCIOUS) if(HAS_TRAIT(src, TRAIT_DUMB)) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(getorgan(/obj/item/organ/brain)) + if(getorgan(/obj/item/organ/internal/brain)) if(ai_controller?.ai_status == AI_STATUS_ON) msg += "[span_deadsay("[t_He] do[t_es]n't appear to be [t_him]self.")]\n" else if(!key) @@ -366,7 +366,7 @@ . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) var/cyberimp_detect - for(var/obj/item/organ/cyberimp/CI in internal_organs) + for(var/obj/item/organ/internal/cyberimp/CI in internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" if(cyberimp_detect) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4d901d61d49..a6e6621b304 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -415,7 +415,7 @@ //200 max knockdown for EXPLODE_HEAVY //160 max knockdown for EXPLODE_LIGHT - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = getorganslot(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 @@ -519,7 +519,7 @@ //If they can't, they're missing their heart and this would runtime if(undergoing_cardiac_arrest() && can_heartattack() && !(flags & SHOCK_ILLUSION)) if(shock_damage * siemens_coeff >= 1 && prob(25)) - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(heart.Restart() && stat == CONSCIOUS) to_chat(src, span_notice("You feel your heart beating again!")) electrocution_animation(40) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 4c6d41bea0b..412556f42d4 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -212,7 +212,7 @@ var/t_his = p_their() var/t_is = p_are() //This checks to see if the body is revivable - if(key || !getorgan(/obj/item/organ/brain) || ghost?.can_reenter_corpse) + if(key || !getorgan(/obj/item/organ/internal/brain) || ghost?.can_reenter_corpse) 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...") diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index f42e49e59ed..cad78f2554a 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -853,7 +853,7 @@ generate/load female uniform sprites matching all previously decided variables // eyes if(!(NOEYESPRITES in dna.species.species_traits)) - var/obj/item/organ/eyes/parent_eyes = getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/parent_eyes = getorganslot(ORGAN_SLOT_EYES) if(parent_eyes) add_overlay(parent_eyes.generate_body_overlay(src)) else diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1fea46d37c4..0f7e6b261ed 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -107,8 +107,8 @@ return FALSE else - if(istype(L, /obj/item/organ/lungs)) - var/obj/item/organ/lungs/lun = L + if(istype(L, /obj/item/organ/internal/lungs)) + var/obj/item/organ/internal/lungs/lun = L lun.check_breath(breath,src) /// Environment handlers for species diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 495184a4a7b..a5996aec183 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -199,23 +199,23 @@ GLOBAL_LIST_EMPTY(features_by_species) //why does it work this way? because traits also disable the downsides of not having an organ, removing organs but not having the trait will make your species die ///Replaces default brain with a different organ - var/obj/item/organ/brain/mutantbrain = /obj/item/organ/brain + var/obj/item/organ/internal/brain/mutantbrain = /obj/item/organ/internal/brain ///Replaces default heart with a different organ - var/obj/item/organ/heart/mutantheart = /obj/item/organ/heart + var/obj/item/organ/internal/heart/mutantheart = /obj/item/organ/internal/heart ///Replaces default lungs with a different organ - var/obj/item/organ/lungs/mutantlungs = /obj/item/organ/lungs + var/obj/item/organ/internal/lungs/mutantlungs = /obj/item/organ/internal/lungs ///Replaces default eyes with a different organ - var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes + var/obj/item/organ/internal/eyes/mutanteyes = /obj/item/organ/internal/eyes ///Replaces default ears with a different organ - var/obj/item/organ/ears/mutantears = /obj/item/organ/ears + var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears ///Replaces default tongue with a different organ - var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue + var/obj/item/organ/internal/tongue/mutanttongue = /obj/item/organ/internal/tongue ///Replaces default liver with a different organ - var/obj/item/organ/liver/mutantliver = /obj/item/organ/liver + var/obj/item/organ/internal/liver/mutantliver = /obj/item/organ/internal/liver ///Replaces default stomach with a different organ - var/obj/item/organ/stomach/mutantstomach = /obj/item/organ/stomach + var/obj/item/organ/internal/stomach/mutantstomach = /obj/item/organ/internal/stomach ///Replaces default appendix with a different organ. - var/obj/item/organ/appendix/mutantappendix = /obj/item/organ/appendix + var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix ///Forces an item into this species' hands. Only an honorary mutantthing because this is not an organ and not loaded in the same way, you've been warned to do your research. var/obj/item/mutanthands @@ -370,7 +370,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(oldorgan && (!should_have || replace_current) && !(oldorgan.zone in excluded_zones) && !(oldorgan.organ_flags & ORGAN_UNREMOVABLE)) if(slot == ORGAN_SLOT_BRAIN) - var/obj/item/organ/brain/brain = oldorgan + var/obj/item/organ/internal/brain/brain = oldorgan if(!brain.decoy_override)//"Just keep it if it's fake" - confucius, probably brain.before_organ_replacement(neworgan) brain.Remove(C,TRUE, TRUE) //brain argument used so it doesn't cause any... sudden death. @@ -463,10 +463,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/mob/living/carbon/human/human = C for(var/obj/item/organ/external/organ_path as anything in external_organs) //Load a persons preferences from DNA - var/feature_key_name = human.dna.features[initial(organ_path.feature_key)] - var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path) - new_organ.set_sprite(feature_key_name) new_organ.Insert(human) for(var/X in inherent_traits) @@ -566,7 +563,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // eyes if(!(NOEYESPRITES in species_traits)) - var/obj/item/organ/eyes/eye_organ = species_human.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eye_organ = species_human.getorganslot(ORGAN_SLOT_EYES) var/mutable_appearance/no_eyeslay var/add_pixel_x = 0 var/add_pixel_y = 0 @@ -686,39 +683,6 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/bodypart/head/noggin = source.get_bodypart(BODY_ZONE_HEAD) - if(mutant_bodyparts["tail_lizard"]) - if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "tail_lizard" - - if(mutant_bodyparts["waggingtail_lizard"]) - if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "waggingtail_lizard" - else if (mutant_bodyparts["tail_lizard"]) - bodyparts_to_add -= "waggingtail_lizard" - - if(mutant_bodyparts["tail_human"]) - if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "tail_human" - - if("tail_monkey" in mutant_bodyparts) - if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "tail_monkey" - - if(mutant_bodyparts["waggingtail_human"]) - if(source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "waggingtail_human" - else if (mutant_bodyparts["tail_human"]) - bodyparts_to_add -= "waggingtail_human" - - if(mutant_bodyparts["spines"]) - if(!source.dna.features["spines"] || source.dna.features["spines"] == "None" || source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "spines" - - if(mutant_bodyparts["waggingspines"]) - if(!source.dna.features["spines"] || source.dna.features["spines"] == "None" || source.wear_suit && (source.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "waggingspines" - else if (mutant_bodyparts["tail"]) - bodyparts_to_add -= "waggingspines" if(mutant_bodyparts["ears"]) if(!source.dna.features["ears"] || source.dna.features["ears"] == "None" || source.head && (source.head.flags_inv & HIDEHAIR) || (source.wear_mask && (source.wear_mask.flags_inv & HIDEHAIR)) || !noggin || !IS_ORGANIC_LIMB(noggin)) @@ -735,18 +699,6 @@ GLOBAL_LIST_EMPTY(features_by_species) for(var/bodypart in bodyparts_to_add) var/datum/sprite_accessory/accessory switch(bodypart) - if("tail_lizard") - accessory = GLOB.tails_list_lizard[source.dna.features["tail_lizard"]] - if("waggingtail_lizard") - accessory = GLOB.animated_tails_list_lizard[source.dna.features["tail_lizard"]] - if("tail_human") - accessory = GLOB.tails_list_human[source.dna.features["tail_human"]] - if("waggingtail_human") - accessory = GLOB.animated_tails_list_human[source.dna.features["tail_human"]] - if("spines") - accessory = GLOB.spines_list[source.dna.features["spines"]] - if("waggingspines") - accessory = GLOB.animated_spines_list[source.dna.features["spines"]] if("ears") accessory = GLOB.ears_list[source.dna.features["ears"]] if("body_markings") @@ -755,20 +707,12 @@ GLOBAL_LIST_EMPTY(features_by_species) accessory = GLOB.legs_list[source.dna.features["legs"]] if("caps") accessory = GLOB.caps_list[source.dna.features["caps"]] - if("tail_monkey") - accessory = GLOB.tails_list_monkey[source.dna.features["tail_monkey"]] if(!accessory || accessory.icon_state == "none") continue var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) - //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. - if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "tail_monkey") - bodypart = "tail" - else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human") - bodypart = "waggingtail" - if(accessory.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[accessory.icon_state]_[layertext]" else @@ -917,7 +861,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(ITEM_SLOT_EYES) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE - var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) if(E?.no_glasses) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) @@ -1738,57 +1682,6 @@ GLOBAL_LIST_EMPTY(features_by_species) //Tail Wagging// //////////////// -/datum/species/proc/can_wag_tail(mob/living/carbon/human/H) - return FALSE - -/datum/species/proc/is_wagging_tail(mob/living/carbon/human/H) - return FALSE - -/* - * This proc is called when a mob loses their tail. - * - * tail_owner - the owner of the tail (who holds our species datum) - * lost_tail - the tail that was removed - * on_species_init - whether or not this was called when the species was initialized, or if it was called due to an ingame means (like surgery) - */ -/datum/species/proc/on_tail_lost(mob/living/carbon/human/tail_owner, obj/item/organ/tail/lost_tail, on_species_init = FALSE) - SEND_SIGNAL(tail_owner, COMSIG_CLEAR_MOOD_EVENT, "right_tail_regained") - SEND_SIGNAL(tail_owner, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") - stop_wagging_tail(tail_owner) - - // If it's initializing the species, don't add moodlets - if(on_species_init) - return - // If we don't have a set tail, don't bother adding moodlets - if(!mutant_organs.len) - return - - SEND_SIGNAL(tail_owner, COMSIG_ADD_MOOD_EVENT, "tail_lost", /datum/mood_event/tail_lost) - SEND_SIGNAL(tail_owner, COMSIG_ADD_MOOD_EVENT, "tail_balance_lost", /datum/mood_event/tail_balance_lost) - -/* - * This proc is called when a mob gains a tail. - * - * tail_owner - the owner of the tail (who holds our species datum) - * lost_tail - the tail that was added - * on_species_init - whether or not this was called when the species was initialized, or if it was called due to an ingame means (like surgery) - */ -/datum/species/proc/on_tail_regain(mob/living/carbon/human/tail_owner, obj/item/organ/tail/found_tail, on_species_init = FALSE) - SEND_SIGNAL(tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") - SEND_SIGNAL(tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") - - // If it's initializing the species, don't add moodlets - if(on_species_init) - return - // If we don't have a set tail, don't add moodlets - if(!mutant_organs.len) - return - - if(found_tail.type in mutant_organs) - SEND_SIGNAL(tail_owner, COMSIG_ADD_MOOD_EVENT, "right_tail_regained", /datum/mood_event/tail_regained_right) - else - SEND_SIGNAL(tail_owner, COMSIG_ADD_MOOD_EVENT, "wrong_tail_regained", /datum/mood_event/tail_regained_wrong) - /* * Clears all tail related moodlets when they lose their species. * @@ -1797,13 +1690,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/clear_tail_moodlets(mob/living/carbon/human/former_tail_owner) SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") - SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "right_tail_regained") SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") - stop_wagging_tail(former_tail_owner) - -/datum/species/proc/start_wagging_tail(mob/living/carbon/human/H) - -/datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H) /////////////// //FLIGHT SHIT// @@ -1867,6 +1754,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if ( \ (preference.relevant_mutant_bodypart in mutant_bodyparts) \ || (preference.relevant_species_trait in species_traits) \ + || (preference.relevant_external_organ in external_organs) ) features += preference.savefile_key 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 c2519002f91..056f13623c8 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -12,7 +12,7 @@ TRAIT_NOHUNGER, TRAIT_NOBREATH, ) - mutanttongue = /obj/item/organ/tongue/abductor + mutanttongue = /obj/item/organ/internal/tongue/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT ass_image = 'icons/ass/assgrey.png' 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 7a1ff0692ad..b1a75d61774 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -25,7 +25,7 @@ inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null damage_overlay_type = "synth" - mutanttongue = /obj/item/organ/tongue/robot + mutanttongue = /obj/item/organ/internal/tongue/robot species_language_holder = /datum/language_holder/synthetic wings_icons = list("Robotic") 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 03b0616a2f3..1cdca7279be 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -11,10 +11,10 @@ inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") use_skintones = TRUE - mutantbrain = /obj/item/organ/brain/dullahan - mutanteyes = /obj/item/organ/eyes/dullahan - mutanttongue = /obj/item/organ/tongue/dullahan - mutantears = /obj/item/organ/ears/dullahan + 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 examine_limb_id = SPECIES_HUMAN skinned_type = /obj/item/stack/sheet/animalhide/human changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN @@ -46,7 +46,7 @@ head.show_organs_on_examine = FALSE // We want to give the head some boring old eyes just so it doesn't look too jank on the head sprite. - head.eyes = new /obj/item/organ/eyes(head) + head.eyes = new /obj/item/organ/internal/eyes(head) head.eyes.eye_color_left = human.eye_color_left head.eyes.eye_color_right = human.eye_color_right human.update_body() @@ -87,7 +87,7 @@ human.gib() // Yeah so giving them a head on their body is really not a good idea, so their original head will remain but uh, good luck fixing it after that. /datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/human) - var/obj/item/organ/eyes/eyes = human.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = human.getorganslot(ORGAN_SLOT_EYES) if(eyes) human.update_tint() if(eyes.tint) @@ -98,7 +98,7 @@ prevent_perspective_change = TRUE /datum/species/dullahan/on_owner_login(mob/living/carbon/human/owner) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if(owner_first_client_connection_handled) if(!eyes.tint) owner.reset_perspective(my_head, TRUE) @@ -154,15 +154,15 @@ return to_add -/obj/item/organ/brain/dullahan +/obj/item/organ/internal/brain/dullahan decoy_override = TRUE organ_flags = 0 -/obj/item/organ/tongue/dullahan +/obj/item/organ/internal/tongue/dullahan zone = "abstract" modifies_speech = TRUE -/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/dullahan/handle_speech(datum/source, list/speech_args) if(ishuman(owner)) var/mob/living/carbon/human/human = owner if(isdullahan(human)) @@ -172,10 +172,10 @@ head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], range = speech_args[SPEECH_RANGE]) speech_args[SPEECH_MESSAGE] = "" -/obj/item/organ/ears/dullahan +/obj/item/organ/internal/ears/dullahan zone = "abstract" -/obj/item/organ/eyes/dullahan +/obj/item/organ/internal/eyes/dullahan name = "head vision" desc = "An abstraction." actions_types = list(/datum/action/item_action/organ_action/dullahan) @@ -188,7 +188,7 @@ /datum/action/item_action/organ_action/dullahan/Trigger(trigger_flags) . = ..() - var/obj/item/organ/eyes/dullahan/dullahan_eyes = target + var/obj/item/organ/internal/eyes/dullahan/dullahan_eyes = target dullahan_eyes.tint = dullahan_eyes.tint ? NONE : INFINITY if(ishuman(owner)) 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 d3e1398d897..5214a4f0f7e 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -5,10 +5,10 @@ attack_sound = 'sound/weapons/etherealhit.ogg' miss_sound = 'sound/weapons/etherealmiss.ogg' meat = /obj/item/food/meat/slab/human/mutant/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 + 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 exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer siemens_coeff = 0.5 //They thrive on energy brutemod = 1.25 //They're weak to punches @@ -74,7 +74,7 @@ spec_updatehealth(ethereal) C.set_safe_hunger_level() - var/obj/item/organ/heart/ethereal/ethereal_heart = C.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/ethereal/ethereal_heart = C.getorganslot(ORGAN_SLOT_HEART) ethereal_heart.ethereal_color = default_color //The following code is literally only to make admin-spawned ethereals not be black. 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 a593b071735..810a5ea92b1 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,10 +4,12 @@ id = SPECIES_FELINE say_mod = "meows" - mutant_bodyparts = list("tail_human" = "Cat", "ears" = "Cat", "wings" = "None") + mutant_bodyparts = list("ears" = "Cat", "wings" = "None") - mutantears = /obj/item/organ/ears/cat - mutant_organs = list(/obj/item/organ/tail/cat) + mutantears = /obj/item/organ/internal/ears/cat + external_organs = list( + /obj/item/organ/external/tail/cat = "Cat", + ) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/felinid disliked_food = GROSS | CLOTH | RAW @@ -18,16 +20,6 @@ family_heirlooms = list(/obj/item/toy/cattoy) examine_limb_id = SPECIES_HUMAN -//Curiosity killed the cat's wagging tail. -/datum/species/human/felinid/spec_death(gibbed, mob/living/carbon/human/H) - if(H) - stop_wagging_tail(H) - -/datum/species/human/felinid/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) - . = ..() - // Prevents felinids from taking toxin damage from carpotoxin /datum/species/human/felinid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) . = ..() @@ -35,42 +27,19 @@ var/datum/reagent/toxin/carpotoxin/fish = chem fish.toxpwr = 0 -/datum/species/human/felinid/can_wag_tail(mob/living/carbon/human/H) - return mutant_bodyparts["tail_human"] || mutant_bodyparts["waggingtail_human"] - -/datum/species/human/felinid/is_wagging_tail(mob/living/carbon/human/H) - return mutant_bodyparts["waggingtail_human"] - -/datum/species/human/felinid/start_wagging_tail(mob/living/carbon/human/H) - if(mutant_bodyparts["tail_human"]) - mutant_bodyparts["waggingtail_human"] = mutant_bodyparts["tail_human"] - mutant_bodyparts -= "tail_human" - H.update_body() - -/datum/species/human/felinid/stop_wagging_tail(mob/living/carbon/human/H) - if(mutant_bodyparts["waggingtail_human"]) - mutant_bodyparts["tail_human"] = mutant_bodyparts["waggingtail_human"] - mutant_bodyparts -= "waggingtail_human" - H.update_body() /datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) if(ishuman(C)) var/mob/living/carbon/human/H = C if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! - if(H.dna.features["tail_human"] == "None") - H.dna.features["tail_human"] = "Cat" + H.dna.features["tail_cat"] = "Cat" if(H.dna.features["ears"] == "None") H.dna.features["ears"] = "Cat" if(H.dna.features["ears"] == "Cat") - var/obj/item/organ/ears/cat/ears = new + var/obj/item/organ/internal/ears/cat/ears = new ears.Insert(H, drop_if_replaced = FALSE) else - mutantears = /obj/item/organ/ears - if(H.dna.features["tail_human"] == "Cat") - var/obj/item/organ/tail/cat/tail = new - tail.Insert(H, special = TRUE, drop_if_replaced = FALSE) - else - mutant_organs = list() + mutantears = /obj/item/organ/internal/ears return ..() /proc/mass_purrbation() @@ -103,8 +72,8 @@ var/datum/species/human/felinid/cat_species = H.dna.species cat_species.original_felinid = FALSE else - var/obj/item/organ/ears/cat/kitty_ears = new - var/obj/item/organ/tail/cat/kitty_tail = new + var/obj/item/organ/internal/ears/cat/kitty_ears = new + var/obj/item/organ/external/tail/cat/kitty_tail = new kitty_ears.Insert(H, TRUE, FALSE) //Gives nonhumans cat tail and ears kitty_tail.Insert(H, TRUE, FALSE) if(!silent) @@ -120,13 +89,13 @@ var/datum/species/target_species = H.dna.species var/organs = H.internal_organs for(var/obj/item/organ/current_organ in organs) - if(istype(current_organ, /obj/item/organ/tail/cat)) + if(istype(current_organ, /obj/item/organ/external/tail/cat)) current_organ.Remove(H, TRUE) - var/obj/item/organ/tail/new_tail = locate(/obj/item/organ/tail) in target_species.mutant_organs + var/obj/item/organ/external/tail/new_tail = locate(/obj/item/organ/external/tail) in target_species.external_organs if(new_tail) new_tail = new new_tail() new_tail.Insert(H, TRUE, FALSE) - if(istype(current_organ, /obj/item/organ/ears/cat)) + if(istype(current_organ, /obj/item/organ/internal/ears/cat)) var/obj/item/organ/new_ears = new target_species.mutantears new_ears.Insert(H, TRUE, FALSE) if(!silent) @@ -137,7 +106,7 @@ human.hair_color = "#ffcccc" // pink human.update_hair() - var/obj/item/organ/ears/cat/cat_ears = human.getorgan(/obj/item/organ/ears/cat) + var/obj/item/organ/internal/ears/cat/cat_ears = human.getorgan(/obj/item/organ/internal/ears/cat) if (cat_ears) cat_ears.color = human.hair_color human.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 7a781dedddd..f3d58a512ff 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -11,7 +11,7 @@ ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG meat = /obj/item/food/meat/slab/human/mutant/fly - mutanteyes = /obj/item/organ/eyes/fly + mutanteyes = /obj/item/organ/internal/eyes/fly liked_food = GROSS disliked_food = NONE toxic_food = NONE @@ -19,13 +19,13 @@ species_language_holder = /datum/language_holder/fly payday_modifier = 0.75 - 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) + 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) bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/fly, @@ -102,44 +102,44 @@ return to_add -/obj/item/organ/heart/fly +/obj/item/organ/internal/heart/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." -/obj/item/organ/heart/fly/Initialize(mapload) +/obj/item/organ/internal/heart/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/heart/fly/update_icon_state() +/obj/item/organ/internal/heart/fly/update_icon_state() SHOULD_CALL_PARENT(FALSE) return //don't set icon thank you -/obj/item/organ/lungs/fly +/obj/item/organ/internal/lungs/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." -/obj/item/organ/lungs/fly/Initialize(mapload) +/obj/item/organ/internal/lungs/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/liver/fly +/obj/item/organ/internal/liver/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect! -/obj/item/organ/liver/fly/Initialize(mapload) +/obj/item/organ/internal/liver/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/stomach/fly +/obj/item/organ/internal/stomach/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." -/obj/item/organ/stomach/fly/Initialize(mapload) +/obj/item/organ/internal/stomach/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/stomach/fly/on_life(delta_time, times_fired) +/obj/item/organ/internal/stomach/fly/on_life(delta_time, times_fired) if(locate(/datum/reagent/consumable) in reagents.reagent_list) var/mob/living/carbon/body = owner // we do not loss any nutrition as a fly when vomiting out food @@ -149,26 +149,26 @@ span_userdanger("You throw up on the floor!")) return ..() -/obj/item/organ/appendix/fly +/obj/item/organ/internal/appendix/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." -/obj/item/organ/appendix/fly/Initialize(mapload) +/obj/item/organ/internal/appendix/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/appendix/fly/update_appearance(updates=ALL) +/obj/item/organ/internal/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 -/obj/item/organ/fly +/obj/item/organ/internal/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." visual = FALSE -/obj/item/organ/fly/Initialize(mapload) +/obj/item/organ/internal/fly/Initialize(mapload) . = ..() name = odd_organ_name() icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5") -/obj/item/organ/fly/groin //appendix is the only groin organ so we gotta have one of these too lol +/obj/item/organ/internal/fly/groin //appendix is the only groin organ so we gotta have one of these too lol zone = BODY_ZONE_PRECISE_GROIN 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 211b8c00084..930923cd5e2 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -19,7 +19,8 @@ TRAIT_NODISMEMBER, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - mutant_organs = list(/obj/item/organ/adamantine_resonator) + mutant_organs = list(/obj/item/organ/internal/adamantine_resonator) + mutanttongue = /obj/item/organ/internal/vocal_cords/adamantine speedmod = 2 payday_modifier = 0.75 armor = 55 @@ -87,7 +88,8 @@ name = "Adamantine Golem" id = SPECIES_GOLEM_ADAMANTINE meat = /obj/item/food/meat/slab/human/mutant/golem/adamantine - mutant_organs = list(/obj/item/organ/adamantine_resonator, /obj/item/organ/vocal_cords/adamantine) + mutant_organs = list(/obj/item/organ/internal/adamantine_resonator) + mutanttongue = /obj/item/organ/internal/vocal_cords/adamantine fixed_mut_color = "#44eedd" info_text = "As an Adamantine Golem, you possess special vocal cords allowing you to \"resonate\" messages to all golems. Your unique mineral makeup makes you immune to most types of magic." prefix = "Adamantine" @@ -298,7 +300,7 @@ id = SPECIES_GOLEM_ALIEN fixed_mut_color = "#333333" meat = /obj/item/stack/sheet/mineral/abductor - mutanttongue = /obj/item/organ/tongue/abductor + mutanttongue = /obj/item/organ/internal/tongue/abductor speedmod = 1 //faster info_text = "As an Alloy Golem, you are made of advanced alien materials: you are faster and regenerate over time. You are, however, only able to be heard by other alloy golems." prefix = "Alien" @@ -629,7 +631,7 @@ COOLDOWN_START(src, honkooldown, 0) COOLDOWN_START(src, banana_cooldown, banana_delay) RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver) ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT) @@ -637,7 +639,7 @@ . = ..() UnregisterSignal(C, COMSIG_MOB_SAY) - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver) REMOVE_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT) @@ -976,7 +978,7 @@ fixed_mut_color = "#cd7f32" info_text = "As a Bronze Golem, you are very resistant to loud noises, and make loud noises if something hard hits you, however this ability does hurt your hearing." special_step_sounds = list('sound/machines/clockcult/integration_cog_install.ogg', 'sound/magic/clockwork/fellowship_armory.ogg' ) - mutantears = /obj/item/organ/ears/bronze + mutantears = /obj/item/organ/internal/ears/bronze examine_limb_id = SPECIES_GOLEM var/last_gong_time = 0 var/gong_cooldown = 150 @@ -1175,8 +1177,8 @@ toxic_food = null species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,HAS_BONE) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/tongue/bone - mutantstomach = /obj/item/organ/stomach/bone + mutanttongue = /obj/item/organ/internal/tongue/bone + mutantstomach = /obj/item/organ/internal/stomach/bone sexes = FALSE fixed_mut_color = null inherent_traits = list( 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 5489c7e9972..e7a60373105 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -10,7 +10,7 @@ TRAIT_CAN_STRIP, TRAIT_TOXINLOVER, ) - mutantlungs = /obj/item/organ/lungs/slime + mutantlungs = /obj/item/organ/internal/lungs/slime meat = /obj/item/food/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly damage_overlay_type = "" 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 c7712551963..d175613706e 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -11,12 +11,15 @@ TRAIT_CAN_USE_FLIGHT_POTION, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE - mutant_bodyparts = list("tail_lizard" = "Smooth", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs") - external_organs = list(/obj/item/organ/external/horns = "None", + mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs") + external_organs = list( + /obj/item/organ/external/horns = "None", /obj/item/organ/external/frills = "None", - /obj/item/organ/external/snout = "Round") - mutanttongue = /obj/item/organ/tongue/lizard - mutant_organs = list(/obj/item/organ/tail/lizard) + /obj/item/organ/external/snout = "Round", + /obj/item/organ/external/spines = "None", + /obj/item/organ/external/tail/lizard = "Smooth", + ) + mutanttongue = /obj/item/organ/internal/tongue/lizard coldmod = 1.5 heatmod = 0.67 payday_modifier = 0.75 @@ -67,60 +70,6 @@ return randname -//I wag in death -/datum/species/lizard/spec_death(gibbed, mob/living/carbon/human/H) - if(H) - stop_wagging_tail(H) - -/datum/species/lizard/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) - . = ..() - -/datum/species/lizard/can_wag_tail(mob/living/carbon/human/H) - return mutant_bodyparts["tail_lizard"] || mutant_bodyparts["waggingtail_lizard"] - -/datum/species/lizard/is_wagging_tail(mob/living/carbon/human/H) - return mutant_bodyparts["waggingtail_lizard"] - -/datum/species/lizard/start_wagging_tail(mob/living/carbon/human/H) - if(mutant_bodyparts["tail_lizard"]) - mutant_bodyparts["waggingtail_lizard"] = mutant_bodyparts["tail_lizard"] - mutant_bodyparts["waggingspines"] = mutant_bodyparts["spines"] - mutant_bodyparts -= "tail_lizard" - mutant_bodyparts -= "spines" - H.update_body() - -/datum/species/lizard/stop_wagging_tail(mob/living/carbon/human/H) - if(mutant_bodyparts["waggingtail_lizard"]) - mutant_bodyparts["tail_lizard"] = mutant_bodyparts["waggingtail_lizard"] - mutant_bodyparts["spines"] = mutant_bodyparts["waggingspines"] - mutant_bodyparts -= "waggingtail_lizard" - mutant_bodyparts -= "waggingspines" - H.update_body() - -/datum/species/lizard/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - var/real_tail_type = C.dna.features["tail_lizard"] - var/real_spines = C.dna.features["spines"] - - . = ..() - - // Special handler for loading preferences. If we're doing it from a preference load, we'll want - // to make sure we give the appropriate lizard tail AFTER we call the parent proc, as the parent - // proc will overwrite the lizard tail. Species code at its finest. - if(pref_load) - C.dna.features["tail_lizard"] = real_tail_type - C.dna.features["spines"] = real_spines - - var/obj/item/organ/tail/lizard/new_tail = new /obj/item/organ/tail/lizard() - - new_tail.tail_type = C.dna.features["tail_lizard"] - new_tail.spines = C.dna.features["spines"] - - // organ.Insert will qdel any existing organs in the same slot, so - // we don't need to manage that. - new_tail.Insert(C, TRUE, FALSE) - /datum/species/lizard/randomize_main_appearance_element(mob/living/carbon/human/human_mob) var/tail = pick(GLOB.tails_list_lizard) human_mob.dna.features["tail_lizard"] = tail @@ -181,7 +130,7 @@ Lizard subspecies: ASHWALKERS name = "Ash Walker" id = SPECIES_LIZARD_ASH species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAS_FLESH,HAS_BONE) - mutantlungs = /obj/item/organ/lungs/ashwalker + mutantlungs = /obj/item/organ/internal/lungs/ashwalker inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -211,7 +160,7 @@ Lizard subspecies: SILVER SCALED TRAIT_WINE_TASTER, ) species_language_holder = /datum/language_holder/lizard/silver - mutanttongue = /obj/item/organ/tongue/lizard/silver + mutanttongue = /obj/item/organ/internal/tongue/lizard/silver armor = 10 //very light silvery scales soften blows changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN examine_limb_id = SPECIES_LIZARD 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 f765a14c1d1..0bb54535c16 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -7,8 +7,9 @@ attack_effect = ATTACK_EFFECT_BITE attack_sound = 'sound/weapons/bite.ogg' miss_sound = 'sound/weapons/bite.ogg' - mutant_organs = list(/obj/item/organ/tail/monkey) - mutant_bodyparts = list("tail_monkey" = "Monkey") + external_organs = list( + /obj/item/organ/external/tail/monkey = "Monkey" + ) 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) @@ -71,10 +72,6 @@ . = ..() H.pass_flags |= PASSTABLE H.butcher_results = knife_butcher_results - if(!H.dna.features["tail_monkey"] || H.dna.features["tail_monkey"] == "None") - H.dna.features["tail_monkey"] = "Monkey" - handle_mutant_bodyparts(H) - H.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) H.dna.activate_mutation(/datum/mutation/human/race) 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 76b5d800e8c..1800cdd52cf 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -20,7 +20,7 @@ liked_food = VEGETABLES | DAIRY | CLOTH disliked_food = FRUIT | GROSS | BUGS toxic_food = MEAT | RAW | SEAFOOD - mutanteyes = /obj/item/organ/eyes/moth + mutanteyes = /obj/item/organ/internal/eyes/moth changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/moth wings_icons = list("Megamoth", "Mothra") 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 db340e41898..876634c5db1 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -29,7 +29,7 @@ burnmod = 1.25 heatmod = 1.5 - mutanteyes = /obj/item/organ/eyes/night_vision/mushroom + mutanteyes = /obj/item/organ/internal/eyes/night_vision/mushroom use_skintones = FALSE var/datum/martial_art/mushpunch/mush species_language_holder = /datum/language_holder/mushroom 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 a54056ba7c1..39dfd44a0a2 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 - mutantlungs = /obj/item/organ/lungs/plasmaman - mutanttongue = /obj/item/organ/tongue/bone/plasmaman - mutantliver = /obj/item/organ/liver/plasmaman - mutantstomach = /obj/item/organ/stomach/bone/plasmaman + mutantlungs = /obj/item/organ/internal/lungs/plasmaman + mutanttongue = /obj/item/organ/internal/tongue/bone/plasmaman + mutantliver = /obj/item/organ/internal/liver/plasmaman + mutantstomach = /obj/item/organ/internal/stomach/bone/plasmaman burnmod = 1.5 heatmod = 1.5 brutemod = 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 d579c496ad4..f401840dc7a 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -72,6 +72,6 @@ human_mob.update_body() /datum/species/pod/proc/change_hairstyle(mob/living/carbon/human/human_mob, new_style) - var/obj/item/organ/external/organ = human_mob.getorganslot(ORGAN_SLOT_EXTERNAL_POD_HAIR ) + var/obj/item/organ/external/organ = human_mob.getorganslot(ORGAN_SLOT_EXTERNAL_POD_HAIR) organ.set_sprite(new_style) human_mob.update_body_parts() 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 4b905f35aa0..bdcc3f150f9 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -15,7 +15,7 @@ ) inherent_factions = list("faithless") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - mutanteyes = /obj/item/organ/eyes/night_vision + mutanteyes = /obj/item/organ/internal/eyes/night_vision species_language_holder = /datum/language_holder/shadowpeople bodypart_overrides = list( 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 67b0712254e..e1da28b300e 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -28,8 +28,8 @@ TRAIT_CAN_USE_FLIGHT_POTION, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/tongue/bone - mutantstomach = /obj/item/organ/stomach/bone + mutanttongue = /obj/item/organ/internal/tongue/bone + mutantstomach = /obj/item/organ/internal/stomach/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE liked_food = GROSS | MEAT | RAW 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 e2266bb5f2d..6c0a1355724 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -18,8 +18,8 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP sexes = FALSE //snails are hermaphrodites - mutanteyes = /obj/item/organ/eyes/snail - mutanttongue = /obj/item/organ/tongue/snail + mutanteyes = /obj/item/organ/internal/eyes/snail + mutanttongue = /obj/item/organ/internal/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 ec4a11ad709..9201a2f870d 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -28,8 +28,8 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN exotic_bloodtype = "U" use_skintones = TRUE - mutantheart = /obj/item/organ/heart/vampire - mutanttongue = /obj/item/organ/tongue/vampire + mutantheart = /obj/item/organ/internal/heart/vampire + mutanttongue = /obj/item/organ/internal/tongue/vampire examine_limb_id = SPECIES_HUMAN skinned_type = /obj/item/stack/sheet/animalhide/human ///some starter text sent to the vampire initially, because vampires have shit to do to stay alive @@ -145,7 +145,7 @@ return to_add -/obj/item/organ/tongue/vampire +/obj/item/organ/internal/tongue/vampire name = "vampire tongue" actions_types = list(/datum/action/item_action/organ_action/vampire) color = "#1C1C1C" @@ -159,7 +159,7 @@ . = ..() if(iscarbon(owner)) var/mob/living/carbon/H = owner - var/obj/item/organ/tongue/vampire/V = target + var/obj/item/organ/internal/tongue/vampire/V = target if(!COOLDOWN_FINISHED(V, drain_cooldown)) to_chat(H, span_warning("You just drained blood, wait a few seconds!")) return @@ -195,7 +195,7 @@ if(!victim.blood_volume) to_chat(H, span_notice("You finish off [victim]'s blood supply.")) -/obj/item/organ/heart/vampire +/obj/item/organ/internal/heart/vampire name = "vampire heart" color = "#1C1C1C" 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 797d64bc62b..c051c8e3bd8 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -27,7 +27,7 @@ TRAIT_NOCLONELOSS, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/tongue/zombie + mutanttongue = /obj/item/organ/internal/tongue/zombie var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE liked_food = GROSS | MEAT | RAW @@ -83,7 +83,7 @@ mutanthands = /obj/item/zombie_hand armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 1.6 - mutanteyes = /obj/item/organ/eyes/night_vision/zombie + mutanteyes = /obj/item/organ/internal/eyes/night_vision/zombie changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN /// The rate the zombies regenerate at var/heal_rate = 0.5 @@ -123,7 +123,7 @@ //Congrats you somehow died so hard you stopped being a zombie /datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C) . = ..() - var/obj/item/organ/zombie_infection/infection + var/obj/item/organ/internal/zombie_infection/infection infection = C.getorganslot(ORGAN_SLOT_ZOMBIE) if(infection) qdel(infection) @@ -134,7 +134,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/zombie_infection/infection + var/obj/item/organ/internal/zombie_infection/infection infection = C.getorganslot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() @@ -146,7 +146,7 @@ id = SPECIES_ZOMBIE_KROKODIL examine_limb_id = SPECIES_HUMAN sexes = 0 - mutanttongue = /obj/item/organ/tongue/zombie + mutanttongue = /obj/item/organ/internal/tongue/zombie changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN bodypart_overrides = list( diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ad59c5ecf44..8b3968535c6 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -48,8 +48,8 @@ //Start of a breath chain, calls breathe() /mob/living/carbon/handle_breathing(delta_time, times_fired) var/next_breath = 4 - var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) - var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/heart/H = getorganslot(ORGAN_SLOT_HEART) if(L) if(L.damage > L.high_threshold) next_breath-- @@ -70,7 +70,7 @@ //Second link in a breath chain, calls check_breath() /mob/living/carbon/proc/breathe(delta_time, times_fired) - var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs = getorganslot(ORGAN_SLOT_LUNGS) if(reagents.has_reagent(/datum/reagent/toxin/lexorin, needs_metabolizing = TRUE)) return @@ -138,7 +138,7 @@ if(HAS_TRAIT(src, TRAIT_NOBREATH)) return FALSE - var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs = getorganslot(ORGAN_SLOT_LUNGS) if(!lungs) adjustOxyLoss(2) @@ -336,8 +336,7 @@ if(stat == DEAD) if(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/V in internal_organs) - var/obj/item/organ/organ = V + for(var/obj/item/organ/internal/organ as anything in internal_organs) organ.on_death(delta_time, times_fired) //Needed so organs decay while inside the body. return @@ -345,7 +344,7 @@ for(var/slot in internal_organs_slot) // We don't use getorganslot 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/organ = internal_organs_slot[slot] + var/obj/item/organ/internal/organ = internal_organs_slot[slot] if(organ?.owner) // This exist mostly because reagent metabolization can cause organ reshuffling organ.on_life(delta_time, times_fired) @@ -579,7 +578,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/get_fullness() var/fullness = nutrition - var/obj/item/organ/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH) if(!belly) //nothing to see here if we do not have a stomach return fullness @@ -597,7 +596,7 @@ All effects don't start immediately, but rather get worse over time; the rate is . = ..() if(.) return - var/obj/item/organ/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH) if(!belly) return FALSE return belly.reagents.has_reagent(reagent, amount, needs_metabolizing) @@ -612,7 +611,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(!dna) return - var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if(liver) return @@ -626,7 +625,7 @@ All effects don't start immediately, but rather get worse over time; the rate is adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* delta_time) /mob/living/carbon/proc/undergoing_liver_failure() - var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if(liver?.organ_flags & ORGAN_FAILING) return TRUE @@ -701,7 +700,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/proc/can_heartattack() if(!needs_heart()) return FALSE - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(!heart || (heart.organ_flags & ORGAN_SYNTHETIC)) return FALSE return TRUE @@ -721,7 +720,7 @@ All effects don't start immediately, but rather get worse over time; the rate is * related situations (i.e not just cardiac arrest) */ /mob/living/carbon/proc/undergoing_cardiac_arrest() - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(istype(heart) && heart.beating) return FALSE else if(!needs_heart()) @@ -732,7 +731,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(!can_heartattack()) return FALSE - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(!istype(heart)) return diff --git a/code/modules/mob/living/carbon/skillchip.dm b/code/modules/mob/living/carbon/skillchip.dm index 35269c61eaa..da44268b0ac 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/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = getorganslot(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/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = getorganslot(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/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = getorganslot(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/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = getorganslot(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 f0ef1fe8ea5..89e28e585d2 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -31,17 +31,17 @@ /mob/living/carbon/proc/get_traumas() . = list() - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) . = B.traumas /mob/living/carbon/proc/has_trauma_type(brain_trauma_type, resilience) - var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(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/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) var/list/arguments = list() if(args.len > 2) @@ -49,16 +49,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/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(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/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(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/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) . = B.cure_all_traumas(resilience) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 249c9f51c3f..dc5df9e55be 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -64,7 +64,7 @@ //MMI stuff. Held togheter by magic. ~Miauw if(!mmi?.brainmob) mmi = new (src) - mmi.brain = new /obj/item/organ/brain(mmi) + mmi.brain = new /obj/item/organ/internal/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/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 1bd0bfe3bb3..be5894ba393 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -67,7 +67,7 @@ return current_target.set_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) - var/obj/item/organ/ears/target_ears = current_target.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/target_ears = current_target.getorganslot(ORGAN_SLOT_EARS) if(target_ears && !HAS_TRAIT_FROM(current_target, TRAIT_DEAF, CLOTHING_TRAIT)) target_ears.adjustEarDamage(0, 5) //far less damage than the H.O.N.K. current_target.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 48321556ea3..388ab7a754d 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -21,7 +21,7 @@ unsuitable_atmos_damage = 0.5 animal_species = /mob/living/simple_animal/pet/cat childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1) - butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1) + 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/stack/sheet/animalhide/cat = 1) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -72,7 +72,7 @@ icon_dead = "breadcat_dead" collar_type = null held_state = "breadcat" - butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1, /obj/item/food/breadslice/plain = 1) + 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/food/breadslice/plain = 1) /mob/living/simple_animal/pet/cat/breadcat/add_cell_sample() return @@ -281,7 +281,7 @@ maxHealth = 50 gender = FEMALE harm_intent_damage = 10 - butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/cakeslice/birthday = 3, \ + butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/cakeslice/birthday = 3, \ /obj/item/food/meat/slab = 2) response_harm_continuous = "takes a bite out of" response_harm_simple = "take a bite out of" @@ -295,7 +295,7 @@ /mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts) ..() - var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents + var/obj/item/organ/internal/brain/B = locate(/obj/item/organ/internal/brain) in contents if(!B || !B.brainmob || !B.brainmob.mind) return B.brainmob.mind.transfer_to(src) diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index a325f8de9e0..53f6d580586 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -18,7 +18,7 @@ speak_chance = 1 turns_per_move = 10 icon = 'icons/mob/penguins.dmi' - butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) + butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) footstep_type = FOOTSTEP_MOB_BAREFOOT @@ -35,7 +35,7 @@ icon_living = "penguin" icon_dead = "penguin_dead" gold_core_spawnable = FRIENDLY_SPAWN - butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) + butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 3) /mob/living/simple_animal/pet/penguin/emperor/shamebrero name = "Shamebrero penguin" @@ -56,5 +56,5 @@ density = FALSE pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL - butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) + butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1) diff --git a/code/modules/mob/living/simple_animal/heretic_monsters.dm b/code/modules/mob/living/simple_animal/heretic_monsters.dm index af19683a97f..91469ab0bb9 100644 --- a/code/modules/mob/living/simple_animal/heretic_monsters.dm +++ b/code/modules/mob/living/simple_animal/heretic_monsters.dm @@ -60,7 +60,7 @@ maxHealth = 65 health = 65 sight = SEE_MOBS|SEE_OBJS|SEE_TURFS - loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/l_arm, /obj/item/organ/eyes) + loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/l_arm, /obj/item/organ/internal/eyes) spells_to_add = list( /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash/long, /obj/effect/proc_holder/spell/targeted/telepathy/eldritch, diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 4c3a97cd7d5..dc9e6a6ca3a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -142,7 +142,7 @@ response_harm_simple = "take a bite out of" attacked_sound = 'sound/items/eatfood.ogg' deathmessage = "loses its false life and collapses!" - butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/brain = 1, /obj/item/organ/heart = 1) + 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) attack_sound = 'sound/weapons/slap.ogg' attack_vis_effect = ATTACK_EFFECT_DISARM attack_verb_simple = "slap" @@ -165,7 +165,7 @@ /mob/living/simple_animal/hostile/bear/butter/CheckParts(list/parts) //Borrowed code from Cak, allows the brain used to actually control the bear. ..() - var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents + var/obj/item/organ/internal/brain/B = locate(/obj/item/organ/internal/brain) in contents if(!B || !B.brainmob || !B.brainmob.mind) return B.brainmob.mind.transfer_to(src) diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index ec7215669ce..5677b2752fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -34,10 +34,10 @@ . = ..() if(. && prob(35) && iscarbon(target)) var/mob/living/carbon/human/L = target - var/obj/item/organ/tail/cat/tail = L.getorgan(/obj/item/organ/tail/cat) + var/obj/item/organ/external/tail/cat/tail = L.getorgan(/obj/item/organ/external/tail/cat) if(!QDELETED(tail)) visible_message(span_notice("[src] severs [L]'s tail in one swift swipe!"), span_notice("You sever [L]'s tail in one swift swipe.")) tail.Remove(L) - var/obj/item/organ/tail/cat/dropped_tail = new(target.drop_location()) + var/obj/item/organ/external/tail/cat/dropped_tail = new(target.drop_location()) dropped_tail.color = L.hair_color return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index c69cf9f90f9..1fc05949912 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -29,7 +29,7 @@ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) - var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) + var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) egg.Insert(victim) if(origin) egg.origin = origin @@ -54,13 +54,13 @@ to_chat(src, span_userdanger("With our egg laid, our death approaches rapidly...")) addtimer(CALLBACK(src, .proc/death), 100) -/obj/item/organ/body_egg/changeling_egg +/obj/item/organ/internal/body_egg/changeling_egg name = "changeling egg" desc = "Twitching and disgusting." var/datum/mind/origin var/time = 0 -/obj/item/organ/body_egg/changeling_egg/egg_process(delta_time, times_fired) +/obj/item/organ/internal/body_egg/changeling_egg/egg_process(delta_time, times_fired) // Changeling eggs grow in dead people time += delta_time * 10 if(time >= EGG_INCUBATION_TIME) @@ -68,7 +68,7 @@ Remove(owner) qdel(src) -/obj/item/organ/body_egg/changeling_egg/proc/Pop() +/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop() var/mob/living/carbon/human/species/monkey/spawned_monkey = new(owner) for(var/obj/item/organ/I in src) 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 2249882b095..06843b08914 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -150,7 +150,7 @@ Difficulty: Hard */ /mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params) . = ..() - if(istype(W, /obj/item/organ/tongue)) + if(istype(W, /obj/item/organ/internal/tongue)) user.client?.give_award(/datum/award/achievement/misc/frenching, user) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 4e74666f39d..95702e6ae69 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/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) if(istype(tongue)) . = tongue.taste_sensitivity else diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index d2b5ca47865..9d238ed0e2a 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -234,34 +234,34 @@ var/charge_modifier = 0.1 /obj/item/mod/core/ethereal/charge_source() - var/obj/item/organ/stomach/ethereal/ethereal_stomach = mod.wearer.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/ethereal/ethereal_stomach = mod.wearer.getorganslot(ORGAN_SLOT_STOMACH) if(!istype(ethereal_stomach)) return return ethereal_stomach /obj/item/mod/core/ethereal/charge_amount() - var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() return charge_source?.crystal_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/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/internal/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/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/internal/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/update_charge_alert() - var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source() if(charge_source) mod.wearer.clear_alert(ALERT_MODSUIT_CHARGE) return diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index efe8659569e..9197d6c87f6 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -46,7 +46,7 @@ return ..() /obj/item/paperplane/suicide_act(mob/living/user) - var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) user.Stun(200) 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_blurriness(6) @@ -101,7 +101,7 @@ if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/H = hit_atom - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(prob(hit_probability)) if(H.is_eyes_covered()) return diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 89c0ba81cd2..7bfe5084819 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -178,7 +178,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/apc_interactor = user - var/obj/item/organ/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.getorganslot(ORGAN_SLOT_STOMACH) if(!istype(maybe_ethereal_stomach)) togglelock(user) else @@ -191,12 +191,12 @@ if(!ishuman(user)) return var/mob/living/carbon/human/ethereal = user - var/obj/item/organ/stomach/maybe_stomach = ethereal.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/maybe_stomach = ethereal.getorganslot(ORGAN_SLOT_STOMACH) - if(!istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) + if(!istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) return var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - APC_POWER_GAIN - var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach if(!((stomach?.drain_time < world.time) && LAZYACCESS(modifiers, RIGHT_CLICK))) return if(ethereal.combat_mode) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index ffe26bcc4bb..02db057735a 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -215,12 +215,12 @@ /obj/item/stock_parts/cell/attack_self(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user - var/obj/item/organ/stomach/maybe_stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/maybe_stomach = H.getorganslot(ORGAN_SLOT_STOMACH) - if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) + if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - CELL_POWER_GAIN - var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach if((stomach.drain_time > world.time) || !stomach) return if(charge < CELL_POWER_DRAIN) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 757ca216382..2a2d7e46581 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -470,9 +470,9 @@ var/mob/living/carbon/human/electrician = user if(istype(electrician)) - var/obj/item/organ/stomach/maybe_stomach = electrician.getorganslot(ORGAN_SLOT_STOMACH) - if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal)) - var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach + var/obj/item/organ/internal/stomach/maybe_stomach = electrician.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal)) + var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach if(stomach.drain_time > world.time) return to_chat(electrician, span_notice("You start channeling some power through the [fitting] into your body.")) diff --git a/code/modules/power/supermatter/supermatter_cascade_components.dm b/code/modules/power/supermatter/supermatter_cascade_components.dm index 3281f2b7ab1..fae4dd5d9d1 100644 --- a/code/modules/power/supermatter/supermatter_cascade_components.dm +++ b/code/modules/power/supermatter/supermatter_cascade_components.dm @@ -72,7 +72,7 @@ var/mob/living/carbon/jedi = user to_chat(jedi, span_userdanger("That was a really dense idea.")) jedi.ghostize() - var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.internal_organs + var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.internal_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 d19b61bb219..4ec79dcd555 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -62,7 +62,7 @@ var/mob/living/carbon/jedi = user to_chat(jedi, span_userdanger("That was a really dense idea.")) jedi.ghostize() - var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.internal_organs + var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.internal_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 e2f2f8b1b63..1090ef11782 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -164,7 +164,7 @@ return var/mob/living/carbon/jedi = user to_chat(jedi, span_userdanger("That was a shockingly dumb idea.")) - var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.internal_organs + var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.internal_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 c81916b7e34..55120800375 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -527,7 +527,7 @@ #define BRAINS_BLOWN_THROW_RANGE 3 #define BRAINS_BLOWN_THROW_SPEED 1 /obj/item/gun/ballistic/suicide_act(mob/user) - var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) if (B && chambered && chambered.loaded_projectile && can_trigger_gun(user) && !chambered.loaded_projectile.nodamage) 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(25) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a8bb76d18d7..7f5a3c11be7 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -472,7 +472,7 @@ else if(!ignore_stomach && (methods & INGEST) && istype(target, /mob/living/carbon)) var/mob/living/carbon/eater = target - var/obj/item/organ/stomach/belly = eater.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = eater.getorganslot(ORGAN_SLOT_STOMACH) if(!belly) eater.expel_ingested(my_atom, amount) return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 091fd551663..530f81f2150 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -51,7 +51,7 @@ All effects don't start immediately, but rather get worse over time; the rate is // Volume, power, and server alcohol rate effect how quickly one gets drunk drinker.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE * REM * delta_time) if(boozepwr > 0) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if (istype(liver)) liver.applyOrganDamage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * delta_time, 0))/150)) return ..() @@ -251,7 +251,7 @@ All effects don't start immediately, but rather get worse over time; the rate is 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(DT_PROB(2.5, delta_time) && iscarbon(drinker)) - var/obj/item/organ/eyes/eyes = drinker.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = drinker.getorganslot(ORGAN_SLOT_EYES) if(drinker.is_blind()) if(istype(eyes)) eyes.Remove(drinker) @@ -658,7 +658,7 @@ All effects don't start immediately, but rather get worse over time; the rate is chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") if (HAS_TRAIT(drinker, TRAIT_IRRADIATED)) @@ -790,7 +790,7 @@ All effects don't start immediately, but rather get worse over time; the rate is 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/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) beepsky_hallucination = new() drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) @@ -798,7 +798,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) drinker.set_timed_status_effect(4 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(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)) drinker.adjustStaminaLoss(-10 * REM * delta_time, 0) @@ -815,7 +815,7 @@ All effects don't start immediately, but rather get worse over time; the rate is return ..() /datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(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) @@ -1333,7 +1333,7 @@ All effects don't start immediately, but rather get worse over time; the rate is chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) . = TRUE @@ -1692,7 +1692,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) . = TRUE @@ -1712,7 +1712,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) drinker.heal_bodypart_damage(2 * REM * delta_time, 2 * REM * delta_time, 2 * REM * delta_time) . = TRUE diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index e5dbd0e033f..4c69bc6ac82 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -144,7 +144,7 @@ . = TRUE /datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume) - if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/stomach)) ) + if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/internal/stomach)) ) return A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05) @@ -395,7 +395,7 @@ var/mob/living/carbon/C = A if(trans_volume >= 0.6) //prevents cheesing with ultralow doses. C.adjustToxLoss((-1.5 * min(2, trans_volume) * REM) * normalise_creation_purity(), 0) //This is to promote iv pole use for that chemotherapy feel. - var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER] + var/obj/item/organ/internal/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER] if((L.organ_flags & ORGAN_FAILING) || !L) return conversion_amount = (trans_volume * (min(100 -C.getOrganLoss(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/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 104a11e6574..e2b1c7ea8c6 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -142,7 +142,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(M)) M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time, 0) . = TRUE @@ -795,7 +795,7 @@ M.adjustToxLoss(-0.5 * REM * delta_time, 0) M.adjustOxyLoss(-0.5 * REM * delta_time, 0) if(M.nutrition && (M.nutrition - 2 > 0)) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = M.getorganslot(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! M.adjust_nutrition(-2 * REM * delta_time) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a86384d346d..390ffab8426 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -442,7 +442,7 @@ M.Paralyze(10) M.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) else - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM)) if(DT_PROB(10, delta_time)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate M.heal_bodypart_damage(brute = 1, burn = 1) @@ -457,7 +457,7 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time, 0) . = TRUE @@ -818,7 +818,7 @@ return var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.getorganslot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 30) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index 45fb497de7e..bc08feb04e1 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -17,7 +17,7 @@ var/liver_damage = 0.5 /datum/reagent/impurity/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) if(!L)//Though, lets be safe C.adjustToxLoss(1 * REM * delta_time, FALSE)//Incase of no liver! return ..() 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 5829a847bc0..e13a987bad9 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 @@ -143,21 +143,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/on_gained_organ) RegisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN, .proc/on_removed_organ) - var/obj/item/organ/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) this_liver.alcohol_tolerance *= 2 /datum/reagent/impurity/libitoil/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/liver)) + if(!istype(organ, /obj/item/organ/internal/liver)) return - var/obj/item/organ/liver/this_liver = organ + var/obj/item/organ/internal/liver/this_liver = organ this_liver.alcohol_tolerance *= 2 /datum/reagent/impurity/libitoil/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/liver)) + if(!istype(organ, /obj/item/organ/internal/liver)) return - var/obj/item/organ/liver/this_liver = organ + var/obj/item/organ/internal/liver/this_liver = organ this_liver.alcohol_tolerance /= 2 /datum/reagent/impurity/libitoil/on_mob_delete(mob/living/L) @@ -165,7 +165,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/mob/living/carbon/consumer = L UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) if(!this_liver) return this_liver.alcohol_tolerance /= 2 @@ -370,19 +370,19 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() RegisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN, .proc/on_gained_organ) RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, .proc/on_removed_organ) - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/lungs = owner.getorganslot(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/lungs)) + if(!istype(organ, /obj/item/organ/internal/lungs)) return - var/obj/item/organ/lungs/lungs = organ + var/obj/item/organ/internal/lungs/lungs = organ apply_lung_levels(lungs) -/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/lungs/lungs) +/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/internal/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 @@ -400,12 +400,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/lungs)) + if(!istype(organ, /obj/item/organ/internal/lungs)) return - var/obj/item/organ/lungs/lungs = organ + var/obj/item/organ/internal/lungs/lungs = organ restore_lung_levels(lungs) -/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/lungs/lungs) +/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/internal/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 @@ -417,7 +417,7 @@ Basically, we fill the time between now and 2s from now with hands based off the . = ..() UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) if(!lungs) return restore_lung_levels(lungs) @@ -515,7 +515,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/back_from_the_dead = FALSE /datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/owner, delta_time) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) return ..() metabolization_rate = 0.35 @@ -549,14 +549,14 @@ Basically, we fill the time between now and 2s from now with hands based off the owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) if(owner.health < HEALTH_THRESHOLD_FULLCRIT) owner.add_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) if(!heart || heart.organ_flags & ORGAN_FAILING) remove_buffs(owner) ..() /datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/owner) remove_buffs(owner) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) if(owner.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500 explosion(owner, light_impact_range = 1, explosion_cause = src) qdel(heart) @@ -566,7 +566,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/penthrite/overdose_start(mob/living/carbon/owner) if(!back_from_the_dead) return ..() - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) if(!heart) //No heart? No life! REMOVE_TRAIT(owner, TRAIT_NODEATH, type) owner.stat = DEAD @@ -653,7 +653,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/brain_trauma/hypnosis // Hypnosis, same reason as obsessed, plus a bug makes it remain even after the neurowhine purges and then turn into "nothing" on the med reading upon a second application ) traumalist -= forbiddentraumas - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) traumalist = shuffle(traumalist) for(var/trauma in traumalist) if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)) @@ -679,9 +679,9 @@ Basically, we fill the time between now and 2s from now with hands based off the chemical_flags = REAGENT_DEAD_PROCESS tox_damage = 0 ///The old heart we're swapping for - var/obj/item/organ/heart/original_heart + var/obj/item/organ/internal/heart/original_heart ///The new heart that's temp added - var/obj/item/organ/heart/cursed/manual_heart + var/obj/item/organ/internal/heart/cursed/manual_heart ///Creates a new cursed heart and puts the old inside of it, then replaces the position of the old /datum/reagent/inverse/corazargh/on_mob_metabolize(mob/living/owner) @@ -705,7 +705,7 @@ Basically, we fill the time between now and 2s from now with hands based off the ///Intercepts the new heart and creates a new cursed heart - putting the old inside of it /datum/reagent/inverse/corazargh/proc/on_gained_organ(mob/owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/heart)) + if(!istype(organ, /obj/item/organ/internal/heart)) return var/mob/living/carbon/carbon_mob = owner original_heart = organ 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 9ca7bd96a5d..48e8def6285 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 @@ liver_damage = 0 /datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/owner, delta_time) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if(!eyes) return ..() eyes.applyOrganDamage(0.5 * REM * delta_time) @@ -61,7 +61,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM /datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, delta_time) - var/obj/item/organ/tongue/tongue = owner.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/tongue = owner.getorganslot(ORGAN_SLOT_TONGUE) if(!tongue) return ..() if(DT_PROB(4.0, delta_time)) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c6dc5bd9afc..87dfa1fad69 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -657,12 +657,12 @@ return RegisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN, .proc/on_gained_organ) RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, .proc/on_removed_organ) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if(!eyes) return improve_eyesight(owner, eyes) -/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/owner, obj/item/organ/eyes/eyes) +/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/owner, obj/item/organ/internal/eyes/eyes) delta_light = creation_purity*30 if(eyes.lighting_alpha) eyes.lighting_alpha -= delta_light @@ -671,29 +671,29 @@ eyes.see_in_dark += 3 owner.update_sight() -/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/owner, obj/item/organ/eyes/eyes) +/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/owner, obj/item/organ/internal/eyes/eyes) eyes.lighting_alpha += delta_light eyes.see_in_dark -= 3 owner.update_sight() /datum/reagent/medicine/oculine/proc/on_gained_organ(mob/owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/eyes)) + if(!istype(organ, /obj/item/organ/internal/eyes)) return - var/obj/item/organ/eyes/eyes = organ + var/obj/item/organ/internal/eyes/eyes = organ improve_eyesight(owner, eyes) /datum/reagent/medicine/oculine/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/eyes)) + if(!istype(organ, /obj/item/organ/internal/eyes)) return - var/obj/item/organ/eyes/eyes = organ + var/obj/item/organ/internal/eyes/eyes = organ restore_eyesight(prev_owner, eyes) /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) owner.adjust_blindness(-2 * REM * delta_time * normalise_creation_purity()) owner.adjust_blurriness(-2 * REM * delta_time * normalise_creation_purity()) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return ..() var/fix_prob = 10 @@ -713,7 +713,7 @@ ..() /datum/reagent/medicine/oculine/on_mob_delete(mob/living/owner) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) if(!eyes) return restore_eyesight(owner, eyes) @@ -746,7 +746,7 @@ message = composer.compose_message(owner, message_language, message, , spans, message_mods) /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - var/obj/item/organ/ears/ears = owner.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = owner.getorganslot(ORGAN_SLOT_EARS) if(!ears) return ..() ears.adjustEarDamage(-4 * REM * delta_time * normalise_creation_purity(), -4 * REM * delta_time * normalise_creation_purity()) @@ -1560,10 +1560,10 @@ M.adjustOxyLoss(rand(3, 4)) if(prob(50)) - var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) our_lungs.applyOrganDamage(1) else - var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) our_heart.applyOrganDamage(1) // i googled "natural coagulant" and a couple of results came up for banana peels, so after precisely 30 more seconds of research, i now dub grinding banana peels good for your blood diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4d5adc1cbbe..ae7043ecf1f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1899,7 +1899,7 @@ /datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/M, delta_time, times_fired) . = ..() - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) if(liver) // Heads of staff and the captain have a "royal metabolism" if(HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM)) @@ -2380,7 +2380,7 @@ . = ..() // Silently add the zombie infection organ to be activated upon death if(!exposed_mob.getorganslot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/zombie_infection/nodamage/ZI = new() + var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new() ZI.Insert(exposed_mob) /datum/reagent/magillitis diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 375963966bf..3124124102d 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -45,7 +45,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/stomach/stomach = carby.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/stomach = carby.getorganslot(ORGAN_SLOT_STOMACH) var/datum/reagent/eigenstate/eigen if(stomach) eigen = stomach.reagents.has_reagent(/datum/reagent/eigenstate) diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index ce1bbef01de..d6b704f625e 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -123,7 +123,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/eyes/empowered_eyes = affected_human.getorgan(/obj/item/organ/eyes) + var/obj/item/organ/internal/eyes/empowered_eyes = affected_human.getorgan(/obj/item/organ/internal/eyes) if(empowered_eyes) ADD_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction") empowered_eyes?.refresh() @@ -151,7 +151,7 @@ affected_human.dna?.species.disliked_food = initial(affected_human.dna?.species.disliked_food) affected_human.dna?.species.toxic_food = initial(affected_human.dna?.species.toxic_food) REMOVE_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction") - var/obj/item/organ/eyes/eyes = affected_human.getorgan(/obj/item/organ/eyes) + var/obj/item/organ/internal/eyes/eyes = affected_human.getorgan(/obj/item/organ/internal/eyes) eyes.refresh() ///Makes you a hypochondriac - I'd like to call it hypochondria, but "I could use some hypochondria" doesn't work @@ -180,7 +180,7 @@ possibilities += ALERT_TEMPERATURE_HOT if(!HAS_TRAIT(affected_carbon, TRAIT_RESISTCOLD)) possibilities += ALERT_TEMPERATURE_COLD - var/obj/item/organ/lungs/lungs = affected_carbon.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/lungs = affected_carbon.getorganslot(ORGAN_SLOT_LUNGS) if(lungs) if(lungs.safe_oxygen_min) possibilities += ALERT_NOT_ENOUGH_OXYGEN diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index b64f3c90235..c97483f6907 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -158,7 +158,7 @@ //first we determine if we can charge them var/did_we_charge = FALSE - var/obj/item/organ/stomach/ethereal/eth_stomach = blessed.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/ethereal/eth_stomach = blessed.getorganslot(ORGAN_SLOT_STOMACH) if(istype(eth_stomach)) eth_stomach.adjust_charge(60) did_we_charge = TRUE diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index 61198d31d3a..673d5857996 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -129,12 +129,12 @@ ..() var/altar_turf = get_turf(religious_tool) var/blessing = pick( - /obj/item/organ/cyberimp/arm/surgery, - /obj/item/organ/cyberimp/eyes/hud/diagnostic, - /obj/item/organ/cyberimp/eyes/hud/medical, - /obj/item/organ/cyberimp/mouth/breathing_tube, - /obj/item/organ/cyberimp/chest/thrusters, - /obj/item/organ/eyes/robotic/glow) + /obj/item/organ/internal/cyberimp/arm/surgery, + /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, + /obj/item/organ/internal/cyberimp/eyes/hud/medical, + /obj/item/organ/internal/cyberimp/mouth/breathing_tube, + /obj/item/organ/internal/cyberimp/chest/thrusters, + /obj/item/organ/internal/eyes/robotic/glow) new blessing(altar_turf) return TRUE /**** Pyre God ****/ @@ -532,7 +532,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/eyes/night_vision/maintenance_adapted/adapted = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/adapted = user.getorganslot(ORGAN_SLOT_EYES) if(adapted && istype(adapted)) to_chat(user, span_warning("Your eyes are already adapted!")) return FALSE @@ -540,12 +540,12 @@ /datum/religion_rites/adapted_eyes/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool) ..() - var/obj/item/organ/eyes/oldeyes = user.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/oldeyes = user.getorganslot(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/eyes/night_vision/maintenance_adapted/neweyes = new + var/obj/item/organ/internal/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 d9357c5553e..38f3850a828 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/heart + build_path = /obj/item/organ/internal/heart category = list(SPECIES_HUMAN,"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/lungs + build_path = /obj/item/organ/internal/lungs category = list(SPECIES_HUMAN,"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/liver + build_path = /obj/item/organ/internal/liver category = list(SPECIES_HUMAN,"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/stomach + build_path = /obj/item/organ/internal/stomach category = list(SPECIES_HUMAN,"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/appendix + build_path = /obj/item/organ/internal/appendix category = list(SPECIES_HUMAN,"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/eyes + build_path = /obj/item/organ/internal/eyes category = list(SPECIES_HUMAN,"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/ears + build_path = /obj/item/organ/internal/ears category = list(SPECIES_HUMAN,"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/tongue + build_path = /obj/item/organ/internal/tongue category = list(SPECIES_HUMAN,"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/tail/lizard/fake + build_path = /obj/item/organ/external/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/tongue/lizard + build_path = /obj/item/organ/internal/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/tail/monkey + build_path = /obj/item/organ/external/tail/monkey category = list("other","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/tail/cat + build_path = /obj/item/organ/external/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/ears/cat + build_path = /obj/item/organ/internal/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/lungs/plasmaman + build_path = /obj/item/organ/internal/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/tongue/bone/plasmaman + build_path = /obj/item/organ/internal/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/liver/plasmaman + build_path = /obj/item/organ/internal/liver/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/stomach/bone/plasmaman + build_path = /obj/item/organ/internal/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/stomach/ethereal + build_path = /obj/item/organ/internal/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/tongue/ethereal + build_path = /obj/item/organ/internal/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/lungs/ethereal + build_path = /obj/item/organ/internal/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/heart/ethereal + build_path = /obj/item/organ/internal/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 e252141e560..6dd0676a840 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -311,7 +311,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 600, /datum/material/glass = 400) - build_path = /obj/item/organ/eyes/robotic/shield + build_path = /obj/item/organ/internal/eyes/robotic/shield category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -322,7 +322,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 600, /datum/material/glass = 1000) - build_path = /obj/item/organ/eyes/robotic/glow + build_path = /obj/item/organ/internal/eyes/robotic/glow category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -333,7 +333,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 35 materials = list(/datum/material/iron = 600, /datum/material/glass = 250) - build_path = /obj/item/organ/cyberimp/mouth/breathing_tube + build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -344,7 +344,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = 2500, /datum/material/glass = 1500, /datum/material/silver = 1500) construction_time = 200 - build_path = /obj/item/organ/cyberimp/arm/surgery + build_path = /obj/item/organ/internal/cyberimp/arm/surgery category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -355,7 +355,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = 2500, /datum/material/glass = 1500, /datum/material/silver = 1500) construction_time = 200 - build_path = /obj/item/organ/cyberimp/arm/toolset + build_path = /obj/item/organ/internal/cyberimp/arm/toolset category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -366,7 +366,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 500, /datum/material/gold = 500) - build_path = /obj/item/organ/cyberimp/eyes/hud/medical + build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -377,7 +377,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 750, /datum/material/gold = 750) - build_path = /obj/item/organ/cyberimp/eyes/hud/security + build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -388,7 +388,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600) - build_path = /obj/item/organ/cyberimp/eyes/hud/diagnostic + build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -399,7 +399,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/uranium = 1000, /datum/material/diamond = 1000, /datum/material/bluespace = 1000) - build_path = /obj/item/organ/eyes/robotic/xray + build_path = /obj/item/organ/internal/eyes/robotic/xray category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -410,7 +410,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 600, /datum/material/gold = 600, /datum/material/plasma = 1000, /datum/material/diamond = 2000) - build_path = /obj/item/organ/eyes/robotic/thermals + build_path = /obj/item/organ/internal/eyes/robotic/thermals category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -421,7 +421,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 400, /datum/material/gold = 400) - build_path = /obj/item/organ/cyberimp/brain/anti_drop + build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -432,7 +432,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 60 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/silver = 500, /datum/material/gold = 1000) - build_path = /obj/item/organ/cyberimp/brain/anti_stun + build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -443,7 +443,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/gold = 500) - build_path = /obj/item/organ/cyberimp/chest/nutriment + build_path = /obj/item/organ/internal/cyberimp/chest/nutriment category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -454,7 +454,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 50 materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/gold = 500, /datum/material/uranium = 750) - build_path = /obj/item/organ/cyberimp/chest/nutriment/plus + build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -465,7 +465,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 60 materials = list(/datum/material/iron = 800, /datum/material/glass = 800, /datum/material/gold = 300, /datum/material/uranium = 500) - build_path = /obj/item/organ/cyberimp/chest/reviver + build_path = /obj/item/organ/internal/cyberimp/chest/reviver category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -476,7 +476,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 80 materials = list(/datum/material/iron = 4000, /datum/material/glass = 2000, /datum/material/silver = 1000, /datum/material/diamond = 1000) - build_path = /obj/item/organ/cyberimp/chest/thrusters + build_path = /obj/item/organ/internal/cyberimp/chest/thrusters category = list("Implants", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -543,7 +543,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/liver/cybernetic + build_path = /obj/item/organ/internal/liver/cybernetic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -552,7 +552,7 @@ desc = "A cybernetic liver." id = "cybernetic_liver_tier2" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/liver/cybernetic/tier2 + build_path = /obj/item/organ/internal/liver/cybernetic/tier2 /datum/design/cybernetic_liver/tier3 name = "Upgraded Cybernetic Liver" @@ -560,7 +560,7 @@ id = "cybernetic_liver_tier3" construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver=500) - build_path = /obj/item/organ/liver/cybernetic/tier3 + build_path = /obj/item/organ/internal/liver/cybernetic/tier3 /datum/design/cybernetic_heart name = "Basic Cybernetic Heart" @@ -569,7 +569,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/heart/cybernetic + build_path = /obj/item/organ/internal/heart/cybernetic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -578,7 +578,7 @@ desc = "A cybernetic heart." id = "cybernetic_heart_tier2" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/heart/cybernetic/tier2 + build_path = /obj/item/organ/internal/heart/cybernetic/tier2 /datum/design/cybernetic_heart/tier3 name = "Upgraded Cybernetic Heart" @@ -586,7 +586,7 @@ id = "cybernetic_heart_tier3" construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver=500) - build_path = /obj/item/organ/heart/cybernetic/tier3 + build_path = /obj/item/organ/internal/heart/cybernetic/tier3 /datum/design/cybernetic_lungs name = "Basic Cybernetic Lungs" @@ -595,7 +595,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/lungs/cybernetic + build_path = /obj/item/organ/internal/lungs/cybernetic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -604,7 +604,7 @@ desc = "A pair of cybernetic lungs." id = "cybernetic_lungs_tier2" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/lungs/cybernetic/tier2 + build_path = /obj/item/organ/internal/lungs/cybernetic/tier2 /datum/design/cybernetic_lungs/tier3 name = "Upgraded Cybernetic Lungs" @@ -612,7 +612,7 @@ id = "cybernetic_lungs_tier3" construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/organ/lungs/cybernetic/tier3 + build_path = /obj/item/organ/internal/lungs/cybernetic/tier3 /datum/design/cybernetic_stomach name = "Basic Cybernetic Stomach" @@ -621,7 +621,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/stomach/cybernetic + build_path = /obj/item/organ/internal/stomach/cybernetic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -630,7 +630,7 @@ desc = "A cybernetic stomach." id = "cybernetic_stomach_tier2" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/organ/stomach/cybernetic/tier2 + build_path = /obj/item/organ/internal/stomach/cybernetic/tier2 /datum/design/cybernetic_stomach/tier3 name = "Upgraded Cybernetic Stomach" @@ -638,7 +638,7 @@ id = "cybernetic_stomach_tier3" construction_time = 50 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/organ/stomach/cybernetic/tier3 + build_path = /obj/item/organ/internal/stomach/cybernetic/tier3 /datum/design/cybernetic_ears name = "Cybernetic Ears" @@ -647,7 +647,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 30 materials = list(/datum/material/iron = 250, /datum/material/glass = 400) - build_path = /obj/item/organ/ears/cybernetic + build_path = /obj/item/organ/internal/ears/cybernetic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -658,7 +658,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 40 materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/organ/ears/cybernetic/upgraded + build_path = /obj/item/organ/internal/ears/cybernetic/upgraded category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -669,7 +669,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 30 materials = list(/datum/material/iron = 250, /datum/material/glass = 400) - build_path = /obj/item/organ/eyes/robotic/basic + build_path = /obj/item/organ/internal/eyes/robotic/basic category = list("Cybernetics", "Medical Designs") departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -677,7 +677,7 @@ name = "Cybernetic Eyes" desc = "A pair of cybernetic eyes." id = "cybernetic_eyes_improved" - build_path = /obj/item/organ/eyes/robotic + build_path = /obj/item/organ/internal/eyes/robotic ///////////////////// ///Surgery Designs/// diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index a43f2546e8a..1b5e24abc88 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -54,7 +54,7 @@ if(iscarbon(caster)) var/mob/living/carbon/carbon_caster = caster - var/obj/item/organ/brain/lich_brain = carbon_caster.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/lich_brain = carbon_caster.getorganslot(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/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 8ca219027f7..31569b609c5 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -193,8 +193,8 @@ switch(upgrade_type) if(VAULT_TOXIN) to_chat(H, span_notice("You feel resistant to airborne toxins.")) - if(locate(/obj/item/organ/lungs) in H.internal_organs) - var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] + if(locate(/obj/item/organ/internal/lungs) in H.internal_organs) + var/obj/item/organ/internal/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] L.plas_breath_dam_min = 0 L.plas_breath_dam_max = 0 ADD_TRAIT(H, TRAIT_VIRUSIMMUNE, "dna_vault") diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm index f17d50524a5..9684aca4f01 100644 --- a/code/modules/surgery/advanced/bioware/cortex_folding.dm +++ b/code/modules/surgery/advanced/bioware/cortex_folding.dm @@ -14,7 +14,7 @@ bioware_target = BIOWARE_CORTEX /datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(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 65e961c1224..70f79e2dbd0 100644 --- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm +++ b/code/modules/surgery/advanced/bioware/cortex_imprint.dm @@ -14,7 +14,7 @@ bioware_target = BIOWARE_CORTEX /datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(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 0f3962c003a..6a242f0d0d0 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -20,7 +20,7 @@ /datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(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 63df1667a19..7f066a0b254 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -16,7 +16,7 @@ /datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target) if(!..()) return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE @@ -68,7 +68,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/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(target_brain) display_results(user, target, span_warning("You remove the wrong part, causing more damage!"), span_notice("[user] successfully lobotomizes [target]!"), diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm index 0916c1a6e58..983b71687f0 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/zombie_infection/z_infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) + var/obj/item/organ/internal/zombie_infection/z_infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) if(z_infection) return FALSE @@ -38,6 +38,6 @@ span_notice("[user] completes the surgery on [target]'s brain.")) display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") if(!target.getorganslot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/zombie_infection/z_infection = new() + var/obj/item/organ/internal/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 12f3f609a11..3b1ed3aed77 100644 --- a/code/modules/surgery/advanced/pacification.dm +++ b/code/modules/surgery/advanced/pacification.dm @@ -15,7 +15,7 @@ /datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target) . = ..() - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index a1b5ea3b6bd..c956063e48c 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -35,7 +35,7 @@ ///Is there a sprite difference between male and female? var/is_dimorphic = FALSE ///The actual color a limb is drawn as, set by /proc/update_limb() - VAR_PROTECTED/draw_color + var/draw_color //NEVER. EVER. EDIT THIS VALUE OUTSIDE OF UPDATE_LIMB. I WILL FIND YOU. It ruins the limb icon pipeline. /// BODY_ZONE_CHEST, BODY_ZONE_L_ARM, etc , used for def_zone var/body_zone @@ -162,6 +162,8 @@ if(length(wounds)) stack_trace("[type] qdeleted with [length(wounds)] uncleared wounds") wounds.Cut() + for(var/external_organ in external_organs) + qdel(external_organ) return ..() /obj/item/bodypart/forceMove(atom/destination) //Please. Never forcemove a limb if its's actually in use. This is only for borgs. @@ -678,6 +680,7 @@ if(!IS_ORGANIC_LIMB(src)) dmg_overlay_type = "robotic" + recolor_external_organs() return TRUE //to update the bodypart's icon when not attached to a mob @@ -804,7 +807,6 @@ image_dir, external_organ.bitflag_to_layer(external_layer), limb_gender, - external_organ.overrides_color ? external_organ.override_color(draw_color) : draw_color ) /obj/item/bodypart/deconstruct(disassembled = TRUE) @@ -985,11 +987,7 @@ QDEL_NULL(current_gauze) SEND_SIGNAL(src, COMSIG_BODYPART_GAUZE_DESTROYED) - -///Proc to turn bodypart into another. -/obj/item/bodypart/proc/change_bodypart(obj/item/bodypart/new_type) - RETURN_TYPE(/obj/item/bodypart) - - var/mob/living/carbon/our_owner = owner //dropping nulls the limb - var/obj/item/bodypart/new_part = new new_type() - new_part.replace_limb(our_owner, TRUE) +///Loops through all of the bodypart's external organs and update's their color. +/obj/item/bodypart/proc/recolor_external_organs() + for(var/obj/item/organ/external/ext_organ as anything in external_organs) + ext_organ.inherit_color(force = TRUE) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index b66c8561d92..973a4407003 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -68,6 +68,13 @@ organ.Remove(chest_owner) organ.forceMove(chest_owner.loc) . += organ + + for(var/obj/item/organ/external/ext_organ as anything in src.external_organs) + if(!(ext_organ.organ_flags & ORGAN_UNREMOVABLE)) + ext_organ.Remove(chest_owner) + ext_organ.forceMove(chest_owner.loc) + . += ext_organ + if(cavity_item) cavity_item.forceMove(chest_owner.loc) . += cavity_item @@ -99,6 +106,9 @@ scar.victim = null LAZYREMOVE(owner.all_scars, scar) + for(var/obj/item/organ/external/ext_organ as anything in external_organs) + ext_organ.transfer_to_limb(src, null) //Null is the second arg because the bodypart is being removed from it's owner. + var/mob/living/carbon/phantom_owner = set_owner(null) // so we can still refer to the guy who lost their limb after said limb forgets 'em for(var/datum/surgery/surgery as anything in phantom_owner.surgeries) //if we had an ongoing surgery on that limb, we stop it. @@ -187,12 +197,20 @@ var/datum/wound/loss/dismembering = new return dismembering.apply_dismember(src, wounding_type) -//when a limb is dropped, the internal organs are removed from the mob and put into the limb +///Transfers the organ to the limb, and to the limb's owner, if it has one. This is done on drop_limb(). /obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/bodypart, mob/living/carbon/bodypart_owner) Remove(bodypart_owner) + add_to_limb(bodypart) + +///Adds the organ to a bodypart, used in transfer_to_limb() +/obj/item/organ/proc/add_to_limb(obj/item/bodypart/bodypart) forceMove(bodypart) -/obj/item/organ/brain/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) +///Removes the organ from the limb, placing it into nullspace. +/obj/item/organ/proc/remove_from_limb() + moveToNullspace() + +/obj/item/organ/internal/brain/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) Remove(head_owner) //Changeling brain concerns are now handled in Remove forceMove(head) head.brain = src @@ -202,15 +220,15 @@ head.brainmob.forceMove(head) head.brainmob.set_stat(DEAD) -/obj/item/organ/eyes/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) +/obj/item/organ/internal/eyes/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) head.eyes = src ..() -/obj/item/organ/ears/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) +/obj/item/organ/internal/ears/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) head.ears = src ..() -/obj/item/organ/tongue/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) +/obj/item/organ/internal/tongue/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) head.tongue = src ..() @@ -306,15 +324,6 @@ if(!.) //If it failed to replace, re-attach their old limb as if nothing happened. old_limb.attach_limb(limb_owner, TRUE) -/obj/item/bodypart/head/replace_limb(mob/living/carbon/head_owner, special) - if(!istype(head_owner)) - return - var/obj/item/bodypart/head/head = head_owner.get_bodypart(body_zone) - if(!attach_limb(head_owner, special)) - return - if(head) - head.drop_limb(1) - /obj/item/bodypart/proc/attach_limb(mob/living/carbon/new_limb_owner, special) if(SEND_SIGNAL(new_limb_owner, COMSIG_CARBON_ATTACH_LIMB, src, special) & COMPONENT_NO_ATTACH) return FALSE @@ -347,7 +356,7 @@ break for(var/obj/item/organ/limb_organ in contents) - limb_organ.Insert(new_limb_owner) + limb_organ.Insert(new_limb_owner, TRUE) for(var/datum/wound/wound as anything in wounds) // we have to remove the wound from the limb wound list first, so that we can reapply it fresh with the new person @@ -415,7 +424,7 @@ ///Makes sure that the owner's bodytype flags match the flags of all of it's parts. /obj/item/bodypart/proc/synchronize_bodytypes(mob/living/carbon/carbon_owner) - if(!carbon_owner.dna.species) + if(!carbon_owner?.dna?.species) //carbon_owner and dna can somehow be null during garbage collection, at which point we don't care anyway. return var/all_limb_flags for(var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts) @@ -460,9 +469,7 @@ var/zone = initial(organ_path.zone) if(zone != limb_zone) continue - var/feature_key_name = dna.features[initial(organ_path.feature_key)] var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path) - new_organ.set_sprite(feature_key_name) new_organ.Insert(src) update_body_parts() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 02561d79bbb..fa4d95e2011 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -21,10 +21,10 @@ is_dimorphic = TRUE var/mob/living/brain/brainmob //The current occupant. - var/obj/item/organ/brain/brain //The brain organ - var/obj/item/organ/eyes/eyes - var/obj/item/organ/ears/ears - var/obj/item/organ/tongue/tongue + var/obj/item/organ/internal/brain/brain //The brain organ + var/obj/item/organ/internal/eyes/eyes + var/obj/item/organ/internal/ears/ears + var/obj/item/organ/internal/tongue/tongue /// Do we show the information about missing organs upon being examined? Defaults to TRUE, useful for Dullahan heads. var/show_organs_on_examine = TRUE @@ -221,7 +221,7 @@ hair_hidden = TRUE ///HAIR CHECKS END - if(!hair_hidden && !owner.getorgan(/obj/item/organ/brain) && !(NOBLOOD in species_flags_list)) + if(!hair_hidden && !owner.getorgan(/obj/item/organ/internal/brain) && !(NOBLOOD in species_flags_list)) show_debrained = TRUE else show_debrained = FALSE diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index 6c7b265688d..ce1830b2867 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -25,7 +25,7 @@ failure_sound = 'sound/surgery/organ2.ogg' /datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) if(!target_brain) return FALSE return TRUE diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 6d066f6e02c..a897cfb972f 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -12,7 +12,7 @@ organ_to_manipulate = ORGAN_SLOT_HEART /datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) if(target_heart) if(target_heart.damage > 60 && !target_heart.operated) return TRUE @@ -82,7 +82,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/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/internal/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) if(target_heart) //slightly worrying if we lost our heart mid-operation, but that's life target_heart.operated = TRUE display_results(user, target, span_notice("You successfully graft a bypass onto [target]'s heart."), diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 083e0f6cd5d..cc1c6e5ec7f 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -21,7 +21,7 @@ time = 64 /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/eyes/target_eyes = target.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/target_eyes = target.getorganslot(ORGAN_SLOT_EYES) if(!target_eyes) to_chat(user, span_warning("It's hard to do surgery on someone's eyes when [target.p_they()] [target.p_do()]n't have any.")) return FALSE @@ -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/eyes/target_eyes = target.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/internal/eyes/target_eyes = target.getorganslot(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, target, span_notice("You succeed in fixing [target]'s eyes."), span_notice("[user] successfully fixes [target]'s eyes!"), @@ -48,7 +48,7 @@ return ..() /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorgan(/obj/item/organ/brain)) + if(target.getorgan(/obj/item/organ/internal/brain)) display_results(user, target, span_warning("You accidentally stab [target] right in the brain!"), span_warning("[user] accidentally stabs [target] right in the brain!"), span_warning("[user] accidentally stabs [target] right in the brain!")) diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm index cde2b251920..33e5cd78cde 100644 --- a/code/modules/surgery/gastrectomy.dm +++ b/code/modules/surgery/gastrectomy.dm @@ -15,7 +15,7 @@ organ_to_manipulate = ORGAN_SLOT_STOMACH /datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) if(target_stomach?.damage > 50 && !(target_stomach.organ_flags & ORGAN_FAILING)) return TRUE diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index 445459f298c..9b74027e7c5 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -14,7 +14,7 @@ organ_to_manipulate = ORGAN_SLOT_LIVER /datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/liver/target_liver = target.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/internal/liver/target_liver = target.getorganslot(ORGAN_SLOT_LIVER) if(target_liver?.damage > 50 && !(target_liver.organ_flags & ORGAN_FAILING)) return TRUE diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 6690f96c3d2..54e0bd54770 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -11,7 +11,7 @@ organ_to_manipulate = ORGAN_SLOT_LUNGS /datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/lungs/target_lungs = target.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/target_lungs = target.getorganslot(ORGAN_SLOT_LUNGS) if(target_lungs) if(target_lungs.damage > 60 && !target_lungs.operated) return TRUE @@ -40,7 +40,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/lungs/target_lungs = human_target.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/internal/lungs/target_lungs = human_target.getorganslot(ORGAN_SLOT_LUNGS) target_lungs.operated = TRUE human_target.setOrganLoss(ORGAN_SLOT_LUNGS, 60) display_results(user, target, span_notice("You successfully excise [human_target]'s most damaged lobe."), diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm new file mode 100644 index 00000000000..f327cfeee02 --- /dev/null +++ b/code/modules/surgery/organs/_organ.dm @@ -0,0 +1,291 @@ + +/obj/item/organ + name = "organ" + icon = 'icons/obj/surgery.dmi' + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + ///The mob that owns this organ. + var/mob/living/carbon/owner = null + var/status = ORGAN_ORGANIC + ///The body zone this organ is supposed to inhabit. + var/zone = BODY_ZONE_CHEST + ///The organ slot this organ is supposed to inhabit. This should be unique by type. (Lungs, Appendix, Stomach, etc) + var/slot + // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! + var/organ_flags = ORGAN_EDIBLE + var/maxHealth = STANDARD_ORGAN_THRESHOLD + /// Total damage this organ has sustained + /// Should only ever be modified by applyOrganDamage + var/damage = 0 + ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick + var/healing_factor = 0 //fraction of maxhealth healed per on_life(), set to 0 for generic organs + var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs + var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs + var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs + var/severe_cooldown //cooldown for severe effects, used for synthetic organ emp effects. + ///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds + var/prev_damage = 0 + var/low_threshold_passed + var/high_threshold_passed + var/now_failing + var/now_fixed + var/high_threshold_cleared + var/low_threshold_cleared + + ///When you take a bite you cant jam it in for surgery anymore. + var/useable = TRUE + var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) + ///The size of the reagent container + var/reagent_vol = 10 + + var/failure_time = 0 + ///Do we effect the appearance of our mob. Used to save time in preference code + var/visual = TRUE + +// Players can look at prefs before atoms SS init, and without this +// they would not be able to see external organs, such as moth wings. +// This is also necessary because assets SS is before atoms, and so +// any nonhumans created in that time would experience the same effect. +INITIALIZE_IMMEDIATE(/obj/item/organ) + +/obj/item/organ/Initialize(mapload) + . = ..() + if(organ_flags & ORGAN_EDIBLE) + AddComponent(/datum/component/edible,\ + initial_reagents = food_reagents,\ + foodtypes = RAW | MEAT | GROSS,\ + volume = reagent_vol,\ + after_eat = CALLBACK(src, .proc/OnEatFrom)) + +/obj/item/organ/forceMove(atom/destination, check_dest = TRUE) + if(check_dest && destination) //Nullspace is always a valid location for organs. Because reasons. + if(organ_flags & ORGAN_UNREMOVABLE) //If this organ is unremovable, it should delete itself if it tries to be moved to anything besides a bodypart. + if(!istype(destination, /obj/item/bodypart) || !iscarbon(destination)) + qdel(src) + return //Don't move it out of nullspace if it's deleted. + return ..() + +/* + * Insert the organ into the select mob. + * + * reciever - the mob who will get our organ + * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment + * drop_if_replaced - if there's an organ in the slot already, whether we drop it afterwards + */ +/obj/item/organ/proc/Insert(mob/living/carbon/reciever, special = FALSE, drop_if_replaced = TRUE) + if(!iscarbon(reciever) || owner == reciever) + return FALSE + + var/obj/item/organ/replaced = reciever.getorganslot(slot) + if(replaced) + replaced.Remove(reciever, special = TRUE) + if(drop_if_replaced) + replaced.forceMove(get_turf(reciever)) + else + qdel(replaced) + + SEND_SIGNAL(src, COMSIG_ORGAN_IMPLANTED, reciever) + SEND_SIGNAL(reciever, COMSIG_CARBON_GAIN_ORGAN, src, special) + + owner = reciever + moveToNullspace() + RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/on_owner_examine) + for(var/datum/action/action as anything in actions) + action.Grant(reciever) + return TRUE + + +/* + * Remove the organ from the select mob. + * + * organ_owner - the mob who owns our organ, that we're removing the organ from. + * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment + */ +/obj/item/organ/proc/Remove(mob/living/carbon/organ_owner, special = FALSE) + + UnregisterSignal(owner, COMSIG_PARENT_EXAMINE) + + owner = null + for(var/datum/action/action as anything in actions) + action.Remove(organ_owner) + + SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) + SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) + + +/obj/item/organ/proc/on_owner_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + return + +/obj/item/organ/proc/on_find(mob/living/finder) + return + +/obj/item/organ/process(delta_time, times_fired) + return + +/obj/item/organ/proc/on_death(delta_time, times_fired) + return + +/obj/item/organ/proc/on_life(delta_time, times_fired) + CRASH("Oh god oh fuck something is calling parent organ life") + +/obj/item/organ/examine(mob/user) + . = ..() + + . += span_notice("It should be inserted in the [parse_zone(zone)].") + + if(organ_flags & ORGAN_FAILING) + if(status == ORGAN_ROBOTIC) + . += span_warning("[src] seems to be broken.") + return + . += span_warning("[src] has decayed for too long, and has turned a sickly color. It probably won't work without repairs.") + return + + if(damage > high_threshold) + . += span_warning("[src] is starting to look discolored.") + +///Used as callbacks by object pooling +/obj/item/organ/proc/exit_wardrobe() + return + +//See above +/obj/item/organ/proc/enter_wardrobe() + return + +/obj/item/organ/proc/OnEatFrom(eater, feeder) + useable = FALSE //You can't use it anymore after eating it you spaztic + +/obj/item/organ/item_action_slot_check(slot,mob/user) + return //so we don't grant the organ's action to mobs who pick up the organ. + +///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage +/obj/item/organ/proc/applyOrganDamage(damage_amount, maximum = maxHealth) //use for damaging effects + if(!damage_amount) //Micro-optimization. + return + if(maximum < damage) + return + damage = clamp(damage + damage_amount, 0, maximum) + var/mess = check_damage_thresholds(owner) + check_failing_thresholds() + prev_damage = damage + if(mess && owner && owner.stat <= SOFT_CRIT) + to_chat(owner, mess) + +///SETS an organ's damage to the amount "damage_amount", and in doing so clears or sets the failing flag, good for when you have an effect that should fix an organ if broken +/obj/item/organ/proc/setOrganDamage(damage_amount) //use mostly for admin heals + applyOrganDamage(damage_amount - damage) + +/** check_damage_thresholds + * input: mob/organ_owner (a mob, the owner of the organ we call the proc on) + * output: returns a message should get displayed. + * description: By checking our current damage against our previous damage, we can decide whether we've passed an organ threshold. + * If we have, send the corresponding threshold message to the owner, if such a message exists. + */ +/obj/item/organ/proc/check_damage_thresholds(mob/organ_owner) + if(damage == prev_damage) + return + var/delta = damage - prev_damage + if(delta > 0) + if(damage >= maxHealth) + return now_failing + if(damage > high_threshold && prev_damage <= high_threshold) + return high_threshold_passed + if(damage > low_threshold && prev_damage <= low_threshold) + return low_threshold_passed + else + if(prev_damage > low_threshold && damage <= low_threshold) + return low_threshold_cleared + if(prev_damage > high_threshold && damage <= high_threshold) + return high_threshold_cleared + if(prev_damage == maxHealth) + return now_fixed + +///Checks if an organ should/shouldn't be failing and gives the appropriate organ flag +/obj/item/organ/proc/check_failing_thresholds() + if(damage >= maxHealth) + organ_flags |= ORGAN_FAILING + if(damage < maxHealth) + organ_flags &= ~ORGAN_FAILING + +//Looking for brains? +//Try code/modules/mob/living/carbon/brain/brain_item.dm + +/mob/living/proc/regenerate_organs() + return FALSE + +/mob/living/carbon/regenerate_organs() + if(dna?.species) + dna.species.regenerate_organs(src) + return + + else + var/obj/item/organ/internal/lungs/lungs = getorganslot(ORGAN_SLOT_LUNGS) + if(!lungs) + lungs = new() + lungs.Insert(src) + lungs.setOrganDamage(0) + + var/obj/item/organ/internal/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(!heart) + heart = new() + heart.Insert(src) + heart.setOrganDamage(0) + + var/obj/item/organ/internal/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) + if(!tongue) + tongue = new() + tongue.Insert(src) + tongue.setOrganDamage(0) + + var/obj/item/organ/internal/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(!eyes) + eyes = new() + eyes.Insert(src) + eyes.setOrganDamage(0) + + var/obj/item/organ/internal/ears/ears = getorganslot(ORGAN_SLOT_EARS) + if(!ears) + ears = new() + ears.Insert(src) + ears.setOrganDamage(0) + +/obj/item/organ/proc/handle_failing_organs(delta_time) + return + +/** organ_failure + * generic proc for handling dying organs + * + * Arguments: + * delta_time - seconds since last tick + */ +/obj/item/organ/proc/organ_failure(delta_time) + return + +/** get_availability + * returns whether the species should innately have this organ. + * + * regenerate organs works with generic organs, so we need to get whether it can accept certain organs just by what this returns. + * This is set to return true or false, depending on if a species has a specific organless trait. stomach for example checks if the species has NOSTOMACH and return based on that. + * Arguments: + * owner_species - species, needed to return whether the species has an organ specific trait + */ +/obj/item/organ/proc/get_availability(datum/species/owner_species) + return TRUE + +/// Called before organs are replaced in regenerate_organs with new ones +/obj/item/organ/proc/before_organ_replacement(obj/item/organ/replacement) + return + +/// Called by medical scanners to get a simple summary of how healthy the organ is. Returns an empty string if things are fine. +/obj/item/organ/proc/get_status_text() + var/status = "" + if(owner.has_reagent(/datum/reagent/inverse/technetium)) + status = " organ is [round((damage/maxHealth)*100, 1)]% damaged." + else if(organ_flags & ORGAN_FAILING) + status = "Non-Functional" + else if(damage > high_threshold) + status = "Severely Damaged" + else if (damage > low_threshold) + status = "Mildly Damaged" + + return status diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 7bc0acba3bb..79551dc9e80 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -2,7 +2,7 @@ #define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600) #define INFLAMATION_ADVANCEMENT_PROB 2 -/obj/item/organ/appendix +/obj/item/organ/internal/appendix name = "appendix" icon_state = "appendix" base_icon_state = "appendix" @@ -19,15 +19,15 @@ var/inflamation_stage = 0 -/obj/item/organ/appendix/update_name() +/obj/item/organ/internal/appendix/update_name() . = ..() name = "[inflamation_stage ? "inflamed " : null][initial(name)]" -/obj/item/organ/appendix/update_icon_state() +/obj/item/organ/internal/appendix/update_icon_state() icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]" return ..() -/obj/item/organ/appendix/on_life(delta_time, times_fired) +/obj/item/organ/internal/appendix/on_life(delta_time, times_fired) ..() var/mob/living/carbon/organ_owner = owner if(!organ_owner) @@ -41,14 +41,14 @@ else if(DT_PROB(APPENDICITIS_PROB, delta_time)) become_inflamed() -/obj/item/organ/appendix/proc/become_inflamed() +/obj/item/organ/internal/appendix/proc/become_inflamed() inflamation_stage = 1 update_appearance() if(owner) ADD_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) owner.med_hud_set_status() -/obj/item/organ/appendix/proc/inflamation(delta_time) +/obj/item/organ/internal/appendix/proc/inflamation(delta_time) var/mob/living/carbon/organ_owner = owner if(inflamation_stage < 3 && DT_PROB(INFLAMATION_ADVANCEMENT_PROB, delta_time)) inflamation_stage += 1 @@ -69,21 +69,22 @@ organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) -/obj/item/organ/appendix/get_availability(datum/species/owner_species) +/obj/item/organ/internal/appendix/get_availability(datum/species/owner_species) return !(TRAIT_NOHUNGER in owner_species.inherent_traits) -/obj/item/organ/appendix/Remove(mob/living/carbon/organ_owner, special = FALSE) +/obj/item/organ/internal/appendix/Remove(mob/living/carbon/organ_owner, special = FALSE) REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) organ_owner.med_hud_set_status() ..() -/obj/item/organ/appendix/Insert(mob/living/carbon/organ_owner, special = FALSE) - ..() - if(inflamation_stage) - ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) - organ_owner.med_hud_set_status() +/obj/item/organ/internal/appendix/Insert(mob/living/carbon/organ_owner, special = FALSE) + . = ..() + if(.) + if(inflamation_stage) + ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) + organ_owner.med_hud_set_status() -/obj/item/organ/appendix/get_status_text() +/obj/item/organ/internal/appendix/get_status_text() if((!(organ_flags & ORGAN_FAILING)) && inflamation_stage) return "Inflamed" else diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 308d72f1022..0617dd201c1 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -1,4 +1,4 @@ -/obj/item/organ/cyberimp/arm +/obj/item/organ/internal/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 @@ -18,7 +18,7 @@ /// Sound played when retracting var/retract_sound = 'sound/mecha/mechmove03.ogg' -/obj/item/organ/cyberimp/arm/Initialize(mapload) +/obj/item/organ/internal/cyberimp/arm/Initialize(mapload) . = ..() if(ispath(active_item)) active_item = new active_item(src) @@ -31,7 +31,7 @@ update_appearance() SetSlotFromZone() -/obj/item/organ/cyberimp/arm/Destroy() +/obj/item/organ/internal/cyberimp/arm/Destroy() hand = null active_item = null for(var/datum/weakref/ref in items_list) @@ -42,7 +42,7 @@ items_list.Cut() return ..() -/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() +/obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone() switch(zone) if(BODY_ZONE_L_ARM) slot = ORGAN_SLOT_LEFT_ARM_AUG @@ -51,16 +51,16 @@ else CRASH("Invalid zone for [type]") -/obj/item/organ/cyberimp/arm/update_icon() +/obj/item/organ/internal/cyberimp/arm/update_icon() . = ..() transform = (zone == BODY_ZONE_R_ARM) ? null : matrix(-1, 0, 0, 0, 1, 0) -/obj/item/organ/cyberimp/arm/examine(mob/user) +/obj/item/organ/internal/cyberimp/arm/examine(mob/user) . = ..() if(status == ORGAN_ROBOTIC) . += 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/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) . = ..() if(.) return TRUE @@ -73,7 +73,7 @@ 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/cyberimp/arm/Insert(mob/living/carbon/arm_owner, special = FALSE, drop_if_replaced = TRUE) +/obj/item/organ/internal/cyberimp/arm/Insert(mob/living/carbon/arm_owner, special = FALSE, drop_if_replaced = TRUE) . = ..() var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS hand = arm_owner.hand_bodyparts[side] @@ -81,18 +81,18 @@ RegisterSignal(hand, COMSIG_ITEM_ATTACK_SELF, .proc/on_item_attack_self) //If the limb gets an attack-self, open the menu. Only happens when hand is empty RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, .proc/dropkey) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. -/obj/item/organ/cyberimp/arm/Remove(mob/living/carbon/arm_owner, special = 0) +/obj/item/organ/internal/cyberimp/arm/Remove(mob/living/carbon/arm_owner, special = 0) Retract() if(hand) UnregisterSignal(hand, COMSIG_ITEM_ATTACK_SELF) UnregisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN) ..() -/obj/item/organ/cyberimp/arm/proc/on_item_attack_self() +/obj/item/organ/internal/cyberimp/arm/proc/on_item_attack_self() SIGNAL_HANDLER INVOKE_ASYNC(src, .proc/ui_action_click) -/obj/item/organ/cyberimp/arm/emp_act(severity) +/obj/item/organ/internal/cyberimp/arm/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF || status == ORGAN_ROBOTIC) return @@ -108,7 +108,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/cyberimp/arm/proc/dropkey(mob/living/carbon/host) +/obj/item/organ/internal/cyberimp/arm/proc/dropkey(mob/living/carbon/host) SIGNAL_HANDLER if(!host) return //How did we even get here @@ -117,7 +117,7 @@ if(Retract()) return COMSIG_KB_ACTIVATED -/obj/item/organ/cyberimp/arm/proc/Retract() +/obj/item/organ/internal/cyberimp/arm/proc/Retract() if(!active_item || (active_item in src)) return FALSE @@ -130,7 +130,7 @@ playsound(get_turf(owner), retract_sound, 50, TRUE) return TRUE -/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/augment) +/obj/item/organ/internal/cyberimp/arm/proc/Extend(obj/item/augment) if(!(augment in src)) return @@ -166,7 +166,7 @@ span_hear("You hear a short mechanical noise.")) playsound(get_turf(owner), extend_sound, 50, TRUE) -/obj/item/organ/cyberimp/arm/ui_action_click() +/obj/item/organ/internal/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 @@ -191,7 +191,7 @@ Retract() -/obj/item/organ/cyberimp/arm/gun/emp_act(severity) +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -206,34 +206,34 @@ organ_flags |= ORGAN_FAILING -/obj/item/organ/cyberimp/arm/gun/laser +/obj/item/organ/internal/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/cyberimp/arm/gun/laser/l +/obj/item/organ/internal/cyberimp/arm/gun/laser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/cyberimp/arm/gun/taser +/obj/item/organ/internal/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/cyberimp/arm/gun/taser/l +/obj/item/organ/internal/cyberimp/arm/gun/taser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/cyberimp/arm/toolset +/obj/item/organ/internal/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." items_to_create = list(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg, /obj/item/crowbar/cyborg, /obj/item/wirecutters/cyborg, /obj/item/multitool/cyborg) -/obj/item/organ/cyberimp/arm/toolset/l +/obj/item/organ/internal/cyberimp/arm/toolset/l zone = BODY_ZONE_L_ARM -/obj/item/organ/cyberimp/arm/toolset/emag_act(mob/user) +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user) 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)) @@ -243,23 +243,23 @@ items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src)) return TRUE -/obj/item/organ/cyberimp/arm/esword +/obj/item/organ/internal/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/cyberimp/arm/medibeam +/obj/item/organ/internal/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/cyberimp/arm/flash +/obj/item/organ/internal/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/cyberimp/arm/flash/Initialize(mapload) +/obj/item/organ/internal/cyberimp/arm/flash/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -268,26 +268,26 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code -/obj/item/organ/cyberimp/arm/flash/Extend() +/obj/item/organ/internal/cyberimp/arm/flash/Extend() . = ..() active_item.set_light_range(7) active_item.set_light_on(TRUE) -/obj/item/organ/cyberimp/arm/flash/Retract() +/obj/item/organ/internal/cyberimp/arm/flash/Retract() active_item.set_light_on(FALSE) return ..() -/obj/item/organ/cyberimp/arm/baton +/obj/item/organ/internal/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/cyberimp/arm/combat +/obj/item/organ/internal/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(/obj/item/melee/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) -/obj/item/organ/cyberimp/arm/combat/Initialize(mapload) +/obj/item/organ/internal/cyberimp/arm/combat/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -296,7 +296,7 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code -/obj/item/organ/cyberimp/arm/surgery +/obj/item/organ/internal/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." items_to_create = list(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 4498cf5d58c..4cdc4b9b96d 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -1,11 +1,11 @@ -/obj/item/organ/cyberimp/chest +/obj/item/organ/internal/cyberimp/chest name = "cybernetic torso implant" desc = "Implants for the organs in your torso." icon_state = "chest_implant" implant_overlay = "chest_implant_overlay" zone = BODY_ZONE_CHEST -/obj/item/organ/cyberimp/chest/nutriment +/obj/item/organ/internal/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 = "chest_implant" @@ -15,7 +15,7 @@ var/poison_amount = 5 slot = ORGAN_SLOT_STOMACH_AID -/obj/item/organ/cyberimp/chest/nutriment/on_life(delta_time, times_fired) +/obj/item/organ/internal/cyberimp/chest/nutriment/on_life(delta_time, times_fired) if(synthesizing) return @@ -25,10 +25,10 @@ owner.adjust_nutrition(25 * delta_time) addtimer(CALLBACK(src, .proc/synth_cool), 50) -/obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool() +/obj/item/organ/internal/cyberimp/chest/nutriment/proc/synth_cool() synthesizing = FALSE -/obj/item/organ/cyberimp/chest/nutriment/emp_act(severity) +/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -36,7 +36,7 @@ to_chat(owner, span_warning("You feel like your insides are burning.")) -/obj/item/organ/cyberimp/chest/nutriment/plus +/obj/item/organ/internal/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 = "chest_implant" @@ -44,7 +44,7 @@ hunger_threshold = NUTRITION_LEVEL_HUNGRY poison_amount = 10 -/obj/item/organ/cyberimp/chest/reviver +/obj/item/organ/internal/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 = "chest_implant" @@ -55,7 +55,7 @@ COOLDOWN_DECLARE(reviver_cooldown) -/obj/item/organ/cyberimp/chest/reviver/on_life(delta_time, times_fired) +/obj/item/organ/internal/cyberimp/chest/reviver/on_life(delta_time, times_fired) if(reviving) switch(owner.stat) if(UNCONSCIOUS, HARD_CRIT) @@ -76,7 +76,7 @@ to_chat(owner, span_notice("You feel a faint buzzing as your reviver implant starts patching your wounds...")) -/obj/item/organ/cyberimp/chest/reviver/proc/heal() +/obj/item/organ/internal/cyberimp/chest/reviver/proc/heal() if(owner.getOxyLoss()) owner.adjustOxyLoss(-5) revive_cost += 5 @@ -90,7 +90,7 @@ owner.adjustToxLoss(-1) revive_cost += 40 -/obj/item/organ/cyberimp/chest/reviver/emp_act(severity) +/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -107,7 +107,7 @@ to_chat(human_owner, span_userdanger("You feel a horrible agony in your chest!")) addtimer(CALLBACK(src, .proc/undo_heart_attack), 600 / severity) -/obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack() +/obj/item/organ/internal/cyberimp/chest/reviver/proc/undo_heart_attack() var/mob/living/carbon/human/human_owner = owner if(!istype(human_owner)) return @@ -116,7 +116,7 @@ to_chat(human_owner, span_notice("You feel your heart beating again!")) -/obj/item/organ/cyberimp/chest/thrusters +/obj/item/organ/internal/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." @@ -131,35 +131,35 @@ var/datum/callback/get_mover var/datum/callback/check_on_move -/obj/item/organ/cyberimp/chest/thrusters/Initialize(mapload) +/obj/item/organ/internal/cyberimp/chest/thrusters/Initialize(mapload) . = ..() get_mover = CALLBACK(src, .proc/get_user) check_on_move = CALLBACK(src, .proc/allow_thrust, 0.01) refresh_jetpack() -/obj/item/organ/cyberimp/chest/thrusters/Destroy() +/obj/item/organ/internal/cyberimp/chest/thrusters/Destroy() get_mover = null check_on_move = null return ..() -/obj/item/organ/cyberimp/chest/thrusters/proc/refresh_jetpack() +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/refresh_jetpack() AddComponent(/datum/component/jetpack, FALSE, COMSIG_THRUSTER_ACTIVATED, COMSIG_THRUSTER_DEACTIVATED, THRUSTER_ACTIVATION_FAILED, get_mover, check_on_move, /datum/effect_system/trail_follow/ion) -/obj/item/organ/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special = 0) +/obj/item/organ/internal/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special = 0) if(on) deactivate(silent = TRUE) ..() -/obj/item/organ/cyberimp/chest/thrusters/ui_action_click() +/obj/item/organ/internal/cyberimp/chest/thrusters/ui_action_click() toggle() -/obj/item/organ/cyberimp/chest/thrusters/proc/toggle(silent = FALSE) +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle(silent = FALSE) if(on) deactivate() else activate() -/obj/item/organ/cyberimp/chest/thrusters/proc/activate(silent = FALSE) +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/activate(silent = FALSE) if(on) return if(organ_flags & ORGAN_FAILING) @@ -175,7 +175,7 @@ to_chat(owner, span_notice("You turn your thrusters set on.")) update_appearance() -/obj/item/organ/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE) +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE) if(!on) return SEND_SIGNAL(src, COMSIG_THRUSTER_DEACTIVATED) @@ -185,11 +185,11 @@ on = FALSE update_appearance() -/obj/item/organ/cyberimp/chest/thrusters/update_icon_state() +/obj/item/organ/internal/cyberimp/chest/thrusters/update_icon_state() icon_state = "[base_icon_state][on ? "-on" : null]" return ..() -/obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE) +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE) if(!owner) return FALSE @@ -224,5 +224,5 @@ deactivate(silent = TRUE) return FALSE -/obj/item/organ/cyberimp/chest/thrusters/proc/get_user() +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/get_user() return owner diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index b3d45d74bd8..16a436fc1c1 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -1,4 +1,4 @@ -/obj/item/organ/cyberimp/eyes +/obj/item/organ/internal/cyberimp/eyes name = "cybernetic eye implant" desc = "Implants for your eyes." icon_state = "eye_implant" @@ -8,14 +8,14 @@ w_class = WEIGHT_CLASS_TINY // HUD implants -/obj/item/organ/cyberimp/eyes/hud +/obj/item/organ/internal/cyberimp/eyes/hud name = "HUD implant" desc = "These cybernetic eyes will display a HUD over everything you see. Maybe." slot = ORGAN_SLOT_HUD var/HUD_type = 0 var/HUD_trait = null -/obj/item/organ/cyberimp/eyes/hud/Insert(mob/living/carbon/eye_owner, special = 0, drop_if_replaced = FALSE) +/obj/item/organ/internal/cyberimp/eyes/hud/Insert(mob/living/carbon/eye_owner, special = 0, drop_if_replaced = FALSE) ..() if(HUD_type) var/datum/atom_hud/hud = GLOB.huds[HUD_type] @@ -23,7 +23,7 @@ if(HUD_trait) ADD_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) -/obj/item/organ/cyberimp/eyes/hud/Remove(mob/living/carbon/eye_owner, special = 0) +/obj/item/organ/internal/cyberimp/eyes/hud/Remove(mob/living/carbon/eye_owner, special = 0) if(HUD_type) var/datum/atom_hud/hud = GLOB.huds[HUD_type] hud.hide_from(eye_owner) @@ -31,24 +31,24 @@ REMOVE_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) ..() -/obj/item/organ/cyberimp/eyes/hud/medical +/obj/item/organ/internal/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." HUD_type = DATA_HUD_MEDICAL_ADVANCED HUD_trait = TRAIT_MEDICAL_HUD -/obj/item/organ/cyberimp/eyes/hud/security +/obj/item/organ/internal/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." HUD_type = DATA_HUD_SECURITY_ADVANCED HUD_trait = TRAIT_SECURITY_HUD -/obj/item/organ/cyberimp/eyes/hud/diagnostic +/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic name = "Diagnostic HUD implant" desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." HUD_type = DATA_HUD_DIAGNOSTIC_ADVANCED -/obj/item/organ/cyberimp/eyes/hud/security/syndicate +/obj/item/organ/internal/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." syndicate_implant = TRUE diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 2832ca9696d..fec8ee2e797 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -1,5 +1,5 @@ -/obj/item/organ/cyberimp +/obj/item/organ/internal/cyberimp name = "cybernetic implant" desc = "A state-of-the-art implant that improves a baseline's functionality." visual = FALSE @@ -9,7 +9,7 @@ var/implant_overlay var/syndicate_implant = FALSE //Makes the implant invisible to health analyzers and medical HUDs. -/obj/item/organ/cyberimp/New(mob/implanted_mob = null) +/obj/item/organ/internal/cyberimp/New(mob/implanted_mob = null) if(iscarbon(implanted_mob)) src.Insert(implanted_mob) if(implant_overlay) @@ -22,7 +22,7 @@ //[[[[BRAIN]]]] -/obj/item/organ/cyberimp/brain +/obj/item/organ/internal/cyberimp/brain name = "cybernetic brain implant" desc = "Injectors of extra sub-routines for the brain." icon_state = "brain_implant" @@ -30,7 +30,7 @@ zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY -/obj/item/organ/cyberimp/brain/emp_act(severity) +/obj/item/organ/internal/cyberimp/brain/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -39,7 +39,7 @@ to_chat(owner, span_warning("Your body seizes up!")) -/obj/item/organ/cyberimp/brain/anti_drop +/obj/item/organ/internal/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." var/active = FALSE @@ -48,7 +48,7 @@ slot = ORGAN_SLOT_BRAIN_ANTIDROP actions_types = list(/datum/action/item_action/organ_action/toggle) -/obj/item/organ/cyberimp/brain/anti_drop/ui_action_click() +/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() active = !active if(active) var/list/hold_list = owner.get_empty_held_indexes() @@ -68,7 +68,7 @@ to_chat(owner, span_notice("Your hands relax...")) -/obj/item/organ/cyberimp/brain/anti_drop/emp_act(severity) +/obj/item/organ/internal/cyberimp/brain/anti_drop/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -83,25 +83,25 @@ stored_items = list() -/obj/item/organ/cyberimp/brain/anti_drop/proc/release_items() +/obj/item/organ/internal/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/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special = 0) +/obj/item/organ/internal/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special = 0) if(active) ui_action_click() ..() -/obj/item/organ/cyberimp/brain/anti_drop/proc/on_held_item_dropped(obj/item/source, mob/user) +/obj/item/organ/internal/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/cyberimp/brain/anti_stun +/obj/item/organ/internal/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." implant_color = "#FFFF00" @@ -116,48 +116,48 @@ var/stun_cap_amount = 40 -/obj/item/organ/cyberimp/brain/anti_stun/Remove(mob/living/carbon/implant_owner, special = FALSE) +/obj/item/organ/internal/cyberimp/brain/anti_stun/Remove(mob/living/carbon/implant_owner, special = FALSE) . = ..() UnregisterSignal(implant_owner, signalCache) -/obj/item/organ/cyberimp/brain/anti_stun/Insert() +/obj/item/organ/internal/cyberimp/brain/anti_stun/Insert() . = ..() RegisterSignal(owner, signalCache, .proc/on_signal) -/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) SIGNAL_HANDLER if(!(organ_flags & ORGAN_FAILING) && amount > 0) addtimer(CALLBACK(src, .proc/clear_stuns), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) -/obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns() +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns() if(owner || !(organ_flags & ORGAN_FAILING)) owner.SetStun(0) owner.SetKnockdown(0) owner.SetImmobilized(0) owner.SetParalyzed(0) -/obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity) +/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return organ_flags |= ORGAN_FAILING addtimer(CALLBACK(src, .proc/reboot), 90 / severity) -/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/reboot() organ_flags &= ~ORGAN_FAILING //[[[[MOUTH]]]] -/obj/item/organ/cyberimp/mouth +/obj/item/organ/internal/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH -/obj/item/organ/cyberimp/mouth/breathing_tube +/obj/item/organ/internal/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/cyberimp/mouth/breathing_tube/emp_act(severity) +/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index e4d0f869a31..60b6dfa6eae 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -106,21 +106,21 @@ /obj/item/autosurgeon/organ/cmo 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/cyberimp/eyes/hud/medical + starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/medical /obj/item/autosurgeon/organ/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/cyberimp/arm/gun/laser + starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser /obj/item/autosurgeon/organ/syndicate/thermal_eyes - starting_organ = /obj/item/organ/eyes/robotic/thermals + starting_organ = /obj/item/organ/internal/eyes/robotic/thermals /obj/item/autosurgeon/organ/syndicate/xray_eyes - starting_organ = /obj/item/organ/eyes/robotic/xray + starting_organ = /obj/item/organ/internal/eyes/robotic/xray /obj/item/autosurgeon/organ/syndicate/anti_stun - starting_organ = /obj/item/organ/cyberimp/brain/anti_stun + starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun /obj/item/autosurgeon/organ/syndicate/reviver - starting_organ = /obj/item/organ/cyberimp/chest/reviver + starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 211a4555a2c..bf853563142 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -1,4 +1,4 @@ -/obj/item/organ/ears +/obj/item/organ/internal/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." @@ -28,7 +28,7 @@ // Multiplier for both long term and short term ear damage var/damage_multiplier = 1 -/obj/item/organ/ears/on_life(delta_time, times_fired) +/obj/item/organ/internal/ears/on_life(delta_time, 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.")) @@ -51,23 +51,23 @@ else REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE) -/obj/item/organ/ears/proc/adjustEarDamage(ddmg, ddeaf) +/obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg, ddeaf) if(owner.status_flags & GODMODE) return setOrganDamage(max(damage + (ddmg*damage_multiplier), 0)) deaf = max(deaf + (ddeaf*damage_multiplier), 0) -/obj/item/organ/ears/invincible +/obj/item/organ/internal/ears/invincible damage_multiplier = 0 -/obj/item/organ/ears/cat +/obj/item/organ/internal/ears/cat name = "cat ears" icon = 'icons/obj/clothing/hats.dmi' icon_state = "kitty" visual = TRUE damage_multiplier = 2 -/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) +/obj/item/organ/internal/ears/cat/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) ..() if(istype(ear_owner)) color = ear_owner.hair_color @@ -75,49 +75,49 @@ ear_owner.dna.update_uf_block(DNA_EARS_BLOCK) ear_owner.update_body() -/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/ear_owner, special = 0) +/obj/item/organ/internal/ears/cat/Remove(mob/living/carbon/human/ear_owner, special = 0) ..() if(istype(ear_owner)) color = ear_owner.hair_color ear_owner.dna.species.mutant_bodyparts -= "ears" ear_owner.update_body() -/obj/item/organ/ears/penguin +/obj/item/organ/internal/ears/penguin name = "penguin ears" desc = "The source of a penguin's happy feet." -/obj/item/organ/ears/penguin/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) +/obj/item/organ/internal/ears/penguin/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) . = ..() if(istype(ear_owner)) to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) ear_owner.AddElement(/datum/element/waddling) -/obj/item/organ/ears/penguin/Remove(mob/living/carbon/human/ear_owner, special = 0) +/obj/item/organ/internal/ears/penguin/Remove(mob/living/carbon/human/ear_owner, special = 0) . = ..() if(istype(ear_owner)) to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) ear_owner.RemoveElement(/datum/element/waddling) -/obj/item/organ/ears/bronze +/obj/item/organ/internal/ears/bronze name = "tin ears" desc = "The robust ears of a bronze golem. " damage_multiplier = 0.1 //STRONK bang_protect = 1 //Fear me weaklings. -/obj/item/organ/ears/cybernetic +/obj/item/organ/internal/ears/cybernetic name = "cybernetic ears" icon_state = "ears-c" desc = "A basic cybernetic organ designed to mimic the operation of ears." damage_multiplier = 0.9 organ_flags = ORGAN_SYNTHETIC -/obj/item/organ/ears/cybernetic/upgraded +/obj/item/organ/internal/ears/cybernetic/upgraded name = "upgraded 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/ears/cybernetic/emp_act(severity) +/obj/item/organ/internal/ears/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/external/_external_organs.dm b/code/modules/surgery/organs/external/_external_organs.dm index b086f384be4..6a9d84fe524 100644 --- a/code/modules/surgery/organs/external/_external_organs.dm +++ b/code/modules/surgery/organs/external/_external_organs.dm @@ -16,9 +16,12 @@ ///Convert the bitflag define into the actual layer define var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) - ///Defines what kind of 'organ' we're looking at. Sprites have names like 'm_firemoth_mothwings'. 'mothwings' would then be feature_key + ///Defines what kind of 'organ' we're looking at. Sprites have names like 'm_mothwings_firemoth'. 'mothwings' would then be feature_key var/feature_key = "" - + ///Similar to feature key, but overrides it in the case you need more fine control over the iconstate, like with Tails. + var/render_key = "" + ///Stores the dna.features[feature_key], used for external organs that can be surgically removed or inserted. + var/stored_feature_id = "" /// The savefile_key of the preference this relates to. Used for the preferences UI. var/preference @@ -33,12 +36,16 @@ ///Reference to the limb we're inside of var/obj/item/bodypart/ownerlimb - ///Does this organ use it's own color instead of bodypart/var/draw_color? - var/overrides_color = FALSE + ///The color this organ draws with. Updated by bodypart/inherit_color() + var/draw_color + + ///Where does this organ inherit it's color from? + var/color_source = ORGAN_COLOR_INHERIT ///Does this organ have any bodytypes to pass to it's ownerlimb? var/external_bodytypes = NONE + /**mob_sprite is optional if you havent set sprite_datums for the object, and is used mostly to generate sprite_datums from a persons DNA * For _mob_sprite we make a distinction between "Round Snout" and "round". Round Snout is the name of the sprite datum, while "round" would be part of the sprite * I'm sorry @@ -48,53 +55,97 @@ if(mob_sprite) set_sprite(mob_sprite) + if(!(organ_flags & ORGAN_UNREMOVABLE)) + color = "#[random_color()]" //A temporary random color that gets overwritten on insertion. + +/obj/item/organ/external/Destroy() + if(owner) + Remove(owner, special=TRUE) + else if(ownerlimb) + remove_from_limb() + + return ..() + /obj/item/organ/external/Insert(mob/living/carbon/reciever, special, drop_if_replaced) - var/obj/item/bodypart/limb = reciever.get_bodypart(zone) + var/obj/item/bodypart/limb = reciever.get_bodypart(deprecise_zone(zone)) if(!limb) return FALSE - - limb.external_organs.Add(src) - ownerlimb = limb - . = ..() + if(!.) + return + + if(!stored_feature_id) //We only want this set *once* + stored_feature_id = reciever.dna.features[feature_key] + + reciever.external_organs.Add(src) + if(slot) + reciever.external_organs_slot[slot] = src + + ownerlimb = limb + add_to_limb(ownerlimb) - limb.contents.Add(src) if(external_bodytypes) limb.synchronize_bodytypes(reciever) reciever.update_body_parts() -/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special, moving) . = ..() - if(ownerlimb) - ownerlimb.external_organs.Remove(src) - ownerlimb.contents.Remove(src) - if(external_bodytypes) //Happens after removal from contents, and before ownerlimb is null. - ownerlimb.synchronize_bodytypes(organ_owner) - ownerlimb = null + remove_from_limb() - organ_owner.update_body_parts() + if(organ_owner) + if(slot) + organ_owner.external_organs_slot.Remove(slot) + organ_owner.external_organs.Remove(src) + organ_owner.update_body_parts() +///Transfers the organ to the limb, and to the limb's owner, if it has one. /obj/item/organ/external/transfer_to_limb(obj/item/bodypart/bodypart, mob/living/carbon/bodypart_owner) - . = ..() + if(owner) + Remove(owner, moving = TRUE) + else if(ownerlimb) + remove_from_limb() - bodypart.external_organs.Add(src) - bodypart.contents.Add(src) + if(bodypart_owner) + Insert(bodypart_owner, TRUE) + else + add_to_limb(bodypart) + +/obj/item/organ/external/add_to_limb(obj/item/bodypart/bodypart) + ownerlimb = bodypart + ownerlimb.external_organs |= src + inherit_color() + return ..() + +/obj/item/organ/external/remove_from_limb() + ownerlimb.external_organs -= src + if(ownerlimb.owner && external_bodytypes) + ownerlimb.synchronize_bodytypes(ownerlimb.owner) + ownerlimb = null + return ..() ///Add the overlays we need to draw on a person. Called from _bodyparts.dm -/obj/item/organ/external/proc/get_overlays(list/overlay_list, image_dir, image_layer, physique, image_color) +/obj/item/organ/external/proc/get_overlays(list/overlay_list, image_dir, image_layer, physique) + set_sprite(stored_feature_id) if(!sprite_datum) return var/gender = (physique == FEMALE) ? "f" : "m" - var/finished_icon_state = (sprite_datum.gender_specific ? gender : "m") + "_" + feature_key + "_" + sprite_datum.icon_state + mutant_bodyparts_layertext(image_layer) + var/list/icon_state_builder = list() + icon_state_builder += sprite_datum.gender_specific ? gender : "m" //Male is default because sprite accessories are so ancient they predate the concept of not hardcoding gender + icon_state_builder += render_key ? render_key : feature_key + icon_state_builder += sprite_datum.icon_state + icon_state_builder += mutant_bodyparts_layertext(image_layer) + + var/finished_icon_state = icon_state_builder.Join("_") + var/mutable_appearance/appearance = mutable_appearance(sprite_datum.icon, finished_icon_state, layer = -image_layer) appearance.dir = image_dir - if(sprite_datum.color_src) //There are multiple flags, but only one is ever used so meh :/ - appearance.color = image_color + if(sprite_datum.color_src) //There are multiple flags, but only one is ever used so meh :/ | This comment isn't true. + appearance.color = draw_color if(sprite_datum.center) center_image(appearance, sprite_datum.dimension_x, sprite_datum.dimension_y) @@ -102,12 +153,17 @@ overlay_list += appearance /obj/item/organ/external/proc/set_sprite(sprite_name) + stored_feature_id = sprite_name sprite_datum = get_sprite_datum(sprite_name) - cache_key = generate_icon_cache() + cache_key = jointext(generate_icon_cache(), "_") ///Generate a unique key based on our sprites. So that if we've aleady drawn these sprites, they can be found in the cache and wont have to be drawn again (blessing and curse) /obj/item/organ/external/proc/generate_icon_cache() - return "[sprite_datum.icon_state]_[feature_key]" + . = list() + . += "[sprite_datum?.icon_state]" + . += "[render_key ? render_key : feature_key]" + . += "[draw_color]" + return . /**This exists so sprite accessories can still be per-layer without having to include that layer's * number in their sprite name, which causes issues when those numbers change. @@ -115,11 +171,11 @@ /obj/item/organ/external/proc/mutant_bodyparts_layertext(layer) switch(layer) if(BODY_BEHIND_LAYER) - return "_BEHIND" + return "BEHIND" if(BODY_ADJ_LAYER) - return "_ADJ" + return "ADJ" if(BODY_FRONT_LAYER) - return "_FRONT" + return "FRONT" ///Converts a bitflag to the right layer. I'd love to make this a static index list, but byond made an attempt on my life when i did /obj/item/organ/external/proc/bitflag_to_layer(layer) @@ -138,7 +194,7 @@ ///Return a dumb glob list for this specific feature (called from parse_sprite) /obj/item/organ/external/proc/get_global_feature_list() - return null + CRASH("External organ has no feature list, it will render invisible") ///Check whether we can draw the overlays. You generally don't want lizard snouts to draw over an EVA suit /obj/item/organ/external/proc/can_draw_on_bodypart(mob/living/carbon/human/human) @@ -153,9 +209,27 @@ set_sprite(feature_list[deconstruct_block(get_uni_feature_block(features, dna_block), feature_list.len)]) +///Give the organ it's color. Force will override the existing one. +/obj/item/organ/external/proc/inherit_color(force) + if(draw_color && !force) + return + switch(color_source) + if(ORGAN_COLOR_OVERRIDE) + draw_color = override_color(ownerlimb.draw_color) + if(ORGAN_COLOR_INHERIT) + draw_color = ownerlimb.draw_color + if(ORGAN_COLOR_HAIR) + if(!ishuman(ownerlimb.owner)) + return + var/mob/living/carbon/human/human_owner = ownerlimb.owner + draw_color = human_owner.hair_color + color = draw_color + return TRUE + ///Colorizes the limb it's inserted to, if required. /obj/item/organ/external/proc/override_color(rgb_value) - return + CRASH("External organ color set to override with no override proc.") + ///The horns of a lizard! /obj/item/organ/external/horns @@ -238,7 +312,7 @@ RegisterSignal(reciever, COMSIG_HUMAN_BURNING, .proc/try_burn_antennae) RegisterSignal(reciever, COMSIG_LIVING_POST_FULLY_HEAL, .proc/heal_antennae) -/obj/item/organ/external/antennae/Remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/external/antennae/Remove(mob/living/carbon/organ_owner, special, moving) . = ..() UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL)) @@ -283,7 +357,7 @@ dna_block = DNA_POD_HAIR_BLOCK - overrides_color = TRUE + color_source = ORGAN_COLOR_OVERRIDE /obj/item/organ/external/pod_hair/can_draw_on_bodypart(mob/living/carbon/human/human) if(!(human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm new file mode 100644 index 00000000000..b47de9d6ed1 --- /dev/null +++ b/code/modules/surgery/organs/external/spines.dm @@ -0,0 +1,29 @@ +/obj/item/organ/external/spines + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_SPINES + layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND + feature_key = "spines" + render_key = "spines" + preference = "feature_lizard_spines" + dna_block = DNA_SPINES_BLOCK + ///A two-way reference between the tail and the spines because of wagging sprites. Bruh. + var/obj/item/organ/external/tail/lizard/paired_tail + +/obj/item/organ/external/spines/get_global_feature_list() + return GLOB.spines_list + +/obj/item/organ/external/spines/can_draw_on_bodypart(mob/living/carbon/human/human) + . = ..() + if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + return FALSE + +/obj/item/organ/external/spines/Insert(mob/living/carbon/reciever, special, drop_if_replaced) + . = ..() + if(.) + paired_tail = locate(/obj/item/organ/external/tail/lizard) in reciever.external_organs //We want specifically a lizard tail, so we don't use the slot. + +/obj/item/organ/external/spines/Remove(mob/living/carbon/organ_owner, special, moving) + . = ..() + if(paired_tail) + paired_tail.paired_spines = null + paired_tail = null diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm new file mode 100644 index 00000000000..46f184370b5 --- /dev/null +++ b/code/modules/surgery/organs/external/tails.dm @@ -0,0 +1,133 @@ +///Tail parent, it doesn't do very much. +/obj/item/organ/external/tail + name = "tail" + desc = "A severed tail. What did you cut this off of?" + icon_state = "severedtail" + zone = BODY_ZONE_PRECISE_GROIN + slot = ORGAN_SLOT_EXTERNAL_TAIL + layers = EXTERNAL_FRONT|EXTERNAL_BEHIND + organ_flags = ORGAN_EDIBLE + feature_key = "tail" + render_key = "tail" + dna_block = DNA_TAIL_BLOCK + ///Does this tail have a wagging sprite, and is it currently wagging? + var/wag_flags = NONE + ///The original owner of this tail + var/original_owner //Yay, snowflake code! + +/obj/item/organ/external/tail/Destroy() + original_owner = null + return ..() + +/obj/item/organ/external/tail/can_draw_on_bodypart(mob/living/carbon/human/human) + if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + return FALSE + return TRUE + +/obj/item/organ/external/tail/Insert(mob/living/carbon/reciever, special, drop_if_replaced) + . = ..() + if(.) + RegisterSignal(reciever, COMSIG_ORGAN_WAG_TAIL, .proc/wag) + original_owner ||= reciever //One and done + + SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") + SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") + + if(original_owner == reciever) + SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") + else if(type in reciever.dna.species.external_organs) + SEND_SIGNAL(reciever, COMSIG_ADD_MOOD_EVENT, "wrong_tail_regained", /datum/mood_event/tail_regained_wrong) + +/obj/item/organ/external/tail/Remove(mob/living/carbon/organ_owner, special, moving) + if(wag_flags & WAG_WAGGING) + wag(FALSE) + . = ..() + UnregisterSignal(organ_owner, COMSIG_ORGAN_WAG_TAIL) + + if(type in organ_owner.dna.species.external_organs) + SEND_SIGNAL(organ_owner, COMSIG_ADD_MOOD_EVENT, "tail_lost", /datum/mood_event/tail_lost) + SEND_SIGNAL(organ_owner, COMSIG_ADD_MOOD_EVENT, "tail_balance_lost", /datum/mood_event/tail_balance_lost) + +/obj/item/organ/external/tail/generate_icon_cache() + . = ..() + if((wag_flags & WAG_WAGGING)) + . += "wagging" + return . + +/obj/item/organ/external/tail/get_global_feature_list() + return GLOB.tails_list + +/obj/item/organ/external/tail/proc/wag(mob/user, start = TRUE, stop_after = 0) + if(!(wag_flags & WAG_ABLE)) + return + + if(start) + render_key = "wagging[initial(render_key)]" + wag_flags |= WAG_WAGGING + if(stop_after) + addtimer(CALLBACK(src, .proc/wag, FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) + else + render_key = initial(render_key) + wag_flags &= ~WAG_WAGGING + owner.update_body_parts() + +/obj/item/organ/external/tail/cat + name = "tail" + preference = "feature_human_tail" + feature_key = "tail_cat" + color_source = ORGAN_COLOR_HAIR + wag_flags = WAG_ABLE + +/obj/item/organ/external/tail/monkey + color_source = NONE + +/obj/item/organ/external/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" + feature_key = "tail_lizard" + wag_flags = WAG_ABLE + ///A reference to the paired_spines, since for some fucking reason tail spines are tied to the spines themselves. + var/obj/item/organ/external/spines/paired_spines + +/obj/item/organ/external/tail/lizard/Insert(mob/living/carbon/reciever, special, drop_if_replaced) + . = ..() + if(.) + paired_spines = ownerlimb.owner.getorganslot(ORGAN_SLOT_EXTERNAL_SPINES) + +/obj/item/organ/external/tail/lizard/Remove(mob/living/carbon/organ_owner, special, moving) + . = ..() + if(paired_spines) + paired_spines.render_key = initial(paired_spines.render_key) //Clears wagging + paired_spines.paired_tail = null + paired_spines = null + +/obj/item/organ/external/tail/lizard/inherit_color(force) + . = ..() + if(.) + paired_spines = ownerlimb.owner.getorganslot(ORGAN_SLOT_EXTERNAL_SPINES) //I hate this so much. + if(paired_spines) + paired_spines.paired_tail = src + +/obj/item/organ/external/tail/lizard/wag(mob/user, start = TRUE, stop_after = 0) + if(!(wag_flags & WAG_ABLE)) + return + + if(start) + render_key = "wagging[initial(render_key)]" + wag_flags |= WAG_WAGGING + if(stop_after) + addtimer(CALLBACK(src, .proc/wag, FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) + if(paired_spines) + paired_spines.render_key = "wagging[initial(paired_spines.render_key)]" + else + render_key = initial(render_key) + wag_flags &= ~WAG_WAGGING + if(paired_spines) + paired_spines.render_key = initial(paired_spines.render_key) + + owner.update_body_parts() + +/obj/item/organ/external/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." diff --git a/code/modules/surgery/organs/external/wings.dm b/code/modules/surgery/organs/external/wings.dm index bca39659054..ed9c33de3e9 100644 --- a/code/modules/surgery/organs/external/wings.dm +++ b/code/modules/surgery/organs/external/wings.dm @@ -45,7 +45,7 @@ fly = new fly.Grant(reciever) -/obj/item/organ/external/wings/functional/Remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/external/wings/functional/Remove(mob/living/carbon/organ_owner, special, moving) . = ..() fly.Remove(organ_owner) @@ -187,7 +187,7 @@ RegisterSignal(reciever, COMSIG_LIVING_POST_FULLY_HEAL, .proc/heal_wings) RegisterSignal(reciever, COMSIG_MOVABLE_PRE_MOVE, .proc/update_float_move) -/obj/item/organ/external/wings/moth/Remove(mob/living/carbon/organ_owner, special) +/obj/item/organ/external/wings/moth/Remove(mob/living/carbon/organ_owner, special, moving) . = ..() UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOVABLE_PRE_MOVE)) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 55b6a03d41b..947f4dc3211 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -1,4 +1,4 @@ -/obj/item/organ/eyes +/obj/item/organ/internal/eyes name = BODY_ZONE_PRECISE_EYES icon_state = "eyeballs" desc = "I see you!" @@ -37,7 +37,7 @@ /// indication that the eyes are undergoing some negative effect var/damaged = FALSE -/obj/item/organ/eyes/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE, initialising) +/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE, initialising) . = ..() if(ishuman(eye_owner)) var/mob/living/carbon/human/human_owner = eye_owner @@ -58,7 +58,7 @@ if(eye_owner.has_dna() && ishuman(eye_owner)) eye_owner.dna.species.handle_body(eye_owner) //updates eye icon -/obj/item/organ/eyes/proc/refresh(call_update = TRUE) +/obj/item/organ/internal/eyes/proc/refresh(call_update = TRUE) if(ishuman(owner)) var/mob/living/carbon/human/affected_human = owner old_eye_color_left = affected_human.eye_color_left @@ -80,7 +80,7 @@ affected_human.dna.species.handle_body(affected_human) //updates eye icon -/obj/item/organ/eyes/Remove(mob/living/carbon/eye_owner, special = 0) +/obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = 0) ..() if(ishuman(eye_owner)) var/mob/living/carbon/human/human_owner = eye_owner @@ -100,8 +100,8 @@ #define OFFSET_Y 2 /// This proc generates a list of overlays that the eye should be displayed using for the given parent -/obj/item/organ/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) - if(!istype(parent) || parent.getorgan(/obj/item/organ/eyes) != src) +/obj/item/organ/internal/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) + if(!istype(parent) || parent.getorgan(/obj/item/organ/internal/eyes) != src) CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") var/mutable_appearance/eye_left = mutable_appearance('icons/mob/human_face.dmi', "[eye_icon_state]_l", -BODY_LAYER) @@ -129,12 +129,12 @@ #undef OFFSET_Y //Gotta reset the eye color, because that persists -/obj/item/organ/eyes/enter_wardrobe() +/obj/item/organ/internal/eyes/enter_wardrobe() . = ..() eye_color_left = initial(eye_color_left) eye_color_right = initial(eye_color_right) -/obj/item/organ/eyes/on_life(delta_time, times_fired) +/obj/item/organ/internal/eyes/on_life(delta_time, times_fired) . = ..() var/mob/living/carbon/eye_owner = owner //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities @@ -160,7 +160,7 @@ eye_owner.clear_fullscreen("eye_damage") eye_owner.cure_blind(EYE_DAMAGE) -/obj/item/organ/eyes/night_vision +/obj/item/organ/internal/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." see_in_dark = NIGHTVISION_FOV_RANGE @@ -168,7 +168,7 @@ actions_types = list(/datum/action/item_action/organ_action/use) var/night_vision = TRUE -/obj/item/organ/eyes/night_vision/ui_action_click() +/obj/item/organ/internal/eyes/night_vision/ui_action_click() sight_flags = initial(sight_flags) switch(lighting_alpha) if (LIGHTING_PLANE_ALPHA_VISIBLE) @@ -182,34 +182,34 @@ sight_flags &= ~SEE_BLACKNESS owner.update_sight() -/obj/item/organ/eyes/night_vision/alien +/obj/item/organ/internal/eyes/night_vision/alien name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS -/obj/item/organ/eyes/night_vision/zombie +/obj/item/organ/internal/eyes/night_vision/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." -/obj/item/organ/eyes/night_vision/nightmare +/obj/item/organ/internal/eyes/night_vision/nightmare name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" -/obj/item/organ/eyes/night_vision/mushroom +/obj/item/organ/internal/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." ///Robotic -/obj/item/organ/eyes/robotic +/obj/item/organ/internal/eyes/robotic name = "robotic eyes" icon_state = "cybernetic_eyeballs" desc = "Your vision is augmented." status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC -/obj/item/organ/eyes/robotic/emp_act(severity) +/obj/item/organ/internal/eyes/robotic/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) return @@ -218,14 +218,14 @@ to_chat(owner, span_warning("Static obfuscates your vision!")) owner.flash_act(visual = 1) -/obj/item/organ/eyes/robotic/basic +/obj/item/organ/internal/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/eyes/robotic/basic/emp_act(severity) +/obj/item/organ/internal/eyes/robotic/basic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -235,7 +235,7 @@ do_sparks(2, TRUE, owner) owner.emote("scream") -/obj/item/organ/eyes/robotic/xray +/obj/item/organ/internal/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" @@ -243,15 +243,15 @@ see_in_dark = NIGHTVISION_FOV_RANGE sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS -/obj/item/organ/eyes/robotic/xray/Insert(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/robotic/xray/Insert(mob/living/carbon/eye_owner, special = FALSE) . = ..() ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) -/obj/item/organ/eyes/robotic/xray/Remove(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/robotic/xray/Remove(mob/living/carbon/eye_owner, special = FALSE) REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) return ..() -/obj/item/organ/eyes/robotic/thermals +/obj/item/organ/internal/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." eye_color_left = "FC0" @@ -261,7 +261,7 @@ flash_protect = FLASH_PROTECTION_SENSITIVE see_in_dark = NIGHTVISION_FOV_RANGE -/obj/item/organ/eyes/robotic/flashlight +/obj/item/organ/internal/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" @@ -272,10 +272,10 @@ tint = INFINITY var/obj/item/flashlight/eyelight/eye -/obj/item/organ/eyes/robotic/flashlight/emp_act(severity) +/obj/item/organ/internal/eyes/robotic/flashlight/emp_act(severity) return -/obj/item/organ/eyes/robotic/flashlight/Insert(mob/living/carbon/victim, special = FALSE, drop_if_replaced = FALSE) +/obj/item/organ/internal/eyes/robotic/flashlight/Insert(mob/living/carbon/victim, special = FALSE, drop_if_replaced = FALSE) ..() if(!eye) eye = new /obj/item/flashlight/eyelight() @@ -285,7 +285,7 @@ victim.become_blind(FLASHLIGHT_EYES) -/obj/item/organ/eyes/robotic/flashlight/Remove(mob/living/carbon/victim, special = 0) +/obj/item/organ/internal/eyes/robotic/flashlight/Remove(mob/living/carbon/victim, special = 0) eye.on = FALSE eye.update_brightness(victim) eye.forceMove(src) @@ -293,17 +293,17 @@ ..() // Welding shield implant -/obj/item/organ/eyes/robotic/shield +/obj/item/organ/internal/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/eyes/robotic/shield/emp_act(severity) +/obj/item/organ/internal/eyes/robotic/shield/emp_act(severity) return #define RGB2EYECOLORSTRING(definitionvar) ("[copytext_char(definitionvar, 2, 3)][copytext_char(definitionvar, 4, 5)][copytext_char(definitionvar, 6, 7)]") -/obj/item/organ/eyes/robotic/glow +/obj/item/organ/internal/eyes/robotic/glow name = "High Luminosity Eyes" desc = "Special glowing eyes, used by snowflakes who want to be special." eye_color_left = "000" @@ -320,38 +320,38 @@ var/image/mob_overlay var/datum/component/mobhook -/obj/item/organ/eyes/robotic/glow/Initialize(mapload) +/obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload) . = ..() mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs") -/obj/item/organ/eyes/robotic/glow/Destroy() +/obj/item/organ/internal/eyes/robotic/glow/Destroy() terminate_effects() . = ..() -/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/Remove(mob/living/carbon/eye_owner, special = FALSE) terminate_effects() . = ..() -/obj/item/organ/eyes/robotic/glow/proc/terminate_effects() +/obj/item/organ/internal/eyes/robotic/glow/proc/terminate_effects() if(owner && active) deactivate() active = FALSE clear_visuals(TRUE) STOP_PROCESSING(SSfastprocess, src) -/obj/item/organ/eyes/robotic/glow/ui_action_click(owner, action) +/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(owner, action) if(istype(action, /datum/action/item_action/organ_action/toggle)) toggle_active() else if(istype(action, /datum/action/item_action/organ_action/use)) prompt_for_controls(owner) -/obj/item/organ/eyes/robotic/glow/proc/toggle_active() +/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active() if(active) deactivate() else activate() -/obj/item/organ/eyes/robotic/glow/proc/prompt_for_controls(mob/user) +/obj/item/organ/internal/eyes/robotic/glow/proc/prompt_for_controls(mob/user) var/color = input(owner, "Select Color", "Select color", "#ffffff") as color|null if(!color || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user) return @@ -363,57 +363,57 @@ if(old_active) activate(FALSE) -/obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor) +/obj/item/organ/internal/eyes/robotic/glow/proc/assume_rgb(newcolor) current_color_string = newcolor eye_color_left = RGB2EYECOLORSTRING(current_color_string) eye_color_right = eye_color_left if(!QDELETED(owner) && ishuman(owner)) //Other carbon mobs don't have eye color. owner.dna.species.handle_body(owner) -/obj/item/organ/eyes/robotic/glow/proc/cycle_mob_overlay() +/obj/item/organ/internal/eyes/robotic/glow/proc/cycle_mob_overlay() remove_mob_overlay() mob_overlay.color = current_color_string add_mob_overlay() -/obj/item/organ/eyes/robotic/glow/proc/add_mob_overlay() +/obj/item/organ/internal/eyes/robotic/glow/proc/add_mob_overlay() if(!QDELETED(owner)) owner.add_overlay(mob_overlay) -/obj/item/organ/eyes/robotic/glow/proc/remove_mob_overlay() +/obj/item/organ/internal/eyes/robotic/glow/proc/remove_mob_overlay() if(!QDELETED(owner)) owner.cut_overlay(mob_overlay) -/obj/item/organ/eyes/robotic/glow/emp_act() +/obj/item/organ/internal/eyes/robotic/glow/emp_act() . = ..() if(!active || . & EMP_PROTECT_SELF) return deactivate(silent = TRUE) -/obj/item/organ/eyes/robotic/glow/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE) . = ..() RegisterSignal(eye_owner, COMSIG_ATOM_DIR_CHANGE, .proc/update_visuals) -/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/Remove(mob/living/carbon/eye_owner, special = FALSE) . = ..() UnregisterSignal(eye_owner, COMSIG_ATOM_DIR_CHANGE) -/obj/item/organ/eyes/robotic/glow/Destroy() +/obj/item/organ/internal/eyes/robotic/glow/Destroy() QDEL_NULL(mobhook) // mobhook is not our component return ..() -/obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/proc/activate(silent = FALSE) start_visuals() if(!silent) to_chat(owner, span_warning("Your [src] clicks and makes a whining noise, before shooting out a beam of light!")) cycle_mob_overlay() -/obj/item/organ/eyes/robotic/glow/proc/deactivate(silent = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(silent = FALSE) clear_visuals() if(!silent) to_chat(owner, span_warning("Your [src] shuts off!")) remove_mob_overlay() -/obj/item/organ/eyes/robotic/glow/proc/update_visuals(datum/source, olddir, newdir) +/obj/item/organ/internal/eyes/robotic/glow/proc/update_visuals(datum/source, olddir, newdir) SIGNAL_HANDLER if(!active) return // Don't update if we're not active! @@ -439,7 +439,7 @@ else lighting.forceMove(scanning) -/obj/item/organ/eyes/robotic/glow/proc/clear_visuals(delete_everything = FALSE) +/obj/item/organ/internal/eyes/robotic/glow/proc/clear_visuals(delete_everything = FALSE) if(delete_everything) QDEL_LIST(eye_lighting) QDEL_NULL(on_mob) @@ -451,7 +451,7 @@ on_mob.forceMove(src) active = FALSE -/obj/item/organ/eyes/robotic/glow/proc/start_visuals() +/obj/item/organ/internal/eyes/robotic/glow/proc/start_visuals() if(!islist(eye_lighting)) eye_lighting = list() regenerate_light_effects() @@ -461,11 +461,11 @@ active = TRUE update_visuals() -/obj/item/organ/eyes/robotic/glow/proc/set_distance(dist) +/obj/item/organ/internal/eyes/robotic/glow/proc/set_distance(dist) light_beam_distance = dist regenerate_light_effects() -/obj/item/organ/eyes/robotic/glow/proc/regenerate_light_effects() +/obj/item/organ/internal/eyes/robotic/glow/proc/regenerate_light_effects() clear_visuals(TRUE) on_mob = new (src, light_object_range, light_object_power, current_color_string, LIGHT_ATTACHED) for(var/i in 1 to light_beam_distance) @@ -473,7 +473,7 @@ sync_light_effects() -/obj/item/organ/eyes/robotic/glow/proc/sync_light_effects() +/obj/item/organ/internal/eyes/robotic/glow/proc/sync_light_effects() for(var/obj/effect/abstract/eye_lighting/eye_lighting as anything in eye_lighting) eye_lighting.set_light_color(current_color_string) on_mob?.set_light_color(current_color_string) @@ -481,7 +481,7 @@ /obj/effect/abstract/eye_lighting light_system = MOVABLE_LIGHT - var/obj/item/organ/eyes/robotic/glow/parent + var/obj/item/organ/internal/eyes/robotic/glow/parent /obj/effect/abstract/eye_lighting/Initialize(mapload, light_object_range, light_object_power, current_color_string, light_flags) @@ -500,34 +500,34 @@ set_light_flags(light_flags) -/obj/item/organ/eyes/moth +/obj/item/organ/internal/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/eyes/snail +/obj/item/organ/internal/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/eyes/fly +/obj/item/organ/internal/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" icon_state = "eyeballs-fly" -/obj/item/organ/eyes/fly/Insert(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/fly/Insert(mob/living/carbon/eye_owner, special = FALSE) . = ..() ADD_TRAIT(eye_owner, TRAIT_FLASH_SENSITIVE, ORGAN_TRAIT) -/obj/item/organ/eyes/fly/Remove(mob/living/carbon/eye_owner, special = FALSE) +/obj/item/organ/internal/eyes/fly/Remove(mob/living/carbon/eye_owner, special = FALSE) REMOVE_TRAIT(eye_owner, TRAIT_FLASH_SENSITIVE, ORGAN_TRAIT) return ..() -/obj/item/organ/eyes/night_vision/maintenance_adapted +/obj/item/organ/internal/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_SENSITIVE @@ -538,7 +538,7 @@ overlay_ignore_lighting = TRUE var/obj/item/flashlight/eyelight/adapted/adapt_light -/obj/item/organ/eyes/night_vision/maintenance_adapted/Insert(mob/living/carbon/adapted, special = FALSE) +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/Insert(mob/living/carbon/adapted, special = FALSE) . = ..() //add lighting if(!adapt_light) @@ -550,7 +550,7 @@ ADD_TRAIT(adapted, TRAIT_FLASH_SENSITIVE, ORGAN_TRAIT) ADD_TRAIT(adapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) -/obj/item/organ/eyes/night_vision/maintenance_adapted/on_life(delta_time, times_fired) +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(delta_time, times_fired) var/turf/owner_turf = get_turf(owner) var/lums = owner_turf.get_lumcount() if(lums > 0.5) //we allow a little more than usual so we can produce light from the adapted eyes @@ -561,7 +561,7 @@ applyOrganDamage(-10) //heal quickly . = ..() -/obj/item/organ/eyes/night_vision/maintenance_adapted/Remove(mob/living/carbon/unadapted, special = FALSE) +/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/Remove(mob/living/carbon/unadapted, special = FALSE) //remove lighting adapt_light.on = FALSE adapt_light.update_brightness(unadapted) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index c1585715629..ef8d1d92b1d 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -1,4 +1,4 @@ -/obj/item/organ/heart +/obj/item/organ/internal/heart name = "heart" desc = "I feel bad for the heartless bastard who lost this." icon_state = "heart-on" @@ -23,20 +23,20 @@ var/failed = FALSE //to prevent constantly running failing code var/operated = FALSE //whether the heart's been operated on to fix some of its damages -/obj/item/organ/heart/update_icon_state() +/obj/item/organ/internal/heart/update_icon_state() icon_state = "[base_icon_state]-[beating ? "on" : "off"]" return ..() -/obj/item/organ/heart/Remove(mob/living/carbon/heartless, special = 0) +/obj/item/organ/internal/heart/Remove(mob/living/carbon/heartless, special = 0) ..() if(!special) addtimer(CALLBACK(src, .proc/stop_if_unowned), 120) -/obj/item/organ/heart/proc/stop_if_unowned() +/obj/item/organ/internal/heart/proc/stop_if_unowned() if(!owner) Stop() -/obj/item/organ/heart/attack_self(mob/user) +/obj/item/organ/internal/heart/attack_self(mob/user) ..() if(!beating) user.visible_message("[user] squeezes [src] to \ @@ -44,22 +44,22 @@ Restart() addtimer(CALLBACK(src, .proc/stop_if_unowned), 80) -/obj/item/organ/heart/proc/Stop() +/obj/item/organ/internal/heart/proc/Stop() beating = FALSE update_appearance() return TRUE -/obj/item/organ/heart/proc/Restart() +/obj/item/organ/internal/heart/proc/Restart() beating = TRUE update_appearance() return TRUE -/obj/item/organ/heart/OnEatFrom(eater, feeder) +/obj/item/organ/internal/heart/OnEatFrom(eater, feeder) . = ..() beating = FALSE update_appearance() -/obj/item/organ/heart/on_life(delta_time, times_fired) +/obj/item/organ/internal/heart/on_life(delta_time, times_fired) ..() // If the owner doesn't need a heart, we don't need to do anything with it. @@ -95,10 +95,10 @@ owner.set_heartattack(TRUE) failed = TRUE -/obj/item/organ/heart/get_availability(datum/species/owner_species) +/obj/item/organ/internal/heart/get_availability(datum/species/owner_species) return !(NOBLOOD in owner_species.species_traits) -/obj/item/organ/heart/cursed +/obj/item/organ/internal/heart/cursed name = "cursed heart" desc = "A heart that, when inserted, will force you to pump it manually." icon_state = "cursedheart-off" @@ -116,7 +116,7 @@ var/heal_oxy = 0 -/obj/item/organ/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target) +/obj/item/organ/internal/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) @@ -124,7 +124,7 @@ else return ..() -/obj/item/organ/heart/cursed/on_life(delta_time, times_fired) +/obj/item/organ/internal/heart/cursed/on_life(delta_time, times_fired) if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/accursed_human = owner @@ -137,12 +137,12 @@ else last_pump = world.time //lets be extra fair *sigh* -/obj/item/organ/heart/cursed/Insert(mob/living/carbon/accursed, special = 0) +/obj/item/organ/internal/heart/cursed/Insert(mob/living/carbon/accursed, special = 0) ..() if(owner) to_chat(owner, span_userdanger("Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")) -/obj/item/organ/heart/cursed/Remove(mob/living/carbon/accursed, special = 0) +/obj/item/organ/internal/heart/cursed/Remove(mob/living/carbon/accursed, special = 0) ..() accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) @@ -152,8 +152,8 @@ //You are now brea- pumping blood manually /datum/action/item_action/organ_action/cursed_heart/Trigger(trigger_flags) . = ..() - if(. && istype(target, /obj/item/organ/heart/cursed)) - var/obj/item/organ/heart/cursed/cursed_heart = target + if(. && istype(target, /obj/item/organ/internal/heart/cursed)) + var/obj/item/organ/internal/heart/cursed/cursed_heart = target if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam to_chat(owner, span_userdanger("Too soon!")) @@ -178,7 +178,7 @@ priority = 100 //it's an indicator you're dying, so it's very high priority colour = "red" -/obj/item/organ/heart/cybernetic +/obj/item/organ/internal/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" @@ -190,7 +190,7 @@ var/ramount = 10 var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/heart/cybernetic/tier2 +/obj/item/organ/internal/heart/cybernetic/tier2 name = "cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma." icon_state = "heart-c-u" @@ -198,7 +198,7 @@ dose_available = TRUE emp_vulnerability = 40 -/obj/item/organ/heart/cybernetic/tier3 +/obj/item/organ/internal/heart/cybernetic/tier3 name = "upgraded cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use." icon_state = "heart-c-u2" @@ -206,7 +206,7 @@ dose_available = TRUE emp_vulnerability = 20 -/obj/item/organ/heart/cybernetic/emp_act(severity) +/obj/item/organ/internal/heart/cybernetic/emp_act(severity) . = ..() // If the owner doesn't need a heart, we don't need to do anything with it. @@ -226,27 +226,27 @@ span_userdanger("You feel a terrible pain in your chest, as if your heart has stopped!")) addtimer(CALLBACK(src, .proc/Restart), 10 SECONDS) -/obj/item/organ/heart/cybernetic/on_life(delta_time, times_fired) +/obj/item/organ/internal/heart/cybernetic/on_life(delta_time, times_fired) . = ..() if(dose_available && owner.health <= owner.crit_threshold && !owner.reagents.has_reagent(rid)) used_dose() -/obj/item/organ/heart/cybernetic/proc/used_dose() +/obj/item/organ/internal/heart/cybernetic/proc/used_dose() owner.reagents.add_reagent(rid, ramount) dose_available = FALSE -/obj/item/organ/heart/cybernetic/tier3/used_dose() +/obj/item/organ/internal/heart/cybernetic/tier3/used_dose() . = ..() addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES) -/obj/item/organ/heart/freedom +/obj/item/organ/internal/heart/freedom name = "heart of freedom" desc = "This heart pumps with the passion to give... something freedom." organ_flags = ORGAN_SYNTHETIC //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/heart/freedom/on_life(delta_time, times_fired) +/obj/item/organ/internal/heart/freedom/on_life(delta_time, times_fired) . = ..() if(owner.health < 5 && COOLDOWN_FINISHED(src, adrenaline_cooldown)) COOLDOWN_START(src, adrenaline_cooldown, rand(25 SECONDS, 1 MINUTES)) @@ -255,7 +255,7 @@ if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) -/obj/item/organ/heart/ethereal +/obj/item/organ/internal/heart/ethereal name = "crystal core" icon_state = "ethereal_heart" //Welp. At least it's more unique in functionaliy. visual = TRUE //This is used by the ethereal species for color @@ -272,37 +272,37 @@ ///Color of the heart, is set by the species on gain var/ethereal_color = "#9c3030" -/obj/item/organ/heart/ethereal/Initialize(mapload) +/obj/item/organ/internal/heart/ethereal/Initialize(mapload) . = ..() add_atom_colour(ethereal_color, FIXED_COLOUR_PRIORITY) -/obj/item/organ/heart/ethereal/Insert(mob/living/carbon/owner, special = 0) +/obj/item/organ/internal/heart/ethereal/Insert(mob/living/carbon/owner, special = 0) . = ..() RegisterSignal(owner, COMSIG_MOB_STATCHANGE, .proc/on_stat_change) RegisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL, .proc/on_owner_fully_heal) RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/owner_deleted) -/obj/item/organ/heart/ethereal/Remove(mob/living/carbon/owner, special = 0) +/obj/item/organ/internal/heart/ethereal/Remove(mob/living/carbon/owner, special = 0) UnregisterSignal(owner, list(COMSIG_MOB_STATCHANGE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_PARENT_QDELETING)) REMOVE_TRAIT(owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT) stop_crystalization_process(owner) QDEL_NULL(current_crystal) return ..() -/obj/item/organ/heart/ethereal/update_overlays() +/obj/item/organ/internal/heart/ethereal/update_overlays() . = ..() var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[icon_state]_shine") shine.appearance_flags = RESET_COLOR //No color on this, just pure white . += shine -/obj/item/organ/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, admin_heal) +/obj/item/organ/internal/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, admin_heal) 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/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) +/obj/item/organ/internal/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list) SIGNAL_HANDLER if(!crystalize_timer_id) @@ -317,7 +317,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/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) +/obj/item/organ/internal/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat) SIGNAL_HANDLER if(new_stat != DEAD) @@ -348,7 +348,7 @@ RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, .proc/on_take_damage) ///Ran when disarmed, prevents the ethereal from reviving -/obj/item/organ/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone) +/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone) SIGNAL_HANDLER defender.visible_message( span_notice("The crystals on [defender] are gently broken off."), @@ -359,7 +359,7 @@ ///Actually spawns the crystal which puts the ethereal in it. -/obj/item/organ/heart/ethereal/proc/crystalize(mob/living/ethereal) +/obj/item/organ/internal/heart/ethereal/proc/crystalize(mob/living/ethereal) var/location = ethereal.loc @@ -375,7 +375,7 @@ stop_crystalization_process(ethereal, TRUE) ///Stop the crystalization process, unregistering any signals and resetting any variables. -/obj/item/organ/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) +/obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) UnregisterSignal(ethereal, COMSIG_HUMAN_DISARM_HIT) UnregisterSignal(ethereal, COMSIG_PARENT_EXAMINE) UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE) @@ -390,14 +390,14 @@ deltimer(crystalize_timer_id) crystalize_timer_id = null -/obj/item/organ/heart/ethereal/proc/owner_deleted(datum/source) +/obj/item/organ/internal/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/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone) +/obj/item/organ/internal/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone) SIGNAL_HANDLER if(damagetype != BRUTE) return @@ -427,13 +427,13 @@ density = TRUE anchored = TRUE ///The organ this crystal belongs to - var/obj/item/organ/heart/ethereal/ethereal_heart + var/obj/item/organ/internal/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. var/being_built = TRUE -/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/heart/ethereal/ethereal_heart) +/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/internal/heart/ethereal/ethereal_heart) . = ..() if(!ethereal_heart) stack_trace("Our crystal has no related heart") diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index b720c3cb26f..1a7ced99076 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -6,6 +6,7 @@ */ /mob/proc/getorgan(typepath) return + /** * Get organ objects by zone * @@ -26,7 +27,8 @@ return /mob/living/carbon/getorgan(typepath) - return (locate(typepath) in internal_organs) + return (locate(typepath) in internal_organs + external_organs) + /mob/living/carbon/getorganszone(zone, subzones = 0) var/list/returnorg = list() @@ -37,10 +39,13 @@ if(zone == BODY_ZONE_CHEST) returnorg = getorganszone(BODY_ZONE_PRECISE_GROIN) - for(var/obj/item/organ/organ as anything in internal_organs) + for(var/obj/item/organ/organ as anything in internal_organs + external_organs) if(zone == organ.zone) returnorg += organ return returnorg /mob/living/carbon/getorganslot(slot) - return internal_organs_slot[slot] + . = internal_organs_slot[slot] + if(!.) + return external_organs_slot[slot] + diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index b8463c5f752..7da853d2b66 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -1,7 +1,7 @@ #define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out #define LIVER_DEFAULT_TOX_LETHALITY 0.005 //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/liver +/obj/item/organ/internal/liver name = "liver" icon_state = "liver" visual = FALSE @@ -24,7 +24,7 @@ var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY var/filterToxins = TRUE //whether to filter toxins -/obj/item/organ/liver/Initialize(mapload) +/obj/item/organ/internal/liver/Initialize(mapload) . = ..() // If the liver handles foods like a clown, it honks like a bike horn // Don't think about it too much. @@ -39,14 +39,14 @@ * The removal of the component, if this liver loses that trait, is handled * by the component itself. */ -/obj/item/organ/liver/proc/on_add_comedy_metabolism() +/obj/item/organ/internal/liver/proc/on_add_comedy_metabolism() SIGNAL_HANDLER // Are clown "bike" horns made from the livers of ex-clowns? // Would that make the clown more or less likely to honk it AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20) -/obj/item/organ/liver/examine(mob/user) +/obj/item/organ/internal/liver/examine(mob/user) . = ..() if(HAS_TRAIT(user, TRAIT_ENTRAILS_READER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ENTRAILS_READER)) || isobserver(user)) @@ -73,7 +73,7 @@ #define HAS_NO_TOXIN 1 #define HAS_PAINFUL_TOXIN 2 -/obj/item/organ/liver/on_life(delta_time, times_fired) +/obj/item/organ/internal/liver/on_life(delta_time, times_fired) var/mob/living/carbon/liver_owner = owner . = ..() //perform general on_life() @@ -110,12 +110,12 @@ to_chat(liver_owner, span_warning("You feel a dull pain in your abdomen.")) -/obj/item/organ/liver/handle_failing_organs(delta_time) +/obj/item/organ/internal/liver/handle_failing_organs(delta_time) if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_NOMETABOLISM)) return return ..() -/obj/item/organ/liver/organ_failure(delta_time) +/obj/item/organ/internal/liver/organ_failure(delta_time) switch(failure_time/LIVER_FAILURE_STAGE_SECONDS) if(1) @@ -166,7 +166,7 @@ if(DT_PROB(3, delta_time)) owner.emote("drool") -/obj/item/organ/liver/on_owner_examine(datum/source, mob/user, list/examine_list) +/obj/item/organ/internal/liver/on_owner_examine(datum/source, mob/user, list/examine_list) if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING)) return @@ -181,7 +181,7 @@ 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()] don't look like they will be alive for much longer.") -/obj/item/organ/liver/on_death(delta_time, times_fired) +/obj/item/organ/internal/liver/on_death(delta_time, times_fired) . = ..() var/mob/living/carbon/carbon_owner = owner if(!owner)//If we're outside of a mob @@ -200,22 +200,22 @@ #undef HAS_PAINFUL_TOXIN #undef LIVER_FAILURE_STAGE_SECONDS -/obj/item/organ/liver/get_availability(datum/species/species) +/obj/item/organ/internal/liver/get_availability(datum/species/species) return !(TRAIT_NOMETABOLISM in species.inherent_traits) -/obj/item/organ/liver/plasmaman +/obj/item/organ/internal/liver/plasmaman name = "reagent processing crystal" icon_state = "liver-p" desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." -/obj/item/organ/liver/alien +/obj/item/organ/internal/liver/alien name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage icon_state = "liver-x" // Same sprite as fly-person liver. desc = "A liver that used to belong to a killer alien, who knows what it used to eat." toxLethality = 2.5 * LIVER_DEFAULT_TOX_LETHALITY // rejects its owner early after too much punishment toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful -/obj/item/organ/liver/cybernetic +/obj/item/organ/internal/liver/cybernetic name = "basic cybernetic liver" icon_state = "liver-c" desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." @@ -226,7 +226,7 @@ var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/liver/cybernetic/tier2 +/obj/item/organ/internal/liver/cybernetic/tier2 name = "cybernetic liver" icon_state = "liver-c-u" desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." @@ -235,7 +235,7 @@ toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver emp_vulnerability = 40 -/obj/item/organ/liver/cybernetic/tier3 +/obj/item/organ/internal/liver/cybernetic/tier3 name = "upgraded cybernetic liver" icon_state = "liver-c-u2" 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." @@ -245,7 +245,7 @@ toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver emp_vulnerability = 20 -/obj/item/organ/liver/cybernetic/emp_act(severity) +/obj/item/organ/internal/liver/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 7941e227c36..4c46a111a7b 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -1,6 +1,4 @@ -/obj/item/organ/lungs - var/failed = FALSE - var/operated = FALSE //whether we can still have our damages fixed through surgery +/obj/item/organ/internal/lungs name = "lungs" icon_state = "lungs" visual = FALSE @@ -18,6 +16,9 @@ low_threshold_cleared = "You can breathe normally again." high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down." + var/failed = FALSE + var/operated = FALSE //whether we can still have our damages fixed through surgery + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) @@ -87,7 +88,7 @@ var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine -/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) +/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) if(breather.status_flags & GODMODE) breather.failed_last_breath = FALSE //clear oxy issues breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) @@ -132,7 +133,7 @@ //Vars for n2o and healium induced euphorias. var/n2o_euphoria = EUPHORIA_LAST_FLAG var/healium_euphoria = EUPHORIA_LAST_FLAG - + //Handle subtypes' breath processing handle_gas_override(breather,breath_gases, gas_breathed) @@ -457,10 +458,10 @@ return TRUE ///override this for breath handling unique to lung subtypes, breath_gas is the list of gas in the breath while gas breathed is just what is being added or removed from that list, just as they are when this is called in check_breath() -/obj/item/organ/lungs/proc/handle_gas_override(mob/living/carbon/human/breather, list/breath_gas, gas_breathed) +/obj/item/organ/internal/lungs/proc/handle_gas_override(mob/living/carbon/human/breather, list/breath_gas, gas_breathed) return -/obj/item/organ/lungs/proc/handle_too_little_breath(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0) +/obj/item/organ/internal/lungs/proc/handle_too_little_breath(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0) . = 0 if(!suffocator || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled. return FALSE @@ -477,7 +478,7 @@ suffocator.failed_last_breath = TRUE -/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures +/obj/item/organ/internal/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 @@ -507,11 +508,11 @@ // The air you breathe out should match your body temperature breath.temperature = breather.bodytemperature -/obj/item/organ/lungs/proc/handle_helium_speech(owner, list/speech_args) +/obj/item/organ/internal/lungs/proc/handle_helium_speech(owner, list/speech_args) SIGNAL_HANDLER speech_args[SPEECH_SPANS] |= SPAN_HELIUM -/obj/item/organ/lungs/on_life(delta_time, times_fired) +/obj/item/organ/internal/lungs/on_life(delta_time, times_fired) . = ..() if(failed && !(organ_flags & ORGAN_FAILING)) failed = FALSE @@ -524,10 +525,10 @@ 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/lungs/get_availability(datum/species/owner_species) +/obj/item/organ/internal/lungs/get_availability(datum/species/owner_species) return !(TRAIT_NOBREATH in owner_species.inherent_traits) -/obj/item/organ/lungs/plasmaman +/obj/item/organ/internal/lungs/plasmaman name = "plasma filter" desc = "A spongy rib-shaped mass for filtering plasma from the air." icon_state = "lungs-plasma" @@ -536,19 +537,19 @@ safe_plasma_min = 4 //We breathe THIS! safe_plasma_max = 0 -/obj/item/organ/lungs/slime +/obj/item/organ/internal/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/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime) +/obj/item/organ/internal/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]) owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. -/obj/item/organ/lungs/cybernetic +/obj/item/organ/internal/lungs/cybernetic name = "basic cybernetic lungs" desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." icon_state = "lungs-c" @@ -557,7 +558,7 @@ var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. -/obj/item/organ/lungs/cybernetic/tier2 +/obj/item/organ/internal/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" @@ -565,7 +566,7 @@ safe_oxygen_min = 13 emp_vulnerability = 40 -/obj/item/organ/lungs/cybernetic/tier3 +/obj/item/organ/internal/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" @@ -579,7 +580,7 @@ cold_level_2_threshold = 140 cold_level_3_threshold = 100 -/obj/item/organ/lungs/cybernetic/emp_act(severity) +/obj/item/organ/internal/lungs/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -590,7 +591,7 @@ organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. -/obj/item/organ/lungs/ashwalker +/obj/item/organ/internal/lungs/ashwalker 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" @@ -599,7 +600,7 @@ // to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules. #define GAS_TOLERANCE 5 -/obj/item/organ/lungs/ashwalker/Initialize(mapload) +/obj/item/organ/internal/lungs/ashwalker/Initialize(mapload) . = ..() var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS] @@ -650,7 +651,7 @@ #undef GAS_TOLERANCE -/obj/item/organ/lungs/ethereal +/obj/item/organ/internal/lungs/ethereal name = "aeration reticulum" desc = "These exotic lungs seem crunchier than most." icon_state = "lungs_ethereal" @@ -659,7 +660,7 @@ heat_level_3_threshold = 1073 -/obj/item/organ/lungs/ethereal/handle_gas_override(mob/living/carbon/human/breather, list/breath_gases, gas_breathed) +/obj/item/organ/internal/lungs/ethereal/handle_gas_override(mob/living/carbon/human/breather, list/breath_gases, gas_breathed) // H2O electrolysis gas_breathed = breath_gases[/datum/gas/water_vapor][MOLES] breath_gases[/datum/gas/oxygen][MOLES] += gas_breathed diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 9ef2ebff306..d4c3855f299 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -1,125 +1,49 @@ -/obj/item/organ +/obj/item/organ/internal name = "organ" - icon = 'icons/obj/surgery.dmi' - var/mob/living/carbon/owner = null - var/status = ORGAN_ORGANIC - w_class = WEIGHT_CLASS_SMALL - throwforce = 0 - var/zone = BODY_ZONE_CHEST - var/slot - // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! - var/organ_flags = ORGAN_EDIBLE - var/maxHealth = STANDARD_ORGAN_THRESHOLD - /// Total damage this organ has sustained - /// Should only ever be modified by applyOrganDamage - var/damage = 0 - ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick - var/healing_factor = 0 //fraction of maxhealth healed per on_life(), set to 0 for generic organs - var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs - var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs - var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs - var/severe_cooldown //cooldown for severe effects, used for synthetic organ emp effects. - ///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds - var/prev_damage = 0 - var/low_threshold_passed - var/high_threshold_passed - var/now_failing - var/now_fixed - var/high_threshold_cleared - var/low_threshold_cleared - ///When you take a bite you cant jam it in for surgery anymore. - var/useable = TRUE - var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) - ///The size of the reagent container - var/reagent_vol = 10 - - var/failure_time = 0 - ///Do we effect the appearance of our mob. Used to save time in preference code - var/visual = TRUE - -// Players can look at prefs before atoms SS init, and without this -// they would not be able to see external organs, such as moth wings. -// This is also necessary because assets SS is before atoms, and so -// any nonhumans created in that time would experience the same effect. -INITIALIZE_IMMEDIATE(/obj/item/organ) - -/obj/item/organ/Initialize(mapload) +/obj/item/organ/internal/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) - if(organ_flags & ORGAN_EDIBLE) - AddComponent(/datum/component/edible,\ - initial_reagents = food_reagents,\ - foodtypes = RAW | MEAT | GROSS,\ - volume = reagent_vol,\ - after_eat = CALLBACK(src, .proc/OnEatFrom)) -/* - * Insert the organ into the select mob. - * - * reciever - the mob who will get our organ - * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment - * drop_if_replaced - if there's an organ in the slot already, whether we drop it afterwards - */ -/obj/item/organ/proc/Insert(mob/living/carbon/reciever, special = FALSE, drop_if_replaced = TRUE) - if(!iscarbon(reciever) || owner == reciever) + +/obj/item/organ/internal/Destroy() + if(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(owner, special=TRUE) + else + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/organ/internal/Insert(mob/living/carbon/reciever, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(!.) return - var/obj/item/organ/replaced = reciever.getorganslot(slot) - if(replaced) - replaced.Remove(reciever, special = TRUE) - if(drop_if_replaced) - replaced.forceMove(get_turf(reciever)) - else - qdel(replaced) + owner.internal_organs |= src + owner.internal_organs_slot[slot] = src + /// internal_organs_slot must ALWAYS be ordered in the same way as organ_process_order + /// Otherwise life processing breaks down + sortTim(owner.internal_organs_slot, /proc/cmp_organ_slot_asc) - SEND_SIGNAL(src, COMSIG_ORGAN_IMPLANTED, reciever) - SEND_SIGNAL(reciever, COMSIG_CARBON_GAIN_ORGAN, src, special) - - owner = reciever - reciever.slot_in_organ(src, slot) - moveToNullspace() - RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/on_owner_examine) - for(var/datum/action/action as anything in actions) - action.Grant(reciever) STOP_PROCESSING(SSobj, src) -/* - * Remove the organ from the select mob. - * - * organ_owner - the mob who owns our organ, that we're removing the organ from. - * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment - */ -/obj/item/organ/proc/Remove(mob/living/carbon/organ_owner, special = FALSE) +/obj/item/organ/internal/Remove(mob/living/carbon/organ_owner, special = FALSE) + . = ..() - UnregisterSignal(owner, COMSIG_PARENT_EXAMINE) - - owner = null if(organ_owner) organ_owner.internal_organs -= src if(organ_owner.internal_organs_slot[slot] == src) organ_owner.internal_organs_slot.Remove(slot) if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE)) organ_owner.death() - for(var/datum/action/action as anything in actions) - action.Remove(organ_owner) - - SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) - SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) START_PROCESSING(SSobj, src) -/obj/item/organ/proc/on_owner_examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - return - -/obj/item/organ/proc/on_find(mob/living/finder) - return - -/obj/item/organ/process(delta_time, times_fired) +/obj/item/organ/internal/process(delta_time, times_fired) on_death(delta_time, times_fired) //Kinda hate doing it like this, but I really don't want to call process directly. -/obj/item/organ/proc/on_death(delta_time, times_fired) //runs decay when outside of a person +/obj/item/organ/internal/on_death(delta_time, times_fired) //runs decay when outside of a person if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN)) return applyOrganDamage(decay_factor * maxHealth * delta_time) @@ -128,7 +52,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// 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/proc/on_life(delta_time, times_fired) //repair organ damage if the organ is not failing +/obj/item/organ/internal/on_life(delta_time, times_fired) //repair organ damage if the organ is not failing if(organ_flags & ORGAN_FAILING) handle_failing_organs(delta_time) return @@ -149,177 +73,18 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) healing_amount += (owner.satiety > 0) ? (4 * healing_factor * owner.satiety / MAX_SATIETY) : 0 applyOrganDamage(-healing_amount * maxHealth * delta_time, damage) // pass curent damage incase we are over cap -/obj/item/organ/examine(mob/user) - . = ..() - - . += span_notice("It should be inserted in the [parse_zone(zone)].") - - if(organ_flags & ORGAN_FAILING) - if(status == ORGAN_ROBOTIC) - . += span_warning("[src] seems to be broken.") - return - . += span_warning("[src] has decayed for too long, and has turned a sickly color. It probably won't work without repairs.") - return - - if(damage > high_threshold) - . += span_warning("[src] is starting to look discolored.") - ///Used as callbacks by object pooling -/obj/item/organ/proc/exit_wardrobe() +/obj/item/organ/internal/exit_wardrobe() START_PROCESSING(SSobj, src) //See above -/obj/item/organ/proc/enter_wardrobe() +/obj/item/organ/internal/enter_wardrobe() STOP_PROCESSING(SSobj, src) -/obj/item/organ/Destroy() - if(owner) - // The special flag is important, because otherwise mobs can die - // while undergoing transformation into different mobs. - Remove(owner, special=TRUE) - else - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/organ/proc/OnEatFrom(eater, feeder) - useable = FALSE //You can't use it anymore after eating it you spaztic - -/obj/item/organ/item_action_slot_check(slot,mob/user) - return //so we don't grant the organ's action to mobs who pick up the organ. - -///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage -/obj/item/organ/proc/applyOrganDamage(damage_amount, maximum = maxHealth) //use for damaging effects - if(!damage_amount) //Micro-optimization. - return - if(maximum < damage) - return - damage = clamp(damage + damage_amount, 0, maximum) - var/mess = check_damage_thresholds(owner) - check_failing_thresholds() - prev_damage = damage - if(mess && owner && owner.stat <= SOFT_CRIT) - to_chat(owner, mess) - -///SETS an organ's damage to the amount "damage_amount", and in doing so clears or sets the failing flag, good for when you have an effect that should fix an organ if broken -/obj/item/organ/proc/setOrganDamage(damage_amount) //use mostly for admin heals - applyOrganDamage(damage_amount - damage) - -/** check_damage_thresholds - * input: mob/organ_owner (a mob, the owner of the organ we call the proc on) - * output: returns a message should get displayed. - * description: By checking our current damage against our previous damage, we can decide whether we've passed an organ threshold. - * If we have, send the corresponding threshold message to the owner, if such a message exists. - */ -/obj/item/organ/proc/check_damage_thresholds(mob/organ_owner) - if(damage == prev_damage) - return - var/delta = damage - prev_damage - if(delta > 0) - if(damage >= maxHealth) - return now_failing - if(damage > high_threshold && prev_damage <= high_threshold) - return high_threshold_passed - if(damage > low_threshold && prev_damage <= low_threshold) - return low_threshold_passed - else - if(prev_damage > low_threshold && damage <= low_threshold) - return low_threshold_cleared - if(prev_damage > high_threshold && damage <= high_threshold) - return high_threshold_cleared - if(prev_damage == maxHealth) - return now_fixed - -///Checks if an organ should/shouldn't be failing and gives the appropriate organ flag -/obj/item/organ/proc/check_failing_thresholds() - if(damage >= maxHealth) - organ_flags |= ORGAN_FAILING - if(damage < maxHealth) - organ_flags &= ~ORGAN_FAILING - -//Looking for brains? -//Try code/modules/mob/living/carbon/brain/brain_item.dm - -/mob/living/proc/regenerate_organs() - return FALSE - -/mob/living/carbon/regenerate_organs() - if(dna?.species) - dna.species.regenerate_organs(src) - return - - else - var/obj/item/organ/lungs/lungs = getorganslot(ORGAN_SLOT_LUNGS) - if(!lungs) - lungs = new() - lungs.Insert(src) - lungs.setOrganDamage(0) - - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - if(!heart) - heart = new() - heart.Insert(src) - heart.setOrganDamage(0) - - var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) - if(!tongue) - tongue = new() - tongue.Insert(src) - tongue.setOrganDamage(0) - - var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) - if(!eyes) - eyes = new() - eyes.Insert(src) - eyes.setOrganDamage(0) - - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) - if(!ears) - ears = new() - ears.Insert(src) - ears.setOrganDamage(0) - ///Organs don't die instantly, and neither should you when you get fucked up -/obj/item/organ/proc/handle_failing_organs(delta_time) +/obj/item/organ/internal/handle_failing_organs(delta_time) if(owner.stat == DEAD) return failure_time += delta_time organ_failure(delta_time) - -/** organ_failure - * generic proc for handling dying organs - * - * Arguments: - * delta_time - seconds since last tick - */ -/obj/item/organ/proc/organ_failure(delta_time) - return - -/** get_availability - * returns whether the species should innately have this organ. - * - * regenerate organs works with generic organs, so we need to get whether it can accept certain organs just by what this returns. - * This is set to return true or false, depending on if a species has a specific organless trait. stomach for example checks if the species has NOSTOMACH and return based on that. - * Arguments: - * owner_species - species, needed to return whether the species has an organ specific trait - */ -/obj/item/organ/proc/get_availability(datum/species/owner_species) - return TRUE - -/// Called before organs are replaced in regenerate_organs with new ones -/obj/item/organ/proc/before_organ_replacement(obj/item/organ/replacement) - return - -/// Called by medical scanners to get a simple summary of how healthy the organ is. Returns an empty string if things are fine. -/obj/item/organ/proc/get_status_text() - var/status = "" - if(owner.has_reagent(/datum/reagent/inverse/technetium)) - status = " organ is [round((damage/maxHealth)*100, 1)]% damaged." - else if(organ_flags & ORGAN_FAILING) - status = "Non-Functional" - else if(damage > high_threshold) - status = "Severely Damaged" - else if (damage > low_threshold) - status = "Mildly Damaged" - - return status diff --git a/code/modules/surgery/organs/stomach/_stomach.dm b/code/modules/surgery/organs/stomach/_stomach.dm index 0cab043c404..6dbaca0abe0 100644 --- a/code/modules/surgery/organs/stomach/_stomach.dm +++ b/code/modules/surgery/organs/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/stomach +/obj/item/organ/internal/stomach name = "stomach" icon_state = "stomach" visual = FALSE @@ -31,7 +31,7 @@ var/metabolism_efficiency = 0.05 // the lowest we should go is 0.05 -/obj/item/organ/stomach/Initialize(mapload) +/obj/item/organ/internal/stomach/Initialize(mapload) . = ..() //None edible organs do not get a reagent holder by default if(!reagents) @@ -39,7 +39,7 @@ else reagents.flags |= REAGENT_HOLDER_ALIVE -/obj/item/organ/stomach/on_life(delta_time, times_fired) +/obj/item/organ/internal/stomach/on_life(delta_time, times_fired) . = ..() //Manage species digestion @@ -115,7 +115,7 @@ body.vomit(damage) to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!")) -/obj/item/organ/stomach/proc/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired) +/obj/item/organ/internal/stomach/proc/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired) if(HAS_TRAIT(human, TRAIT_NOHUNGER)) return //hunger is for BABIES @@ -198,17 +198,17 @@ human.throw_alert(ALERT_NUTRITION, /atom/movable/screen/alert/starving) ///for when mood is disabled and hunger should handle slowdowns -/obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human) +/obj/item/organ/internal/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/stomach/get_availability(datum/species/owner_species) +/obj/item/organ/internal/stomach/get_availability(datum/species/owner_species) return !(NOSTOMACH in owner_species.inherent_traits) -/obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, delta_time, times_fired) +/obj/item/organ/internal/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, delta_time, times_fired) var/old_disgust = disgusted.old_disgust var/disgust = disgusted.disgust @@ -254,7 +254,7 @@ disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/disgusted) SEND_SIGNAL(disgusted, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted) -/obj/item/organ/stomach/Remove(mob/living/carbon/stomach_owner, special = 0) +/obj/item/organ/internal/stomach/Remove(mob/living/carbon/stomach_owner, special = 0) if(ishuman(stomach_owner)) var/mob/living/carbon/human/human_owner = owner human_owner.clear_alert(ALERT_DISGUST) @@ -263,7 +263,7 @@ return ..() -/obj/item/organ/stomach/bone +/obj/item/organ/internal/stomach/bone desc = "You have no idea what this strange ball of bones does." metabolism_efficiency = 0.025 //very bad /// How much [BRUTE] damage milk heals every second @@ -271,7 +271,7 @@ /// How much [BURN] damage milk heals every second var/milk_burn_healing = 2.5 -/obj/item/organ/stomach/bone/on_life(delta_time, times_fired) +/obj/item/organ/internal/stomach/bone/on_life(delta_time, times_fired) var/datum/reagent/consumable/milk/milk = locate(/datum/reagent/consumable/milk) in reagents.reagent_list if(milk) var/mob/living/carbon/body = owner @@ -285,14 +285,14 @@ reagents.remove_reagent(milk.type, milk.metabolization_rate * delta_time) return ..() -/obj/item/organ/stomach/bone/plasmaman +/obj/item/organ/internal/stomach/bone/plasmaman name = "digestive crystal" icon_state = "stomach-p" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." metabolism_efficiency = 0.06 milk_burn_healing = 0 -/obj/item/organ/stomach/cybernetic +/obj/item/organ/internal/stomach/cybernetic name = "basic cybernetic stomach" icon_state = "stomach-c" desc = "A basic device designed to mimic the functions of a human stomach" @@ -301,7 +301,7 @@ var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. metabolism_efficiency = 0.35 // not as good at digestion -/obj/item/organ/stomach/cybernetic/tier2 +/obj/item/organ/internal/stomach/cybernetic/tier2 name = "cybernetic stomach" icon_state = "stomach-c-u" desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better." @@ -310,7 +310,7 @@ emp_vulnerability = 40 metabolism_efficiency = 0.07 -/obj/item/organ/stomach/cybernetic/tier3 +/obj/item/organ/internal/stomach/cybernetic/tier3 name = "upgraded cybernetic stomach" icon_state = "stomach-c-u2" desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well." @@ -319,7 +319,7 @@ emp_vulnerability = 20 metabolism_efficiency = 0.1 -/obj/item/organ/stomach/cybernetic/emp_act(severity) +/obj/item/organ/internal/stomach/cybernetic/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return diff --git a/code/modules/surgery/organs/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/stomach/stomach_ethereal.dm index 199a236cbf5..9a68b7b11fb 100644 --- a/code/modules/surgery/organs/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/stomach/stomach_ethereal.dm @@ -1,4 +1,4 @@ -/obj/item/organ/stomach/ethereal +/obj/item/organ/internal/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." @@ -7,18 +7,18 @@ ///used to keep ethereals from spam draining power sources var/drain_time = 0 -/obj/item/organ/stomach/ethereal/on_life(delta_time, times_fired) +/obj/item/organ/internal/stomach/ethereal/on_life(delta_time, times_fired) . = ..() adjust_charge(-ETHEREAL_CHARGE_FACTOR * delta_time) handle_charge(owner, delta_time, times_fired) -/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/carbon, special = 0) +/obj/item/organ/internal/stomach/ethereal/Insert(mob/living/carbon/carbon, special = 0) . = ..() RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute) ADD_TRAIT(owner, TRAIT_NOHUNGER, src) -/obj/item/organ/stomach/ethereal/Remove(mob/living/carbon/carbon, special = 0) +/obj/item/organ/internal/stomach/ethereal/Remove(mob/living/carbon/carbon, special = 0) UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) UnregisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT) REMOVE_TRAIT(owner, TRAIT_NOHUNGER, src) @@ -29,24 +29,24 @@ return ..() -/obj/item/organ/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human) +/obj/item/organ/internal/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 - crystal_charge / 100))) -/obj/item/organ/stomach/ethereal/proc/charge(datum/source, amount, repairs) +/obj/item/organ/internal/stomach/ethereal/proc/charge(datum/source, amount, repairs) SIGNAL_HANDLER adjust_charge(amount / 3.5) -/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) +/obj/item/organ/internal/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) SIGNAL_HANDLER if(flags & SHOCK_ILLUSION) return adjust_charge(shock_damage * siemens_coeff * 2) to_chat(owner, span_notice("You absorb some of the shock into your body!")) -/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount) +/obj/item/organ/internal/stomach/ethereal/proc/adjust_charge(amount) crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS) -/obj/item/organ/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, delta_time, times_fired) +/obj/item/organ/internal/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, delta_time, times_fired) switch(crystal_charge) if(-INFINITY to ETHEREAL_CHARGE_NONE) SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/decharged) @@ -78,7 +78,7 @@ carbon.clear_alert(ALERT_ETHEREAL_CHARGE) carbon.clear_alert(ALERT_ETHEREAL_OVERCHARGE) -/obj/item/organ/stomach/ethereal/proc/discharge_process(mob/living/carbon/carbon) +/obj/item/organ/internal/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/tails.dm b/code/modules/surgery/organs/tails.dm deleted file mode 100644 index 07e7169455b..00000000000 --- a/code/modules/surgery/organs/tails.dm +++ /dev/null @@ -1,123 +0,0 @@ -// Note: tails only work in humans. They use human-specific parameters and rely on human code for displaying. - -/obj/item/organ/tail - name = "tail" - desc = "A severed tail. What did you cut this off of?" - visual = TRUE - icon_state = "severedtail" - zone = BODY_ZONE_PRECISE_GROIN - slot = ORGAN_SLOT_TAIL - /// The sprite accessory this tail gives to the human it's attached to. If null, it will inherit its value from the human's DNA once attached. - var/tail_type = "None" - -/obj/item/organ/tail/Insert(mob/living/carbon/human/tail_owner, special = FALSE, drop_if_replaced = TRUE) - . = ..() - tail_owner?.dna?.species?.on_tail_regain(tail_owner, src, special) - -/obj/item/organ/tail/Remove(mob/living/carbon/human/tail_owner, special = FALSE) - . = ..() - tail_owner?.dna?.species?.on_tail_lost(tail_owner, src, special) - -/obj/item/organ/tail/cat - name = "cat tail" - desc = "A severed cat tail. Who's wagging now?" - tail_type = "Cat" - -/obj/item/organ/tail/cat/Insert(mob/living/carbon/human/tail_owner, special = FALSE, drop_if_replaced = TRUE) - ..() - if(istype(tail_owner)) - var/default_part = tail_owner.dna.species.mutant_bodyparts["tail_human"] - if(!default_part || default_part == "None") - if(tail_type) - tail_owner.dna.features["tail_human"] = tail_owner.dna.species.mutant_bodyparts["tail_human"] = tail_type - tail_owner.dna.update_uf_block(DNA_HUMAN_TAIL_BLOCK) - else - tail_owner.dna.species.mutant_bodyparts["tail_human"] = tail_owner.dna.features["tail_human"] - tail_owner.update_body() - -/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/tail_owner, special = FALSE) - ..() - if(istype(tail_owner)) - tail_owner.dna.species.mutant_bodyparts -= "tail_human" - color = tail_owner.hair_color - tail_owner.update_body() - -/obj/item/organ/tail/lizard - name = "lizard tail" - desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." - color = "#116611" - tail_type = "Smooth" - /// The sprite accessory this tail gives to the human it's attached to. If null, it will inherit its value from the human's DNA once attached. - var/spines = "None" - -/obj/item/organ/tail/lizard/Initialize(mapload) - . = ..() - color = "#"+ random_color() - -/obj/item/organ/tail/lizard/Insert(mob/living/carbon/human/tail_owner, special = FALSE, drop_if_replaced = TRUE) - ..() - if(istype(tail_owner)) - // Checks here are necessary so it wouldn't overwrite the tail of a lizard it spawned in - var/default_part = tail_owner.dna.species.mutant_bodyparts["tail_lizard"] - if(!default_part || default_part == "None") - if(tail_type) - tail_owner.dna.features["tail_lizard"] = tail_owner.dna.species.mutant_bodyparts["tail_lizard"] = tail_type - tail_owner.dna.update_uf_block(DNA_LIZARD_TAIL_BLOCK) - else - tail_owner.dna.species.mutant_bodyparts["tail_lizard"] = tail_owner.dna.features["tail_lizard"] - - default_part = tail_owner.dna.species.mutant_bodyparts["spines"] - if(!default_part || default_part == "None") - if(spines) - tail_owner.dna.features["spines"] = tail_owner.dna.species.mutant_bodyparts["spines"] = spines - tail_owner.dna.update_uf_block(DNA_SPINES_BLOCK) - else - tail_owner.dna.species.mutant_bodyparts["spines"] = tail_owner.dna.features["spines"] - tail_owner.update_body() - -/obj/item/organ/tail/lizard/Remove(mob/living/carbon/human/tail_owner, special = FALSE) - ..() - if(istype(tail_owner)) - tail_owner.dna.species.mutant_bodyparts -= "tail_lizard" - color = tail_owner.dna.features["mcolor"] - tail_type = tail_owner.dna.features["tail_lizard"] - spines = tail_owner.dna.features["spines"] - tail_owner.update_body() - -/obj/item/organ/tail/lizard/before_organ_replacement(obj/item/organ/replacement) - . = ..() - var/obj/item/organ/tail/lizard/new_tail = replacement - - if(!istype(new_tail)) - return - - new_tail.tail_type = tail_type - new_tail.spines = spines - -/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." - tail_type = null - spines = null - -/obj/item/organ/tail/monkey - name = "monkey tail" - desc = "A severed monkey tail. Does not look like a banana." - tail_type = "Monkey" - icon_state = "severedmonkeytail" - -/obj/item/organ/tail/monkey/Insert(mob/living/carbon/human/tail_owner, special = FALSE, drop_if_replaced = TRUE) - ..() - if(istype(tail_owner)) - if(!("tail_monkey" in tail_owner.dna.species.mutant_bodyparts)) - tail_owner.dna.species.mutant_bodyparts |= "tail_monkey" - if(tail_type) - tail_owner.dna.features["tail_monkey"] = tail_type - tail_owner.dna.update_uf_block(DNA_MONKEY_TAIL_BLOCK) - tail_owner.update_body() - -/obj/item/organ/tail/monkey/Remove(mob/living/carbon/human/tail_owner, special = FALSE) - ..() - if(istype(tail_owner)) - tail_owner.dna.species.mutant_bodyparts -= "tail_monkey" - tail_owner.update_body() diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 5ad071ef92d..e217dcb3558 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -1,4 +1,4 @@ -/obj/item/organ/tongue +/obj/item/organ/internal/tongue name = "tongue" desc = "A fleshy muscle mostly used for lying." icon_state = "tonguenormal" @@ -33,20 +33,20 @@ /datum/language/nekomimetic )) -/obj/item/organ/tongue/Initialize(mapload) +/obj/item/organ/internal/tongue/Initialize(mapload) . = ..() languages_possible = languages_possible_base -/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER if(speech_args[SPEECH_LANGUAGE] in languages_native) return FALSE //no changes modify_speech(source, speech_args) -/obj/item/organ/tongue/proc/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/proc/modify_speech(datum/source, list/speech_args) return speech_args[SPEECH_MESSAGE] -/obj/item/organ/tongue/Insert(mob/living/carbon/tongue_owner, special = 0) +/obj/item/organ/internal/tongue/Insert(mob/living/carbon/tongue_owner, special = 0) ..() if(say_mod && tongue_owner.dna && tongue_owner.dna.species) tongue_owner.dna.species.say_mod = say_mod @@ -63,20 +63,20 @@ if(!sense_of_taste) ADD_TRAIT(tongue_owner, TRAIT_AGEUSIA, ORGAN_TRAIT) -/obj/item/organ/tongue/Remove(mob/living/carbon/tongue_owner, special = 0) - ..() +/obj/item/organ/internal/tongue/Remove(mob/living/carbon/tongue_owner, special = 0) + . = ..() if(say_mod && tongue_owner.dna && tongue_owner.dna.species) tongue_owner.dna.species.say_mod = initial(tongue_owner.dna.species.say_mod) UnregisterSignal(tongue_owner, COMSIG_MOB_SAY) - tongue_owner.RegisterSignal(tongue_owner, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech) + RegisterSignal(tongue_owner, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech) REMOVE_TRAIT(tongue_owner, TRAIT_AGEUSIA, ORGAN_TRAIT) // Carbons by default start with NO_TONGUE_TRAIT caused TRAIT_AGEUSIA ADD_TRAIT(tongue_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) -/obj/item/organ/tongue/could_speak_language(language) +/obj/item/organ/internal/tongue/could_speak_language(language) return is_type_in_typecache(language, languages_possible) -/obj/item/organ/tongue/lizard +/obj/item/organ/internal/tongue/lizard name = "forked tongue" desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose." icon_state = "tonguelizard" @@ -85,7 +85,7 @@ modifies_speech = TRUE languages_native = list(/datum/language/draconic) -/obj/item/organ/tongue/lizard/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) var/static/regex/lizard_hiss = new("s+", "g") var/static/regex/lizard_hiSS = new("S+", "g") var/static/regex/lizard_kss = new(@"(\w)x", "g") @@ -102,7 +102,7 @@ message = lizard_eckS.Replace(message, "ECKS$1") speech_args[SPEECH_MESSAGE] = message -/obj/item/organ/tongue/lizard/silver +/obj/item/organ/internal/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" @@ -182,7 +182,7 @@ qdel(dropped) qdel(owner) -/obj/item/organ/tongue/fly +/obj/item/organ/internal/tongue/fly name = "proboscis" desc = "A freakish looking meat tube that apparently can take in liquids." icon_state = "tonguefly" @@ -207,7 +207,7 @@ /datum/language/buzzwords )) -/obj/item/organ/tongue/fly/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/fly/modify_speech(datum/source, list/speech_args) var/static/regex/fly_buzz = new("z+", "g") var/static/regex/fly_buZZ = new("Z+", "g") var/message = speech_args[SPEECH_MESSAGE] @@ -218,11 +218,11 @@ message = replacetext(message, "S", "Z") speech_args[SPEECH_MESSAGE] = message -/obj/item/organ/tongue/fly/Initialize(mapload) +/obj/item/organ/internal/tongue/fly/Initialize(mapload) . = ..() languages_possible = languages_possible_fly -/obj/item/organ/tongue/abductor +/obj/item/organ/internal/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" @@ -231,11 +231,11 @@ modifies_speech = TRUE var/mothership -/obj/item/organ/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) +/obj/item/organ/internal/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder) if(!istype(tongue_holder)) return - var/obj/item/organ/tongue/abductor/tongue = tongue_holder.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/abductor/tongue = tongue_holder.getorganslot(ORGAN_SLOT_TONGUE) if(!istype(tongue)) return @@ -247,7 +247,7 @@ to_chat(tongue_holder, span_notice("You attune [src] to your own channel.")) mothership = tongue.mothership -/obj/item/organ/tongue/abductor/examine(mob/examining_mob) +/obj/item/organ/internal/tongue/abductor/examine(mob/examining_mob) . = ..() if(HAS_TRAIT(examining_mob, TRAIT_ABDUCTOR_TRAINING) || (examining_mob.mind && HAS_TRAIT(examining_mob.mind, TRAIT_ABDUCTOR_TRAINING)) || isobserver(examining_mob)) . += span_notice("It can be attuned to a different channel by using it inhand.") @@ -256,14 +256,14 @@ else . += span_notice("It is attuned to [mothership].") -/obj/item/organ/tongue/abductor/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/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/tongue/abductor/tongue = living_mob.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/internal/tongue/abductor/tongue = living_mob.getorganslot(ORGAN_SLOT_TONGUE) if(!istype(tongue)) continue if(mothership == tongue.mothership) @@ -275,7 +275,7 @@ speech_args[SPEECH_MESSAGE] = "" -/obj/item/organ/tongue/zombie +/obj/item/organ/internal/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" @@ -283,7 +283,7 @@ modifies_speech = TRUE taste_sensitivity = 32 -/obj/item/organ/tongue/zombie/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args) var/list/message_list = splittext(speech_args[SPEECH_MESSAGE], " ") var/maxchanges = max(round(message_list.len / 1.5), 2) @@ -299,7 +299,7 @@ speech_args[SPEECH_MESSAGE] = jointext(message_list, " ") -/obj/item/organ/tongue/alien +/obj/item/organ/internal/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" @@ -312,14 +312,14 @@ /datum/language/draconic, /datum/language/monkey)) -/obj/item/organ/tongue/alien/Initialize(mapload) +/obj/item/organ/internal/tongue/alien/Initialize(mapload) . = ..() languages_possible = languages_possible_alien -/obj/item/organ/tongue/alien/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/alien/modify_speech(datum/source, list/speech_args) playsound(owner, SFX_HISS, 25, TRUE, TRUE) -/obj/item/organ/tongue/bone +/obj/item/organ/internal/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" @@ -348,12 +348,12 @@ /datum/language/calcic )) -/obj/item/organ/tongue/bone/Initialize(mapload) +/obj/item/organ/internal/tongue/bone/Initialize(mapload) . = ..() phomeme_type = pick(phomeme_types) languages_possible = languages_possible_skeleton -/obj/item/organ/tongue/bone/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/bone/modify_speech(datum/source, list/speech_args) if (chattering) chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source) switch(phomeme_type) @@ -362,13 +362,13 @@ if("papyrus") speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS -/obj/item/organ/tongue/bone/plasmaman +/obj/item/organ/internal/tongue/bone/plasmaman name = "plasma bone \"tongue\"" desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech." icon_state = "tongueplasma" modifies_speech = FALSE -/obj/item/organ/tongue/robot +/obj/item/organ/internal/tongue/robot name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." status = ORGAN_ROBOTIC @@ -380,19 +380,19 @@ modifies_speech = TRUE taste_sensitivity = 25 // not as good as an organic tongue -/obj/item/organ/tongue/robot/can_speak_language(language) +/obj/item/organ/internal/tongue/robot/can_speak_language(language) return TRUE // THE MAGIC OF ELECTRONICS -/obj/item/organ/tongue/robot/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args) speech_args[SPEECH_SPANS] |= SPAN_ROBOT -/obj/item/organ/tongue/snail +/obj/item/organ/internal/tongue/snail name = "radula" color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." modifies_speech = TRUE -/obj/item/organ/tongue/snail/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/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)) @@ -402,7 +402,7 @@ new_message += message[i] speech_args[SPEECH_MESSAGE] = new_message -/obj/item/organ/tongue/ethereal +/obj/item/organ/internal/tongue/ethereal name = "electric discharger" desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." icon_state = "electrotongue" @@ -427,19 +427,19 @@ /datum/language/voltaic )) -/obj/item/organ/tongue/ethereal/Initialize(mapload) +/obj/item/organ/internal/tongue/ethereal/Initialize(mapload) . = ..() languages_possible = languages_possible_ethereal //Sign Language Tongue - yep, that's how you speak sign language. -/obj/item/organ/tongue/tied +/obj/item/organ/internal/tongue/tied name = "tied tongue" desc = "If only one had a sword so we may finally untie this knot." say_mod = "signs" icon_state = "tonguetied" modifies_speech = TRUE -/obj/item/organ/tongue/tied/Insert(mob/living/carbon/signer) +/obj/item/organ/internal/tongue/tied/Insert(mob/living/carbon/signer) . = ..() signer.verb_ask = "signs" signer.verb_exclaim = "signs" @@ -449,7 +449,7 @@ ADD_TRAIT(signer, TRAIT_SIGN_LANG, ORGAN_TRAIT) REMOVE_TRAIT(signer, TRAIT_MUTE, ORGAN_TRAIT) -/obj/item/organ/tongue/tied/Remove(mob/living/carbon/speaker, special = 0) +/obj/item/organ/internal/tongue/tied/Remove(mob/living/carbon/speaker, special = 0) ..() speaker.verb_ask = initial(verb_ask) speaker.verb_exclaim = initial(verb_exclaim) @@ -460,7 +460,7 @@ //Thank you Jwapplephobia for helping me with the literal hellcode below -/obj/item/organ/tongue/tied/modify_speech(datum/source, list/speech_args) +/obj/item/organ/internal/tongue/tied/modify_speech(datum/source, list/speech_args) var/new_message var/message = speech_args[SPEECH_MESSAGE] var/exclamation_found = findtext(message, "!") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 95a1d7557a3..42822c85c0d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1,4 +1,4 @@ -/obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel +/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel name = "vocal cords" icon_state = "appendix" visual = FALSE @@ -9,16 +9,16 @@ healing_factor = 0 var/list/spans = null -/obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords +/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords return TRUE -/obj/item/organ/vocal_cords/proc/speak_with(message) //do what the organ does +/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does return -/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message +/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) -/obj/item/organ/adamantine_resonator +/obj/item/organ/internal/adamantine_resonator visual = FALSE 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." @@ -26,7 +26,7 @@ slot = ORGAN_SLOT_ADAMANTINE_RESONATOR icon_state = "adamantine_resonator" -/obj/item/organ/vocal_cords/adamantine +/obj/item/organ/internal/vocal_cords/adamantine name = "adamantine vocal cords" desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems." actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) @@ -42,7 +42,7 @@ return owner.say(".x[message]") -/obj/item/organ/vocal_cords/adamantine/handle_speech(message) +/obj/item/organ/internal/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)) @@ -54,7 +54,7 @@ to_chat(player, "[link] [msg]") //Colossus drop, forces the listeners to obey certain commands -/obj/item/organ/vocal_cords/colossus +/obj/item/organ/internal/vocal_cords/colossus name = "divine vocal cords" desc = "They carry the voice of an ancient god." icon_state = "voice_of_god" @@ -66,7 +66,7 @@ /datum/action/item_action/organ_action/colossus name = "Voice of God" - var/obj/item/organ/vocal_cords/colossus/cords = null + var/obj/item/organ/internal/vocal_cords/colossus/cords = null /datum/action/item_action/organ_action/colossus/New() ..() @@ -99,7 +99,7 @@ return owner.say(".x[command]") -/obj/item/organ/vocal_cords/colossus/can_speak_with() +/obj/item/organ/internal/vocal_cords/colossus/can_speak_with() if(world.time < next_command) to_chat(owner, span_notice("You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.")) return FALSE @@ -110,10 +110,10 @@ return FALSE return TRUE -/obj/item/organ/vocal_cords/colossus/handle_speech(message) +/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message) playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, TRUE, 5) return //voice of god speaks for us -/obj/item/organ/vocal_cords/colossus/speak_with(message) +/obj/item/organ/internal/vocal_cords/colossus/speak_with(message) var/cooldown = voice_of_god(uppertext(message), owner, spans, base_multiplier) next_command = world.time + (cooldown * cooldown_mod) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 3c8d2cdf0c7..75234deaf0e 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -23,7 +23,7 @@ return FALSE if(HAS_TRAIT(target, TRAIT_DEFIB_BLACKLISTED)) return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/internal/brain/target_brain = target.getorganslot(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 ffd179e5868..9c00f8e5120 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -15,7 +15,7 @@ var/accumulated_experience = 0 /datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/target_stomach = target.getorganslot(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 db30bf2674a..bcd4b36aa6b 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -379,11 +379,11 @@ return var/candidate_name - var/obj/item/organ/tail_snip_candidate + var/obj/item/organ/external/tail_snip_candidate var/obj/item/bodypart/limb_snip_candidate if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) - tail_snip_candidate = patient.getorganslot(ORGAN_SLOT_TAIL) + tail_snip_candidate = patient.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) if(!tail_snip_candidate) to_chat(user, span_warning("[patient] does not have a tail.")) return diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index 7e7263503e0..94fdd2d05a9 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -79,7 +79,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/stomach/pill_belly = pill_user.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/pill_belly = pill_user.getorganslot(ORGAN_SLOT_STOMACH) pill_belly.metabolism_efficiency = 1 pill_user.Life() diff --git a/code/modules/unit_tests/stomach.dm b/code/modules/unit_tests/stomach.dm index fbc86ee394f..144262f7175 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) var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug) - var/obj/item/organ/stomach/belly = human.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/internal/stomach/belly = human.getorganslot(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/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index eff9560bf5a..a1778c3af2b 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -197,7 +197,7 @@ to_chat(M, "HONK") M.SetSleeping(0) M.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/internal/ears/ears = M.getorganslot(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 ec563d4cc21..899a1dd8961 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -183,7 +183,7 @@ contraband = list( /obj/item/clothing/suit/hooded/techpriest = 2, /obj/item/clothing/under/costume/mech_suit = 2, - /obj/item/organ/tongue/robot = 2, + /obj/item/organ/internal/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/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index b0ec954a0ff..8a0389f5317 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/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/cyberimp/bci) var/datum/port/input/counter_number @@ -19,7 +19,7 @@ var/datum/port/input/signal_update - var/obj/item/organ/cyberimp/bci/bci + var/obj/item/organ/internal/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/cyberimp/bci)) + if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, .proc/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 0b74be3caec..c7f07ccf0e7 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/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/cyberimp/bci) var/datum/port/input/option/object_overlay_options @@ -27,7 +27,7 @@ var/datum/port/input/signal_on var/datum/port/input/signal_off - var/obj/item/organ/cyberimp/bci/bci + var/obj/item/organ/internal/cyberimp/bci/bci var/list/active_overlays = list() var/list/options_map @@ -63,7 +63,7 @@ options_map = component_options /obj/item/circuit_component/object_overlay/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/organ/cyberimp/bci)) + if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, .proc/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 fea25a3599b..4fb3c3585ea 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/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/cyberimp/bci) var/datum/port/output/clicked_atom - var/obj/item/organ/cyberimp/bci/bci + var/obj/item/organ/internal/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/cyberimp/bci)) + if(istype(shell, /obj/item/organ/internal/cyberimp/bci)) bci = shell RegisterSignal(shell, COMSIG_ORGAN_REMOVED, .proc/on_organ_removed) diff --git a/code/modules/wiremod/components/bci/thought_listener.dm b/code/modules/wiremod/components/bci/thought_listener.dm index f7bf30a3cfd..b995c0102c7 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/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/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/cyberimp/bci/bci + var/obj/item/organ/internal/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/cyberimp/bci)) + if(istype(shell, /obj/item/organ/internal/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 8749d1b72b6..420140a7fde 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/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/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/cyberimp/bci/bci + var/obj/item/organ/internal/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/cyberimp/bci)) + if(istype(shell, /obj/item/organ/internal/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 1310708108d..8f278f885d2 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/cyberimp/bci +/obj/item/organ/internal/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/wiremod.dmi' @@ -7,7 +7,7 @@ zone = BODY_ZONE_HEAD w_class = WEIGHT_CLASS_TINY -/obj/item/organ/cyberimp/bci/Initialize(mapload) +/obj/item/organ/internal/cyberimp/bci/Initialize(mapload) . = ..() var/obj/item/integrated_circuit/circuit = new(src) @@ -17,13 +17,13 @@ new /obj/item/circuit_component/bci_core, ), SHELL_CAPACITY_SMALL, starting_circuit = circuit) -/obj/item/organ/cyberimp/bci/Insert(mob/living/carbon/reciever, special, drop_if_replaced) +/obj/item/organ/internal/cyberimp/bci/Insert(mob/living/carbon/reciever, special, drop_if_replaced) . = ..() // Organs are put in nullspace, but this breaks circuit interactions forceMove(reciever) -/obj/item/organ/cyberimp/bci/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced) +/obj/item/organ/internal/cyberimp/bci/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced) if (owner) // Otherwise say_dead will be called. // It's intentional that a circuit for a dead person does not speak from the shell. @@ -37,7 +37,7 @@ /obj/item/circuit_component/equipment_action/bci display_name = "BCI Action" desc = "Represents an action the user can take when implanted with the brain-computer interface." - required_shells = list(/obj/item/organ/cyberimp/bci) + required_shells = list(/obj/item/organ/internal/cyberimp/bci) /// A reference to the action button itself var/datum/action/innate/bci_action/bci_action @@ -48,7 +48,7 @@ /obj/item/circuit_component/equipment_action/bci/register_shell(atom/movable/shell) . = ..() - var/obj/item/organ/cyberimp/bci/bci = shell + var/obj/item/organ/internal/cyberimp/bci/bci = shell if(istype(bci)) bci_action = new(src) update_action() @@ -56,7 +56,7 @@ bci.actions += list(bci_action) /obj/item/circuit_component/equipment_action/bci/unregister_shell(atom/movable/shell) - var/obj/item/organ/cyberimp/bci/bci = shell + var/obj/item/organ/internal/cyberimp/bci/bci = shell if(istype(bci)) bci.actions -= bci_action QDEL_NULL(bci_action) @@ -118,7 +118,7 @@ return ..() /obj/item/circuit_component/bci_core/register_shell(atom/movable/shell) - var/obj/item/organ/cyberimp/bci/bci = shell + var/obj/item/organ/internal/cyberimp/bci/bci = shell charge_action = new(src) bci.actions += list(charge_action) @@ -127,7 +127,7 @@ RegisterSignal(shell, COMSIG_ORGAN_REMOVED, .proc/on_organ_removed) /obj/item/circuit_component/bci_core/unregister_shell(atom/movable/shell) - var/obj/item/organ/cyberimp/bci/bci = shell + var/obj/item/organ/internal/cyberimp/bci/bci = shell bci.actions -= charge_action QDEL_NULL(charge_action) @@ -290,7 +290,7 @@ occupant_typecache = typecacheof(/mob/living/carbon) /obj/machinery/bci_implanter/on_deconstruction() - var/obj/item/organ/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() + var/obj/item/organ/internal/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() bci_to_implant_resolved?.forceMove(drop_location()) bci_to_implant = null @@ -350,7 +350,7 @@ balloon_alert(user, "it's locked!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - var/obj/item/organ/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() + var/obj/item/organ/internal/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() if (isnull(bci_to_implant_resolved)) balloon_alert(user, "no bci inserted!") else @@ -362,13 +362,13 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, params) - var/obj/item/organ/cyberimp/bci/new_bci = weapon + var/obj/item/organ/internal/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/cyberimp/bci/previous_bci_to_implant = bci_to_implant?.resolve() + var/obj/item/organ/internal/cyberimp/bci/previous_bci_to_implant = bci_to_implant?.resolve() bci_to_implant = WEAKREF(weapon) weapon.moveToNullspace() @@ -425,8 +425,8 @@ playsound(loc, 'sound/machines/ping.ogg', 30, FALSE) - var/obj/item/organ/cyberimp/bci/bci_organ = carbon_occupant.getorgan(/obj/item/organ/cyberimp/bci) - var/obj/item/organ/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() + var/obj/item/organ/internal/cyberimp/bci/bci_organ = carbon_occupant.getorgan(/obj/item/organ/internal/cyberimp/bci) + var/obj/item/organ/internal/cyberimp/bci/bci_to_implant_resolved = bci_to_implant?.resolve() if (bci_organ) bci_organ.Remove(carbon_occupant) @@ -459,7 +459,7 @@ var/mob/living/carbon/carbon_occupant = occupant if (istype(occupant)) - var/obj/item/organ/cyberimp/bci/existing_bci_organ = carbon_occupant.getorgan(/obj/item/organ/cyberimp/bci) + var/obj/item/organ/internal/cyberimp/bci/existing_bci_organ = carbon_occupant.getorgan(/obj/item/organ/internal/cyberimp/bci) if (isnull(existing_bci_organ) && isnull(bci_to_implant?.resolve())) say("No brain-computer interface inserted, and occupant does not have one. Insert a BCI to implant one.") playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm index a82a2999b91..565424c344d 100644 --- a/code/modules/wiremod/shell/shell_items.dm +++ b/code/modules/wiremod/shell/shell_items.dm @@ -61,7 +61,7 @@ /obj/item/shell/bci name = "brain-computer interface assembly" icon_state = "bci-open" - shell_to_spawn = /obj/item/organ/cyberimp/bci + shell_to_spawn = /obj/item/organ/internal/cyberimp/bci /obj/item/shell/scanner_gate name = "scanner gate assembly" diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 0a0771beb81..38863c56637 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -48,7 +48,7 @@ // zombies) return - var/obj/item/organ/zombie_infection/infection + var/obj/item/organ/internal/zombie_infection/infection infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index ac629053477..c071d824b13 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -1,4 +1,4 @@ -/obj/item/organ/zombie_infection +/obj/item/organ/internal/zombie_infection name = "festering ooze" desc = "A black web of pus and viscera." zone = BODY_ZONE_HEAD @@ -13,21 +13,21 @@ var/revive_time_max = 700 var/timer_id -/obj/item/organ/zombie_infection/Initialize(mapload) +/obj/item/organ/internal/zombie_infection/Initialize(mapload) . = ..() if(iscarbon(loc)) Insert(loc) GLOB.zombie_infection_list += src -/obj/item/organ/zombie_infection/Destroy() +/obj/item/organ/internal/zombie_infection/Destroy() GLOB.zombie_infection_list -= src . = ..() -/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/zombie_infection/Insert(mob/living/carbon/M, special = 0) . = ..() START_PROCESSING(SSobj, src) -/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/zombie_infection/Remove(mob/living/carbon/M, special = 0) . = ..() STOP_PROCESSING(SSobj, src) if(iszombie(M) && old_species && !special && !QDELETED(src)) @@ -35,12 +35,12 @@ if(timer_id) deltimer(timer_id) -/obj/item/organ/zombie_infection/on_find(mob/living/finder) +/obj/item/organ/internal/zombie_infection/on_find(mob/living/finder) to_chat(finder, "Inside the head is a disgusting black \ web of pus and viscera, bound tightly around the brain like some \ biological harness.") -/obj/item/organ/zombie_infection/process(delta_time, times_fired) +/obj/item/organ/internal/zombie_infection/process(delta_time, times_fired) if(!owner) return if(!(src in owner.internal_organs)) @@ -57,7 +57,7 @@ return if(owner.stat != DEAD && !converts_living) return - if(!owner.getorgan(/obj/item/organ/brain)) + if(!owner.getorgan(/obj/item/organ/internal/brain)) return if(!iszombie(owner)) to_chat(owner, "You can feel your heart stopping, but something isn't right... \ @@ -67,7 +67,7 @@ var/flags = TIMER_STOPPABLE timer_id = addtimer(CALLBACK(src, .proc/zombify, owner), revive_time, flags) -/obj/item/organ/zombie_infection/proc/zombify(mob/living/carbon/target) +/obj/item/organ/internal/zombie_infection/proc/zombify(mob/living/carbon/target) timer_id = null if(!converts_living && owner.stat != DEAD) @@ -94,5 +94,5 @@ target.Stun(living_transformation_time) to_chat(target, span_alertalien("You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence.")) -/obj/item/organ/zombie_infection/nodamage +/obj/item/organ/internal/zombie_infection/nodamage causes_damage = FALSE diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index c69dbad09e281eaf70c2d1ebc5751e8ba616972d..c41af7c05512fa3a479e2706ff2ef5a3c44f620c 100644 GIT binary patch literal 34432 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 V_P`bA25t|+*wB1`?!J?k{|8|%o&o>> literal 34375 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

yIb9vIG9xlDwt!^3Q^lET7f5MP`b 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 diff --git a/tgstation.dme b/tgstation.dme index 055af29b5d9..3634ad03a8e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -74,6 +74,7 @@ #include "code\__DEFINES\experisci.dm" #include "code\__DEFINES\explosions.dm" #include "code\__DEFINES\exports.dm" +#include "code\__DEFINES\external_organs.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\firealarm.dm" #include "code\__DEFINES\flags.dm" @@ -4217,6 +4218,7 @@ #include "code\modules\surgery\bodyparts\species_parts\misc_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\moth_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\plasmaman_bodyparts.dm" +#include "code\modules\surgery\organs\_organ.dm" #include "code\modules\surgery\organs\appendix.dm" #include "code\modules\surgery\organs\augments_arms.dm" #include "code\modules\surgery\organs\augments_chest.dm" @@ -4230,10 +4232,11 @@ #include "code\modules\surgery\organs\liver.dm" #include "code\modules\surgery\organs\lungs.dm" #include "code\modules\surgery\organs\organ_internal.dm" -#include "code\modules\surgery\organs\tails.dm" #include "code\modules\surgery\organs\tongue.dm" #include "code\modules\surgery\organs\vocal_cords.dm" #include "code\modules\surgery\organs\external\_external_organs.dm" +#include "code\modules\surgery\organs\external\spines.dm" +#include "code\modules\surgery\organs\external\tails.dm" #include "code\modules\surgery\organs\external\wings.dm" #include "code\modules\surgery\organs\stomach\_stomach.dm" #include "code\modules\surgery\organs\stomach\stomach_ethereal.dm"