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 c69dbad09e2..c41af7c0551 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
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"