diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
index 97b4e3d53c99f..6ef2066b19156 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
@@ -467,7 +467,7 @@
pixel_y = 4
},
/obj/item/bodypart/chest,
-/obj/item/organ/internal/heart,
+/obj/item/organ/heart,
/obj/item/multitool,
/turf/open/floor/iron/freezer,
/area/ruin/powered)
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm
index d4862ce03ee07..0ea4048d1276a 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm
@@ -142,7 +142,7 @@
/turf/open/misc/ice/icemoon,
/area/icemoon/underground/explored)
"sp" = (
-/obj/item/organ/internal/monster_core/regenerative_core/legion{
+/obj/item/organ/monster_core/regenerative_core/legion{
time_to_decay = 0;
pixel_x = 11;
pixel_y = 4;
@@ -273,7 +273,7 @@
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"JP" = (
-/obj/item/organ/internal/monster_core/regenerative_core/legion{
+/obj/item/organ/monster_core/regenerative_core/legion{
time_to_decay = 0;
pixel_x = -12;
pixel_y = -4;
@@ -365,7 +365,7 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
"VT" = (
-/obj/item/organ/internal/monster_core/regenerative_core/legion{
+/obj/item/organ/monster_core/regenerative_core/legion{
time_to_decay = 0;
pixel_x = 4;
pixel_y = 3;
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
index a3c10d3b50899..e2b11a02964eb 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
@@ -217,8 +217,8 @@
dir = 5
},
/obj/machinery/smartfridge/organ,
-/obj/item/organ/internal/alien/resinspinner,
-/obj/item/organ/internal/eyes/night_vision,
+/obj/item/organ/alien/resinspinner,
+/obj/item/organ/eyes/night_vision,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/syndibiodome)
"cE" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
index 6156174aaba56..bd900021094f3 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
@@ -235,7 +235,7 @@
"oL" = (
/obj/structure/bonfire/prelit,
/obj/effect/decal/cleanable/ash,
-/obj/item/organ/external/tail/lizard,
+/obj/item/organ/tail/lizard,
/obj/effect/decal/cleanable/blood/old,
/obj/structure/stone_tile/slab/cracked,
/turf/open/misc/asteroid/basalt/wasteland,
@@ -313,7 +313,7 @@
/area/ruin/unpowered/elephant_graveyard)
"wp" = (
/obj/item/knife/combat/bone,
-/obj/item/organ/internal/tongue,
+/obj/item/organ/tongue,
/obj/effect/decal/cleanable/blood/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -386,8 +386,8 @@
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface)
"Di" = (
-/obj/item/organ/internal/lungs,
-/obj/item/organ/internal/liver,
+/obj/item/organ/lungs,
+/obj/item/organ/liver,
/obj/effect/decal/cleanable/blood/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -406,7 +406,7 @@
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"Eh" = (
-/obj/item/organ/internal/brain,
+/obj/item/organ/brain,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"EI" = (
@@ -468,9 +468,9 @@
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
"Kj" = (
-/obj/item/organ/internal/heart,
-/obj/item/organ/internal/eyes,
-/obj/item/organ/internal/ears,
+/obj/item/organ/heart,
+/obj/item/organ/eyes,
+/obj/item/organ/ears,
/obj/effect/decal/cleanable/blood/gibs/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
index 66e681981c706..5e8cb710e8914 100644
--- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
+++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
@@ -524,9 +524,9 @@
"tL" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/closet/crate/secure/engineering,
-/obj/item/organ/internal/cyberimp/arm/toolset,
-/obj/item/organ/internal/cyberimp/eyes/hud/medical,
-/obj/item/organ/internal/cyberimp/brain/anti_stun,
+/obj/item/organ/cyberimp/arm/toolset,
+/obj/item/organ/cyberimp/eyes/hud/medical,
+/obj/item/organ/cyberimp/brain/anti_stun,
/turf/open/floor/iron/dark/airless,
/area/shuttle/ruin/caravan/freighter3)
"tO" = (
diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
index 025a2b62e0a83..52a288e64e6d1 100644
--- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
+++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
@@ -341,7 +341,7 @@
/obj/effect/decal/cleanable/blood/footprints{
dir = 8
},
-/obj/item/organ/internal/liver,
+/obj/item/organ/liver,
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/dangerous_research/lab)
@@ -543,7 +543,7 @@
dir = 4
},
/obj/effect/decal/cleanable/blood/bubblegum,
-/obj/item/organ/internal/appendix,
+/obj/item/organ/appendix,
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/window/reinforced/spawner/directional/west,
/obj/effect/mapping_helpers/burnt_floor,
@@ -903,7 +903,7 @@
/area/ruin/space/has_grav/dangerous_research/dorms)
"mG" = (
/obj/structure/table,
-/obj/item/organ/internal/heart,
+/obj/item/organ/heart,
/obj/effect/decal/cleanable/blood/bubblegum,
/obj/effect/spawner/random/medical/surgery_tool_advanced,
/obj/effect/turf_decal/tile/blue/fourcorners,
@@ -1056,7 +1056,7 @@
dir = 1
},
/obj/effect/decal/cleanable/blood/footprints,
-/obj/item/organ/internal/lungs,
+/obj/item/organ/lungs,
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/floor/iron/dark,
@@ -1193,7 +1193,7 @@
dir = 8
},
/obj/effect/decal/cleanable/blood/gibs,
-/obj/item/organ/internal/brain,
+/obj/item/organ/brain,
/obj/item/skillchip/research_director,
/obj/effect/turf_decal/tile/neutral/half{
dir = 4
@@ -1279,7 +1279,7 @@
/obj/effect/decal/cleanable/blood/footprints{
dir = 8
},
-/obj/item/organ/internal/heart,
+/obj/item/organ/heart,
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/dangerous_research/lab)
@@ -3692,8 +3692,8 @@
/area/ruin/space/has_grav/dangerous_research/lab)
"Wt" = (
/obj/structure/table/optable,
-/obj/item/organ/internal/eyes,
-/obj/item/organ/internal/liver,
+/obj/item/organ/eyes,
+/obj/item/organ/liver,
/obj/effect/decal/cleanable/blood/bubblegum,
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/white,
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
index f3a4b1f75286f..05da4138d0f25 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
@@ -876,10 +876,10 @@
/obj/item/petri_dish,
/obj/item/petri_dish,
/obj/item/petri_dish,
-/obj/item/organ/internal/tongue/rat,
+/obj/item/organ/tongue/rat,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/glass,
-/obj/item/organ/internal/stomach/rat,
+/obj/item/organ/stomach/rat,
/obj/item/fish/ratfish,
/obj/structure/closet/crate/freezer,
/obj/effect/spawner/random/medical/surgery_tool,
@@ -1227,7 +1227,7 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/food/deadmouse,
/mob/living/basic/mouse/rat,
-/obj/item/organ/internal/heart/rat,
+/obj/item/organ/heart/rat,
/turf/open/floor/plating/dumpsterair,
/area/ruin/space/has_grav/garbagetruck/foodwaste)
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
index c697cd5fa00be..f1c41c3bf1708 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
@@ -1,11 +1,11 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"bb" = (
-/obj/item/organ/external/wings/moth,
+/obj/item/organ/wings/moth,
/obj/structure/closet/crate/trashcart,
/obj/item/bodypart/arm/left/skeleton,
/obj/item/bodypart/arm/right/skeleton,
/obj/item/evidencebag,
-/obj/item/organ/internal/heart/cybernetic/tier2,
+/obj/item/organ/heart/cybernetic/tier2,
/obj/structure/broken_flooring/pile,
/obj/item/stack/sheet/animalhide/human/five,
/turf/open/floor/plating,
@@ -183,7 +183,7 @@
/obj/item/trash/syndi_cakes,
/obj/item/trash/syndi_cakes,
/obj/item/poster/random_contraband,
-/obj/item/organ/internal/tongue/zombie,
+/obj/item/organ/tongue/zombie,
/obj/structure/closet/crate/trashcart,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
@@ -298,8 +298,8 @@
/obj/item/stack/medical/gauze,
/obj/item/stack/sticky_tape/surgical,
/obj/structure/broken_flooring/corner,
-/obj/item/organ/internal/cyberimp/arm/surgery,
-/obj/item/organ/internal/cyberimp/eyes/hud/medical,
+/obj/item/organ/cyberimp/arm/surgery,
+/obj/item/organ/cyberimp/eyes/hud/medical,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"zu" = (
@@ -417,7 +417,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"Gp" = (
-/obj/item/organ/internal/eyes/robotic/basic,
+/obj/item/organ/eyes/robotic/basic,
/obj/item/kitchen/spoon,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
@@ -437,9 +437,9 @@
"IM" = (
/obj/effect/decal/cleanable/robot_debris,
/obj/structure/closet/crate/freezer,
-/obj/item/organ/internal/liver/roach,
-/obj/item/organ/internal/stomach,
-/obj/item/organ/internal/tongue/robot,
+/obj/item/organ/liver/roach,
+/obj/item/organ/stomach,
+/obj/item/organ/tongue/robot,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"IS" = (
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
index cdb5b4e2cec60..1bc775220c2fc 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
@@ -662,7 +662,7 @@
/obj/structure/mecha_wreckage/ripley,
/obj/effect/decal/cleanable/fuel_pool,
/obj/effect/decal/cleanable/molten_object,
-/obj/item/organ/internal/tongue/robot,
+/obj/item/organ/tongue/robot,
/turf/open/floor/plating/dumpsterair,
/area/ruin/space/has_grav/garbagetruck/squat)
"HN" = (
diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
index 6954a5f57a20f..06451e02e8c7a 100644
--- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
@@ -5471,7 +5471,7 @@
/obj/structure/table/wood,
/obj/item/toy/figure/wizard/special{
pixel_y = 9;
- pixel_x = -4;
+ pixel_x = -4
},
/obj/item/toy/figure/warden{
name = "\improper Knight action figure";
diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
index 6c08525d8f2c3..729e9ddf044cd 100644
--- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
@@ -312,7 +312,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/powered/cat_man)
"be" = (
-/obj/item/organ/external/tail/cat,
+/obj/item/organ/tail/cat,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/white/corner,
/area/ruin/space/has_grav/powered/cat_man)
@@ -396,7 +396,7 @@
"bt" = (
/obj/structure/table/optable,
/obj/effect/mob_spawn/corpse/human/damaged,
-/obj/item/organ/internal/ears/cat,
+/obj/item/organ/ears/cat,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/white,
/area/ruin/space/has_grav/powered/cat_man)
@@ -737,12 +737,12 @@
/obj/structure/closet/crate/freezer{
name = "cat ears"
},
-/obj/item/organ/internal/ears/cat,
-/obj/item/organ/internal/ears/cat,
-/obj/item/organ/internal/ears/cat,
-/obj/item/organ/internal/ears/cat,
-/obj/item/organ/internal/ears/cat,
-/obj/item/organ/internal/ears/cat,
+/obj/item/organ/ears/cat,
+/obj/item/organ/ears/cat,
+/obj/item/organ/ears/cat,
+/obj/item/organ/ears/cat,
+/obj/item/organ/ears/cat,
+/obj/item/organ/ears/cat,
/turf/open/floor/iron/freezer,
/area/ruin/space/has_grav/powered/cat_man)
"cv" = (
@@ -791,12 +791,12 @@
/obj/structure/closet/crate/freezer{
name = "cat tails"
},
-/obj/item/organ/external/tail/cat,
-/obj/item/organ/external/tail/cat,
-/obj/item/organ/external/tail/cat,
-/obj/item/organ/external/tail/cat,
-/obj/item/organ/external/tail/cat,
-/obj/item/organ/external/tail/cat,
+/obj/item/organ/tail/cat,
+/obj/item/organ/tail/cat,
+/obj/item/organ/tail/cat,
+/obj/item/organ/tail/cat,
+/obj/item/organ/tail/cat,
+/obj/item/organ/tail/cat,
/turf/open/floor/iron/freezer,
/area/ruin/space/has_grav/powered/cat_man)
"jc" = (
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 0c3c231b5f225..1f1ad0f6c4a3c 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -521,7 +521,7 @@
pixel_x = 17;
pixel_y = 12
},
-/obj/item/organ/internal/cyberimp/arm/toolset{
+/obj/item/organ/cyberimp/arm/toolset{
pixel_y = 2;
pixel_x = 6
},
diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
index f31929b70a4e2..719088322f21e 100644
--- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
+++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
@@ -251,14 +251,14 @@
/area/ruin/space/has_grav/the_outlet/researchrooms)
"gU" = (
/obj/structure/closet/secure_closet/freezer/empty,
-/obj/item/organ/internal/tongue/lizard,
+/obj/item/organ/tongue/lizard,
/obj/item/food/meat/slab/human/mutant/lizard,
-/obj/item/organ/external/tail/lizard,
-/obj/item/organ/internal/heart,
-/obj/item/organ/internal/brain,
-/obj/item/organ/internal/liver,
-/obj/item/organ/internal/lungs,
-/obj/item/organ/internal/stomach,
+/obj/item/organ/tail/lizard,
+/obj/item/organ/heart,
+/obj/item/organ/brain,
+/obj/item/organ/liver,
+/obj/item/organ/lungs,
+/obj/item/organ/stomach,
/turf/open/floor/iron/freezer,
/area/ruin/space/has_grav/the_outlet/researchrooms)
"gX" = (
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index a21d64d505b63..ea63bf1b7fe19 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -56,7 +56,7 @@
},
/obj/item/veilrender/honkrender,
/obj/item/clothing/mask/gas/clown_hat,
-/obj/item/organ/internal/heart/demon,
+/obj/item/organ/heart/demon,
/turf/open/floor/engine/cult{
initial_gas_mix = "n2=23;o2=14;TEMP=2.7"
},
@@ -1252,7 +1252,7 @@
"ki" = (
/obj/structure/closet/crate/preopen,
/obj/item/paper/fluff/awaymissions/caves/shipment_receipt,
-/obj/item/organ/internal/eyes/robotic/thermals,
+/obj/item/organ/eyes/robotic/thermals,
/obj/item/gun/energy/laser/captain/scattershot,
/obj/item/slimepotion/fireproof,
/turf/open/misc/asteroid/basalt{
@@ -1977,7 +1977,7 @@
},
/area/awaymission/caves/bmp_asteroid/level_three)
"YG" = (
-/obj/item/organ/internal/brain/alien,
+/obj/item/organ/brain/alien,
/turf/open/misc/asteroid/basalt{
initial_gas_mix = "n2=23;o2=14;TEMP=2.7"
},
diff --git a/_maps/deathmatch/sunrise.dmm b/_maps/deathmatch/sunrise.dmm
index b4de46385cd5c..d58aac39aecc3 100644
--- a/_maps/deathmatch/sunrise.dmm
+++ b/_maps/deathmatch/sunrise.dmm
@@ -721,7 +721,7 @@
/area/deathmatch)
"Uk" = (
/obj/structure/closet/crate/coffin,
-/obj/item/organ/internal/cyberimp/arm/shard/katana,
+/obj/item/organ/cyberimp/arm/shard/katana,
/obj/structure/window/spawner/directional/east,
/obj/structure/window/spawner/directional/west,
/obj/structure/window/spawner/directional/south,
diff --git a/_maps/map_files/Basketball/lusty_xenomorphs.dmm b/_maps/map_files/Basketball/lusty_xenomorphs.dmm
index 534376d3f5639..f3550c0c15fad 100644
--- a/_maps/map_files/Basketball/lusty_xenomorphs.dmm
+++ b/_maps/map_files/Basketball/lusty_xenomorphs.dmm
@@ -135,7 +135,7 @@
/turf/open/floor/engine,
/area/centcom/basketball)
"kT" = (
-/obj/item/organ/internal/body_egg/alien_embryo,
+/obj/item/organ/body_egg/alien_embryo,
/turf/open/floor/engine,
/area/centcom/basketball)
"lh" = (
@@ -327,7 +327,7 @@
/area/centcom/basketball)
"Bd" = (
/obj/structure/alien/weeds,
-/obj/item/organ/internal/body_egg/alien_embryo,
+/obj/item/organ/body_egg/alien_embryo,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"Cv" = (
diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm
index 402b8f827c67c..95fdc28f2f6ca 100644
--- a/_maps/map_files/Birdshot/birdshot.dmm
+++ b/_maps/map_files/Birdshot/birdshot.dmm
@@ -2454,12 +2454,6 @@
/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
-"aVK" = (
-/obj/structure/rack,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
"aVT" = (
/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior,
/obj/effect/mapping_helpers/airlock/locked,
@@ -2609,6 +2603,10 @@
/obj/structure/flora/bush/flowers_yw/style_random,
/turf/open/misc/sandy_dirt,
/area/station/service/lawoffice)
+"aZg" = (
+/obj/machinery/drone_dispenser,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"aZh" = (
/obj/machinery/modular_computer/preset/curator{
dir = 8
@@ -9465,24 +9463,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"dzi" = (
-/obj/structure/table/wood,
-/obj/item/book/granter/action/spell/smoke/lesser{
- name = "mysterious old book of cloud-chasing"
- },
-/obj/item/reagent_containers/cup/glass/bottle/holywater{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/nullrod{
- pixel_x = 4
- },
-/obj/item/organ/internal/heart,
-/obj/item/soulstone/anybody/chaplain,
-/obj/machinery/light/small/red/dim/directional/south,
-/obj/item/radio/intercom/chapel/directional/east,
-/turf/open/floor/iron/terracotta/diagonal,
-/area/station/service/chapel/office)
"dzE" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -26326,10 +26306,6 @@
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"jar" = (
-/obj/machinery/drone_dispenser,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
"jat" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
dir = 4
@@ -30219,7 +30195,6 @@
/area/station/command/corporate_dock)
"kmD" = (
/obj/structure/chair/office/light{
- name = "blue";
color = "#6495ED";
dir = 4
},
@@ -45439,6 +45414,24 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"pEQ" = (
+/obj/structure/table/wood,
+/obj/item/book/granter/action/spell/smoke/lesser{
+ name = "mysterious old book of cloud-chasing"
+ },
+/obj/item/reagent_containers/cup/glass/bottle/holywater{
+ pixel_x = -2;
+ pixel_y = 2
+ },
+/obj/item/nullrod{
+ pixel_x = 4
+ },
+/obj/item/organ/heart,
+/obj/item/soulstone/anybody/chaplain,
+/obj/machinery/light/small/red/dim/directional/south,
+/obj/item/radio/intercom/chapel/directional/east,
+/turf/open/floor/iron/terracotta/diagonal,
+/area/station/service/chapel/office)
"pET" = (
/obj/effect/turf_decal/siding/wideplating{
dir = 8
@@ -64493,7 +64486,6 @@
/area/station/security/checkpoint/customs/auxiliary)
"vKn" = (
/obj/structure/chair/office/light{
- name = "blue";
color = "#6495ED";
dir = 8
},
@@ -70261,6 +70253,12 @@
},
/turf/open/floor/iron/checker,
/area/station/security/breakroom)
+"xtv" = (
+/obj/structure/rack,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"xtD" = (
/obj/effect/turf_decal/siding/wood{
dir = 4
@@ -85845,7 +85843,7 @@ jte
diI
yea
vmt
-dzi
+pEQ
fEC
wxR
fEC
@@ -112840,7 +112838,7 @@ tjj
tjj
blb
ssz
-jar
+aZg
qRO
ssz
vLv
@@ -113097,7 +113095,7 @@ tjj
blb
blb
ssz
-aVK
+xtv
sPO
ssz
aSy
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 141895206a53a..52e73ec652281 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -52616,7 +52616,7 @@
/turf/open/floor/iron/dark/textured,
/area/station/ai_monitored/security/armory)
"pgN" = (
-/obj/item/organ/external/tail/monkey,
+/obj/item/organ/tail/monkey,
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
@@ -56829,7 +56829,7 @@
pixel_y = 4
},
/obj/item/bodypart/chest,
-/obj/item/organ/internal/heart,
+/obj/item/organ/heart,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"qrj" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 3c4c6f608263c..c1850a0eb3302 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -15680,14 +15680,6 @@
/obj/structure/cable,
/turf/open/floor/circuit/red,
/area/station/ai_monitored/turret_protected/ai_upload)
-"fEV" = (
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/obj/machinery/door/airlock/security/glass{
- name = "Security Post - Cargo"
- },
-/obj/effect/mapping_helpers/airlock/access/all/security/general,
-/turf/open/floor/iron/dark,
-/area/station/security/checkpoint/supply)
"fEW" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -28019,22 +28011,6 @@
/obj/item/kirbyplants/potty,
/turf/open/floor/wood/large,
/area/station/commons/lounge)
-"jTy" = (
-/obj/structure/table/wood,
-/obj/item/book/granter/action/spell/smoke/lesser{
- name = "mysterious old book of cloud-chasing"
- },
-/obj/item/reagent_containers/cup/glass/bottle/holywater{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/nullrod{
- pixel_x = 4
- },
-/obj/item/organ/internal/heart,
-/obj/item/soulstone/anybody/chaplain,
-/turf/open/floor/cult,
-/area/station/service/chapel/office)
"jTH" = (
/obj/machinery/firealarm/directional/east,
/obj/machinery/pdapainter/security,
@@ -38064,6 +38040,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/prison/work)
+"nyu" = (
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/obj/machinery/door/airlock/security/glass{
+ name = "Security Post - Cargo"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/iron/dark,
+/area/station/security/checkpoint/supply)
"nyy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -59519,6 +59503,22 @@
"uXd" = (
/turf/closed/wall/r_wall,
/area/station/engineering/main)
+"uXh" = (
+/obj/structure/table/wood,
+/obj/item/book/granter/action/spell/smoke/lesser{
+ name = "mysterious old book of cloud-chasing"
+ },
+/obj/item/reagent_containers/cup/glass/bottle/holywater{
+ pixel_x = -2;
+ pixel_y = 2
+ },
+/obj/item/nullrod{
+ pixel_x = 4
+ },
+/obj/item/organ/heart,
+/obj/item/soulstone/anybody/chaplain,
+/turf/open/floor/cult,
+/area/station/service/chapel/office)
"uXt" = (
/obj/docking_port/stationary/syndicate/northwest{
dir = 8
@@ -63486,17 +63486,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/evidence)
-"wme" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Security Post - Cargo"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/obj/effect/mapping_helpers/airlock/access/all/security/general,
-/turf/open/floor/iron/dark,
-/area/station/security/checkpoint/supply)
"wmf" = (
/obj/effect/spawner/random/trash/garbage{
spawn_scatter_radius = 1
@@ -66214,6 +66203,17 @@
},
/turf/open/floor/iron,
/area/station/commons/locker)
+"xma" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Security Post - Cargo"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/turf/open/floor/iron/dark,
+/area/station/security/checkpoint/supply)
"xmb" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
dir = 4
@@ -89980,7 +89980,7 @@ hxd
rtG
oor
oor
-wme
+xma
oor
xbu
oor
@@ -90499,7 +90499,7 @@ kDb
imT
gPw
qNL
-fEV
+nyu
pVK
xOw
uCR
@@ -91335,7 +91335,7 @@ tSw
tAH
waD
tSw
-jTy
+uXh
vQg
oCb
gCA
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 280fcdfc858e7..9b9a4ebef4fc0 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -2592,13 +2592,13 @@
/area/station/hallway/primary/central)
"XN" = (
/obj/structure/table,
-/obj/item/organ/internal/cyberimp/bci{
+/obj/item/organ/cyberimp/bci{
pixel_y = 5
},
-/obj/item/organ/internal/cyberimp/bci{
+/obj/item/organ/cyberimp/bci{
pixel_y = 5
},
-/obj/item/organ/internal/cyberimp/bci{
+/obj/item/organ/cyberimp/bci{
pixel_y = 5
},
/turf/open/floor/iron/dark,
diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm
index 0e8deac0a590a..893f1208686ff 100644
--- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_2.dmm
@@ -102,7 +102,7 @@
/area/station/asteroid)
"N" = (
/obj/item/instrument/trombone,
-/obj/item/organ/internal/tongue/bone,
+/obj/item/organ/tongue/bone,
/turf/open/misc/asteroid/dug,
/area/station/asteroid)
"O" = (
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index af9811526292f..07e0c9ba51acf 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -15446,7 +15446,7 @@
/obj/item/nullrod{
pixel_x = 4
},
-/obj/item/organ/internal/heart,
+/obj/item/organ/heart,
/obj/item/soulstone/anybody/chaplain,
/turf/open/floor/cult,
/area/station/service/chapel/office)
@@ -66285,11 +66285,11 @@
/area/station/hallway/secondary/exit/departure_lounge)
"xrt" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/organ/external/horns,
-/obj/item/organ/external/antennae,
-/obj/item/organ/external/frills,
-/obj/item/organ/external/spines,
-/obj/item/organ/external/tail/lizard/fake,
+/obj/item/organ/horns,
+/obj/item/organ/antennae,
+/obj/item/organ/frills,
+/obj/item/organ/spines,
+/obj/item/organ/tail/lizard/fake,
/obj/structure/closet/crate/freezer,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm
index bbcad398257f1..cdf903f034595 100644
--- a/_maps/shuttles/emergency_birdshot.dmm
+++ b/_maps/shuttles/emergency_birdshot.dmm
@@ -904,14 +904,14 @@
/obj/structure/closet/crate/freezer,
/obj/item/bodypart/arm/left/moth,
/obj/item/bodypart/arm/left/moth,
-/obj/item/organ/external/tail/lizard,
+/obj/item/organ/tail/lizard,
/obj/item/bodypart/leg/right/digitigrade,
/obj/item/bodypart/leg/right/digitigrade,
/obj/item/bodypart/leg/left/fly,
/obj/item/bodypart/leg/left/fly,
/obj/item/bodypart/arm/right,
/obj/item/bodypart/arm/right,
-/obj/item/organ/external/tail/cat,
+/obj/item/organ/tail/cat,
/obj/effect/turf_decal/stripes/white/end{
dir = 1
},
diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm
index 720a906a767c8..ba22cc263016d 100644
--- a/_maps/shuttles/emergency_zeta.dmm
+++ b/_maps/shuttles/emergency_zeta.dmm
@@ -198,10 +198,10 @@
/area/shuttle/escape/brig)
"IM" = (
/obj/structure/table/abductor,
-/obj/item/organ/internal/heart/gland/access{
+/obj/item/organ/heart/gland/access{
pixel_x = 10
},
-/obj/item/organ/internal/heart/gland/egg,
+/obj/item/organ/heart/gland/egg,
/turf/open/floor/plating/abductor,
/area/shuttle/escape)
"JK" = (
diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm
index 4e0fff656e83d..7864564eab185 100644
--- a/_maps/shuttles/ruin_cyborg_mothership.dmm
+++ b/_maps/shuttles/ruin_cyborg_mothership.dmm
@@ -480,7 +480,7 @@
/turf/open/floor/circuit/airless,
/area/shuttle/ruin/cyborg_mothership)
"yQ" = (
-/obj/item/organ/internal/brain,
+/obj/item/organ/brain,
/obj/structure/cable,
/turf/open/floor/circuit/airless,
/area/shuttle/ruin/cyborg_mothership)
diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm
index 0192f6aa1188a..b895743cab0c7 100644
--- a/_maps/shuttles/whiteship_kilo.dmm
+++ b/_maps/shuttles/whiteship_kilo.dmm
@@ -100,7 +100,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/item/organ/internal/stomach,
+/obj/item/organ/stomach,
/obj/item/trash/syndi_cakes,
/obj/effect/turf_decal/tile/bar{
dir = 1
diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm
index f538a4e509673..324ebc3209380 100644
--- a/_maps/templates/lazy_templates/ninja_den.dmm
+++ b/_maps/templates/lazy_templates/ninja_den.dmm
@@ -1659,8 +1659,8 @@
/obj/item/reagent_containers/medigel/synthflesh,
/obj/item/reagent_containers/medigel/synthflesh,
/obj/item/reagent_containers/medigel/synthflesh,
-/obj/item/organ/internal/heart/cybernetic/tier2,
-/obj/item/organ/internal/heart/cybernetic/tier2,
+/obj/item/organ/heart/cybernetic/tier2,
+/obj/item/organ/heart/cybernetic/tier2,
/obj/item/defibrillator,
/turf/open/floor/iron/sepia,
/area/centcom/central_command_areas/holding)
diff --git a/_maps/virtual_domains/abductor_ship.dmm b/_maps/virtual_domains/abductor_ship.dmm
index b182c50ed6683..b74435a9ab158 100644
--- a/_maps/virtual_domains/abductor_ship.dmm
+++ b/_maps/virtual_domains/abductor_ship.dmm
@@ -63,7 +63,7 @@
/area/virtual_domain)
"kl" = (
/obj/structure/table_frame/abductor,
-/obj/item/organ/internal/lungs{
+/obj/item/organ/lungs{
pixel_x = 8;
pixel_y = 7
},
@@ -247,7 +247,7 @@
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"JC" = (
-/obj/item/organ/external/tail/cat,
+/obj/item/organ/tail/cat,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"JR" = (
@@ -298,7 +298,7 @@
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"PB" = (
-/obj/item/organ/external/antennae,
+/obj/item/organ/antennae,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"Qp" = (
diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm
index 31b4c359ba6ae..6d429572c7b47 100644
--- a/_maps/virtual_domains/pirates.dmm
+++ b/_maps/virtual_domains/pirates.dmm
@@ -610,7 +610,8 @@
"HO" = (
/obj/structure/table/wood,
/mob/living/basic/parrot{
- name = "pepper"
+ name = "pepper";
+ faction = list("pirate")
},
/turf/open/floor/carpet/blue,
/area/virtual_domain)
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index 53ac323b61cd5..2b6c1b3220679 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -358,10 +358,10 @@
//called in /obj/item/tank/jetpack/proc/turn_off() : ()
#define COMSIG_JETPACK_DEACTIVATED "jetpack_deactivated"
-//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : ()
+//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : ()
#define COMSIG_THRUSTER_ACTIVATED "jetmodule_activated"
#define THRUSTER_ACTIVATION_FAILED (1<<0)
-//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : ()
+//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : ()
#define COMSIG_THRUSTER_DEACTIVATED "jetmodule_deactivated"
// /obj/item/camera signals
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index b06bf36fdb8fa..718f9fc03fa9d 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -266,7 +266,7 @@ GLOBAL_LIST_INIT(mining_suit_allowed, list(
/obj/item/kinetic_crusher,
/obj/item/knife,
/obj/item/mining_scanner,
- /obj/item/organ/internal/monster_core,
+ /obj/item/organ/monster_core,
/obj/item/storage/bag/ore,
/obj/item/pickaxe,
/obj/item/resonator,
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 954aec3235070..dc51fdd68dd4d 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -257,10 +257,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define isorgan(A) (istype(A, /obj/item/organ))
-#define isinternalorgan(A) (istype(A, /obj/item/organ/internal))
-
-#define isexternalorgan(A) (istype(A, /obj/item/organ/external))
-
#define isclothing(A) (istype(A, /obj/item/clothing))
#define ispickedupmob(A) (istype(A, /obj/item/clothing/head/mob_holder)) // Checks if clothing item is actually a held mob
diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index b0b8993a22357..cd25fc7f17833 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -123,6 +123,14 @@
#define JOB_CENTCOM_SPECIAL_OFFICER "Special Ops Officer"
#define JOB_CENTCOM_PRIVATE_SECURITY "Private Security Force"
+//Lost crew
+#define JOB_LOSTCREW_ENGINEER "Visiting Engineer"
+#define JOB_LOSTCREW_MEDICAL "Visiting Doctor"
+#define JOB_LOSTCREW_SECURITY "Visiting Officer"
+#define JOB_LOSTCREW_SCIENCE "Visiting Scientist"
+#define JOB_LOSTCREW_CARGO "Visiting Technician"
+#define JOB_LOSTCREW_CIVILLIAN "Visiting Civillian"
+
#define JOB_GROUP_ENGINEERS list( \
JOB_STATION_ENGINEER, \
JOB_ATMOSPHERIC_TECHNICIAN, \
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index d1862f787d65c..97a86538e3ad9 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -512,6 +512,7 @@
// Ex: (You turn into a "monkey", You turn into a "xenomorph")
#define WABBAJACK_MONKEY "monkey"
#define WABBAJACK_ROBOT "robot"
+#define WABBAJACK_CLOWN "clown"
#define WABBAJACK_SLIME "slime"
#define WABBAJACK_XENO "xenomorph"
#define WABBAJACK_HUMAN "humanoid"
@@ -836,9 +837,6 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
/// The layer above mutant body parts
#define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1)
-/// We need gloves to layer on top of modsuit chestplates because we need the hole in the suit filled in if the user lacks a limb
-#define MOD_CHESTPLATE_LAYER (GLOVES_LAYER+0.5)
-
/// If gravity must be present to perform action (can't use pens without gravity)
#define NEED_GRAVITY (1<<0)
/// If reading is required to perform action (can't read a book if you are illiterate)
diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm
index 1a4bed1ca9922..dcfcf028d080d 100644
--- a/code/__DEFINES/mod.dm
+++ b/code/__DEFINES/mod.dm
@@ -57,5 +57,9 @@
/// Global list of all /datum/mod_theme
GLOBAL_LIST_INIT(mod_themes, setup_mod_themes())
+/// Global cache of mod skins to masks per different configuration of pulled out parts.
+GLOBAL_LIST_EMPTY(mod_masks)
+/// Global cache of mod skins to deployed parts to module icon states
+GLOBAL_LIST_EMPTY(mod_module_overlays)
/// Global list of all ids associated to a /datum/mod_link instance
GLOBAL_LIST_EMPTY(mod_link_ids)
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index 314d8f5ecf2ee..28172587e795a 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -25,7 +25,7 @@
// Reagent exposure methods.
/// Used for splashing.
#define TOUCH (1<<0)
-/// Used for ingesting the reagents. Food, drinks, inhaling smoke.
+/// Used for ingesting the reagents. Food and drinks.
#define INGEST (1<<1)
/// Used by foams, sprays, and blob attacks.
#define VAPOR (1<<2)
@@ -35,6 +35,8 @@
#define INJECT (1<<4)
/// Exclusive to just plumbing. if set we use the round robin technique else we use proportional
#define LINEAR (1<<5)
+/// Used by smoke or inhaling from a source. Smoke and cigarettes.
+#define INHALE (1<<6)
/// When returned by on_mob_life(), on_mob_dead(), overdose_start() or overdose_processed(), will cause the mob to updatehealth() afterwards
#define UPDATE_MOB_HEALTH 1
diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm
index e04aead3464bc..c708cdf67dbd5 100644
--- a/code/__DEFINES/research/anomalies.dm
+++ b/code/__DEFINES/research/anomalies.dm
@@ -26,23 +26,23 @@ GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list(
/// Blacklist of organs which should not appear when bioscrambled.
/// Either will look terrible outside of intended host, give you magical powers, are irreversible, or kill you
GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list (
- /obj/item/organ/external/pod_hair,
- /obj/item/organ/external/spines,
- /obj/item/organ/external/wings,
- /obj/item/organ/external/wings/functional,
- /obj/item/organ/internal/alien,
- /obj/item/organ/internal/brain,
- /obj/item/organ/internal/body_egg,
- /obj/item/organ/internal/cyberimp,
- /obj/item/organ/internal/ears/dullahan,
- /obj/item/organ/internal/eyes/dullahan,
- /obj/item/organ/internal/heart/cursed,
- /obj/item/organ/internal/heart/demon,
- /obj/item/organ/internal/lungs,
- /obj/item/organ/internal/monster_core,
- /obj/item/organ/internal/tongue/dullahan,
- /obj/item/organ/internal/vocal_cords/colossus,
- /obj/item/organ/internal/zombie_infection,
+ /obj/item/organ/pod_hair,
+ /obj/item/organ/spines,
+ /obj/item/organ/wings,
+ /obj/item/organ/wings/functional,
+ /obj/item/organ/alien,
+ /obj/item/organ/brain,
+ /obj/item/organ/body_egg,
+ /obj/item/organ/cyberimp,
+ /obj/item/organ/ears/dullahan,
+ /obj/item/organ/eyes/dullahan,
+ /obj/item/organ/heart/cursed,
+ /obj/item/organ/heart/demon,
+ /obj/item/organ/lungs,
+ /obj/item/organ/monster_core,
+ /obj/item/organ/tongue/dullahan,
+ /obj/item/organ/vocal_cords/colossus,
+ /obj/item/organ/zombie_infection,
)))
/// List of body parts we can apply to people
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 4e42cef8f3c4f..c6fb148b64708 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -84,6 +84,8 @@
#define ROLE_SYNDICATE_MEDBORG "Syndicate Medical Cyborg"
#define ROLE_SYNDICATE_ASSAULTBORG "Syndicate Assault Cyborg"
+#define ROLE_RECOVERED_CREW "Recovered Crew"
+
//Spawner roles
#define ROLE_ANCIENT_CREW "Ancient Crew"
#define ROLE_ASHWALKER "Ash Walker"
@@ -167,6 +169,7 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_GLITCH = 0,
ROLE_PAI = 0,
ROLE_SENTIENCE = 0,
+ ROLE_RECOVERED_CREW = 0,
))
//Job defines for what happens when you fail to qualify for any job during job selection
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 5894daebd38e6..d527ebd94ea0e 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -206,6 +206,8 @@ GLOBAL_LIST_INIT(announcer_keys, list(
#define SFX_VOID_DEFLECT "void_deflect"
#define SFX_LOW_HISS "low_hiss"
#define SFX_INDUSTRIAL_SCAN "industrial_scan"
+#define SFX_MALE_SIGH "male_sigh"
+#define SFX_FEMALE_SIGH "female_sigh"
// Default is 45kbps
#define MIN_EMOTE_PITCH 42000
diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm
index b930c3711de34..f510d7a1a9410 100644
--- a/code/__DEFINES/surgery.dm
+++ b/code/__DEFINES/surgery.dm
@@ -30,6 +30,8 @@
#define ORGAN_PROMINENT (1<<11)
/// An organ that is ostensibly dangerous when inside a body
#define ORGAN_HAZARDOUS (1<<12)
+/// This is an external organ, not an inner one. Used in several checks.
+#define ORGAN_EXTERNAL (1<<13)
/// Scarring on the right eye
#define RIGHT_EYE_SCAR (1<<0)
diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm
index 76e8ffdb0e222..51283ef98a886 100644
--- a/code/__DEFINES/time.dm
+++ b/code/__DEFINES/time.dm
@@ -69,6 +69,9 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define HOURS MINUTES*60
+#define DAYS HOURS*24
+#define YEARS DAYS*365 //fuck leap days, they were removed in 2069
+
#define TICKS *world.tick_lag
#define DS2TICKS(DS) ((DS)/world.tick_lag)
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index de93661e16920..08e54d92eed05 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -619,7 +619,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// example. Through years of training/abuse, their livers have taken
// a liking to those substances. Steal a sec officer's liver, eat donuts good.
-// These traits are applied to /obj/item/organ/internal/liver
+// These traits are applied to /obj/item/organ/liver
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism"
#define TRAIT_CULINARY_METABOLISM "culinary_metabolism"
#define TRAIT_COMEDY_METABOLISM "comedy_metabolism"
@@ -977,6 +977,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///Trait given to a mob with a ckey currently in a temporary body, allowing people to know someone will re-enter the round later.
#define TRAIT_MIND_TEMPORARILY_GONE "temporarily_gone"
+/// Mobs with this trait will show up as soulless if their brain is missing even if their ghost can reenter the corpse
+#define TRAIT_FAKE_SOULLESS "fake_soulless"
+
/// Similar trait given to temporary bodies inhabited by players
#define TRAIT_TEMPORARY_BODY "temporary_body"
@@ -1352,5 +1355,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///A "fake" effect that should not be subject to normal effect removal methods (like the effect remover component)
#define TRAIT_ILLUSORY_EFFECT "illusory_effect"
+/// Gives a little examine to their body that they can be revived with a soul
+#define TRAIT_GHOSTROLE_ON_REVIVE "ghostrole_on_revive"
// END TRAIT DEFINES
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index 04e5aaf13b316..9ee97b9f1572f 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -273,7 +273,7 @@
/**
* Trait granted by [/mob/living/carbon/Initialize] and
-* granted/removed by [/obj/item/organ/internal/tongue]
+* granted/removed by [/obj/item/organ/tongue]
* Used for ensuring that carbons without tongues cannot taste anything
* so it is added in Initialize, and then removed when a tongue is inserted
* and readded when a tongue is removed.
diff --git a/code/__HELPERS/honkerblast.dm b/code/__HELPERS/honkerblast.dm
index f49a5ca4aca29..4f1f6b71dd313 100644
--- a/code/__HELPERS/honkerblast.dm
+++ b/code/__HELPERS/honkerblast.dm
@@ -23,7 +23,7 @@
victim.Stun(100)
victim.adjust_stutter(30 SECONDS)
victim.set_jitter_if_lower(1000 SECONDS)
- var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(10, 15)
to_chat(victim, "HONK")
var/obj/item/clothing/shoes/victim_shoes = victim.get_item_by_slot(ITEM_SLOT_FEET)
@@ -35,13 +35,13 @@
victim.Paralyze(20)
victim.Stun(50)
victim.set_jitter_if_lower(500 SECONDS)
- var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(7, 10)
to_chat(victim, "HONK")
for(var/mob/living/carbon/victim in lightly_honked)
victim.Knockdown(20)
victim.set_jitter_if_lower(200 SECONDS)
- var/obj/item/organ/internal/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = victim.get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(4, 5)
to_chat(victim, "HONK")
diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm
index ca2cd3c5db3a3..927d8479b0dd8 100644
--- a/code/__HELPERS/levels.dm
+++ b/code/__HELPERS/levels.dm
@@ -58,3 +58,31 @@
// Finally, more specific checks are ran for edge cases, such as lazily loaded map templates or away missions. Not perfect.
return istype(what_turf) && what_turf.planetary_atmos && what_turf.has_gravity()
+
+/**
+ * Gets the angle between two linked z-levels.
+ * Returns an angle (in degrees) if the z-levels are crosslinked/neighbors,
+ * or null if they are not.
+ *
+ * Arguments:
+ * * start: The starting Z level. Can either be a numeric z-level, or a [/datum/space_level].
+ * * end: The destination Z level. Can either be a numeric z-level, or a [/datum/space_level].
+ */
+/proc/get_linked_z_angle(datum/space_level/start, datum/space_level/end)
+ if(isnum(start))
+ start = SSmapping.get_level(start)
+ if(isnum(end))
+ end = SSmapping.get_level(end)
+ // Check the neighbors first, and return the appropiate angle if it is a neighbor.
+ for(var/direction in start.neigbours)
+ var/datum/space_level/neighbor = start.neigbours[direction]
+ if(neighbor == end)
+ var/angle = GLOB.cardinal_angles[direction]
+ if(!isnull(angle))
+ return angle
+ // Otherwise, if they're both crosslinked, calculate the angle using their grid coordinates.
+ if(start.linkage == CROSSLINKED && end.linkage == CROSSLINKED)
+ var/dx = end.xi - start.xi
+ var/dy = end.yi - start.yi
+ return round(delta_to_angle(dy, dx))
+ return null
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 867f6f9e7649d..01d1e42013ff6 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -720,7 +720,7 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
mob_occupant = occupant
else if(isorgan(occupant))
- var/obj/item/organ/internal/brain/brain = occupant
+ var/obj/item/organ/brain/brain = occupant
mob_occupant = brain.brainmob
return mob_occupant
diff --git a/code/_globalvars/lists/basic_ai.dm b/code/_globalvars/lists/basic_ai.dm
index a8646bb8d7f92..561d874c4e915 100644
--- a/code/_globalvars/lists/basic_ai.dm
+++ b/code/_globalvars/lists/basic_ai.dm
@@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(ai_controllers_by_status, list(
GLOBAL_LIST_EMPTY(ai_controllers_by_zlevel)
///basic ai controllers that are currently performing idled behaviors
-GLOBAL_LIST_INIT(unplanned_controllers, list(
+GLOBAL_LIST_INIT_TYPED(unplanned_controllers, /list/datum/ai_controller, list(
AI_STATUS_ON = list(),
AI_STATUS_IDLE = list(),
))
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index a7c7584d23aad..78680d4b216c3 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -93,6 +93,13 @@ GLOBAL_LIST_INIT(alldirs, list(
SOUTHWEST,
))
+GLOBAL_LIST_INIT(cardinal_angles, list(
+ "[NORTH]" = 0,
+ "[SOUTH]" = 180,
+ "[EAST]" = 90,
+ "[WEST]" = 270,
+))
+
/// list of all landmarks created
GLOBAL_LIST_EMPTY(landmarks_list)
/// list of all job spawn points created
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index b65ec230d37b3..d0cb7207acbf5 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -36,6 +36,7 @@
#define POLL_IGNORE_STALKER "stalker"
#define POLL_IGNORE_SYNDICATE "syndicate"
#define POLL_IGNORE_VENUSHUMANTRAP "venus_human_trap"
+#define POLL_IGNORE_RECOVERED_CREW "recovered_crew"
GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender",
@@ -74,6 +75,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_STALKER = "Stalker",
POLL_IGNORE_SYNDICATE = "Syndicate",
POLL_IGNORE_VENUSHUMANTRAP = "Venus Human Traps",
+ POLL_IGNORE_RECOVERED_CREW = "recovered_crew",
))
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm
index c052f761b03bf..825c217d055cc 100644
--- a/code/_globalvars/lists/quirks.dm
+++ b/code/_globalvars/lists/quirks.dm
@@ -25,8 +25,8 @@ GLOBAL_LIST_INIT(part_choice_transhuman, list(
"Right Arm" = /obj/item/bodypart/arm/right/robot,
"Left Leg" = /obj/item/bodypart/leg/left/robot,
"Right Leg" = /obj/item/bodypart/leg/right/robot,
- "Robotic Voice Box" = /obj/item/organ/internal/tongue/robot,
- "Flashlights for Eyes" = /obj/item/organ/internal/eyes/robotic/flashlight,
+ "Robotic Voice Box" = /obj/item/organ/tongue/robot,
+ "Flashlights for Eyes" = /obj/item/organ/eyes/robotic/flashlight,
))
///Hemiplegic Quirk
@@ -120,5 +120,6 @@ GLOBAL_LIST_INIT(quirk_chipped_choice, list(
"Integrated Intuitive Thinking and Judging" = /obj/item/skillchip/intj,
"F0RC3 4DD1CT10N" = /obj/item/skillchip/drunken_brawler,
"\"Space Station 13: The Musical\"" = /obj/item/skillchip/musical,
- "Mast-Angl-Er skillchip" = /obj/item/skillchip/master_angler,
+ "Mast-Angl-Er" = /obj/item/skillchip/master_angler,
+ "Kommand" = /obj/item/skillchip/big_pointer,
))
diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm
index e112d376adf5d..21c95d2314dc7 100644
--- a/code/_globalvars/phobias.dm
+++ b/code/_globalvars/phobias.dm
@@ -125,8 +125,8 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/gun/energy/alien,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
- /obj/item/organ/internal/body_egg/alien_embryo,
- /obj/item/organ/internal/heart/gland,
+ /obj/item/organ/body_egg/alien_embryo,
+ /obj/item/organ/heart/gland,
/obj/item/radio/headset/abductor,
/obj/item/retractor/alien,
/obj/item/scalpel/alien,
@@ -255,10 +255,10 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/grenade/spawnergrenade/spesscarp,
/obj/item/knife/carp,
/obj/item/nullrod/carp,
- /obj/item/organ/internal/lungs/carp,
- /obj/item/organ/internal/tongue/carp,
- /obj/item/organ/internal/brain/carp,
- /obj/item/organ/internal/heart/carp,
+ /obj/item/organ/lungs/carp,
+ /obj/item/organ/tongue/carp,
+ /obj/item/organ/brain/carp,
+ /obj/item/organ/heart/carp,
/obj/item/storage/fancy/cigarettes/cigpack_carp,
/obj/item/stack/sheet/animalhide/carp,
/obj/item/toy/plush/carpplushie,
@@ -430,7 +430,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/clothing/head/costume/lizard,
/obj/item/clothing/shoes/cowboy/lizard,
/obj/item/food/kebab/tail,
- /obj/item/organ/external/tail/lizard,
+ /obj/item/organ/tail/lizard,
/obj/item/reagent_containers/cup/glass/bottle/lizardwine,
/obj/item/toy/plush/lizard_plushie,
)),
@@ -472,7 +472,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/effect/decal/remains/human,
/obj/item/clothing/suit/armor/bone,
/obj/item/food/meat/slab/human/mutant/skeleton,
- /obj/item/organ/internal/tongue/bone,
+ /obj/item/organ/tongue/bone,
/obj/item/stack/sheet/bone,
)),
"snakes" = typecacheof(list(
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 9eef84860b510..b0d5e835907fd 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -334,6 +334,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MIND_READER" = TRAIT_MIND_READER,
"TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD,
"TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE,
+ "TRAIT_FAKE_SOULLESS" = TRAIT_FAKE_SOULLESS,
"TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER,
"TRAIT_MOB_CAN_DIG" = TRAIT_MOB_CAN_DIG,
"TRAIT_MOB_EATER" = TRAIT_MOB_EATER,
@@ -564,6 +565,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SPEECH_BOOSTER" = TRAIT_SPEECH_BOOSTER,
"TRAIT_MINING_PARRYING" = TRAIT_MINING_PARRYING,
"TRAIT_ILLUSORY_EFFECT" = TRAIT_ILLUSORY_EFFECT,
+ "TRAIT_GHOSTROLE_ON_REVIVE" = TRAIT_GHOSTROLE_ON_REVIVE,
"TRAIT_IGNORE_FIRE_PROTECTION" = TRAIT_IGNORE_FIRE_PROTECTION,
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
@@ -669,7 +671,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART,
"TRAIT_USED_ORGAN" = TRAIT_USED_ORGAN,
),
- /obj/item/organ/internal/liver = list(
+ /obj/item/organ/liver = list(
"TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST,
"TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM,
"TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM,
@@ -682,7 +684,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM,
"TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM,
),
- /obj/item/organ/internal/lungs = list(
+ /obj/item/organ/lungs = list(
"TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING,
),
/obj/machinery/modular_computer = list(
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 9745f1ac8c291..31c88b492d6eb 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -375,7 +375,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
/obj/item/fishing_rod = list(
"TRAIT_ROD_REMOVE_FISHING_DUD" = TRAIT_ROD_REMOVE_FISHING_DUD,
),
- /obj/item/organ/internal/liver = list(
+ /obj/item/organ/liver = list(
"TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST,
"TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM,
"TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM,
@@ -387,7 +387,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM,
"TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM,
),
- /obj/item/organ/internal/lungs = list(
+ /obj/item/organ/lungs = list(
"TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING,
),
))
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index fe09d95c9c60a..35014076db6b1 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -129,7 +129,7 @@
//Gas alerts
// Gas alerts are continuously thrown/cleared by:
-// * /obj/item/organ/internal/lungs/proc/check_breath()
+// * /obj/item/organ/lungs/proc/check_breath()
// * /mob/living/carbon/check_breath()
// * /mob/living/carbon/human/check_breath()
// * /datum/element/atmos_requirements/proc/on_non_stasis_life()
@@ -486,7 +486,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE))
last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince", encode = FALSE) // saycode already handles sanitization
if(isnull(last_whisper))
- if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE))
+ if(HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE))
return
if(!CAN_SUCCUMB(living_owner) && !HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE))
return
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index cdf63cb68812c..922241321ab91 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -330,7 +330,7 @@
var/obj/item/bodypart/head/head = human_mob.get_bodypart(BODY_ZONE_HEAD)
if(isnull(head))
blocked_slots |= ITEM_SLOT_HEAD|ITEM_SLOT_EARS|ITEM_SLOT_EYES|ITEM_SLOT_MASK
- var/obj/item/organ/internal/eyes/eyes = human_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human_mob.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes?.no_glasses)
blocked_slots |= ITEM_SLOT_EYES
if(human_mob.bodyshape & BODYSHAPE_DIGITIGRADE)
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 08c6ae681655a..655cb3fcf9a40 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -108,7 +108,7 @@
/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other
/datum/config_entry/string/human_authority //Controls how to enforce human authority
- default = "HUMAN_WHITELIST"
+ default = "DISABLED"
/////////////////////////////////////////////////Outdated human authority settings
/datum/config_entry/flag/enforce_human_authority
diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm
index c3edc30dc6866..d037d48d85475 100644
--- a/code/controllers/subsystem/dynamic/dynamic.dm
+++ b/code/controllers/subsystem/dynamic/dynamic.dm
@@ -67,7 +67,9 @@ SUBSYSTEM_DEF(dynamic)
var/list/executed_rules = list()
/// If TRUE, the next player to latejoin will guarantee roll for a random latejoin antag
/// (this does not guarantee they get said antag roll, depending on preferences and circumstances)
- var/forced_injection = FALSE
+ var/late_forced_injection = FALSE
+ /// If TRUE, a midround ruleset will be rolled
+ var/mid_forced_injection = FALSE
/// Forced ruleset to be executed for the next latejoin.
var/datum/dynamic_ruleset/latejoin/forced_latejoin_rule = null
/// How many percent of the rounds are more peaceful.
@@ -258,10 +260,10 @@ SUBSYSTEM_DEF(dynamic)
spend_midround_budget(-threatadd, threat_log, "[worldtime2text()]: decreased by [key_name(usr)]")
else if (href_list["injectlate"])
latejoin_injection_cooldown = 0
- forced_injection = TRUE
+ late_forced_injection = TRUE
message_admins("[key_name(usr)] forced a latejoin injection.")
else if (href_list["injectmid"])
- forced_injection = TRUE
+ mid_forced_injection = TRUE
message_admins("[key_name(usr)] forced a midround injection.")
try_midround_roll()
else if (href_list["threatlog"])
@@ -873,14 +875,14 @@ SUBSYSTEM_DEF(dynamic)
forced_latejoin_rule = null
return
- if(!forced_injection)
+ if(!late_forced_injection)
if(latejoin_injection_cooldown >= world.time)
return
if(!prob(latejoin_roll_chance))
return
- var/was_forced = forced_injection
- forced_injection = FALSE
+ var/was_forced = late_forced_injection
+ late_forced_injection = FALSE
var/list/possible_latejoin_rules = list()
for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules)
if(!rule.weight)
diff --git a/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm b/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm
index 968037b9fa2e0..c44bf3d591ccb 100644
--- a/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm
+++ b/code/controllers/subsystem/dynamic/dynamic_midround_rolling.dm
@@ -17,7 +17,7 @@
return last_midround_injection_attempt + distance
/datum/controller/subsystem/dynamic/proc/try_midround_roll()
- if (!forced_injection && next_midround_injection() > world.time)
+ if (!mid_forced_injection && next_midround_injection() > world.time)
return
if (GLOB.dynamic_forced_extended)
@@ -30,7 +30,7 @@
last_midround_injection_attempt = world.time
next_midround_injection = null
- forced_injection = FALSE
+ mid_forced_injection = FALSE
log_dynamic_and_announce("A midround ruleset is rolling, and will be [spawn_heavy ? "HEAVY" : "LIGHT"].")
diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
index 4d182febb07e5..e50794aa6d310 100644
--- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
+++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
@@ -261,7 +261,7 @@
candidates -= player
else if(is_centcom_level(player.z))
candidates -= player // We don't autotator people in CentCom
- else if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0))
+ else if(player.mind && (player.mind.special_role || player.mind.can_roll_midround()))
candidates -= player // We don't autotator people with roles already
/datum/dynamic_ruleset/midround/from_living/autotraitor/execute()
@@ -310,7 +310,7 @@
continue
if(isnull(player.mind))
continue
- if(player.mind.special_role || length(player.mind.antag_datums))
+ if(player.mind.special_role || player.mind.can_roll_midround())
continue
candidates += player
@@ -479,7 +479,7 @@
candidates -= player
continue
- if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0))
+ if(player.mind && (player.mind.special_role || player.mind.can_roll_midround()))
candidates -= player
/datum/dynamic_ruleset/midround/from_living/blob_infection/execute()
@@ -843,7 +843,7 @@
candidates = living_players
for(var/mob/living/carbon/human/candidate in candidates)
if( \
- !candidate.get_organ_by_type(/obj/item/organ/internal/brain) \
+ !candidate.get_organ_by_type(/obj/item/organ/brain) \
|| candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \
|| candidate.stat == DEAD \
|| !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \
diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm
index 3fdbcbf3f06a5..c9c7d3ea31167 100644
--- a/code/controllers/subsystem/polling.dm
+++ b/code/controllers/subsystem/polling.dm
@@ -2,7 +2,7 @@ SUBSYSTEM_DEF(polling)
name = "Polling"
flags = SS_BACKGROUND | SS_NO_INIT
wait = 1 SECONDS
- runlevels = RUNLEVEL_GAME
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
/// List of polls currently ongoing, to be checked on next fire()
var/list/datum/candidate_poll/currently_polling
/// Number of polls performed since the start
diff --git a/code/controllers/subsystem/unplanned_controllers.dm b/code/controllers/subsystem/unplanned_controllers.dm
index 3fb5f46dd069d..57b4ed68f169b 100644
--- a/code/controllers/subsystem/unplanned_controllers.dm
+++ b/code/controllers/subsystem/unplanned_controllers.dm
@@ -1,18 +1,37 @@
+GLOBAL_LIST_EMPTY(unplanned_controller_subsystems)
/// Handles making mobs perform lightweight "idle" behaviors such as wandering around when they have nothing planned
SUBSYSTEM_DEF(unplanned_controllers)
name = "Unplanned AI Controllers"
- flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
+ flags = SS_POST_FIRE_TIMING|SS_BACKGROUND
priority = FIRE_PRIORITY_UNPLANNED_NPC
init_order = INIT_ORDER_AI_CONTROLLERS
wait = 0.25 SECONDS
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
///what ai status are we interested in
var/target_status = AI_STATUS_ON
+ var/list/current_run = list()
+
+/datum/controller/subsystem/unplanned_controllers/Initialize()
+ ..()
+ GLOB.unplanned_controller_subsystems += src
+ return SS_INIT_SUCCESS
+
+/datum/controller/subsystem/unplanned_controllers/Destroy()
+ GLOB.unplanned_controller_subsystems -= src
+ return ..()
/datum/controller/subsystem/unplanned_controllers/stat_entry(msg)
msg = "Planning AIs:[length(GLOB.unplanned_controllers[target_status])]"
return ..()
/datum/controller/subsystem/unplanned_controllers/fire(resumed)
- for(var/datum/ai_controller/ai_controller as anything in GLOB.unplanned_controllers[target_status])
- ai_controller.idle_behavior.perform_idle_behavior(wait * 0.1, ai_controller)
+ if(!resumed)
+ src.current_run = GLOB.unplanned_controllers[target_status].Copy()
+ var/list/current_run = src.current_run // cache for sonic speed
+ while(length(current_run))
+ var/datum/ai_controller/unplanned = current_run[current_run.len]
+ current_run.len--
+ if(!QDELETED(unplanned))
+ unplanned.idle_behavior.perform_idle_behavior(wait * 0.1, unplanned)
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm
index 1c290c5f224c1..974009727870f 100644
--- a/code/datums/actions/cooldown_action.dm
+++ b/code/datums/actions/cooldown_action.dm
@@ -11,8 +11,8 @@
var/panel
/// The default cooldown applied when StartCooldown() is called
var/cooldown_time = 0
- /// The default melee cooldown applied after the ability ends
- var/melee_cooldown_time
+ /// The default melee cooldown applied after the ability ends. If set to null, copies cooldown_time.
+ var/melee_cooldown_time = 0
/// The actual next time the owner of this action can melee
var/next_melee_use_time = 0
/// Whether or not you want the cooldown for the ability to display in text form
diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm
index 449cf11124abf..d43eb0dcd3b90 100644
--- a/code/datums/actions/items/toggles.dm
+++ b/code/datums/actions/items/toggles.dm
@@ -88,7 +88,7 @@
. = ..()
if(!.)
return
- var/obj/item/organ/internal/cyberimp/eyes/hud/hud_implant = target
+ var/obj/item/organ/cyberimp/eyes/hud/hud_implant = target
hud_implant.toggle_hud(owner)
/datum/action/item_action/wheelys
diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm
index 07e3851a1aeab..b8bd03d7cc501 100644
--- a/code/datums/ai/_ai_controller.dm
+++ b/code/datums/ai/_ai_controller.dm
@@ -466,6 +466,9 @@ multiple modular subtrees with behaviors
if(isnull(ai_status) || ai_status == AI_STATUS_OFF)
return
GLOB.unplanned_controllers[ai_status] -= src
+ for(var/datum/controller/subsystem/unplanned_controllers/potential_holder as anything in GLOB.unplanned_controller_subsystems)
+ if(potential_holder.target_status == ai_status)
+ potential_holder.current_run -= src
/datum/ai_controller/proc/modify_cooldown(datum/ai_behavior/behavior, new_cooldown)
behavior_cooldowns[behavior] = new_cooldown
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
index f05c357b1a845..feca986909302 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm
@@ -10,10 +10,13 @@
var/emotes_blackboard_list = BB_EAT_EMOTES
/datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ var/list/foods_list = controller.blackboard[food_list_key]
+ if(!length(foods_list))
+ CRASH("the types of food has not been supplied in the [food_list_key] key!")
if(controller.blackboard[BB_NEXT_FOOD_EAT] > world.time)
return
if(!controller.blackboard_key_exists(found_food_key))
- controller.queue_behavior(finding_behavior, found_food_key, controller.blackboard[food_list_key])
+ controller.queue_behavior(finding_behavior, found_food_key, foods_list)
return
controller.queue_behavior(/datum/ai_behavior/interact_with_target/eat_food, found_food_key, emotes_blackboard_list)
return SUBTREE_RETURN_FINISH_PLANNING
diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm
index 0096ff0f2eb5c..c7534510b6afa 100644
--- a/code/datums/ai/generic/find_and_set.dm
+++ b/code/datums/ai/generic/find_and_set.dm
@@ -38,19 +38,17 @@
/datum/ai_behavior/find_and_set/edible/search_tactic(datum/ai_controller/controller, locate_path, search_range)
var/mob/living/living_pawn = controller.pawn
- var/list/food_candidates = list()
- for(var/held_candidate as anything in living_pawn.held_items)
- if(!held_candidate || !IsEdible(held_candidate))
- continue
- food_candidates += held_candidate
- var/list/local_results = locate(locate_path) in oview(search_range, controller.pawn)
- for(var/local_candidate in local_results)
- if(!IsEdible(local_candidate))
- continue
- food_candidates += local_candidate
- if(food_candidates.len)
- return pick(food_candidates)
+ for(var/atom/held_candidate as anything in living_pawn.held_items)
+ if(IsEdible(held_candidate))
+ return held_candidate
+
+ for(var/atom/local_candidate as anything in oview(search_range, controller.pawn))
+ if(IsEdible(local_candidate) && istype(local_candidate, locate_path))
+ return local_candidate
+
+ return null
+
/**
* Variant of find and set that only checks in hands, search range should be excluded for this
diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm
index 901a9eeef7f6c..4d0fb51405044 100644
--- a/code/datums/ai/generic/generic_behaviors.dm
+++ b/code/datums/ai/generic/generic_behaviors.dm
@@ -180,7 +180,7 @@
var/mob/living/living_pawn = controller.pawn
var/obj/item/target = controller.blackboard[target_key]
if(QDELETED(target))
- return AI_BEHAVIOR_DELAY
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
if(!(target in living_pawn.held_items))
if(!living_pawn.get_empty_held_indexes() || !living_pawn.put_in_hands(target))
@@ -190,7 +190,8 @@
if(QDELETED(target) || prob(10)) // Even if we don't finish it all we can randomly decide to be done
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
- return AI_BEHAVIOR_DELAY
+
+ return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
/datum/ai_behavior/consume/finish_action(datum/ai_controller/controller, succeeded, target_key, hunger_timer_key)
. = ..()
@@ -204,12 +205,11 @@
/datum/ai_behavior/drop_item/perform(seconds_per_tick, datum/ai_controller/controller)
var/mob/living/living_pawn = controller.pawn
- var/obj/item/best_held = GetBestWeapon(controller, null, living_pawn.held_items)
- for(var/obj/item/held as anything in living_pawn.held_items)
- if(!held || held == best_held)
- continue
- living_pawn.dropItemToGround(held)
- return AI_BEHAVIOR_DELAY
+ var/list/my_held_items = living_pawn.held_items - GetBestWeapon(controller, null, living_pawn.held_items)
+ if(!length(my_held_items))
+ return AI_BEHAVIOR_FAILED | AI_BEHAVIOR_DELAY
+ living_pawn.dropItemToGround(pick(my_held_items))
+ return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY
/// This behavior involves attacking a target.
/datum/ai_behavior/attack
diff --git a/code/datums/ai/generic/generic_subtrees.dm b/code/datums/ai/generic/generic_subtrees.dm
index 12007a261240f..36bbbf35dd3d7 100644
--- a/code/datums/ai/generic/generic_subtrees.dm
+++ b/code/datums/ai/generic/generic_subtrees.dm
@@ -55,10 +55,16 @@
if(world.time < next_eat)
return
- if(!controller.blackboard[BB_FOOD_TARGET])
+ var/atom/food_target = controller.blackboard[BB_FOOD_TARGET]
+
+ if(isnull(food_target))
controller.queue_behavior(/datum/ai_behavior/find_and_set/edible, BB_FOOD_TARGET, /obj/item, 2)
return
- controller.queue_behavior(/datum/ai_behavior/drop_item)
+ var/mob/living/living_pawn = controller.pawn
+ if(!length(living_pawn.get_empty_held_indexes()) && !(food_target in living_pawn.held_items))
+ controller.queue_behavior(/datum/ai_behavior/drop_item)
+ return SUBTREE_RETURN_FINISH_PLANNING
+
controller.queue_behavior(/datum/ai_behavior/consume, BB_FOOD_TARGET, BB_NEXT_HUNGRY)
return SUBTREE_RETURN_FINISH_PLANNING
diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm
index 71e3d5f398114..0074d206983b3 100644
--- a/code/datums/ai/monkey/monkey_controller.dm
+++ b/code/datums/ai/monkey/monkey_controller.dm
@@ -19,11 +19,8 @@ have ways of interacting with a specific mob and control it.
BB_MONKEY_BEST_FORCE_FOUND = 0,
BB_MONKEY_ENEMIES = list(),
BB_MONKEY_BLACKLISTITEMS = list(),
- BB_MONKEY_PICKUPTARGET = null,
BB_MONKEY_PICKPOCKETING = FALSE,
BB_MONKEY_DISPOSING = FALSE,
- BB_MONKEY_TARGET_DISPOSAL = null,
- BB_MONKEY_CURRENT_ATTACK_TARGET = null,
BB_MONKEY_GUN_NEURONS_ACTIVATED = FALSE,
BB_MONKEY_GUN_WORKED = TRUE,
BB_SONG_LINES = MONKEY_SONG,
@@ -126,8 +123,8 @@ have ways of interacting with a specific mob and control it.
/datum/ai_controller/monkey/proc/set_trip_mode(mode = TRUE)
var/mob/living/carbon/regressed_monkey = pawn
var/brain = regressed_monkey.get_organ_slot(ORGAN_SLOT_BRAIN)
- if(istype(brain, /obj/item/organ/internal/brain/primate)) // In case we are a monkey AI in a human brain by who was previously controlled by a client but it now not by some marvel
- var/obj/item/organ/internal/brain/primate/monkeybrain = brain
+ if(istype(brain, /obj/item/organ/brain/primate)) // In case we are a monkey AI in a human brain by who was previously controlled by a client but it now not by some marvel
+ var/obj/item/organ/brain/primate/monkeybrain = brain
monkeybrain.tripping = mode
///re-used behavior pattern by monkeys for finding a weapon
diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
index c5d08591da900..a96a13f991ae1 100644
--- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
@@ -8,6 +8,11 @@
///The color this organ draws with. Updated by bodypart/inherit_color()
var/draw_color
+ ///Override of the color of the organ, from dye sprays
+ var/dye_color
+ ///Can this bodypart overlay be dyed?
+ var/dyable = FALSE
+
///Where does this organ inherit its color from?
var/color_source = ORGAN_COLOR_INHERIT
///Take on the dna/preference from whoever we're gonna be inserted in
@@ -85,7 +90,7 @@
return appearance
/datum/bodypart_overlay/mutant/color_image(image/overlay, layer, obj/item/bodypart/limb)
- overlay.color = sprite_datum.color_src ? draw_color : null
+ overlay.color = sprite_datum.color_src ? (dye_color || draw_color) : null
/datum/bodypart_overlay/mutant/added_to_limb(obj/item/bodypart/limb)
inherit_color(limb)
@@ -105,7 +110,7 @@
. = list()
. += "[get_base_icon_state()]"
. += "[feature_key]"
- . += "[draw_color]"
+ . += "[dye_color || draw_color]"
return .
///Return a dumb glob list for this specific feature (called from parse_sprite)
@@ -163,3 +168,10 @@
else
CRASH("External organ [type] had fetch_sprite_datum called with a null accessory name!")
+///From dye sprays. Set the dye_color (draw_color override) of this organ to a new value.
+/datum/bodypart_overlay/mutant/proc/set_dye_color(new_color, obj/item/organ/organ)
+ dye_color = new_color
+ if(organ.owner)
+ organ.owner.update_body_parts()
+ else
+ organ.bodypart_owner?.update_icon_dropped()
diff --git a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm
index 20467eede042b..78aa80179f46b 100644
--- a/code/datums/bodypart_overlays/simple_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/simple_bodypart_overlay.dm
@@ -30,3 +30,8 @@
icon_state = "bags"
draw_color = COLOR_WEBSAFE_DARK_GRAY
layers = EXTERNAL_ADJACENT
+
+///PENDING eyes drawn on the face
+/datum/bodypart_overlay/simple/soul_pending_eyes
+ icon_state = "soul_pending_eyes"
+ layers = EXTERNAL_FRONT
diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm
index 8f0f8cfb04893..422ad075ea075 100644
--- a/code/datums/brain_damage/brain_trauma.dm
+++ b/code/datums/brain_damage/brain_trauma.dm
@@ -8,7 +8,7 @@
var/desc = "A trauma caused by brain damage, which causes issues to the patient."
var/scan_desc = "generic brain trauma" //description when detected by a health scanner
var/mob/living/carbon/owner //the poor bastard
- var/obj/item/organ/internal/brain/brain //the poor bastard's brain
+ var/obj/item/organ/brain/brain //the poor bastard's brain
var/gain_text = span_notice("You feel traumatized.")
var/lose_text = span_notice("You no longer feel traumatized.")
var/can_gain = TRUE
diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm
index f49a6d0c0bc52..486af4b278080 100644
--- a/code/datums/brain_damage/special.dm
+++ b/code/datums/brain_damage/special.dm
@@ -525,3 +525,179 @@
owner.ai_controller.set_ai_status(AI_STATUS_OFF)
owner.remove_language(/datum/language/monkey, UNDERSTOOD_LANGUAGE, TRAUMA_TRAIT)
to_chat(owner, span_green("The urge subsides."))
+
+/datum/brain_trauma/special/axedoration
+ name = "Axe Delusions"
+ desc = "Patient feels an immense sense of duty towards protecting an axe and has hallucinations regarding it."
+ scan_desc = "object attachment"
+ gain_text = span_notice("You feel like protecting the fire axe is one of your greatest duties.")
+ lose_text = span_warning("You feel like you lost your sense of duty.")
+ resilience = TRAUMA_RESILIENCE_ABSOLUTE
+ random_gain = FALSE
+ var/static/list/talk_lines = list(
+ "I'm proud of you.",
+ "I believe in you!",
+ "Do I bother you?",
+ "Praise me!",
+ "Fires burn.",
+ "We made it!",
+ "Mother, my body disgusts me.",
+ "There's a gap where we meet, where I end and you begin.",
+ "Humble yourself.",
+ )
+ var/static/list/hurt_lines = list(
+ "Ow!",
+ "Ouch!",
+ "Ack!",
+ "It burns!",
+ "Stop!",
+ "Arghh!",
+ "Please!",
+ "End it!",
+ "Cease!",
+ "Ah!",
+ )
+
+/datum/brain_trauma/special/axedoration/on_life(seconds_per_tick, times_fired)
+ if(owner.stat != CONSCIOUS)
+ return
+
+ if(!GLOB.bridge_axe)
+ if(SPT_PROB(0.5, seconds_per_tick))
+ to_chat(owner, span_warning("I've failed my duty..."))
+ owner.set_jitter_if_lower(5 SECONDS)
+ owner.set_stutter_if_lower(5 SECONDS)
+ if(SPT_PROB(20, seconds_per_tick))
+ owner.vomit(VOMIT_CATEGORY_DEFAULT)
+ return
+
+ var/atom/axe_location = get_axe_location()
+ if(!SPT_PROB(1.5, seconds_per_tick))
+ return
+ if(isliving(axe_location))
+ var/mob/living/axe_holder = axe_location
+ if(axe_holder == owner)
+ talk_tuah(pick(talk_lines))
+ return
+ var/datum/job/holder_job = axe_holder.mind?.assigned_role
+ if(holder_job && (/datum/job_department/command in holder_job.departments_list))
+ to_chat(owner, span_notice("I hope the axe is in good hands..."))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral)
+ return
+ to_chat(owner, span_warning("You start having a bad feeling..."))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_missing)
+ return
+
+ if(!isarea(axe_location))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_gone)
+ return
+
+ if(istype(axe_location, /area/station/command))
+ to_chat(owner, span_notice("You feel a sense of relief..."))
+ if(istype(GLOB.bridge_axe.loc, /obj/structure/fireaxecabinet))
+ return
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral)
+ return
+
+ to_chat(owner, span_warning("You start having a bad feeling..."))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_missing)
+
+/datum/brain_trauma/special/axedoration/on_gain()
+ RegisterSignal(owner, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equip))
+ RegisterSignal(owner, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(on_unequip))
+ RegisterSignal(owner, COMSIG_MOB_EXAMINING, PROC_REF(on_examine))
+ if(!GLOB.bridge_axe)
+ axe_gone()
+ return ..()
+ RegisterSignal(GLOB.bridge_axe, COMSIG_QDELETING, PROC_REF(axe_gone))
+ if(istype(get_axe_location(), /area/station/command) && istype(GLOB.bridge_axe.loc, /obj/structure/fireaxecabinet))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_cabinet)
+ else if(owner.is_holding(GLOB.bridge_axe))
+ on_equip(owner, GLOB.bridge_axe)
+ else
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral)
+ RegisterSignal(GLOB.bridge_axe, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_axe_attack))
+ return ..()
+
+
+/datum/brain_trauma/special/axedoration/on_lose()
+ owner.clear_mood_event("fireaxe")
+ UnregisterSignal(owner, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EXAMINING))
+ if(GLOB.bridge_axe)
+ UnregisterSignal(GLOB.bridge_axe, COMSIG_ITEM_AFTERATTACK)
+ return ..()
+
+/datum/brain_trauma/special/axedoration/proc/axe_gone(source)
+ SIGNAL_HANDLER
+ to_chat(owner, span_danger("You feel a great disturbance in the force."))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_gone)
+ owner.set_jitter_if_lower(15 SECONDS)
+ owner.set_stutter_if_lower(15 SECONDS)
+
+/datum/brain_trauma/special/axedoration/proc/on_equip(source, obj/item/picked_up, slot)
+ SIGNAL_HANDLER
+ if(!istype(picked_up, /obj/item/fireaxe))
+ return
+ owner.set_jitter_if_lower(3 SECONDS)
+ if(picked_up == GLOB.bridge_axe)
+ to_chat(owner, span_hypnophrase("I have it. It's time to put it back."))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_held)
+ return
+ ADD_TRAIT(picked_up, TRAIT_NODROP, type)
+ to_chat(owner, span_warning("...This is not the one I'm looking after."))
+ owner.Immobilize(2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(throw_faker), picked_up), 2 SECONDS)
+
+/datum/brain_trauma/special/axedoration/proc/throw_faker(obj/item/faker)
+ REMOVE_TRAIT(faker, TRAIT_NODROP, type)
+ var/held_index = owner.get_held_index_of_item(faker)
+ if(!held_index)
+ return
+ to_chat(owner, span_warning("Be gone with you."))
+ owner.swap_hand(held_index, silent = TRUE)
+ var/turf/target_turf = get_ranged_target_turf(owner, owner.dir, faker.throw_range)
+ owner.throw_item(target_turf)
+
+/datum/brain_trauma/special/axedoration/proc/on_unequip(datum/source, obj/item/dropped_item, force, new_location)
+ SIGNAL_HANDLER
+ if(dropped_item != GLOB.bridge_axe)
+ return
+ if(get_axe_location() == owner)
+ return
+ if(istype(new_location, /obj/structure/fireaxecabinet))
+ if(istype(get_area(new_location), /area/station/command))
+ to_chat(owner, span_nicegreen("Ah! Back where it belongs!"))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_cabinet)
+ INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "smile")
+ return
+ to_chat(owner, span_warning("Leaving it outside of command? Am I sure about that?"))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral)
+ return
+ to_chat(owner, span_warning("Should I really leave it here?"))
+ owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral)
+
+/datum/brain_trauma/special/axedoration/proc/on_examine(mob/source, atom/target, list/examine_strings)
+ SIGNAL_HANDLER
+ if(!istype(target, /obj/item/fireaxe))
+ return
+ if(target == GLOB.bridge_axe)
+ examine_strings += span_notice("It's the axe I've sworn to protect.")
+ else
+ examine_strings += span_warning("It's a simulacra, a fake axe made to fool the masses.")
+
+/datum/brain_trauma/special/axedoration/proc/on_axe_attack(obj/item/axe, atom/target, mob/user, click_parameters)
+ SIGNAL_HANDLER
+ if(user != owner)
+ return
+ talk_tuah(pick(hurt_lines))
+
+/datum/brain_trauma/special/axedoration/proc/talk_tuah(sent_message = "Hello World.")
+ owner.Hear(null, GLOB.bridge_axe, owner.get_selected_language(), sent_message)
+
+/datum/brain_trauma/special/axedoration/proc/get_axe_location()
+ if(!GLOB.bridge_axe)
+ return
+ var/atom/axe_loc = GLOB.bridge_axe.loc
+ while(!ismob(axe_loc) && !isarea(axe_loc) && !isnull(axe_loc))
+ axe_loc = axe_loc.loc
+ return axe_loc
diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm
index 198b674631750..195d33c4b4b8d 100644
--- a/code/datums/brain_damage/split_personality.dm
+++ b/code/datums/brain_damage/split_personality.dm
@@ -191,7 +191,7 @@
var/codeword
var/objective
-/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/internal/brain/B, _permanent, _codeword, _objective)
+/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/brain/B, _permanent, _codeword, _objective)
..()
if(_codeword)
codeword = _codeword
diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm
index f1aa865e0cbc1..0602624dbb84f 100644
--- a/code/datums/components/crafting/entertainment.dm
+++ b/code/datums/components/crafting/entertainment.dm
@@ -22,7 +22,7 @@
result = /obj/item/toy/plush/moth
reqs = list(
/obj/item/stack/sheet/animalhide/mothroach = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/heart = 1,
/obj/item/stack/sheet/cloth = 3,
)
category = CAT_ENTERTAINMENT
diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm
index 2546106d40327..ef8f1b247873f 100644
--- a/code/datums/components/crafting/equipment.dm
+++ b/code/datums/components/crafting/equipment.dm
@@ -156,7 +156,7 @@
/datum/crafting_recipe/flashlight_eyes
name = "Flashlight Eyes"
- result = /obj/item/organ/internal/eyes/robotic/flashlight
+ result = /obj/item/organ/eyes/robotic/flashlight
time = 10
reqs = list(
/obj/item/flashlight = 2,
diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm
index b8771257cfa15..a8805c56577c4 100644
--- a/code/datums/components/crafting/melee_weapon.dm
+++ b/code/datums/components/crafting/melee_weapon.dm
@@ -37,10 +37,10 @@
name = "Tail Club"
result = /obj/item/tailclub
reqs = list(
- /obj/item/organ/external/tail/lizard = 1,
+ /obj/item/organ/tail/lizard = 1,
/obj/item/stack/sheet/iron = 1,
)
- blacklist = list(/obj/item/organ/external/tail/lizard/fake)
+ blacklist = list(/obj/item/organ/tail/lizard/fake)
time = 4 SECONDS
category = CAT_WEAPON_MELEE
@@ -63,10 +63,10 @@
name = "Liz O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip
reqs = list(
- /obj/item/organ/external/tail/lizard = 1,
+ /obj/item/organ/tail/lizard = 1,
/obj/item/stack/cable_coil = 1,
)
- blacklist = list(/obj/item/organ/external/tail/lizard/fake)
+ blacklist = list(/obj/item/organ/tail/lizard/fake)
time = 4 SECONDS
category = CAT_WEAPON_MELEE
@@ -74,7 +74,7 @@
name = "Cat O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip/kitty
reqs = list(
- /obj/item/organ/external/tail/cat = 1,
+ /obj/item/organ/tail/cat = 1,
/obj/item/stack/cable_coil = 1,
)
time = 4 SECONDS
diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm
index 09c8455a77b39..21abedb8b47f8 100644
--- a/code/datums/components/crafting/robot.dm
+++ b/code/datums/components/crafting/robot.dm
@@ -184,7 +184,7 @@
/obj/item/stack/cable_coil = 5,
/obj/item/stack/rods = 2,
/obj/item/stack/sheet/glass = 1,
- /obj/item/organ/internal/heart/ethereal = 1,
+ /obj/item/organ/heart/ethereal = 1,
)
category = CAT_ROBOT
diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm
index 2196a88325ac2..45c021aca6ce3 100644
--- a/code/datums/components/crafting/tailoring.dm
+++ b/code/datums/components/crafting/tailoring.dm
@@ -253,7 +253,7 @@
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/costume/lizard
time = 1 SECONDS
- reqs = list(/obj/item/organ/external/tail/lizard = 1)
+ reqs = list(/obj/item/organ/tail/lizard = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/lizardhat_alternate
@@ -268,8 +268,8 @@
result = /obj/item/clothing/head/costume/kitty/genuine
time = 1 SECONDS
reqs = list(
- /obj/item/organ/external/tail/cat = 1,
- /obj/item/organ/internal/ears/cat = 1,
+ /obj/item/organ/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1,
)
category = CAT_CLOTHING
diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm
index 554e3d611ba2d..053782f6ed633 100644
--- a/code/datums/components/cult_ritual_item.dm
+++ b/code/datums/components/cult_ritual_item.dm
@@ -162,7 +162,7 @@
// For carbonss we also want to clear out the stomach of any holywater
if(iscarbon(target))
var/mob/living/carbon/carbon_target = target
- var/obj/item/organ/internal/stomach/belly = carbon_target.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = carbon_target.get_organ_slot(ORGAN_SLOT_STOMACH)
if(belly)
holy_to_unholy += belly.reagents.get_reagent_amount(/datum/reagent/water/holywater)
belly.reagents.del_reagent(/datum/reagent/water/holywater)
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
index 6f9881f2f1565..6ad197b7c00cd 100644
--- a/code/datums/components/food/edible.dm
+++ b/code/datums/components/food/edible.dm
@@ -499,7 +499,7 @@ Behavior that's still missing from this component that original food items had t
//Invoke the eater's stomach's after_eat callback if valid
if(iscarbon(eater))
var/mob/living/carbon/carbon_eater = eater
- var/obj/item/organ/internal/stomach/stomach = carbon_eater.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/stomach = carbon_eater.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.after_eat(owner)
@@ -565,10 +565,7 @@ Behavior that's still missing from this component that original food items had t
last_check_time = world.time
var/food_quality = get_perceived_food_quality(gourmand)
- if(food_quality <= FOOD_QUALITY_DANGEROUS && (foodtypes & gourmand.get_allergic_foodtypes())) // Only cause anaphylaxis if we're ACTUALLY allergic, otherwise it just tastes horrible
- if(gourmand.ForceContractDisease(new /datum/disease/anaphylaxis(), make_copy = FALSE, del_on_fail = TRUE))
- to_chat(gourmand, span_warning("You feel your throat start to itch."))
- gourmand.add_mood_event("allergic_food", /datum/mood_event/allergic_food)
+ if(food_quality <= FOOD_QUALITY_DANGEROUS && gourmand.check_allergic_reaction(foodtypes, chance = 100, histamine_add = 10))
return
if(food_quality <= TOXIC_FOOD_QUALITY_THRESHOLD)
diff --git a/code/datums/components/ghostrole_on_revive.dm b/code/datums/components/ghostrole_on_revive.dm
new file mode 100644
index 0000000000000..d9638b2d46a6f
--- /dev/null
+++ b/code/datums/components/ghostrole_on_revive.dm
@@ -0,0 +1,119 @@
+/// Proc ghosts to enter the body when it get's revived
+/datum/component/ghostrole_on_revive
+ /// If revived and no ghosts, just die again?
+ var/refuse_revival_if_failed
+ /// Callback for when the mob is revived and has their body occupied by a ghost
+ var/datum/callback/on_succesful_revive
+
+/datum/component/ghostrole_on_revive/Initialize(refuse_revival_if_failed, on_succesful_revive)
+ . = ..()
+
+ src.refuse_revival_if_failed = refuse_revival_if_failed
+ src.on_succesful_revive = on_succesful_revive
+
+ ADD_TRAIT(parent, TRAIT_GHOSTROLE_ON_REVIVE, REF(src)) //for adding an alternate examination
+
+ if(ismob(parent))
+ prepare_mob(parent)
+ return
+
+ if(!istype(parent, /obj/item/organ/brain))
+ return COMPONENT_INCOMPATIBLE
+
+ var/obj/item/organ/brain/brein = parent
+ if(brein.owner)
+ prepare_mob(brein.owner)
+ else
+ prepare_brain(brein)
+
+/// Give the appropriate signals, and watch for organ removal
+/datum/component/ghostrole_on_revive/proc/prepare_mob(mob/living/liver)
+ RegisterSignal(liver, COMSIG_LIVING_REVIVE, PROC_REF(on_revive))
+ ADD_TRAIT(liver, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
+ liver.med_hud_set_status()
+
+ if(iscarbon(liver))
+ var/mob/living/carbon/carbon = liver
+ var/obj/item/organ/brain = carbon.get_organ_by_type(/obj/item/organ/brain)
+ if(brain)
+ RegisterSignal(brain, COMSIG_ORGAN_REMOVED, PROC_REF(on_remove))
+
+/datum/component/ghostrole_on_revive/proc/on_remove(obj/item/organ/brain, mob/living/old_owner)
+ SIGNAL_HANDLER
+
+ REMOVE_TRAIT(old_owner, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
+ // we might have some lingering blinking eyes
+ var/obj/item/bodypart/head/head = old_owner?.get_bodypart(BODY_ZONE_HEAD)
+ if(head)
+ var/soul_eyes = locate(/datum/bodypart_overlay/simple/soul_pending_eyes) in head.bodypart_overlays
+ if(soul_eyes)
+ head.remove_bodypart_overlay(soul_eyes)
+
+ prepare_brain(brain)
+
+/datum/component/ghostrole_on_revive/proc/prepare_brain(obj/item/organ/brein)
+ SIGNAL_HANDLER
+
+ RegisterSignal(brein, COMSIG_ORGAN_IMPLANTED, PROC_REF(prepare_mob_from_brain))
+ UnregisterSignal(brein, COMSIG_ORGAN_REMOVED)
+
+/datum/component/ghostrole_on_revive/proc/prepare_mob_from_brain(obj/item/organ/brain/brein, mob/living/owner)
+ SIGNAL_HANDLER
+
+ UnregisterSignal(brein, COMSIG_ORGAN_IMPLANTED)
+ prepare_mob(owner)
+
+/datum/component/ghostrole_on_revive/proc/on_revive(mob/living/aliver)
+ SIGNAL_HANDLER
+
+ INVOKE_ASYNC(src, PROC_REF(poll_ghosts), aliver)
+
+/datum/component/ghostrole_on_revive/proc/poll_ghosts(mob/living/aliver)
+ var/soul_eyes
+ var/obj/item/bodypart/head
+ // adds soulful SOUL PENDING eyes to indicate what's happening to observers
+
+ var/mob/living/carbon/human/hewmon
+ if(ishuman(aliver))
+ hewmon = aliver
+ head = hewmon.get_bodypart(BODY_ZONE_HEAD)
+ if(head)
+ soul_eyes = new /datum/bodypart_overlay/simple/soul_pending_eyes ()
+ head.add_bodypart_overlay(soul_eyes)
+ hewmon.update_body_parts()
+
+ var/mob/dead/observer/chosen_one = SSpolling.poll_ghosts_for_target(
+ question = "Would you like to play as a recovered crewmember?",
+ role = null,
+ check_jobban = ROLE_RECOVERED_CREW,
+ poll_time = 15 SECONDS,
+ checked_target = aliver,
+ ignore_category = POLL_IGNORE_RECOVERED_CREW,
+ alert_pic = aliver,
+ role_name_text = "recovered crew",
+ )
+ if(head)
+ head.remove_bodypart_overlay(soul_eyes)
+ hewmon?.update_body_parts()
+
+ if(!isobserver(chosen_one))
+ if(refuse_revival_if_failed)
+ aliver.death()
+ aliver.visible_message(span_deadsay("[aliver.name]'s soul is struggling to return!"))
+ else
+ aliver.key = chosen_one.key
+ on_succesful_revive?.Invoke(aliver)
+ qdel(src)
+
+/datum/component/ghostrole_on_revive/Destroy(force)
+ REMOVE_TRAIT(parent, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
+
+ var/mob/living/living
+ if(isliving(parent))
+ living = parent
+ else if(istype(parent, /obj/item/organ/brain))
+ var/obj/item/organ/brain/brain = parent
+ living = brain.owner
+ living?.med_hud_set_status()
+
+ . = ..()
diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm
index 0b3751856b8a2..46c2091389675 100644
--- a/code/datums/components/gps.dm
+++ b/code/datums/components/gps.dm
@@ -137,19 +137,23 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/list/signals = list()
data["signals"] = list()
- for(var/gps in GLOB.GPS_list)
- var/datum/component/gps/G = gps
- if(G.emped || !G.tracking || G == src)
+ for(var/datum/component/gps/gps as anything in GLOB.GPS_list)
+ if(gps == src || gps.emped || !gps.tracking)
continue
- var/turf/pos = get_turf(G.parent)
- if(!pos || !global_mode && pos.z != curr.z)
+ var/turf/pos = get_turf(gps.parent)
+ if(!pos || (!global_mode && pos.z != curr.z))
continue
var/list/signal = list()
- signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS
+ signal["entrytag"] = gps.gpstag //Name or 'tag' of the GPS
signal["coords"] = "[pos.x], [pos.y], [pos.z]"
- if(pos.z == curr.z) //Distance/Direction calculations for same z-level only
+ // Distance is calculated for the same z-level only, and direction is calculated for crosslinked/neighboring and same z-levels.
+ if(pos.z == curr.z)
signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs
signal["degrees"] = round(get_angle(curr, pos)) //0-360 degree directional bearing, for more precision.
+ else
+ var/angle = get_linked_z_angle(curr.z, pos.z)
+ if(!isnull(angle))
+ signal["degrees"] = angle
signals += list(signal) //Add this signal to the list of signals
data["signals"] = signals
return data
diff --git a/code/datums/components/hat_stabilizer.dm b/code/datums/components/hat_stabilizer.dm
index e7951e49956b4..7a4033c3b2baf 100644
--- a/code/datums/components/hat_stabilizer.dm
+++ b/code/datums/components/hat_stabilizer.dm
@@ -77,9 +77,16 @@
if(!user.transferItemToLoc(hat, parent, force = FALSE, silent = TRUE))
return
+
+ attach_hat(hat, user)
+
+/datum/component/hat_stabilizer/proc/attach_hat(obj/item/clothing/hat, mob/user)
+ var/atom/movable/movable_parent = parent
attached_hat = hat
RegisterSignal(hat, COMSIG_MOVABLE_MOVED, PROC_REF(remove_hat))
- movable_parent.balloon_alert(user, "hat attached, right-click to remove")
+
+ if (!isnull(user))
+ movable_parent.balloon_alert(user, "hat attached, right-click to remove")
if (!istype(parent, /obj/item/clothing))
movable_parent.update_appearance()
@@ -92,13 +99,14 @@
apparel.flags_cover |= attached_hat.flags_cover
apparel.visor_flags_cover |= attached_hat.visor_flags_cover
apparel.update_appearance()
+
if (ismob(apparel.loc))
var/mob/wearer = apparel.loc
wearer.update_clothing(wearer.get_slot_by_item(apparel))
/datum/component/hat_stabilizer/proc/on_secondary_attack_hand(datum/source, mob/user)
SIGNAL_HANDLER
- . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ . = COMPONENT_CANCEL_ATTACK_CHAIN
if(!attached_hat)
return
var/atom/movable/movable_parent = parent
diff --git a/code/datums/components/heart_eater.dm b/code/datums/components/heart_eater.dm
index 722c4b1636d79..122716b3be5b9 100644
--- a/code/datums/components/heart_eater.dm
+++ b/code/datums/components/heart_eater.dm
@@ -44,7 +44,7 @@
/datum/component/heart_eater/proc/prepare_species(mob/living/carbon/human/eater)
if(eater.get_liked_foodtypes() & GORE)
return
- var/obj/item/organ/internal/tongue/eater_tongue = eater.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/eater_tongue = eater.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!eater_tongue)
return
eater_tongue.disliked_foodtypes &= ~GORE
@@ -62,10 +62,10 @@
if(get_area(eater) == GLOB.areas_by_type[/area/centcom/wizard_station])
return
- if(!istype(what_we_ate, /obj/item/organ/internal/heart))
+ if(!istype(what_we_ate, /obj/item/organ/heart))
return
- var/obj/item/organ/internal/heart/we_ate_heart = what_we_ate
- var/obj/item/organ/internal/heart/previous_heart = last_heart_we_ate?.resolve()
+ var/obj/item/organ/heart/we_ate_heart = what_we_ate
+ var/obj/item/organ/heart/previous_heart = last_heart_we_ate?.resolve()
if(we_ate_heart == previous_heart)
return
if (!HAS_TRAIT(we_ate_heart, TRAIT_USED_ORGAN))
diff --git a/code/datums/components/ling_decoy_brain.dm b/code/datums/components/ling_decoy_brain.dm
index 917e8f2fbbd7c..d6368aeee0e71 100644
--- a/code/datums/components/ling_decoy_brain.dm
+++ b/code/datums/components/ling_decoy_brain.dm
@@ -6,7 +6,7 @@
VAR_FINAL/datum/action/changeling/mmi_talk/talk_action
/datum/component/ling_decoy_brain/Initialize(datum/antagonist/changeling/ling)
- if(!istype(parent, /obj/item/organ/internal/brain))
+ if(!istype(parent, /obj/item/organ/brain))
return COMPONENT_INCOMPATIBLE
if(isnull(ling))
stack_trace("[type] instantiated without a changeling to link to.")
@@ -22,13 +22,13 @@
return ..()
/datum/component/ling_decoy_brain/RegisterWithParent()
- var/obj/item/organ/internal/brain/ling_brain = parent
+ var/obj/item/organ/brain/ling_brain = parent
ling_brain.organ_flags &= ~ORGAN_VITAL
ling_brain.decoy_override = TRUE
RegisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi))
/datum/component/ling_decoy_brain/UnregisterFromParent()
- var/obj/item/organ/internal/brain/ling_brain = parent
+ var/obj/item/organ/brain/ling_brain = parent
ling_brain.organ_flags |= ORGAN_VITAL
ling_brain.decoy_override = FALSE
UnregisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi))
@@ -38,7 +38,7 @@
*
* Unfortunately this is hooked on Entering rather than its own dedicated MMI signal becuase MMI code is a fuck
*/
-/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/internal/brain/source, atom/entering, atom/old_loc, ...)
+/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/brain/source, atom/entering, atom/old_loc, ...)
SIGNAL_HANDLER
var/mob/living/the_real_ling = parent_ling.owner.current
diff --git a/code/datums/components/manual_blinking.dm b/code/datums/components/manual_blinking.dm
index 67229a8b85f5f..f7d7d65e5d144 100644
--- a/code/datums/components/manual_blinking.dm
+++ b/code/datums/components/manual_blinking.dm
@@ -1,7 +1,7 @@
/datum/component/manual_blinking
dupe_mode = COMPONENT_DUPE_UNIQUE
- var/obj/item/organ/internal/eyes/E
+ var/obj/item/organ/eyes/E
var/warn_grace = FALSE
var/warn_dying = FALSE
var/last_blink
@@ -69,18 +69,18 @@
/datum/component/manual_blinking/proc/check_added_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/new_eyes = O
+ var/obj/item/organ/eyes/new_eyes = O
- if(istype(new_eyes,/obj/item/organ/internal/eyes))
+ if(istype(new_eyes,/obj/item/organ/eyes))
E = new_eyes
START_PROCESSING(SSdcs, src)
/datum/component/manual_blinking/proc/check_removed_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/bye_beyes = O // oh come on, that's pretty good
+ var/obj/item/organ/eyes/bye_beyes = O // oh come on, that's pretty good
- if(istype(bye_beyes, /obj/item/organ/internal/eyes))
+ if(istype(bye_beyes, /obj/item/organ/eyes))
E = null
STOP_PROCESSING(SSdcs, src)
diff --git a/code/datums/components/manual_breathing.dm b/code/datums/components/manual_breathing.dm
index d8d4fea07d9ec..8e5f096766a92 100644
--- a/code/datums/components/manual_breathing.dm
+++ b/code/datums/components/manual_breathing.dm
@@ -1,7 +1,7 @@
/datum/component/manual_breathing
dupe_mode = COMPONENT_DUPE_UNIQUE
- var/obj/item/organ/internal/lungs/L
+ var/obj/item/organ/lungs/L
var/warn_grace = FALSE
var/warn_dying = FALSE
var/last_breath
@@ -71,18 +71,18 @@
/datum/component/manual_breathing/proc/check_added_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/new_lungs = O
+ var/obj/item/organ/eyes/new_lungs = O
- if(istype(new_lungs,/obj/item/organ/internal/lungs))
+ if(istype(new_lungs,/obj/item/organ/lungs))
L = new_lungs
START_PROCESSING(SSdcs, src)
/datum/component/manual_breathing/proc/check_removed_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
- var/obj/item/organ/internal/lungs/old_lungs = O
+ var/obj/item/organ/lungs/old_lungs = O
- if(istype(old_lungs, /obj/item/organ/internal/lungs))
+ if(istype(old_lungs, /obj/item/organ/lungs))
L = null
STOP_PROCESSING(SSdcs, src)
diff --git a/code/datums/components/manual_heart.dm b/code/datums/components/manual_heart.dm
index 09448acfc6722..d8d7485490029 100644
--- a/code/datums/components/manual_heart.dm
+++ b/code/datums/components/manual_heart.dm
@@ -56,7 +56,7 @@
pump_action.Grant(parent)
var/mob/living/carbon/carbon_parent = parent
- var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART)
if(parent_heart && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD)
START_PROCESSING(SSdcs, src)
COOLDOWN_START(src, heart_timer, pump_delay)
@@ -126,7 +126,7 @@
/datum/component/manual_heart/proc/check_added_organ(mob/organ_owner, obj/item/organ/new_organ)
SIGNAL_HANDLER
- var/obj/item/organ/internal/heart/new_heart = new_organ
+ var/obj/item/organ/heart/new_heart = new_organ
if(!istype(new_heart) || !check_valid())
return
@@ -141,7 +141,7 @@
/datum/component/manual_heart/proc/check_removed_organ(mob/organ_owner, obj/item/organ/removed_organ)
SIGNAL_HANDLER
- var/obj/item/organ/internal/heart/removed_heart = removed_organ
+ var/obj/item/organ/heart/removed_heart = removed_organ
if(istype(removed_heart))
pump_action.build_all_button_icons(UPDATE_BUTTON_STATUS)
@@ -150,7 +150,7 @@
///Helper proc to check if processing can be restarted.
/datum/component/manual_heart/proc/check_valid()
var/mob/living/carbon/carbon_parent = parent
- var/obj/item/organ/internal/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/parent_heart = carbon_parent.get_organ_slot(ORGAN_SLOT_HEART)
return !isnull(parent_heart) && !HAS_TRAIT(carbon_parent, TRAIT_NOBLOOD) && carbon_parent.stat != DEAD
///Action to pump your heart. Cooldown will always be set to 1 second less than the pump delay.
@@ -171,7 +171,7 @@
var/mob/living/carbon/heart_haver = owner
if(!istype(heart_haver) || HAS_TRAIT(heart_haver, TRAIT_NOBLOOD) || heart_haver.stat == DEAD)
return FALSE
- var/obj/item/organ/internal/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart_havers_heart = heart_haver.get_organ_slot(ORGAN_SLOT_HEART)
if(isnull(heart_havers_heart))
return FALSE
return ..()
diff --git a/code/datums/components/phylactery.dm b/code/datums/components/phylactery.dm
index 572f816b5ad22..9c96416f8002c 100644
--- a/code/datums/components/phylactery.dm
+++ b/code/datums/components/phylactery.dm
@@ -169,7 +169,7 @@
var/mob/living/carbon/human/lich = new(parent_turf)
ADD_TRAIT(lich, TRAIT_NO_SOUL, LICH_TRAIT)
- var/obj/item/organ/internal/brain/new_lich_brain = lich.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/new_lich_brain = lich.get_organ_slot(ORGAN_SLOT_BRAIN)
if(new_lich_brain) // Prevent MMI cheese
new_lich_brain.organ_flags &= ~ORGAN_VITAL
new_lich_brain.decoy_override = TRUE
@@ -201,7 +201,7 @@
var/mob/living/carbon/carbon_body = corpse
for(var/obj/item/organ/to_drop as anything in carbon_body.organs)
// Skip the brain - it can disappear, we don't need it anymore
- if(istype(to_drop, /obj/item/organ/internal/brain))
+ if(istype(to_drop, /obj/item/organ/brain))
continue
// For the rest, drop all the organs onto the floor (for style)
diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm
index 054a4de4af0f0..478de762afc6c 100644
--- a/code/datums/components/sign_language.dm
+++ b/code/datums/components/sign_language.dm
@@ -75,7 +75,7 @@
SIGNAL_HANDLER
var/mob/living/carbon/carbon_parent = parent
- var/obj/item/organ/internal/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
tongue.temp_say_mod = "signs"
//this speech relies on hands, which we have our own way of garbling speech when they're occupied, so we can have this always on
@@ -102,7 +102,7 @@
SIGNAL_HANDLER
var/mob/living/carbon/carbon_parent = parent
- var/obj/item/organ/internal/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = carbon_parent.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
tongue.temp_say_mod = ""
REMOVE_TRAIT(carbon_parent, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_HANDS)
@@ -128,9 +128,9 @@
/datum/component/sign_language/proc/on_added_organ(mob/living/source, obj/item/organ/new_organ)
SIGNAL_HANDLER
- if(!istype(new_organ, /obj/item/organ/internal/tongue))
+ if(!istype(new_organ, /obj/item/organ/tongue))
return
- var/obj/item/organ/internal/tongue/new_tongue = new_organ
+ var/obj/item/organ/tongue/new_tongue = new_organ
new_tongue.temp_say_mod = "signs"
/// Signal proc for [COMSIG_MOB_TRY_SPEECH]
@@ -238,7 +238,7 @@
return SPELL_INVOCATION_ALWAYS_SUCCEED
/// Signal proc for [COMSIG_LIVING_TREAT_MESSAGE]
-/// Changes our message based on conditions that limit or alter our ability to communicate
+/// Changes our message based on conditions that limit or alter our ability to communicate
/datum/component/sign_language/proc/on_treat_living_message(atom/movable/source, list/message_args)
SIGNAL_HANDLER
diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm
index afd8cce49e8c7..ca1bb82ace785 100644
--- a/code/datums/components/squeak.dm
+++ b/code/datums/components/squeak.dm
@@ -46,7 +46,7 @@
else if(isstructure(parent))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(use_squeak))
- if(istype(parent, /obj/item/organ/internal/liver))
+ if(istype(parent, /obj/item/organ/liver))
// Liver squeaking is depending on them functioning like a clown's liver
RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), PROC_REF(on_comedy_metabolism_removal))
diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm
index 53a0797c2e1c0..4dac194c158b2 100644
--- a/code/datums/components/supermatter_crystal.dm
+++ b/code/datums/components/supermatter_crystal.dm
@@ -130,7 +130,7 @@
)
return
- var/obj/item/organ/internal/tongue/licking_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/licking_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE)
if(licking_tongue)
dust_mob(source, user,
span_danger("As [user] hesitantly leans in and licks [atom_source] everything goes silent before [user.p_their()] body starts to glow and burst into flames before flashing to ash!"),
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index baf1efaee1dd5..8c5e10ddd655a 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -399,13 +399,13 @@
if(HAS_TRAIT(tackle_target, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // riot armor and such
defense_mod += 5
- var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(HAS_TRAIT(tackle_target, TRAIT_TACKLING_TAILED_DEFENDER) && !el_tail)
defense_mod -= 1
if(el_tail && (el_tail.wag_flags & WAG_WAGGING)) // lizard tail wagging is robust and can swat away assailants!
defense_mod += 1
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = tackle_target.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = tackle_target.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
defense_mod += potential_spine.strength_bonus
@@ -434,14 +434,14 @@
attack_mod += 2
if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER))
- var/obj/item/organ/external/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(!sacker_moth_wing || sacker_moth_wing.burnt)
attack_mod -= 2
- var/obj/item/organ/external/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(sacker_wing)
attack_mod += 2
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = sacker.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = sacker.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
attack_mod += potential_spine.strength_bonus
@@ -508,7 +508,7 @@
if(HAS_TRAIT(user, TRAIT_HEAD_INJURY_BLOCKED))
oopsie_mod -= 6
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) // Can't snap that spine if it's made of metal.
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) // Can't snap that spine if it's made of metal.
if(istype(potential_spine))
oopsie_mod -= potential_spine.strength_bonus
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
index dcb8d63a3c43e..e903d84fab0f5 100644
--- a/code/datums/components/twohanded.dm
+++ b/code/datums/components/twohanded.dm
@@ -195,10 +195,10 @@
var/atom/atom_parent = parent
if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING))
if(require_twohands)
- atom_parent.balloon_alert(user, "too weak to wield!")
+ atom_parent.balloon_alert(user, "can't wield!")
user.dropItemToGround(parent, force = TRUE)
else
- atom_parent.balloon_alert(user, "too weak to wield with both hands!")
+ atom_parent.balloon_alert(user, "can't wield with both hands!")
return COMPONENT_EQUIPPED_FAILED
if(user.get_inactive_held_item())
if(require_twohands)
diff --git a/code/datums/components/vision_hurting.dm b/code/datums/components/vision_hurting.dm
index acf2d186bb433..925395f3d39b6 100644
--- a/code/datums/components/vision_hurting.dm
+++ b/code/datums/components/vision_hurting.dm
@@ -16,7 +16,7 @@
for(var/mob/living/carbon/viewer in viewers(parent))
if(viewer.is_blind() || viewer.get_eye_protection() >= damage_per_second)
continue
- var/obj/item/organ/internal/eyes/burning_orbs = locate() in viewer.organs
+ var/obj/item/organ/eyes/burning_orbs = locate() in viewer.organs
if(!burning_orbs)
continue
burning_orbs.apply_organ_damage(damage_per_second * seconds_per_tick)
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index c93d94023df91..bf096a9fb4ad3 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -45,7 +45,7 @@
return
var/mob/living/carbon/infected_mob = advanced_disease.affected_mob
- var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
switch(advanced_disease.stage)
if(3, 4)
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 79c4909d27702..2848ec484b3cf 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -95,13 +95,13 @@
switch(advanced_disease.stage)
if(4, 5)
if(advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EARS))
- var/obj/item/organ/internal/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = infected_mob.get_organ_slot(ORGAN_SLOT_EARS)
ears.adjustEarDamage(-4, -4)
if(!advanced_disease.has_required_infectious_organ(infected_mob, ORGAN_SLOT_EYES))
return
- var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
infected_mob.adjust_temp_blindness(-4 SECONDS)
infected_mob.adjust_eye_blur(-4 SECONDS)
diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm
index e53faf5bac51e..cc9e70a24213d 100644
--- a/code/datums/diseases/advance/symptoms/vision.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -42,7 +42,7 @@
return
var/mob/living/carbon/infected_mob = source_disease.affected_mob
- var/obj/item/organ/internal/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = infected_mob.get_organ_slot(ORGAN_SLOT_EYES)
switch(source_disease.stage)
if(1, 2)
diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm
index aab0fcded1d67..f7348c38cb889 100644
--- a/code/datums/diseases/gastrolisis.dm
+++ b/code/datums/diseases/gastrolisis.dm
@@ -37,9 +37,9 @@
if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100)
if(4)
- var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in affected_mob.organs
+ var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.organs
if(!eyes && SPT_PROB(2.5, seconds_per_tick))
- var/obj/item/organ/internal/eyes/snail/new_eyes = new()
+ var/obj/item/organ/eyes/snail/new_eyes = new()
new_eyes.Insert(affected_mob)
affected_mob.visible_message(span_warning("[affected_mob]'s eyes fall out, with snail eyes taking its place!"), \
span_userdanger("You scream in pain as your eyes are pushed out by your new snail eyes!"))
@@ -57,9 +57,9 @@
affected_mob.emote("scream")
return
- var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in affected_mob.organs
+ var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.organs
if(!tongue && SPT_PROB(2.5, seconds_per_tick))
- var/obj/item/organ/internal/tongue/snail/new_tongue = new()
+ var/obj/item/organ/tongue/snail/new_tongue = new()
new_tongue.Insert(affected_mob)
to_chat(affected_mob, span_userdanger("You feel your speech slow down..."))
return
@@ -84,13 +84,13 @@
. = ..()
if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening
var/mob/living/carbon/human/H = affected_mob
- var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in H.organs
+ var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.organs
if(tongue)
- var/obj/item/organ/internal/tongue/new_tongue = new H.dna.species.mutanttongue ()
+ var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue ()
new_tongue.Insert(H)
- var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in H.organs
+ var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in H.organs
if(eyes)
- var/obj/item/organ/internal/eyes/new_eyes = new H.dna.species.mutanteyes ()
+ var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes ()
new_eyes.Insert(H)
var/obj/item/storage/backpack/bag = H.get_item_by_slot(ITEM_SLOT_BACK)
if(istype(bag, /obj/item/storage/backpack/snail))
diff --git a/code/datums/diseases/parasitic_infection.dm b/code/datums/diseases/parasitic_infection.dm
index 64bb59f01fd96..53b61266271fa 100644
--- a/code/datums/diseases/parasitic_infection.dm
+++ b/code/datums/diseases/parasitic_infection.dm
@@ -43,7 +43,7 @@
to_chat(affected_mob, span_warning("You feel much, MUCH lighter!"))
affected_mob.vomit(VOMIT_CATEGORY_BLOOD, lost_nutrition = 20)
// disease code already checks if the liver exists otherwise it is cured
- var/obj/item/organ/internal/liver/affected_liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/affected_liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
affected_liver.Remove(affected_mob)
affected_liver.forceMove(get_turf(affected_mob))
cure()
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 3ccbc7b71ea25..72dc12dd0d024 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -907,7 +907,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
/mob/living/carbon/human/proc/something_horrible_mindmelt()
if(!is_blind())
- var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in organs
+ var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in organs
if(!eyes)
return
eyes.Remove(src)
diff --git a/code/datums/elements/basic_allergenic_attack.dm b/code/datums/elements/basic_allergenic_attack.dm
new file mode 100644
index 0000000000000..29bcbf9d79884
--- /dev/null
+++ b/code/datums/elements/basic_allergenic_attack.dm
@@ -0,0 +1,34 @@
+/// Attach to basic mobs, when they attack, they may trigger a food-based allergic reaction in the target.
+/datum/element/basic_allergenic_attack
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 2
+ /// What allergen is being used. Corresponds to a FOODTYPE
+ var/allergen = NONE
+ /// Chance of the reaction happening
+ var/allergen_chance = 100
+ /// How much histamine to add to the target on reaction
+ var/histamine_add = 0
+
+/datum/element/basic_allergenic_attack/Attach(datum/target, allergen = NONE, allergen_chance = 100, histamine_add = 0)
+ . = ..()
+ if(!isbasicmob(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.allergen = allergen
+ src.allergen_chance = allergen_chance
+ src.histamine_add = histamine_add
+ RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(trigger_allergy))
+
+/datum/element/basic_allergenic_attack/Detach(datum/source, ...)
+ . = ..()
+ UnregisterSignal(source, COMSIG_HOSTILE_POST_ATTACKINGTARGET)
+
+/datum/element/basic_allergenic_attack/proc/trigger_allergy(mob/living/source, mob/living/target, result)
+ SIGNAL_HANDLER
+
+ if(result <= 0 || !istype(target))
+ return
+ if(!target.can_inject(source))
+ return
+
+ target.check_allergic_reaction(allergen, allergen_chance, histamine_add)
diff --git a/code/datums/elements/corrupted_organ.dm b/code/datums/elements/corrupted_organ.dm
index 504c6851e00c6..fda892887cacc 100644
--- a/code/datums/elements/corrupted_organ.dm
+++ b/code/datums/elements/corrupted_organ.dm
@@ -2,9 +2,9 @@
/// Mostly just does something spooky when it is removed
/datum/element/corrupted_organ
-/datum/element/corrupted_organ/Attach(datum/target)
+/datum/element/corrupted_organ/Attach(obj/item/organ/target)
. = ..()
- if (!isinternalorgan(target))
+ if (!istype(target) || (target.organ_flags & ORGAN_EXTERNAL))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_removed))
diff --git a/code/datums/elements/dangerous_surgical_removal.dm b/code/datums/elements/dangerous_surgical_removal.dm
index a0dea1c8bdbd0..7f56a7b104e83 100644
--- a/code/datums/elements/dangerous_surgical_removal.dm
+++ b/code/datums/elements/dangerous_surgical_removal.dm
@@ -1,24 +1,36 @@
/**
- * ## DANGEROUS SURGICAL REMOVAL ELEMENT
+ * ## DANGEROUS ORGAN REMOVAL ELEMENT
*
- * Makes the organ explode when removed surgically.
+ * Makes the organ explode when removed (potentially surgically!).
* That's about it.
*/
-/datum/element/dangerous_surgical_removal
+/datum/element/dangerous_organ_removal
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 2
-/datum/element/dangerous_surgical_removal/Attach(datum/target)
+ /// whether the removal needs to be surgical for it to explode. If you're adding more modes, just pass the signal directly instead
+ var/surgical
+
+/datum/element/dangerous_organ_removal/Attach(datum/target, surgical = FALSE)
. = ..()
if(!isorgan(target))
return ELEMENT_INCOMPATIBLE
- RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_surgical_removal))
-/datum/element/dangerous_surgical_removal/Detach(datum/source)
+ src.surgical = surgical
+
+ if(surgical)
+ RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_removal))
+ else
+ RegisterSignal(target, COMSIG_ORGAN_REMOVED, PROC_REF(on_removal))
+
+/datum/element/dangerous_organ_removal/Detach(datum/source)
. = ..()
- UnregisterSignal(source, COMSIG_ORGAN_SURGICALLY_REMOVED)
-/datum/element/dangerous_surgical_removal/proc/on_surgical_removal(obj/item/organ/source, mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool)
+ UnregisterSignal(source, list(COMSIG_ORGAN_SURGICALLY_REMOVED, COMSIG_ORGAN_REMOVED))
+
+/datum/element/dangerous_organ_removal/proc/on_removal(obj/item/organ/source, mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool)
SIGNAL_HANDLER
- if(source.organ_flags & (ORGAN_FAILING|ORGAN_EMP))
+ if(surgical && source.organ_flags & (ORGAN_FAILING|ORGAN_EMP))
return
if(user?.Adjacent(source))
source.audible_message("[source] explodes on [user]'s face!")
diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm
index f1b3465205928..ac69e8cc18ed5 100644
--- a/code/datums/elements/earhealing.dm
+++ b/code/datums/elements/earhealing.dm
@@ -26,7 +26,7 @@
/datum/element/earhealing/process(seconds_per_tick)
for(var/i in user_by_item)
var/mob/living/carbon/user = user_by_item[i]
- var/obj/item/organ/internal/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS)
if(!ears || !ears.damage || (ears.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(ears))
continue
ears.deaf = max(ears.deaf - 0.25 * seconds_per_tick, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged
diff --git a/code/datums/elements/eyestab.dm b/code/datums/elements/eyestab.dm
index a6757f67fb39b..7821b26fab8f2 100644
--- a/code/datums/elements/eyestab.dm
+++ b/code/datums/elements/eyestab.dm
@@ -77,7 +77,7 @@
target.add_mood_event("eye_stab", /datum/mood_event/eye_stab)
log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])")
- var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
if (!eyes)
return
diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm
index df857cdd6efe6..b65d44096bd38 100644
--- a/code/datums/elements/frozen.dm
+++ b/code/datums/elements/frozen.dm
@@ -20,11 +20,11 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
target_obj.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY)
target_obj.alpha -= 25
- if (isinternalorgan(target))
- var/obj/item/organ/internal/organ = target
+ if(isorgan(target))
+ var/obj/item/organ/organ = target
organ.organ_flags |= ORGAN_FROZEN
else if (isbodypart(target))
- for(var/obj/item/organ/internal/organ in target_obj.contents)
+ for(var/obj/item/organ/organ in target_obj.contents)
organ.organ_flags |= ORGAN_FROZEN
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
@@ -40,11 +40,11 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
obj_source.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix)
obj_source.alpha += 25
- if (isinternalorgan(source))
- var/obj/item/organ/internal/organ = source
+ if (isorgan(source))
+ var/obj/item/organ/organ = source
organ.organ_flags &= ~ORGAN_FROZEN
else if (isbodypart(source))
- for(var/obj/item/organ/internal/organ in obj_source.contents)
+ for(var/obj/item/organ/organ in obj_source.contents)
organ.organ_flags &= ~ORGAN_FROZEN
return ..()
diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm
index 78c0ba7654d69..52b2e00e19c93 100644
--- a/code/datums/elements/kneejerk.dm
+++ b/code/datums/elements/kneejerk.dm
@@ -28,7 +28,7 @@
var/selected_zone = user.zone_selected
var/obj/item/bodypart/leg/right = target.get_bodypart(BODY_ZONE_R_LEG)
var/obj/item/bodypart/leg/left = target.get_bodypart(BODY_ZONE_L_LEG)
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!ishuman(target))
return
diff --git a/code/datums/elements/muffles_speech.dm b/code/datums/elements/muffles_speech.dm
index bbf41e3c4deef..0512d62e33f23 100644
--- a/code/datums/elements/muffles_speech.dm
+++ b/code/datums/elements/muffles_speech.dm
@@ -32,6 +32,8 @@
/datum/element/muffles_speech/proc/muzzle_talk(datum/source, list/speech_args)
SIGNAL_HANDLER
+ if(HAS_TRAIT(source, TRAIT_SIGN_LANG))
+ return
var/spoken_message = speech_args[SPEECH_MESSAGE]
if(spoken_message)
var/list/words = splittext(spoken_message, " ")
diff --git a/code/datums/elements/proficient_miner.dm b/code/datums/elements/proficient_miner.dm
index 0d7a43528f5ac..a35b3951d4418 100644
--- a/code/datums/elements/proficient_miner.dm
+++ b/code/datums/elements/proficient_miner.dm
@@ -9,8 +9,10 @@
/datum/element/proficient_miner/proc/on_bump(mob/living/source, atom/target)
SIGNAL_HANDLER
- if(!ismineralturf(target))
+
+ if(!ismineralturf(target) || (istype(source) && source.stat != CONSCIOUS))
return
+
var/turf/closed/mineral/mineral_wall = target
if(!istype(mineral_wall, /turf/closed/mineral/gibtonite))
@@ -21,8 +23,6 @@
if(gibtonite_wall.stage == GIBTONITE_UNSTRUCK)
mineral_wall.gets_drilled(source)
-
-
/datum/element/proficient_miner/Detach(datum/source, ...)
UnregisterSignal(source, COMSIG_MOVABLE_BUMP)
return ..()
diff --git a/code/datums/instability_meltdown.dm b/code/datums/instability_meltdown.dm
index d8e6fbd77ac9e..4e3a82fd376b5 100644
--- a/code/datums/instability_meltdown.dm
+++ b/code/datums/instability_meltdown.dm
@@ -72,8 +72,9 @@
/datum/instability_meltdown/organ_vomit/meltdown(mob/living/carbon/human/victim)
var/list/elligible_organs = list()
- for(var/obj/item/organ/internal/internal_organ in victim.organs) //make sure we dont get an implant or cavity item
- elligible_organs += internal_organ
+ for(var/obj/item/organ/organ as anything in victim.organs) //make sure we dont get an implant or cavity item
+ if(!(organ.organ_flags & ORGAN_EXTERNAL))
+ elligible_organs += organ
victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10)
if(!elligible_organs.len)
return
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index 122eab2861e99..d0ad6544ca6e6 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -4,7 +4,7 @@
/datum/looping_sound
/// (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. In a list, path must have also be assigned a value or it will be assigned 0 and not play.
var/mid_sounds
- /// The length of time to wait between playing mid_sounds.
+ /// The length of time to wait between playing mid_sounds. WARNING: Continuously looping sounds like the microwave, grav gen and fan sounds don't work very well with this, just don't set this if you are doing a continuous loop of machinery.
var/mid_length
/// Amount of time to add/take away from the mid length, randomly
var/mid_length_vary = 0
diff --git a/code/datums/looping_sounds/vents.dm b/code/datums/looping_sounds/vents.dm
index 016b21db9cad0..183c337ef9814 100644
--- a/code/datums/looping_sounds/vents.dm
+++ b/code/datums/looping_sounds/vents.dm
@@ -4,4 +4,3 @@
end_sound = 'sound/machines/fan/fan_stop.ogg'
end_sound = 1.5 SECONDS
mid_sounds = 'sound/machines/fan/fan_loop.ogg'
- mid_length = 2 SECONDS
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 9d6252855d3e1..e46467327ede7 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -107,7 +107,7 @@
if(honor_check(defender))
var/strength_bonus = HAS_TRAIT(attacker, TRAIT_STRENGTH) ? 2 : 0 //Investing into genetic strength improvements makes you a better boxer
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = attacker.get_organ_slot(ORGAN_SLOT_SPINE) //Getting a cyberspine also pushes you further than just mere meat
if(istype(potential_spine))
strength_bonus *= potential_spine.strength_bonus
diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm
index 397a1c5b13afa..1df318f9ee46f 100644
--- a/code/datums/mind/_mind.dm
+++ b/code/datums/mind/_mind.dm
@@ -540,6 +540,13 @@
var/datum/addiction/affected_addiction = SSaddiction.all_addictions[type]
return affected_addiction.on_lose_addiction_points(src)
+/// Whether or not we can roll for midrounds, specifically checking if we have any major antag datums that should block it
+/datum/mind/proc/can_roll_midround()
+ for(var/datum/antagonist/antag as anything in antag_datums)
+ if(antag.block_midrounds)
+ return FALSE
+
+ return TRUE
/// Setter for the assigned_role job datum.
/datum/mind/proc/set_assigned_role(datum/job/new_role)
diff --git a/code/datums/mood.dm b/code/datums/mood.dm
index cffd955635817..fe91e1db2c66c 100644
--- a/code/datums/mood.dm
+++ b/code/datums/mood.dm
@@ -462,8 +462,8 @@
/datum/mood/proc/set_sanity(amount, minimum = SANITY_INSANE, maximum = SANITY_GREAT, override = FALSE)
// If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.7
// If the new amount would move towards the acceptable range faster then use it instead
- if(amount < minimum)
- amount += clamp(minimum - amount, 0, 0.7)
+ if(amount < minimum && sanity < minimum)
+ amount = sanity + 0.7
if((!override && HAS_TRAIT(mob_parent, TRAIT_UNSTABLE)) || amount > maximum)
amount = min(sanity, amount)
if(amount == sanity) //Prevents stuff from flicking around.
diff --git a/code/datums/mood_events/axe_events.dm b/code/datums/mood_events/axe_events.dm
new file mode 100644
index 0000000000000..1af7c116ceff1
--- /dev/null
+++ b/code/datums/mood_events/axe_events.dm
@@ -0,0 +1,20 @@
+
+/datum/mood_event/axe_gone
+ description = "What happened to the axe... Where is it? It can't be..."
+ mood_change = -15
+
+/datum/mood_event/axe_neutral
+ description = "I'm sure the axe is okay."
+ mood_change = 1
+
+/datum/mood_event/axe_cabinet
+ description = "The axe is where it belongs."
+ mood_change = 5
+
+/datum/mood_event/axe_missing
+ description = "The axe, there's something wrong..."
+ mood_change = -5
+
+/datum/mood_event/axe_held
+ description = "I'm not worthy of you, axe. I need to put you back."
+ mood_change = -10
diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm
index 399cbec53ed00..a9ac83727994e 100644
--- a/code/datums/mutations/_combined.dm
+++ b/code/datums/mutations/_combined.dm
@@ -26,11 +26,11 @@
result = /datum/mutation/human/shock
/datum/generecipe/cindikinesis
- required = "/datum/mutation/human/geladikinesis; /datum/mutation/human/fire_breath"
+ required = "/datum/mutation/human/geladikinesis; /datum/mutation/human/firebreath"
result = /datum/mutation/human/cindikinesis
/datum/generecipe/pyrokinesis
- required = "/datum/mutation/human/cryokinesis; /datum/mutation/human/fire_breath"
+ required = "/datum/mutation/human/cryokinesis; /datum/mutation/human/firebreath"
result = /datum/mutation/human/pyrokinesis
/datum/generecipe/thermal_adaptation
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index e09a8337b72a4..bbfdc8b3fa5f4 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -560,7 +560,7 @@
explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src)
for(var/mob/living/carbon/human/splashed in view(2, owner))
- var/obj/item/organ/internal/eyes/eyes = splashed.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = splashed.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
to_chat(splashed, span_userdanger("You are blinded by a shower of blood!"))
eyes.apply_organ_damage(5)
@@ -588,7 +588,7 @@
if(.)//cant add
return TRUE
- var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(brain)
brain.Remove(owner, special = TRUE, movement_flags = NO_ID_TRANSFER)
brain.zone = BODY_ZONE_CHEST
@@ -613,7 +613,7 @@
if(!successful)
stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)")
return TRUE
- var/obj/item/organ/internal/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(brain)
brain.Remove(owner, special = TRUE, movement_flags = NO_ID_TRANSFER)
brain.zone = initial(brain.zone)
diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm
index d5db738213fec..c6a48a32a144d 100644
--- a/code/datums/mutations/tongue_spike.dm
+++ b/code/datums/mutations/tongue_spike.dm
@@ -30,7 +30,7 @@
to_chat(cast_on, span_notice("You concentrate really hard, but nothing happens."))
return
- var/obj/item/organ/internal/tongue/to_fire = locate() in cast_on.organs
+ var/obj/item/organ/tongue/to_fire = locate() in cast_on.organs
if(!to_fire)
to_chat(cast_on, span_notice("You don't have a tongue to shoot!"))
return
diff --git a/code/datums/quirks/negative_quirks/addict.dm b/code/datums/quirks/negative_quirks/addict.dm
index 5eb88795bdc6c..62262dc3bf7e4 100644
--- a/code/datums/quirks/negative_quirks/addict.dm
+++ b/code/datums/quirks/negative_quirks/addict.dm
@@ -145,15 +145,15 @@
quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name))
// smoker lungs have 25% less health and healing
var/mob/living/carbon/carbon_holder = quirk_holder
- var/obj/item/organ/internal/lungs/smoker_lungs = null
- var/obj/item/organ/internal/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/smoker_lungs = null
+ var/obj/item/organ/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS)
if(old_lungs && IS_ORGANIC_ORGAN(old_lungs))
if(isplasmaman(carbon_holder))
- smoker_lungs = /obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker
+ smoker_lungs = /obj/item/organ/lungs/plasmaman/plasmaman_smoker
else if(isethereal(carbon_holder))
- smoker_lungs = /obj/item/organ/internal/lungs/ethereal/ethereal_smoker
+ smoker_lungs = /obj/item/organ/lungs/ethereal/ethereal_smoker
else
- smoker_lungs = /obj/item/organ/internal/lungs/smoker_lungs
+ smoker_lungs = /obj/item/organ/lungs/smoker_lungs
if(!isnull(smoker_lungs))
smoker_lungs = new smoker_lungs
smoker_lungs.Insert(carbon_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED)
@@ -217,7 +217,7 @@
quirk_holder.add_mob_memory(/datum/memory/key/quirk_alcoholic, protagonist = quirk_holder, preferred_brandy = initial(favorite_alcohol.name))
// alcoholic livers have 25% less health and healing
- var/obj/item/organ/internal/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER)
if(alcohol_liver && IS_ORGANIC_ORGAN(alcohol_liver)) // robotic livers aren't affected
alcohol_liver.maxHealth = alcohol_liver.maxHealth * 0.75
alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75
diff --git a/code/datums/quirks/negative_quirks/photophobia.dm b/code/datums/quirks/negative_quirks/photophobia.dm
index b543aeda07631..987b43fdcf37d 100644
--- a/code/datums/quirks/negative_quirks/photophobia.dm
+++ b/code/datums/quirks/negative_quirks/photophobia.dm
@@ -27,22 +27,22 @@
COMSIG_CARBON_LOSE_ORGAN,
COMSIG_MOVABLE_MOVED,))
quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA)
- var/obj/item/organ/internal/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES)
if(istype(normal_eyes))
normal_eyes.flash_protect = initial(normal_eyes.flash_protect)
-/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/internal/eyes/sensitive_eyes)
+/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/eyes/sensitive_eyes)
SIGNAL_HANDLER
if(!istype(sensitive_eyes))
return
update_eyes(sensitive_eyes)
-/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/internal/eyes/target_eyes)
+/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/eyes/target_eyes)
if(!istype(target_eyes))
return
target_eyes.flash_protect = max(target_eyes.flash_protect - 1, FLASH_PROTECTION_HYPER_SENSITIVE)
-/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/internal/eyes/normal_eyes)
+/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/eyes/normal_eyes)
SIGNAL_HANDLER
if(!istype(normal_eyes))
return
diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm
index 4a377699b40ac..2b0f20b0d9f84 100644
--- a/code/datums/quirks/negative_quirks/prosthetic_organ.dm
+++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm
@@ -46,16 +46,16 @@
var/obj/item/organ/prosthetic
switch(organ_slot)
if(ORGAN_SLOT_HEART)
- prosthetic = new /obj/item/organ/internal/heart/cybernetic/surplus
+ prosthetic = new /obj/item/organ/heart/cybernetic/surplus
slot_string = "heart"
if(ORGAN_SLOT_LUNGS)
- prosthetic = new /obj/item/organ/internal/lungs/cybernetic/surplus
+ prosthetic = new /obj/item/organ/lungs/cybernetic/surplus
slot_string = "lungs"
if(ORGAN_SLOT_LIVER)
- prosthetic = new /obj/item/organ/internal/liver/cybernetic/surplus
+ prosthetic = new /obj/item/organ/liver/cybernetic/surplus
slot_string = "liver"
if(ORGAN_SLOT_STOMACH)
- prosthetic = new /obj/item/organ/internal/stomach/cybernetic/surplus
+ prosthetic = new /obj/item/organ/stomach/cybernetic/surplus
slot_string = "stomach"
medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \
Removal of these organs is known to be dangerous to the patient as well as the practitioner."
diff --git a/code/datums/quirks/negative_quirks/scarred_eye.dm b/code/datums/quirks/negative_quirks/scarred_eye.dm
index 49628545cfa0d..11b3f16f8aae5 100644
--- a/code/datums/quirks/negative_quirks/scarred_eye.dm
+++ b/code/datums/quirks/negative_quirks/scarred_eye.dm
@@ -35,7 +35,7 @@
/datum/quirk/item_quirk/scarred_eye/add(client/client_source)
var/mob/living/carbon/human/human_owner = quirk_holder
- var/obj/item/organ/internal/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
if (isnull(eyes))
return
@@ -57,7 +57,7 @@
/datum/quirk/item_quirk/scarred_eye/remove()
var/mob/living/carbon/human/human_owner = quirk_holder
- var/obj/item/organ/internal/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human_owner.get_organ_slot(ORGAN_SLOT_EYES)
if (!isnull(eyes))
eyes.fix_scar(RIGHT_EYE_SCAR)
eyes.fix_scar(LEFT_EYE_SCAR)
diff --git a/code/datums/quirks/negative_quirks/tin_man.dm b/code/datums/quirks/negative_quirks/tin_man.dm
index e6d411bc772f1..0afd8874bed49 100644
--- a/code/datums/quirks/negative_quirks/tin_man.dm
+++ b/code/datums/quirks/negative_quirks/tin_man.dm
@@ -11,10 +11,10 @@
/datum/quirk/tin_man/add_unique(client/client_source)
var/mob/living/carbon/human/human_holder = quirk_holder
var/static/list/organ_slots = list(
- ORGAN_SLOT_HEART = /obj/item/organ/internal/heart/cybernetic/surplus,
- ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs/cybernetic/surplus,
- ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver/cybernetic/surplus,
- ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach/cybernetic/surplus,
+ ORGAN_SLOT_HEART = /obj/item/organ/heart/cybernetic/surplus,
+ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/cybernetic/surplus,
+ ORGAN_SLOT_LIVER = /obj/item/organ/liver/cybernetic/surplus,
+ ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/cybernetic/surplus,
)
var/list/possible_organ_slots = organ_slots.Copy()
if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD))
diff --git a/code/datums/quirks/neutral_quirks/deviant_tastes.dm b/code/datums/quirks/neutral_quirks/deviant_tastes.dm
index 566b469c7a77d..5be181f96b5a8 100644
--- a/code/datums/quirks/neutral_quirks/deviant_tastes.dm
+++ b/code/datums/quirks/neutral_quirks/deviant_tastes.dm
@@ -9,7 +9,7 @@
mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy
/datum/quirk/deviant_tastes/add(client/client_source)
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
var/liked_foodtypes = tongue.liked_foodtypes
@@ -17,7 +17,7 @@
tongue.disliked_foodtypes = liked_foodtypes
/datum/quirk/deviant_tastes/remove()
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
diff --git a/code/datums/quirks/neutral_quirks/gamer.dm b/code/datums/quirks/neutral_quirks/gamer.dm
index 0ab2e780480ee..9055b09ce7fe6 100644
--- a/code/datums/quirks/neutral_quirks/gamer.dm
+++ b/code/datums/quirks/neutral_quirks/gamer.dm
@@ -13,7 +13,7 @@
var/gaming_withdrawal_timer = TIMER_ID_NULL
/datum/quirk/gamer/add(client/client_source)
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
// Gamer diet
tongue.liked_foodtypes = JUNKFOOD
@@ -26,7 +26,7 @@
gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE)
/datum/quirk/gamer/remove()
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
UnregisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME)
diff --git a/code/datums/quirks/neutral_quirks/heretochromatic.dm b/code/datums/quirks/neutral_quirks/heretochromatic.dm
index 311cbf66868f0..daa018726ad89 100644
--- a/code/datums/quirks/neutral_quirks/heretochromatic.dm
+++ b/code/datums/quirks/neutral_quirks/heretochromatic.dm
@@ -22,7 +22,7 @@
human_holder.eye_color_right = color
human_holder.dna.update_ui_block(DNA_EYE_COLOR_RIGHT_BLOCK)
- var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/eyes)
if(!eyes_of_the_holder)
return
@@ -39,7 +39,7 @@
human_holder.eye_color_right = human_holder.eye_color_left
UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN)
-/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed)
+/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed)
SIGNAL_HANDLER
if(!istype(removed))
diff --git a/code/datums/quirks/neutral_quirks/pineapple_hater.dm b/code/datums/quirks/neutral_quirks/pineapple_hater.dm
index f17eb4224ec4c..858963e0a36e0 100644
--- a/code/datums/quirks/neutral_quirks/pineapple_hater.dm
+++ b/code/datums/quirks/neutral_quirks/pineapple_hater.dm
@@ -15,13 +15,13 @@
)
/datum/quirk/pineapple_hater/add(client/client_source)
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.disliked_foodtypes |= PINEAPPLE
/datum/quirk/pineapple_hater/remove()
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
diff --git a/code/datums/quirks/neutral_quirks/pineapple_liker.dm b/code/datums/quirks/neutral_quirks/pineapple_liker.dm
index c342e14769cf8..d2de14a0e8163 100644
--- a/code/datums/quirks/neutral_quirks/pineapple_liker.dm
+++ b/code/datums/quirks/neutral_quirks/pineapple_liker.dm
@@ -9,13 +9,13 @@
mail_goodies = list(/obj/item/food/pizzaslice/pineapple)
/datum/quirk/pineapple_liker/add(client/client_source)
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.liked_foodtypes |= PINEAPPLE
/datum/quirk/pineapple_liker/remove()
- var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
diff --git a/code/datums/quirks/positive_quirks/chip_connector.dm b/code/datums/quirks/positive_quirks/chip_connector.dm
index c12809bbfd2ef..6fcc5bf9d31be 100644
--- a/code/datums/quirks/positive_quirks/chip_connector.dm
+++ b/code/datums/quirks/positive_quirks/chip_connector.dm
@@ -7,7 +7,7 @@
lose_text = span_danger("You don't feel so CONNECTED anymore.")
medical_record_text = "Patient has a cybernetic implant on their back of their head that lets them install and remove skillchips at will. Gross."
mail_goodies = list()
- var/obj/item/organ/internal/cyberimp/brain/connector/connector
+ var/obj/item/organ/cyberimp/brain/connector/connector
/datum/quirk/chip_connector/New()
. = ..()
diff --git a/code/datums/quirks/positive_quirks/chipped.dm b/code/datums/quirks/positive_quirks/chipped.dm
index 30c226c130031..7f43fc07b5bbc 100644
--- a/code/datums/quirks/positive_quirks/chipped.dm
+++ b/code/datums/quirks/positive_quirks/chipped.dm
@@ -42,7 +42,7 @@
quirk_holder_carbon.implant_skillchip(installed_chip, force = TRUE)
installed_chip.try_activate_skillchip(silent = FALSE, force = TRUE)
- var/obj/item/organ/internal/brain/itchy_brain = quirk_holder.get_organ_by_type(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/itchy_brain = quirk_holder.get_organ_by_type(ORGAN_SLOT_BRAIN)
itchy_timer = addtimer(CALLBACK(src, PROC_REF(cause_itchy), itchy_brain), rand(5 SECONDS, 10 MINUTES)) // they get The Itch from a poor quality install every so often
/datum/quirk/chipped/remove()
@@ -50,7 +50,7 @@
deltimer(itchy_timer)
. = ..()
-/datum/quirk/chipped/proc/cause_itchy(obj/item/organ/internal/brain/itchy_brain)
+/datum/quirk/chipped/proc/cause_itchy(obj/item/organ/brain/itchy_brain)
itchy_brain.apply_organ_damage(rand(1, 5), maximum = itchy_brain.maxHealth * 0.3)
to_chat(itchy_brain.owner, span_warning("Your [itchy_brain] itches."))
diff --git a/code/datums/quirks/positive_quirks/friendly.dm b/code/datums/quirks/positive_quirks/friendly.dm
index 943bc2c4b8457..ef030530169f8 100644
--- a/code/datums/quirks/positive_quirks/friendly.dm
+++ b/code/datums/quirks/positive_quirks/friendly.dm
@@ -12,7 +12,7 @@
/datum/quirk/friendly/add_unique(client/client_source)
var/mob/living/carbon/human/human_quirkholder = quirk_holder
- var/obj/item/organ/internal/heart/holder_heart = human_quirkholder.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/holder_heart = human_quirkholder.get_organ_slot(ORGAN_SLOT_HEART)
if(isnull(holder_heart) || isnull(holder_heart.reagents))
return
holder_heart.reagents.maximum_volume = 20
diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm
index 3598bd764cac7..fadcbb8570946 100644
--- a/code/datums/saymode.dm
+++ b/code/datums/saymode.dm
@@ -64,7 +64,7 @@
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
if(iscarbon(user))
var/mob/living/carbon/C = user
- var/obj/item/organ/internal/vocal_cords/V = C.get_organ_slot(ORGAN_SLOT_VOICE)
+ var/obj/item/organ/vocal_cords/V = C.get_organ_slot(ORGAN_SLOT_VOICE)
if(V?.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm
index c7f8869c405a3..07edc617cbd9c 100644
--- a/code/datums/station_traits/positive_traits.dm
+++ b/code/datums/station_traits/positive_traits.dm
@@ -258,42 +258,42 @@
trait_to_give = STATION_TRAIT_CYBERNETIC_REVOLUTION
/// List of all job types with the cybernetics they should receive.
var/static/list/job_to_cybernetic = list(
- /datum/job/assistant = /obj/item/organ/internal/heart/cybernetic, //real cardiac
- /datum/job/atmospheric_technician = /obj/item/organ/internal/cyberimp/mouth/breathing_tube,
- /datum/job/bartender = /obj/item/organ/internal/liver/cybernetic/tier3,
- /datum/job/bitrunner = /obj/item/organ/internal/eyes/robotic/thermals,
- /datum/job/botanist = /obj/item/organ/internal/cyberimp/chest/nutriment,
- /datum/job/captain = /obj/item/organ/internal/heart/cybernetic/tier3,
- /datum/job/cargo_technician = /obj/item/organ/internal/stomach/cybernetic/tier2,
- /datum/job/chaplain = /obj/item/organ/internal/cyberimp/brain/anti_drop,
- /datum/job/chemist = /obj/item/organ/internal/liver/cybernetic/tier2,
- /datum/job/chief_engineer = /obj/item/organ/internal/cyberimp/chest/thrusters,
- /datum/job/chief_medical_officer = /obj/item/organ/internal/cyberimp/chest/reviver,
- /datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK!
- /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
- /datum/job/coroner = /obj/item/organ/internal/tongue/bone, //hes got a bone to pick with you
- /datum/job/curator = /obj/item/organ/internal/cyberimp/brain/connector,
- /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3,
- /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery,
- /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer.
- /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic,
- /datum/job/head_of_security = /obj/item/organ/internal/eyes/robotic/thermals,
- /datum/job/human_ai = /obj/item/organ/internal/brain/cybernetic,
- /datum/job/janitor = /obj/item/organ/internal/eyes/robotic/xray,
- /datum/job/lawyer = /obj/item/organ/internal/heart/cybernetic/tier2,
- /datum/job/mime = /obj/item/organ/internal/tongue/robot, //...
- /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical,
- /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield,
- /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/whisper,
- /datum/job/pun_pun = /obj/item/organ/internal/cyberimp/arm/strongarm,
- /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3,
- /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci,
- /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic,
- /datum/job/scientist = /obj/item/organ/internal/ears/cybernetic,
- /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/flash,
- /datum/job/shaft_miner = /obj/item/organ/internal/monster_core/rush_gland,
- /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/toolset,
- /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /datum/job/assistant = /obj/item/organ/heart/cybernetic, //real cardiac
+ /datum/job/atmospheric_technician = /obj/item/organ/cyberimp/mouth/breathing_tube,
+ /datum/job/bartender = /obj/item/organ/liver/cybernetic/tier3,
+ /datum/job/bitrunner = /obj/item/organ/eyes/robotic/thermals,
+ /datum/job/botanist = /obj/item/organ/cyberimp/chest/nutriment,
+ /datum/job/captain = /obj/item/organ/heart/cybernetic/tier3,
+ /datum/job/cargo_technician = /obj/item/organ/stomach/cybernetic/tier2,
+ /datum/job/chaplain = /obj/item/organ/cyberimp/brain/anti_drop,
+ /datum/job/chemist = /obj/item/organ/liver/cybernetic/tier2,
+ /datum/job/chief_engineer = /obj/item/organ/cyberimp/chest/thrusters,
+ /datum/job/chief_medical_officer = /obj/item/organ/cyberimp/chest/reviver,
+ /datum/job/clown = /obj/item/organ/cyberimp/brain/anti_stun, //HONK!
+ /datum/job/cook = /obj/item/organ/cyberimp/chest/nutriment/plus,
+ /datum/job/coroner = /obj/item/organ/tongue/bone, //hes got a bone to pick with you
+ /datum/job/curator = /obj/item/organ/cyberimp/brain/connector,
+ /datum/job/detective = /obj/item/organ/lungs/cybernetic/tier3,
+ /datum/job/doctor = /obj/item/organ/cyberimp/arm/surgery,
+ /datum/job/geneticist = /obj/item/organ/fly, //we don't care about implants, we have cancer.
+ /datum/job/head_of_personnel = /obj/item/organ/eyes/robotic,
+ /datum/job/head_of_security = /obj/item/organ/eyes/robotic/thermals,
+ /datum/job/human_ai = /obj/item/organ/brain/cybernetic,
+ /datum/job/janitor = /obj/item/organ/eyes/robotic/xray,
+ /datum/job/lawyer = /obj/item/organ/heart/cybernetic/tier2,
+ /datum/job/mime = /obj/item/organ/tongue/robot, //...
+ /datum/job/paramedic = /obj/item/organ/cyberimp/eyes/hud/medical,
+ /datum/job/prisoner = /obj/item/organ/eyes/robotic/shield,
+ /datum/job/psychologist = /obj/item/organ/ears/cybernetic/whisper,
+ /datum/job/pun_pun = /obj/item/organ/cyberimp/arm/strongarm,
+ /datum/job/quartermaster = /obj/item/organ/stomach/cybernetic/tier3,
+ /datum/job/research_director = /obj/item/organ/cyberimp/bci,
+ /datum/job/roboticist = /obj/item/organ/cyberimp/eyes/hud/diagnostic,
+ /datum/job/scientist = /obj/item/organ/ears/cybernetic,
+ /datum/job/security_officer = /obj/item/organ/cyberimp/arm/flash,
+ /datum/job/shaft_miner = /obj/item/organ/monster_core/rush_gland,
+ /datum/job/station_engineer = /obj/item/organ/cyberimp/arm/toolset,
+ /datum/job/warden = /obj/item/organ/cyberimp/eyes/hud/security,
)
/datum/station_trait/cybernetic_revolution/New()
@@ -312,7 +312,7 @@
var/mob/living/silicon/ai/ai = spawned
ai.eyeobj.relay_speech = TRUE //surveillance upgrade. the ai gets cybernetics too.
return
- var/obj/item/organ/internal/cybernetic = new cybernetic_type()
+ var/obj/item/organ/cybernetic = new cybernetic_type()
cybernetic.Insert(spawned, special = TRUE, movement_flags = DELETE_IF_REPLACED)
/datum/station_trait/luxury_escape_pods
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 7a6b263d5893e..3b197ec7f9719 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -433,7 +433,7 @@
owner.reagents.add_reagent(/datum/reagent/medicine/adminordrazine, 25)
owner.log_message("entered a blood frenzy", LOG_ATTACK)
- to_chat(owner, span_warning("KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!"))
+ to_chat(owner, span_narsiesmall("KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, NO TEAM MATES OR ALLEGIANCES! KILL THEM ALL!"))
var/datum/client_colour/colour = owner.add_client_colour(/datum/client_colour/bloodlust)
QDEL_IN(colour, 1.1 SECONDS)
diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm
index 2664bbb4214de..a1ff3c7fb4eaf 100644
--- a/code/datums/status_effects/debuffs/drunk.dm
+++ b/code/datums/status_effects/debuffs/drunk.dm
@@ -136,7 +136,7 @@
// Handle the Ballmer Peak.
// If our owner is a scientist (has the trait "TRAIT_BALLMER_SCIENTIST"), there's a 5% chance
// that they'll say one of the special "ballmer message" lines, depending their drunk-ness level.
- var/obj/item/organ/internal/liver/liver_organ = owner.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver_organ = owner.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver_organ && HAS_TRAIT(liver_organ, TRAIT_BALLMER_SCIENTIST) && prob(5))
if(drunk_value >= BALLMER_PEAK_LOW_END && drunk_value <= BALLMER_PEAK_HIGH_END)
owner.say(pick_list_replacements(VISTA_FILE, "ballmer_good_msg"), forced = "ballmer")
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index a6607cd7797e2..0056c55a7f6d4 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -547,7 +547,7 @@
if(QDELETED(human_mob))
return
if(prob(1))//low chance of the alternative reality returning to monkey
- var/obj/item/organ/external/tail/monkey/monkey_tail = new ()
+ var/obj/item/organ/tail/monkey/monkey_tail = new ()
monkey_tail.Insert(human_mob, movement_flags = DELETE_IF_REPLACED)
var/datum/species/human_species = human_mob.dna?.species
if(human_species)
diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm
index feda199d67071..2cf18c0767a1b 100644
--- a/code/datums/storage/storage.dm
+++ b/code/datums/storage/storage.dm
@@ -171,6 +171,7 @@
arrived.item_flags |= IN_STORAGE
refresh_views()
arrived.on_enter_storage(src)
+ RegisterSignal(arrived, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive))
SEND_SIGNAL(arrived, COMSIG_ITEM_STORED, src)
parent.update_appearance()
@@ -184,6 +185,7 @@
gone.item_flags &= ~IN_STORAGE
remove_and_refresh(gone)
gone.on_exit_storage(src)
+ UnregisterSignal(gone, COMSIG_MOUSEDROPPED_ONTO)
SEND_SIGNAL(gone, COMSIG_ITEM_UNSTORED, src)
parent.update_appearance()
@@ -451,7 +453,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
SEND_SIGNAL(parent, COMSIG_ATOM_STORED_ITEM, to_insert, user, force)
SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force)
- RegisterSignal(to_insert, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive))
to_insert.forceMove(real_location)
item_insertion_feedback(user, to_insert, override)
parent.update_appearance()
@@ -468,7 +469,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
return
if (target.loc != real_location) // what even
- UnregisterSignal(target, COMSIG_MOUSEDROPPED_ONTO)
return
if(numerical_stacking)
@@ -573,7 +573,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
refresh_views()
parent.update_appearance()
- UnregisterSignal(thing, COMSIG_MOUSEDROPPED_ONTO)
SEND_SIGNAL(parent, COMSIG_ATOM_REMOVED_ITEM, thing, remove_to_loc, silent)
SEND_SIGNAL(src, COMSIG_STORAGE_REMOVED_ITEM, thing, remove_to_loc, silent)
return TRUE
diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm
index 8feebe8d2b624..615d0d10eb0e6 100644
--- a/code/datums/wounds/cranial_fissure.dm
+++ b/code/datums/wounds/cranial_fissure.dm
@@ -66,7 +66,7 @@
if (source.stat == DEAD)
return
- var/obj/item/organ/internal/brain/brain = source.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/brain = source.get_organ_by_type(/obj/item/organ/brain)
if (isnull(brain))
return
@@ -91,7 +91,7 @@
if (victim.body_position != LYING_DOWN)
return FALSE
- var/obj/item/organ/internal/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/eyes)
if (isnull(eyes))
victim.balloon_alert(user, "no eyes to take!")
return TRUE
@@ -131,9 +131,9 @@
return TRUE
-/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/internal/eyes/eyes)
+/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/eyes/eyes)
PRIVATE_PROC(TRUE)
- return victim?.get_organ_by_type(/obj/item/organ/internal/eyes) == eyes
+ return victim?.get_organ_by_type(/obj/item/organ/eyes) == eyes
#undef CRANIAL_FISSURE_FILTER_DISPLACEMENT
diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm
index 7a0fa12f4473e..01af1fa44d1fd 100644
--- a/code/datums/wounds/pierce.dm
+++ b/code/datums/wounds/pierce.dm
@@ -263,7 +263,7 @@
var/right_side = FALSE
/datum/wound/pierce/bleed/severe/eye/apply_wound(obj/item/bodypart/limb, silent, datum/wound/old_wound, smited, attack_direction, wound_source, replacing, right_side)
- var/obj/item/organ/internal/eyes/eyes = locate() in limb
+ var/obj/item/organ/eyes/eyes = locate() in limb
if (!istype(eyes))
return FALSE
. = ..()
@@ -295,7 +295,7 @@
can_be_randomly_generated = FALSE
/datum/wound_pregen_data/flesh_pierce/open_puncture/eye/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types, datum/wound/old_wound, random_roll, duplicates_allowed, care_about_existing_wounds)
- if (isnull(locate(/obj/item/organ/internal/eyes) in limb))
+ if (isnull(locate(/obj/item/organ/eyes) in limb))
return FALSE
return ..()
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 1aace3e67709e..dff56587c1954 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -204,6 +204,8 @@ Medical HUD! Basic mode needs suit sensors on.
else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
if(HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) || can_defib_client())
holder.icon_state = "huddefib"
+ else if(HAS_TRAIT(src, TRAIT_GHOSTROLE_ON_REVIVE))
+ holder.icon_state = "hudghost"
else
holder.icon_state = "huddead"
else
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index b2df8d7416dde..f93a4e2fac65e 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -348,7 +348,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list
var/human_check = TRUE
/datum/objective/protect/check_completion()
- var/obj/item/organ/internal/brain/brain_target
+ var/obj/item/organ/brain/brain_target
if(isnull(target))
return FALSE
if(human_check)
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index efb3f4480330e..fdebf44e52abb 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -6,26 +6,33 @@
req_access = list(ACCESS_CE)
circuit = /obj/item/circuitboard/computer/apc_control
light_color = LIGHT_COLOR_DIM_YELLOW
- var/obj/machinery/power/apc/active_apc //The APC we're using right now
+ ///The APC we're remotely connected to right now
+ var/obj/machinery/power/apc/active_apc
+ ///Whether actions are being logged to the console's logs or not
var/should_log = TRUE
+ ///Whether the console is currently being restored from an emagged state
var/restoring = FALSE
- var/list/logs
+ ///List of logs containing events like logins/logoffs, APC access and manipulation, checking the APC/logs tabs and restoring logging after an emag
+ var/list/logs = list()
+ ///Tracks the current logged-in user's ID card's name and assignment
var/auth_id = "\[NULL\]:"
+ ///Whether the computer is on a station-level; set in Initialize() for use in checking APCs
+ var/is_on_station = TRUE
/obj/machinery/computer/apc_control/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
- logs = list()
+ is_on_station = is_station_level(z)
/obj/machinery/computer/apc_control/on_set_machine_stat(old_value)
. = ..()
- if(machine_stat)
+ if(machine_stat && active_apc)
disconnect_apc()
/obj/machinery/computer/apc_control/attack_ai(mob/user)
if(!isAdminGhostAI(user))
to_chat(user,span_warning("[src] does not support AI control.")) //You already have APC access, cheater!
return
- ..()
+ return ..()
/obj/machinery/computer/apc_control/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
@@ -37,11 +44,13 @@
playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
return TRUE
+///Creates a log entry in the console with a timestamp, current login ID data and the text provided in log_text
/obj/machinery/computer/apc_control/proc/log_activity(log_text)
if(!should_log)
return
LAZYADD(logs, "([station_time_timestamp()]): [auth_id] [log_text]")
+///Resets the console's emagged state and re-enables logging of activity
/obj/machinery/computer/apc_control/proc/restore_comp(mob/user)
obj_flags &= ~EMAGGED
should_log = TRUE
@@ -49,6 +58,7 @@
log_activity("-=- Logging restored to full functionality at this point -=-")
restoring = FALSE
+///Initiates remote access to the APC
/obj/machinery/computer/apc_control/proc/connect_apc(obj/machinery/power/apc/apc, mob/user)
if(isnull(apc))
return
@@ -62,17 +72,37 @@
user.log_message("remotely accessed [apc] from [src].", LOG_GAME)
log_activity("[auth_id] remotely accessed APC in [get_area_name(apc.area, TRUE)]")
active_apc = apc
-
-/obj/machinery/computer/apc_control/proc/disconnect_apc()
- // check if apc exists and is not controlled by anyone
- if(QDELETED(active_apc))
- return
+ RegisterSignal(active_apc, COMSIG_QDELETING, PROC_REF(on_apc_destroyed))
+
+///Disconnects the computer from the accessed APC upon its destruction
+/obj/machinery/computer/apc_control/proc/on_apc_destroyed(datum/source)
+ SIGNAL_HANDLER
+ disconnect_apc(TRUE) //to prevent the APC from trying to speak while being qdel'd
+
+/**
+ * Disconnect from the APC we're currently in remote access with
+ * arguments:
+ * mute - whether the APC should announce the disconnection locally, passed into apc's disconnect_remote_access()
+ */
+/obj/machinery/computer/apc_control/proc/disconnect_apc(mute = FALSE)
+ UnregisterSignal(active_apc, COMSIG_QDELETING)
if(active_apc.remote_control_user)
- active_apc.disconnect_remote_access()
+ active_apc.disconnect_remote_access(mute)
active_apc = null
-/obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/APC)
- return APC.z == z && !APC.malfhack && !APC.aidisabled && !(APC.obj_flags & EMAGGED) && !APC.machine_stat && !istype(APC.area, /area/station/ai_monitored)
+/**
+* Checks for whether the APC provided is eligible for access and being listed in the APC list.
+* The APC has to:
+* - be on a station z-level if the computer is station-side or be on the same z-level as the computer if otherwise (away subtype, charlie station)
+* - be not hacked by a malf AI
+* - have AI control enabled
+* - be not emagged
+* - be working
+* - not be an AI monitored area (AI sat areas and AI upload)
+*/
+
+/obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/checked_apc)
+ return (is_on_station ? is_station_level(checked_apc.z) : checked_apc.z == z) && !checked_apc.malfhack && !checked_apc.aidisabled && !(checked_apc.obj_flags & EMAGGED) && !checked_apc.machine_stat && !istype(checked_apc.area, /area/station/ai_monitored)
/obj/machinery/computer/apc_control/ui_interact(mob/user, datum/tgui/ui)
. = ..()
@@ -118,6 +148,7 @@
if(.)
return
+ var/mob/living/user = ui.user
switch(action)
if("log-in")
if(obj_flags & EMAGGED)
@@ -125,18 +156,17 @@
auth_id = "Unknown (Unknown):"
log_activity("[auth_id] logged in to the terminal")
return
- var/mob/living/operator = usr
- if(!istype(operator))
+ if(!istype(user))
return
- var/obj/item/card/id/ID = operator.get_idcard(TRUE)
- if(ID && istype(ID))
- if(check_access(ID))
+ var/obj/item/card/id/user_id_card = user.get_idcard(TRUE)
+ if(istype(user_id_card))
+ if(check_access(user_id_card))
authenticated = TRUE
- auth_id = "[ID.registered_name] ([ID.assignment]):"
+ auth_id = "[user_id_card.registered_name] ([user_id_card.assignment]):"
log_activity("[auth_id] logged in to the terminal")
playsound(src, 'sound/machines/terminal/terminal_on.ogg', 50, FALSE)
else
- auth_id = "[ID.registered_name] ([ID.assignment]):"
+ auth_id = "[user_id_card.registered_name] ([user_id_card.assignment]):"
log_activity("[auth_id] attempted to log into the terminal")
playsound(src, 'sound/machines/terminal/terminal_error.ogg', 50, FALSE)
say("ID rejected, access denied!")
@@ -150,15 +180,15 @@
auth_id = "\[NULL\]"
if("toggle-logs")
should_log = !should_log
- usr.log_message("set the logs of [src] [should_log ? "On" : "Off"].", LOG_GAME)
+ user.log_message("set the logs of [src] [should_log ? "On" : "Off"].", LOG_GAME)
if("restore-console")
restoring = TRUE
- addtimer(CALLBACK(src, PROC_REF(restore_comp)), rand(3,5) * 9 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(restore_comp), user), rand(3,5) * 9 SECONDS)
if("access-apc")
var/ref = params["ref"]
playsound(src, SFX_TERMINAL_TYPE, 50, FALSE)
- var/obj/machinery/power/apc/APC = locate(ref) in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)
- connect_apc(APC, usr)
+ var/obj/machinery/power/apc/remote_target = locate(ref) in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)
+ connect_apc(remote_target, user)
if("check-logs")
log_activity("Checked Logs")
if("check-apcs")
@@ -176,8 +206,8 @@
if("equipment", "lighting", "environ")
target.vars[type] = value
else
- message_admins("Warning: possible href exploit by [key_name(usr)] - attempted to set [html_encode(type)] on [target] to [html_encode(value)]")
- usr.log_message("possibly trying to href exploit - attempted to set [html_encode(type)] on [target] to [html_encode(value)]", LOG_ADMIN)
+ message_admins("Warning: possible href exploit by [key_name(user)] - attempted to set [html_encode(type)] on [target] to [html_encode(value)]")
+ user.log_message("possibly trying to href exploit - attempted to set [html_encode(type)] on [target] to [html_encode(value)]", LOG_ADMIN)
return
target.update_appearance()
@@ -193,13 +223,13 @@
if(3)
setTo = "Auto On"
log_activity("Set APC [target.area.name] [type] to [setTo]")
- usr.log_message("set APC [target.area.name] [type] to [setTo]]", LOG_GAME)
+ user.log_message("set APC [target.area.name] [type] to [setTo]]", LOG_GAME)
if("breaker")
var/ref = params["ref"]
- var/obj/machinery/power/apc/target = locate(ref) in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)
- target.toggle_breaker(usr)
- var/setTo = target.operating ? "On" : "Off"
- log_activity("Turned APC [target.area.name]'s breaker [setTo]")
+ var/obj/machinery/power/apc/breaker_target = locate(ref) in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)
+ breaker_target.toggle_breaker(user)
+ var/setTo = breaker_target.operating ? "On" : "Off"
+ log_activity("Turned APC [breaker_target.area.name]'s breaker [setTo]")
/obj/machinery/computer/apc_control/ui_close(mob/user)
. = ..()
diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm
index 6021c954cabfc..1a79aa267887b 100644
--- a/code/game/machinery/computer/telescreen.dm
+++ b/code/game/machinery/computer/telescreen.dm
@@ -45,6 +45,14 @@
var/icon_state_off = "entertainment_blank"
var/icon_state_on = "entertainment"
+/obj/machinery/vending/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ context[SCREENTIP_CONTEXT_CTRL_LMB] = "Toggle mute button"
+
+/obj/machinery/computer/security/telescreen/entertainment/click_ctrl(mob/user)
+ . = ..()
+ balloon_alert(user, speakers.should_be_listening ? "muted" : "unmuted")
+ speakers.toggle_mute()
+
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertainment, 32)
/obj/item/wallframe/telescreen/entertainment
@@ -65,6 +73,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai
/obj/machinery/computer/security/telescreen/entertainment/examine(mob/user)
. = ..()
. += length(network) ? span_notice("The TV is broadcasting something!") : span_notice("There's nothing on TV.")
+ . += span_notice("The volume is currently [speakers.should_be_listening ? "on" : "off"]")
/obj/machinery/computer/security/telescreen/entertainment/ui_state(mob/user)
return GLOB.always_state
diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm
index ccc24d44f6e7e..8e0dfa61c6caa 100644
--- a/code/game/machinery/dna_infuser/dna_infuser.dm
+++ b/code/game/machinery/dna_infuser/dna_infuser.dm
@@ -100,7 +100,7 @@
/obj/machinery/dna_infuser/proc/end_infuse(fail_explanation, fail_title)
var/mob/living/carbon/human/human_occupant = occupant
- if(human_occupant.infuse_organ(infusing_into))
+ if(human_occupant.infuse_organ(infusing_into, infusing_from))
check_tier_progression(human_occupant)
to_chat(occupant, span_danger("You feel yourself becoming more... [infusing_into.infusion_desc]?"))
infusing = FALSE
diff --git a/code/game/machinery/dna_infuser/dna_infusion.dm b/code/game/machinery/dna_infuser/dna_infusion.dm
index c902240404ca7..68b3bfe351565 100644
--- a/code/game/machinery/dna_infuser/dna_infusion.dm
+++ b/code/game/machinery/dna_infuser/dna_infusion.dm
@@ -55,17 +55,17 @@
/// - or the new organ must be external.
/// 2. Target's pre-existing organ must be organic / not robotic.
/// 3. Target must not have the same/identical organ.
-/mob/living/carbon/human/proc/pick_infusion_organ(datum/infuser_entry/entry)
+/mob/living/carbon/human/proc/pick_infusion_organ(datum/infuser_entry/entry, atom/movable/infused_from)
if(!entry)
return FALSE
- var/list/obj/item/organ/potential_new_organs = entry.output_organs.Copy()
+ var/list/obj/item/organ/potential_new_organs = entry.get_output_organs(src, infused_from)
// Remove organ typepaths from the list if they're incompatible with target.
for(var/obj/item/organ/new_organ as anything in entry.output_organs)
var/obj/item/organ/old_organ = get_organ_slot(initial(new_organ.slot))
if(old_organ)
if((old_organ.type != new_organ) && !IS_ROBOTIC_ORGAN(old_organ))
continue // Old organ can be mutated!
- else if(ispath(new_organ, /obj/item/organ/external))
+ else if(new_organ::organ_flags & ORGAN_EXTERNAL)
continue // External organ can be grown!
// Internal organ is either missing, or is non-organic.
potential_new_organs -= new_organ
diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
index faa3683b9a27b..e69a78f132dfb 100644
--- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
+++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_one_entries.dm
@@ -19,10 +19,10 @@
/mob/living/basic/mining/goliath,
)
output_organs = list(
- /obj/item/organ/internal/brain/goliath,
- /obj/item/organ/internal/eyes/night_vision/goliath,
- /obj/item/organ/internal/heart/goliath,
- /obj/item/organ/internal/lungs/lavaland/goliath,
+ /obj/item/organ/brain/goliath,
+ /obj/item/organ/eyes/night_vision/goliath,
+ /obj/item/organ/heart/goliath,
+ /obj/item/organ/lungs/lavaland/goliath,
)
infusion_desc = "armored tendril-like"
tier = DNA_MUTANT_TIER_ONE
@@ -43,10 +43,10 @@
/mob/living/basic/carp,
)
output_organs = list(
- /obj/item/organ/internal/brain/carp,
- /obj/item/organ/internal/heart/carp,
- /obj/item/organ/internal/lungs/carp,
- /obj/item/organ/internal/tongue/carp,
+ /obj/item/organ/brain/carp,
+ /obj/item/organ/heart/carp,
+ /obj/item/organ/lungs/carp,
+ /obj/item/organ/tongue/carp,
)
infusion_desc = "nomadic"
tier = DNA_MUTANT_TIER_ONE
@@ -67,10 +67,10 @@
/obj/item/food/deadmouse,
)
output_organs = list(
- /obj/item/organ/internal/eyes/night_vision/rat,
- /obj/item/organ/internal/heart/rat,
- /obj/item/organ/internal/stomach/rat,
- /obj/item/organ/internal/tongue/rat,
+ /obj/item/organ/eyes/night_vision/rat,
+ /obj/item/organ/heart/rat,
+ /obj/item/organ/stomach/rat,
+ /obj/item/organ/tongue/rat,
)
infusion_desc = "skittish"
tier = DNA_MUTANT_TIER_ONE
@@ -97,10 +97,10 @@
/mob/living/basic/cockroach,
)
output_organs = list(
- /obj/item/organ/internal/heart/roach,
- /obj/item/organ/internal/stomach/roach,
- /obj/item/organ/internal/liver/roach,
- /obj/item/organ/internal/appendix/roach,
+ /obj/item/organ/heart/roach,
+ /obj/item/organ/stomach/roach,
+ /obj/item/organ/liver/roach,
+ /obj/item/organ/appendix/roach,
)
infusion_desc = "kafkaesque" // Gregor Samsa !!
tier = DNA_MUTANT_TIER_ONE
@@ -128,14 +128,40 @@
/obj/item/fish,
)
output_organs = list(
- /obj/item/organ/internal/lungs/fish,
- /obj/item/organ/internal/stomach/fish,
- /obj/item/organ/external/tail/fish,
+ /obj/item/organ/lungs/fish,
+ /obj/item/organ/stomach/fish,
+ /obj/item/organ/tail/fish,
)
infusion_desc = "piscine"
tier = DNA_MUTANT_TIER_ONE
status_effect_type = /datum/status_effect/organ_set_bonus/fish
+/datum/infuser_entry/fish/get_output_organs(mob/living/carbon/human/target, obj/item/fish/infused_from)
+ if(!istype(infused_from))
+ return ..()
+
+ ///Get a list of possible alternatives to the standard fish infusion. We prioritize special infusions over it.
+ var/list/possible_alt_infusions = list()
+ for(var/type in infused_from.fish_traits)
+ var/datum/fish_trait/trait = GLOB.fish_traits[type]
+ if(!trait.infusion_entry)
+ continue
+ var/datum/infuser_entry/entry = GLOB.infuser_entries[trait.infusion_entry]
+ for(var/organ in entry.output_organs)
+ if(!target.get_organ_by_type(organ))
+ possible_alt_infusions |= entry
+ break
+
+ if(length(possible_alt_infusions))
+ var/datum/infuser_entry/chosen = pick(possible_alt_infusions)
+ return chosen.get_output_organs(target, infused_from)
+
+ var/list/organs = ..()
+ if(infused_from.required_fluid_type == AQUARIUM_FLUID_AIR || HAS_TRAIT(infused_from, TRAIT_FISH_AMPHIBIOUS))
+ organs -= /obj/item/organ/lungs/fish
+ return organs
+
+
/datum/infuser_entry/squid
name = "Ink Production"
infuse_mob_name = "ink-producing sealife"
@@ -146,7 +172,7 @@
"spit ink to blind foes",
)
output_organs = list(
- /obj/item/organ/internal/tongue/inky
+ /obj/item/organ/tongue/inky
)
tier = DNA_MUTANT_TIER_ONE
@@ -161,7 +187,7 @@
"drink like a fish",
)
output_organs = list(
- /obj/item/organ/internal/liver/fish
+ /obj/item/organ/liver/fish
)
tier = DNA_MUTANT_TIER_ONE
unreachable_effect = TRUE
@@ -182,7 +208,7 @@
/mob/living/basic/crab,
)
output_organs = list(
- /obj/item/organ/internal/lungs/fish/amphibious,
+ /obj/item/organ/lungs/fish/amphibious,
)
infusion_desc = "semi-aquatic"
tier = DNA_MUTANT_TIER_ONE
diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm
index 1620607d5f09c..045fa669c4f96 100644
--- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm
+++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_two_entries.dm
@@ -22,9 +22,9 @@
/obj/item/food/meat/slab/gondola,
)
output_organs = list(
- /obj/item/organ/internal/heart/gondola,
- /obj/item/organ/internal/tongue/gondola,
- /obj/item/organ/internal/liver/gondola,
+ /obj/item/organ/heart/gondola,
+ /obj/item/organ/tongue/gondola,
+ /obj/item/organ/liver/gondola,
)
infusion_desc = "observant"
tier = DNA_MUTANT_TIER_TWO
diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
index e93cffd51437b..e4d93a587f8f5 100644
--- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
+++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm
@@ -17,12 +17,12 @@
"this is a bad idea",
)
output_organs = list(
- /obj/item/organ/internal/appendix/fly,
- /obj/item/organ/internal/eyes/fly,
- /obj/item/organ/internal/heart/fly,
- /obj/item/organ/internal/lungs/fly,
- /obj/item/organ/internal/stomach/fly,
- /obj/item/organ/internal/tongue/fly,
+ /obj/item/organ/appendix/fly,
+ /obj/item/organ/eyes/fly,
+ /obj/item/organ/heart/fly,
+ /obj/item/organ/lungs/fly,
+ /obj/item/organ/stomach/fly,
+ /obj/item/organ/tongue/fly,
)
infusion_desc = "fly-like"
tier = DNA_MUTANT_TIER_ZERO
@@ -41,7 +41,7 @@
/mob/living/basic/pet/fox,
)
output_organs = list(
- /obj/item/organ/internal/ears/fox,
+ /obj/item/organ/ears/fox,
)
infusion_desc = "inexcusable"
tier = DNA_MUTANT_TIER_ZERO
@@ -61,10 +61,10 @@
/mob/living/basic/mothroach,
)
output_organs = list(
- /obj/item/organ/external/antennae,
- /obj/item/organ/external/wings/moth,
- /obj/item/organ/internal/eyes/moth,
- /obj/item/organ/internal/tongue/moth,
+ /obj/item/organ/antennae,
+ /obj/item/organ/wings/moth,
+ /obj/item/organ/eyes/moth,
+ /obj/item/organ/tongue/moth,
)
infusion_desc = "fluffy"
tier = DNA_MUTANT_TIER_ZERO
@@ -84,11 +84,11 @@
/mob/living/basic/lizard,
)
output_organs = list(
- /obj/item/organ/external/horns,
- /obj/item/organ/external/frills,
- /obj/item/organ/external/snout,
- /obj/item/organ/external/tail/lizard,
- /obj/item/organ/internal/tongue/lizard,
+ /obj/item/organ/horns,
+ /obj/item/organ/frills,
+ /obj/item/organ/snout,
+ /obj/item/organ/tail/lizard,
+ /obj/item/organ/tongue/lizard,
)
infusion_desc = "scaly"
tier = DNA_MUTANT_TIER_ZERO
@@ -105,8 +105,8 @@
/mob/living/basic/pet/cat,
)
output_organs = list(
- /obj/item/organ/internal/ears/cat,
- /obj/item/organ/external/tail/cat,
+ /obj/item/organ/ears/cat,
+ /obj/item/organ/tail/cat,
)
infusion_desc = "domestic"
tier = DNA_MUTANT_TIER_ZERO
diff --git a/code/game/machinery/dna_infuser/infuser_entry.dm b/code/game/machinery/dna_infuser/infuser_entry.dm
index 55ac43d1bf4e6..4ddc65aad4bd4 100644
--- a/code/game/machinery/dna_infuser/infuser_entry.dm
+++ b/code/game/machinery/dna_infuser/infuser_entry.dm
@@ -48,3 +48,7 @@ GLOBAL_LIST_INIT(infuser_entries, prepare_infuser_entries())
var/list/output_organs
///message the target gets while being infused
var/infusion_desc = "mutant-like"
+
+///Returns a list of organs that can be infused into the target human. Useful for custom behavior for certain entries
+/datum/infuser_entry/proc/get_output_organs(mob/living/carbon/human/target, atom/movable/infused_from)
+ return output_organs.Copy()
diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
index 622cafaa7bfde..1e4bc41ae415b 100644
--- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm
@@ -15,7 +15,7 @@
///Carp lungs! You can breathe in space! Oh... you can't breathe on the station, you need low oxygen environments.
/// Inverts behavior of lungs. Bypasses suffocation due to space / lack of gas, but also allows Oxygen to suffocate.
-/obj/item/organ/internal/lungs/carp
+/obj/item/organ/lungs/carp
name = "mutated carp-lungs"
desc = "Carp DNA infused into what was once some normal lungs."
// Oxygen causes suffocation.
@@ -27,14 +27,14 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = CARP_COLORS
-/obj/item/organ/internal/lungs/carp/Initialize(mapload)
+/obj/item/organ/lungs/carp/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their neck has odd gills.", BODY_ZONE_HEAD)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
ADD_TRAIT(src, TRAIT_SPACEBREATHING, REF(src))
///occasionally sheds carp teeth, stronger melee (bite) attacks, but you can't cover your mouth anymore.
-/obj/item/organ/internal/tongue/carp
+/obj/item/organ/tongue/carp
name = "mutated carp-jaws"
desc = "Carp DNA infused into what was once some normal teeth."
@@ -45,12 +45,12 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = CARP_COLORS
-/obj/item/organ/internal/tongue/carp/Initialize(mapload)
+/obj/item/organ/tongue/carp/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are big and sharp.", BODY_ZONE_PRECISE_MOUTH)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
-/obj/item/organ/internal/tongue/carp/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
+/obj/item/organ/tongue/carp/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
. = ..()
if(!ishuman(tongue_owner))
return
@@ -60,14 +60,14 @@
var/datum/species/rec_species = human_receiver.dna.species
rec_species.update_no_equip_flags(tongue_owner, rec_species.no_equip_flags | ITEM_SLOT_MASK)
-/obj/item/organ/internal/tongue/carp/on_bodypart_insert(obj/item/bodypart/head)
+/obj/item/organ/tongue/carp/on_bodypart_insert(obj/item/bodypart/head)
. = ..()
head.unarmed_damage_low = 10
head.unarmed_damage_high = 15
head.unarmed_effectiveness = 15
head.unarmed_attack_effect = ATTACK_EFFECT_BITE
-/obj/item/organ/internal/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner)
+/obj/item/organ/tongue/carp/on_mob_remove(mob/living/carbon/tongue_owner)
. = ..()
if(!ishuman(tongue_owner))
return
@@ -77,14 +77,14 @@
var/datum/species/rec_species = human_receiver.dna.species
rec_species.update_no_equip_flags(tongue_owner, initial(rec_species.no_equip_flags))
-/obj/item/organ/internal/tongue/carp/on_bodypart_remove(obj/item/bodypart/head)
+/obj/item/organ/tongue/carp/on_bodypart_remove(obj/item/bodypart/head)
. = ..()
head.unarmed_damage_low = initial(head.unarmed_damage_low)
head.unarmed_damage_high = initial(head.unarmed_damage_high)
head.unarmed_effectiveness = initial(head.unarmed_effectiveness)
head.unarmed_attack_effect = initial(head.unarmed_attack_effect)
-/obj/item/organ/internal/tongue/carp/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/tongue/carp/on_life(seconds_per_tick, times_fired)
. = ..()
if(owner.stat != CONSCIOUS || !prob(0.1))
return
@@ -99,7 +99,7 @@
icon_state = "carptooth"
///carp brain. you need to occasionally go to a new zlevel. think of it as... walking your dog!
-/obj/item/organ/internal/brain/carp
+/obj/item/organ/brain/carp
name = "mutated carp-brain"
desc = "Carp DNA infused into what was once a normal brain."
@@ -114,35 +114,35 @@
///how much time the timer is given
var/cooldown_time = 10 MINUTES
-/obj/item/organ/internal/brain/carp/Initialize(mapload)
+/obj/item/organ/brain/carp/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
AddElement(/datum/element/noticable_organ, "%PRONOUN_They seem%PRONOUN_s unable to stay still.")
-/obj/item/organ/internal/brain/carp/on_mob_insert(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/carp/on_mob_insert(mob/living/carbon/brain_owner)
. = ..()
cooldown_timer = addtimer(CALLBACK(src, PROC_REF(unsatisfied_nomad)), cooldown_time, TIMER_STOPPABLE|TIMER_OVERRIDE|TIMER_UNIQUE)
RegisterSignal(brain_owner, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(satisfied_nomad))
//technically you could get around the mood issue by extracting and reimplanting the brain but it will be far easier to just go one z there and back
-/obj/item/organ/internal/brain/carp/on_mob_remove(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/carp/on_mob_remove(mob/living/carbon/brain_owner)
. = ..()
UnregisterSignal(brain_owner, COMSIG_MOVABLE_Z_CHANGED)
deltimer(cooldown_timer)
-/obj/item/organ/internal/brain/carp/get_attacking_limb(mob/living/carbon/human/target)
+/obj/item/organ/brain/carp/get_attacking_limb(mob/living/carbon/human/target)
return owner.get_bodypart(BODY_ZONE_HEAD)
-/obj/item/organ/internal/brain/carp/proc/unsatisfied_nomad()
+/obj/item/organ/brain/carp/proc/unsatisfied_nomad()
owner.add_mood_event("nomad", /datum/mood_event/unsatisfied_nomad)
-/obj/item/organ/internal/brain/carp/proc/satisfied_nomad()
+/obj/item/organ/brain/carp/proc/satisfied_nomad()
SIGNAL_HANDLER
owner.clear_mood_event("nomad")
cooldown_timer = addtimer(CALLBACK(src, PROC_REF(unsatisfied_nomad)), cooldown_time, TIMER_STOPPABLE|TIMER_OVERRIDE|TIMER_UNIQUE)
/// makes you cold resistant, but heat-weak.
-/obj/item/organ/internal/heart/carp
+/obj/item/organ/heart/carp
name = "mutated carp-heart"
desc = "Carp DNA infused into what was once a normal heart."
@@ -153,7 +153,7 @@
organ_traits = list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE)
-/obj/item/organ/internal/heart/carp/Initialize(mapload)
+/obj/item/organ/heart/carp/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their skin has small patches of scales growing on it.", BODY_ZONE_CHEST)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp)
diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
index 7ac41ab28c024..8f19a70cdbf7f 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
@@ -40,7 +40,7 @@
else
ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src))
owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_water)
- if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish))
+ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish))
add_speed_buff()
owner.mind?.adjust_experience(/datum/skill/fishing, SKILL_EXP_JOURNEYMAN, silent = TRUE)
@@ -62,7 +62,7 @@
if(ishuman(owner))
var/mob/living/carbon/human/human = owner
human.physiology.damage_resistance -= 8
- if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish))
+ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish))
remove_speed_buff()
owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE)
@@ -86,11 +86,11 @@
SIGNAL_HANDLER
if(HAS_TRAIT(owner, TRAIT_IS_WET)) //remove the debuffs from being dry
remove_debuff()
- if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish))
+ if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish))
add_speed_buff()
return
apply_debuff()
- if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/external/tail/fish))
+ if(istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish))
remove_speed_buff()
/datum/status_effect/organ_set_bonus/fish/proc/apply_debuff()
@@ -125,7 +125,7 @@
/datum/status_effect/organ_set_bonus/fish/proc/check_tail(mob/living/carbon/source, obj/item/organ/organ, special)
SIGNAL_HANDLER
- if(!HAS_TRAIT(owner, TRAIT_IS_WET) || !istype(organ, /obj/item/organ/external/tail/fish))
+ if(!HAS_TRAIT(owner, TRAIT_IS_WET) || !istype(organ, /obj/item/organ/tail/fish))
return
var/obj/item/organ/tail = owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(tail != organ)
@@ -152,7 +152,7 @@
///Tail for fish DNA-infused spacemen. It provides a speed buff while in water. It's also needed for the crawl speed bonus once the threshold is reached.
-/obj/item/organ/external/tail/fish
+/obj/item/organ/tail/fish
name = "fish tail"
desc = "A severed tail from some sort of marine creature... or a fish-infused spaceman. It's smooth, faintly wet and definitely not flopping."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -180,29 +180,29 @@
/// The amount of fillets this gets processed into
var/fillet_amount = 5
-/obj/item/organ/external/tail/fish/Initialize(mapload)
+/obj/item/organ/tail/fish/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish)
var/time_to_fillet = fillet_amount * 0.5 SECONDS
AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, fillet_amount, time_to_fillet, screentip_verb = "Cut")
-/obj/item/organ/external/tail/fish/on_mob_insert(mob/living/carbon/owner)
+/obj/item/organ/tail/fish/on_mob_insert(mob/living/carbon/owner)
. = ..()
owner.AddElementTrait(TRAIT_WADDLING, type, /datum/element/waddling)
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_location))
check_location(owner, null)
-/obj/item/organ/external/tail/fish/on_mob_remove(mob/living/carbon/owner)
+/obj/item/organ/tail/fish/on_mob_remove(mob/living/carbon/owner)
. = ..()
owner.remove_traits(list(TRAIT_WADDLING, TRAIT_NO_STAGGER), type)
owner.remove_movespeed_modifier(/datum/movespeed_modifier/fish_on_water)
owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/fish_on_water)
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
-/obj/item/organ/external/tail/fish/get_greyscale_color_from_draw_color()
+/obj/item/organ/tail/fish/get_greyscale_color_from_draw_color()
set_greyscale(bodypart_overlay.draw_color)
-/obj/item/organ/external/tail/fish/proc/check_location(mob/living/carbon/source, atom/movable/old_loc, dir, forced)
+/obj/item/organ/tail/fish/proc/check_location(mob/living/carbon/source, atom/movable/old_loc, dir, forced)
SIGNAL_HANDLER
var/was_water = istype(old_loc, /turf/open/water)
var/is_water = istype(source.loc, /turf/open/water) && !HAS_TRAIT(source.loc, TRAIT_TURF_IGNORE_SLOWDOWN)
@@ -240,7 +240,7 @@
///Lungs that replace the need of oxygen with water vapor or being wet
-/obj/item/organ/internal/lungs/fish
+/obj/item/organ/lungs/fish
name = "mutated gills"
desc = "Fish DNA infused on what once was a normal pair of lungs that now require spacemen to breathe water vapor, or keep themselves covered in water."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -258,7 +258,7 @@
var/has_gills = TRUE
-/obj/item/organ/internal/lungs/fish/Initialize(mapload)
+/obj/item/organ/lungs/fish/Initialize(mapload)
. = ..()
add_gas_reaction(/datum/gas/water_vapor, always = PROC_REF(breathe_water))
respiration_type |= RESPIRATION_OXYGEN //after all, we get oxygen from water
@@ -269,26 +269,26 @@
AddComponent(/datum/component/bubble_icon_override, "fish", BUBBLE_ICON_PRIORITY_ORGAN)
AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean"))
-/obj/item/organ/internal/lungs/fish/Destroy()
+/obj/item/organ/lungs/fish/Destroy()
QDEL_NULL(gills)
return ..()
-/obj/item/organ/internal/lungs/fish/on_bodypart_insert(obj/item/bodypart/limb)
+/obj/item/organ/lungs/fish/on_bodypart_insert(obj/item/bodypart/limb)
. = ..()
if(gills)
limb.add_bodypart_overlay(gills)
-/obj/item/organ/internal/lungs/fish/on_bodypart_remove(obj/item/bodypart/limb)
+/obj/item/organ/lungs/fish/on_bodypart_remove(obj/item/bodypart/limb)
. = ..()
if(gills)
limb.remove_bodypart_overlay(gills)
-/obj/item/organ/internal/lungs/fish/on_mob_remove(mob/living/carbon/owner)
+/obj/item/organ/lungs/fish/on_mob_remove(mob/living/carbon/owner)
. = ..()
owner.clear_alert(ALERT_NOT_ENOUGH_WATER)
/// Requires the spaceman to have either water vapor or be wet.
-/obj/item/organ/internal/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp)
+/obj/item/organ/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp)
var/need_to_breathe = !HAS_TRAIT(src, TRAIT_SPACEBREATHING) && !HAS_TRAIT(breather, TRAIT_IS_WET)
if(water_pp < safe_water_level && need_to_breathe)
on_low_water(breather, breath, water_pp)
@@ -305,7 +305,7 @@
breather.adjustOxyLoss(-5)
/// Called when there isn't enough water to breath
-/obj/item/organ/internal/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
+/obj/item/organ/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
breather.throw_alert(ALERT_NOT_ENOUGH_WATER, /atom/movable/screen/alert/not_enough_water)
var/gas_breathed = handle_suffocation(breather, water_pp, safe_water_level, breath.gases[/datum/gas/water_vapor][MOLES])
if(water_pp)
@@ -325,10 +325,10 @@
)
/// Subtype of gills that allow the mob to optionally breathe water.
-/obj/item/organ/internal/lungs/fish/amphibious
+/obj/item/organ/lungs/fish/amphibious
name = "mutated semi-aquatic lungs"
desc = "DNA from an amphibious or semi-aquatic creature infused on a pair lungs. Enjoy breathing underwater without drowning outside water."
- safe_oxygen_min = /obj/item/organ/internal/lungs::safe_oxygen_min
+ safe_oxygen_min = /obj/item/organ/lungs::safe_oxygen_min
has_gills = FALSE
/**
* If false, we don't breathe air since we've got water instead.
@@ -336,7 +336,7 @@
*/
var/should_breathe_oxygen = FALSE
-/obj/item/organ/internal/lungs/fish/amphibious/Initialize(mapload)
+/obj/item/organ/lungs/fish/amphibious/Initialize(mapload)
. = ..()
/**
* We're setting the gas reaction for breathing oxygen here,
@@ -344,18 +344,18 @@
* and we want breathe_water() to run before breathe_oxygen,
* so that if we're breathing water vapor (or are wet), we won't have to breathe oxygen.
*/
- safe_oxygen_min = /obj/item/organ/internal/lungs::safe_oxygen_min
+ safe_oxygen_min = /obj/item/organ/lungs::safe_oxygen_min
add_gas_reaction(/datum/gas/oxygen, always = PROC_REF(breathe_oxygen))
-/obj/item/organ/internal/lungs/fish/amphibious/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
+/obj/item/organ/lungs/fish/amphibious/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
should_breathe_oxygen = FALSE //assume we don't have to breathe oxygen until we fail to breathe water
return ..()
-/obj/item/organ/internal/lungs/fish/amphibious/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
+/obj/item/organ/lungs/fish/amphibious/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
should_breathe_oxygen = TRUE
return
-/obj/item/organ/internal/lungs/fish/amphibious/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
+/obj/item/organ/lungs/fish/amphibious/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
if(!should_breathe_oxygen)
if(breather.failed_last_breath) //in case we had neither oxygen nor water last tick.
breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN)
@@ -363,7 +363,7 @@
return ..()
///Fish infuser organ, allows mobs to safely eat raw fish.
-/obj/item/organ/internal/stomach/fish
+/obj/item/organ/stomach/fish
name = "mutated fish-stomach"
desc = "Fish DNA infused into a stomach now permeated by the faint smell of salt and slightly putrefied fish."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -382,13 +382,13 @@
"putrid fish" = 1,
)
-/obj/item/organ/internal/stomach/fish/Initialize(mapload)
+/obj/item/organ/stomach/fish/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish)
///Organ from fish with the ink production trait. Doesn't count toward the organ set bonus but is buffed once it's active.
-/obj/item/organ/internal/tongue/inky
+/obj/item/organ/tongue/inky
name = "ink-secreting tongue"
desc = "A black tongue linked to two swollen black sacs underneath the palate."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -403,12 +403,12 @@
"the sea" = 0.2,
)
-/obj/item/organ/internal/tongue/inky/Initialize(mapload)
+/obj/item/organ/tongue/inky/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "Slick black ink seldom rivulets from %PRONOUN_their mouth.", BODY_ZONE_PRECISE_MOUTH)
///Organ from fish with the toxic trait. Allows the user to use tetrodotoxin as a healing chem instead of a toxin.
-/obj/item/organ/internal/liver/fish
+/obj/item/organ/liver/fish
name = "mutated fish-liver"
desc = "Fish DNA infused into a stomach that now uses tetrodotoxin as regenerative material. It also processes alcohol quite well."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -426,7 +426,7 @@
// Just fish, the toxin isn't obvious
food_tastes = list("fish" = 1)
-/obj/item/organ/internal/liver/fish/Initialize(mapload)
+/obj/item/organ/liver/fish/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fish)
diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
index 4786bf5753c9f..0ca652c3ab92c 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
@@ -19,7 +19,7 @@
to_chat(new_fly, span_danger("Too much fly DNA! Your skin begins to discolor into a horrible black as you become more fly than person!"))
new_fly.set_species(/datum/species/fly)
-/obj/item/organ/internal/eyes/fly
+/obj/item/organ/eyes/fly
name = "fly eyes"
desc = "These eyes seem to stare back no matter the direction you look at it from."
eye_icon_state = "flyeyes"
@@ -27,11 +27,11 @@
flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE
native_fov = NONE //flies can see all around themselves.
-/obj/item/organ/internal/eyes/fly/Initialize(mapload)
+/obj/item/organ/eyes/fly/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/tongue/fly
+/obj/item/organ/tongue/fly
name = "proboscis"
desc = "A freakish looking meat tube that apparently can take in liquids."
icon = 'icons/obj/medical/organs/fly_organs.dmi'
@@ -49,56 +49,56 @@
"S" = "Z",
)
-/obj/item/organ/internal/tongue/fly/New(class, timer, datum/mutation/human/copymut)
+/obj/item/organ/tongue/fly/New(class, timer, datum/mutation/human/copymut)
. = ..()
AddComponent(/datum/component/speechmod, replacements = speech_replacements, should_modify_speech = CALLBACK(src, PROC_REF(should_modify_speech)))
-/obj/item/organ/internal/tongue/fly/Initialize(mapload)
+/obj/item/organ/tongue/fly/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/tongue/fly/get_possible_languages()
+/obj/item/organ/tongue/fly/get_possible_languages()
return ..() + /datum/language/buzzwords
-/obj/item/organ/internal/heart/fly
+/obj/item/organ/heart/fly
desc = FLY_INFUSED_ORGAN_DESC
-/obj/item/organ/internal/heart/fly/Initialize(mapload)
+/obj/item/organ/heart/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
AddElement(/datum/element/update_icon_blocker)
-/obj/item/organ/internal/lungs/fly
+/obj/item/organ/lungs/fly
desc = FLY_INFUSED_ORGAN_DESC
-/obj/item/organ/internal/lungs/fly/Initialize(mapload)
+/obj/item/organ/lungs/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/liver/fly
+/obj/item/organ/liver/fly
desc = FLY_INFUSED_ORGAN_DESC
alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect!
-/obj/item/organ/internal/liver/fly/Initialize(mapload)
+/obj/item/organ/liver/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/stomach/fly
+/obj/item/organ/stomach/fly
desc = FLY_INFUSED_ORGAN_DESC
-/obj/item/organ/internal/stomach/fly/Initialize(mapload)
+/obj/item/organ/stomach/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/stomach/fly/after_eat(edible)
+/obj/item/organ/stomach/fly/after_eat(edible)
var/mob/living/carbon/body = owner
ASSERT(istype(body))
// we do not lose any nutrition as a fly when vomiting out food
@@ -110,28 +110,28 @@
)
return ..()
-/obj/item/organ/internal/appendix/fly
+/obj/item/organ/appendix/fly
desc = FLY_INFUSED_ORGAN_DESC
-/obj/item/organ/internal/appendix/fly/Initialize(mapload)
+/obj/item/organ/appendix/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/fly)
-/obj/item/organ/internal/appendix/fly/update_appearance(updates=ALL)
+/obj/item/organ/appendix/fly/update_appearance(updates=ALL)
return ..(updates & ~(UPDATE_NAME|UPDATE_ICON)) //don't set name or icon thank you
//useless organs we throw in just to fuck with surgeons a bit more. they aren't part of a bonus, just the (absolute) state of flies
-/obj/item/organ/internal/fly
+/obj/item/organ/fly
desc = FLY_INFUSED_ORGAN_DESC
-/obj/item/organ/internal/fly/Initialize(mapload)
+/obj/item/organ/fly/Initialize(mapload)
. = ..()
name = odd_organ_name()
icon_state = FLY_INFUSED_ORGAN_ICON
-/obj/item/organ/internal/fly/groin //appendix is the only groin organ so we gotta have one of these too lol
+/obj/item/organ/fly/groin //appendix is the only groin organ so we gotta have one of these too lol
zone = BODY_ZONE_PRECISE_GROIN
#undef FLY_INFUSED_ORGAN_DESC
diff --git a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm
index 3fecac3bb6dbf..7591643f84663 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fox_organs.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/ears/fox
+/obj/item/organ/ears/fox
name = "fox ears"
icon = 'icons/obj/clothing/head/costume.dmi'
worn_icon = 'icons/mob/clothing/head/costume.dmi'
@@ -6,4 +6,6 @@
visual = TRUE
damage_multiplier = 2
+ dna_block = DNA_EARS_BLOCK
+ bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears
sprite_accessory_override = /datum/sprite_accessory/ears/fox
diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
index 385878cb255a4..4940f6dae6e66 100644
--- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
@@ -12,7 +12,7 @@
bonus_traits = list(TRAIT_LAVA_IMMUNE)
///goliath eyes, simple night vision
-/obj/item/organ/internal/eyes/night_vision/goliath
+/obj/item/organ/eyes/night_vision/goliath
name = "goliath eyes"
desc = "goliath DNA infused into what was once some normal eyes."
@@ -29,13 +29,13 @@
high_light_cutoff = list(50, 10, 40)
organ_traits = list(TRAIT_UNNATURAL_RED_GLOWY_EYES)
-/obj/item/organ/internal/eyes/night_vision/goliath/Initialize(mapload)
+/obj/item/organ/eyes/night_vision/goliath/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes are blood red and stone-like.", BODY_ZONE_PRECISE_EYES)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath)
///goliath lungs! You can breathe lavaland air mix but can't breath pure O2 from a tank anymore.
-/obj/item/organ/internal/lungs/lavaland/goliath
+/obj/item/organ/lungs/lavaland/goliath
name = "mutated goliath-lungs"
desc = "goliath DNA infused into what was once some normal lungs."
@@ -44,13 +44,13 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = GOLIATH_COLORS
-/obj/item/organ/internal/lungs/lavaland/goliath/Initialize(mapload)
+/obj/item/organ/lungs/lavaland/goliath/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their back is covered in small tendrils.", BODY_ZONE_CHEST)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath)
///goliath brain. you can't use gloves but one of your arms becomes a tendril hammer that can be used to mine!
-/obj/item/organ/internal/brain/goliath
+/obj/item/organ/brain/goliath
name = "mutated goliath-brain"
desc = "goliath DNA infused into what was once a normal brain."
@@ -62,12 +62,12 @@
var/obj/item/goliath_infuser_hammer/hammer
-/obj/item/organ/internal/brain/goliath/Initialize(mapload)
+/obj/item/organ/brain/goliath/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their arm is just a mass of plate and tendrils.", BODY_ZONE_CHEST)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath)
-/obj/item/organ/internal/brain/goliath/on_mob_insert(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/goliath/on_mob_insert(mob/living/carbon/brain_owner)
. = ..()
if(!ishuman(brain_owner))
return
@@ -79,7 +79,7 @@
hammer = new/obj/item/goliath_infuser_hammer
brain_owner.put_in_hands(hammer)
-/obj/item/organ/internal/brain/goliath/on_mob_remove(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/goliath/on_mob_remove(mob/living/carbon/brain_owner)
. = ..()
UnregisterSignal(brain_owner)
if(!ishuman(brain_owner))
@@ -158,7 +158,7 @@
target.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), rand(1, 2), prob(60) ? 1 : 4, user)
/// goliath heart gives you the ability to survive ash storms.
-/obj/item/organ/internal/heart/goliath
+/obj/item/organ/heart/goliath
name = "mutated goliath-heart"
desc = "goliath DNA infused into what was once a normal heart."
@@ -169,7 +169,7 @@
organ_traits = list(TRAIT_ASHSTORM_IMMUNE)
-/obj/item/organ/internal/heart/goliath/Initialize(mapload)
+/obj/item/organ/heart/goliath/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their skin has visible hard plates growing from within.", BODY_ZONE_CHEST)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/goliath)
diff --git a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm
index 9fcf7e483bba9..82c9c9fc8e8be 100644
--- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm
@@ -16,7 +16,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
bonus_traits = list(TRAIT_RESISTHEAT, TRAIT_RESISTCOLD, TRAIT_NOBREATH, TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE)
/// makes you a pacifist and turns most mobs neutral towards you
-/obj/item/organ/internal/heart/gondola
+/obj/item/organ/heart/gondola
name = "mutated gondola-heart"
desc = "Gondola DNA infused into what was once a normal heart."
@@ -28,13 +28,13 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
///keeps track of whether the receiver actually gained factions
var/list/factions_to_remove = list()
-/obj/item/organ/internal/heart/gondola/Initialize(mapload)
+/obj/item/organ/heart/gondola/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola)
AddElement(/datum/element/noticable_organ, "%PRONOUN_They radiate%PRONOUN_s an aura of serenity.")
AddElement(/datum/element/update_icon_blocker)
-/obj/item/organ/internal/heart/gondola/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/heart/gondola/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
if(!(FACTION_HOSTILE in receiver.faction))
factions_to_remove += FACTION_HOSTILE
@@ -42,7 +42,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
factions_to_remove += FACTION_MINING
receiver.faction |= list(FACTION_HOSTILE, FACTION_MINING)
-/obj/item/organ/internal/heart/gondola/mob_remove(mob/living/carbon/heartless, special, movement_flags)
+/obj/item/organ/heart/gondola/mob_remove(mob/living/carbon/heartless, special, movement_flags)
. = ..()
for(var/faction in factions_to_remove)
heartless.faction -= faction
@@ -50,7 +50,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
factions_to_remove = list()
/// Zen (tounge): You can no longer speak, but get a powerful positive moodlet
-/obj/item/organ/internal/tongue/gondola
+/obj/item/organ/tongue/gondola
name = "mutated gondola-tongue"
desc = "Gondola DNA infused into what was once a normal tongue."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -59,21 +59,21 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
greyscale_colors = GONDOLA_COLORS
organ_traits = list(TRAIT_MUTE)
-/obj/item/organ/internal/tongue/gondola/Initialize(mapload)
+/obj/item/organ/tongue/gondola/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their mouth is permanently affixed into a relaxed smile.", BODY_ZONE_PRECISE_MOUTH)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola)
-/obj/item/organ/internal/tongue/gondola/mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
+/obj/item/organ/tongue/gondola/mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
. = ..()
tongue_owner.add_mood_event("gondola_zen", /datum/mood_event/gondola_serenity)
-/obj/item/organ/internal/tongue/gondola/mob_remove(mob/living/carbon/tongue_owner, special, movement_flags)
+/obj/item/organ/tongue/gondola/mob_remove(mob/living/carbon/tongue_owner, special, movement_flags)
tongue_owner.clear_mood_event("gondola_zen")
return ..()
/// Loving arms: your hands become unable to hold much of anything but your hugs now infuse the subject with pax.
-/obj/item/organ/internal/liver/gondola
+/obj/item/organ/liver/gondola
name = "mutated gondola-liver"
desc = "Gondola DNA infused into what was once a normal liver."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -81,13 +81,13 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = GONDOLA_COLORS
-/obj/item/organ/internal/liver/gondola/Initialize(mapload)
+/obj/item/organ/liver/gondola/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola)
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their left arm has small needles breaching the skin all over it.", BODY_ZONE_L_ARM)
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their right arm has small needles breaching the skin all over it.", BODY_ZONE_R_ARM)
-/obj/item/organ/internal/liver/gondola/mob_insert(mob/living/carbon/liver_owner, special, movement_flags)
+/obj/item/organ/liver/gondola/mob_insert(mob/living/carbon/liver_owner, special, movement_flags)
. = ..()
var/has_left = liver_owner.has_left_hand(check_disabled = FALSE)
var/has_right = liver_owner.has_right_hand(check_disabled = FALSE)
@@ -102,19 +102,19 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
RegisterSignal(liver_owner, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull))
RegisterSignal(liver_owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug))
-/obj/item/organ/internal/liver/gondola/mob_remove(mob/living/carbon/liver_owner, special, movement_flags)
+/obj/item/organ/liver/gondola/mob_remove(mob/living/carbon/liver_owner, special, movement_flags)
. = ..()
UnregisterSignal(liver_owner, list(COMSIG_HUMAN_EQUIPPING_ITEM, COMSIG_LIVING_TRY_PULL, COMSIG_CARBON_HELPED))
/// signal sent when prompting if an item can be equipped
-/obj/item/organ/internal/liver/gondola/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/equip_target, slot)
+/obj/item/organ/liver/gondola/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/equip_target, slot)
SIGNAL_HANDLER
if(equip_target.w_class > WEIGHT_CLASS_TINY)
equip_target.balloon_alert(owner, "too weak to hold this!")
return COMPONENT_BLOCK_EQUIP
/// signal sent when owner tries to pull an item
-/obj/item/organ/internal/liver/gondola/proc/on_owner_try_pull(mob/living/carbon/owner, atom/movable/target, force)
+/obj/item/organ/liver/gondola/proc/on_owner_try_pull(mob/living/carbon/owner, atom/movable/target, force)
SIGNAL_HANDLER
if(isliving(target))
var/mob/living/living_target = target
@@ -127,7 +127,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah...
item_target.balloon_alert(owner, "too weak to pull this!")
return COMSIG_LIVING_CANCEL_PULL
-/obj/item/organ/internal/liver/gondola/proc/on_hug(mob/living/carbon/human/source, mob/living/carbon/hugged)
+/obj/item/organ/liver/gondola/proc/on_hug(mob/living/carbon/human/source, mob/living/carbon/hugged)
SIGNAL_HANDLER
var/list/covered_body_zones = source.get_covered_body_zones()
diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
index 4f8d38aa99971..f10dcefb0d5c5 100644
--- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
@@ -12,7 +12,7 @@
bonus_traits = list(TRAIT_VENTCRAWLER_NUDE)
///way better night vision, super sensitive. lotta things work like this, huh?
-/obj/item/organ/internal/eyes/night_vision/rat
+/obj/item/organ/eyes/night_vision/rat
name = "mutated rat-eyes"
desc = "Rat DNA infused into what was once a normal pair of eyes."
flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE
@@ -27,13 +27,13 @@
medium_light_cutoff = list(30, 20, 5)
high_light_cutoff = list(45, 35, 10)
-/obj/item/organ/internal/eyes/night_vision/rat/Initialize(mapload)
+/obj/item/organ/eyes/night_vision/rat/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes have deep, shifty black pupils, surrounded by a sickening yellow sclera.", BODY_ZONE_PRECISE_EYES)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat)
///increases hunger, disgust recovers quicker, expands what is defined as "food"
-/obj/item/organ/internal/stomach/rat
+/obj/item/organ/stomach/rat
name = "mutated rat-stomach"
desc = "Rat DNA infused into what was once a normal stomach."
disgust_metabolism = 3
@@ -44,13 +44,13 @@
greyscale_colors = RAT_COLORS
hunger_modifier = 10
-/obj/item/organ/internal/stomach/rat/Initialize(mapload)
+/obj/item/organ/stomach/rat/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat)
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their mouth is drooling excessively.", BODY_ZONE_PRECISE_MOUTH)
/// makes you smaller, walk over tables, and take 1.5x damage
-/obj/item/organ/internal/heart/rat
+/obj/item/organ/heart/rat
name = "mutated rat-heart"
desc = "Rat DNA infused into what was once a normal heart."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -58,13 +58,13 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = RAT_COLORS
-/obj/item/organ/internal/heart/rat/Initialize(mapload)
+/obj/item/organ/heart/rat/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat)
AddElement(/datum/element/noticable_organ, "%PRONOUN_They hunch%PRONOUN_es over unnaturally!")
AddElement(/datum/element/update_icon_blocker)
-/obj/item/organ/internal/heart/rat/on_mob_insert(mob/living/carbon/receiver)
+/obj/item/organ/heart/rat/on_mob_insert(mob/living/carbon/receiver)
. = ..()
if(!ishuman(receiver))
return
@@ -74,7 +74,7 @@
//but 1.5 damage
human_receiver.physiology?.damage_resistance -= 50
-/obj/item/organ/internal/heart/rat/on_mob_remove(mob/living/carbon/heartless, special)
+/obj/item/organ/heart/rat/on_mob_remove(mob/living/carbon/heartless, special)
. = ..()
if(!ishuman(heartless))
return
@@ -84,7 +84,7 @@
human_heartless.physiology?.damage_resistance += 50
/// you occasionally squeak, and have some rat related verbal tics
-/obj/item/organ/internal/tongue/rat
+/obj/item/organ/tongue/rat
name = "mutated rat-tongue"
desc = "Rat DNA infused into what was once a normal tongue."
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
@@ -97,12 +97,12 @@
disliked_foodtypes = NONE //but a rat can eat anything without issue
toxic_foodtypes = NONE
-/obj/item/organ/internal/tongue/rat/Initialize(mapload)
+/obj/item/organ/tongue/rat/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their teeth are oddly shaped and yellowing.", BODY_ZONE_PRECISE_MOUTH)
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat)
-/obj/item/organ/internal/tongue/rat/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/rat/modify_speech(datum/source, list/speech_args)
. = ..()
var/message = LOWER_TEXT(speech_args[SPEECH_MESSAGE])
if(message == "hi" || message == "hi.")
@@ -110,23 +110,23 @@
if(message == "hi?")
speech_args[SPEECH_MESSAGE] = "Um... cheesed to meet you?"
-/obj/item/organ/internal/tongue/rat/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
+/obj/item/organ/tongue/rat/on_mob_insert(mob/living/carbon/tongue_owner, special, movement_flags)
. = ..()
RegisterSignal(tongue_owner, COMSIG_CARBON_ITEM_GIVEN, PROC_REF(its_on_the_mouse))
-/obj/item/organ/internal/tongue/rat/on_mob_remove(mob/living/carbon/tongue_owner)
+/obj/item/organ/tongue/rat/on_mob_remove(mob/living/carbon/tongue_owner)
. = ..()
UnregisterSignal(tongue_owner, COMSIG_CARBON_ITEM_GIVEN)
-/obj/item/organ/internal/tongue/rat/proc/on_item_given(mob/living/carbon/offerer, mob/living/taker, obj/item/given)
+/obj/item/organ/tongue/rat/proc/on_item_given(mob/living/carbon/offerer, mob/living/taker, obj/item/given)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(its_on_the_mouse), offerer, taker)
-/obj/item/organ/internal/tongue/rat/proc/its_on_the_mouse(mob/living/carbon/offerer, mob/living/taker)
+/obj/item/organ/tongue/rat/proc/its_on_the_mouse(mob/living/carbon/offerer, mob/living/taker)
offerer.say("For you, it's on the mouse.")
taker.add_mood_event("it_was_on_the_mouse", /datum/mood_event/it_was_on_the_mouse)
-/obj/item/organ/internal/tongue/rat/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/tongue/rat/on_life(seconds_per_tick, times_fired)
. = ..()
if(prob(5))
owner.emote("squeaks")
diff --git a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
index b31a64d9bb87c..2b32ad8570223 100644
--- a/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/roach_organs.dm
@@ -46,7 +46,7 @@
/// Roach heart:
/// Reduces damage taken from brute attacks from behind,
/// but increases duration of knockdowns
-/obj/item/organ/internal/heart/roach
+/obj/item/organ/heart/roach
name = "mutated roach-heart"
desc = "Roach DNA infused into what was once a normal heart."
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
@@ -61,18 +61,18 @@
COOLDOWN_DECLARE(harden_effect_cd)
-/obj/item/organ/internal/heart/roach/Initialize(mapload)
+/obj/item/organ/heart/roach/Initialize(mapload)
. = ..()
AddElement(/datum/element/noticable_organ, "%PRONOUN_They %PRONOUN_have hardened, somewhat translucent skin.")
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach)
AddElement(/datum/element/update_icon_blocker)
roach_shell = new()
-/obj/item/organ/internal/heart/roach/Destroy()
+/obj/item/organ/heart/roach/Destroy()
QDEL_NULL(roach_shell)
return ..()
-/obj/item/organ/internal/heart/roach/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/heart/roach/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
if(!ishuman(organ_owner))
return
@@ -83,11 +83,11 @@
RegisterSignal(human_owner, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(do_block_effect))
human_owner.physiology.knockdown_mod *= 3
-/obj/item/organ/internal/heart/roach/on_bodypart_insert(obj/item/bodypart/limb)
+/obj/item/organ/heart/roach/on_bodypart_insert(obj/item/bodypart/limb)
. = ..()
limb.add_bodypart_overlay(roach_shell)
-/obj/item/organ/internal/heart/roach/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/heart/roach/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if(!ishuman(organ_owner) || QDELETED(organ_owner))
return
@@ -97,7 +97,7 @@
UnregisterSignal(human_owner, list(COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, COMSIG_MOB_AFTER_APPLY_DAMAGE))
human_owner.physiology.knockdown_mod /= 3
-/obj/item/organ/internal/heart/roach/on_bodypart_remove(obj/item/bodypart/limb)
+/obj/item/organ/heart/roach/on_bodypart_remove(obj/item/bodypart/limb)
. = ..()
limb.remove_bodypart_overlay(roach_shell)
@@ -107,7 +107,7 @@
*
* Adds a 0.5 modifier to attacks from the back
*/
-/obj/item/organ/internal/heart/roach/proc/modify_damage(mob/living/carbon/human/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item)
+/obj/item/organ/heart/roach/proc/modify_damage(mob/living/carbon/human/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item)
SIGNAL_HANDLER
if(!is_blocking(source, damage_amount, damagetype, attack_direction))
@@ -120,7 +120,7 @@
*
* Does a special effect if we blocked damage with our back
*/
-/obj/item/organ/internal/heart/roach/proc/do_block_effect(mob/living/carbon/human/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item)
+/obj/item/organ/heart/roach/proc/do_block_effect(mob/living/carbon/human/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item)
SIGNAL_HANDLER
if(!is_blocking(source, damage_dealt, damagetype, attack_direction))
@@ -133,7 +133,7 @@
COOLDOWN_START(src, harden_effect_cd, 5 SECONDS) // Cooldown resets EVERY time we get hit
/// Checks if the passed mob is in a valid state to be blocking damage with the roach shell
-/obj/item/organ/internal/heart/roach/proc/is_blocking(mob/living/carbon/human/blocker, damage_amount, damagetype, attack_direction)
+/obj/item/organ/heart/roach/proc/is_blocking(mob/living/carbon/human/blocker, damage_amount, damagetype, attack_direction)
if(damage_amount < 5 || damagetype != BRUTE || !attack_direction)
return
if(!ishuman(blocker) || blocker.stat >= UNCONSCIOUS)
@@ -160,7 +160,7 @@
/// Roach stomach:
/// Makes disgust a non-issue, very slightly worse at passing off reagents
/// Also makes you more hungry
-/obj/item/organ/internal/stomach/roach
+/obj/item/organ/stomach/roach
name = "mutated roach-stomach"
desc = "Roach DNA infused into what was once a normal stomach."
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
@@ -173,13 +173,13 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = ROACH_COLORS
-/obj/item/organ/internal/stomach/roach/Initialize(mapload)
+/obj/item/organ/stomach/roach/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach)
/// Roach liver:
/// Purges toxins at a higher threshold, but takes more damage from them if not purged
-/obj/item/organ/internal/liver/roach
+/obj/item/organ/liver/roach
name = "mutated roach-liver"
desc = "Roach DNA infused into what was once a normal liver."
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
@@ -191,11 +191,11 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = ROACH_COLORS
-/obj/item/organ/internal/liver/roach/Initialize(mapload)
+/obj/item/organ/liver/roach/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach)
-/obj/item/organ/internal/liver/roach/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/roach/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
if(!ishuman(organ_owner))
return
@@ -203,7 +203,7 @@
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.tox_mod *= 2
-/obj/item/organ/internal/liver/roach/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/roach/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if(!ishuman(organ_owner) || QDELETED(organ_owner))
return
@@ -213,7 +213,7 @@
/// Roach appendix:
/// No appendicitus! weee!
-/obj/item/organ/internal/appendix/roach
+/obj/item/organ/appendix/roach
name = "mutated roach-appendix"
desc = "Roach DNA infused into what was once a normal appendix. It could get worse?"
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
@@ -223,11 +223,11 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = ROACH_COLORS
-/obj/item/organ/internal/appendix/roach/Initialize(mapload)
+/obj/item/organ/appendix/roach/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/roach)
-/obj/item/organ/internal/appendix/roach/become_inflamed()
+/obj/item/organ/appendix/roach/become_inflamed()
return
#undef ROACH_ORGAN_COLOR
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index cb0ab9900d5cc..0ed9bd4a0103c 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -7,7 +7,7 @@
density = TRUE
obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open
interaction_flags_mouse_drop = NEED_DEXTERITY
- occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/internal/brain)
+ occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain)
circuit = /obj/item/circuitboard/machine/dnascanner
var/locked = FALSE
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2b473c3dbe6c1..04f67cee1c1ba 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -119,7 +119,6 @@
var/obj/item/note
/// The seal on the airlock
var/obj/item/seal
- var/detonated = FALSE
var/abandoned = FALSE
/// Controls if the door closes quickly or not. FALSE = the door autocloses in 1.5 seconds, TRUE = 8 seconds - see autoclose_in()
var/normalspeed = TRUE
@@ -701,8 +700,9 @@
switch (held_item?.tool_behaviour)
if (TOOL_SCREWDRIVER)
- context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel"
- return CONTEXTUAL_SCREENTIP_SET
+ if(has_access_panel)
+ context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel"
+ return CONTEXTUAL_SCREENTIP_SET
if (TOOL_CROWBAR)
if (panel_open)
if (security_level == AIRLOCK_SECURITY_PLASTEEL_O_S || security_level == AIRLOCK_SECURITY_PLASTEEL_I_S)
@@ -746,9 +746,6 @@
if(obj_flags & EMAGGED)
to_chat(user, span_warning("Unable to interface: Airlock is unresponsive."))
return
- if(detonated)
- to_chat(user, span_warning("Unable to interface. Airlock control panel damaged."))
- return
ui_interact(user)
@@ -858,7 +855,7 @@
set_electrified(MACHINE_ELECTRIFIED_PERMANENT)
/obj/machinery/door/airlock/screwdriver_act(mob/living/user, obj/item/tool)
- if(panel_open && detonated)
+ if(!has_access_panel)
to_chat(user, span_warning("[src] has no maintenance panel!"))
return ITEM_INTERACT_SUCCESS
toggle_panel_open()
@@ -2001,12 +1998,12 @@
glass = TRUE
/obj/machinery/door/airlock/maintenance/glass
- name = "maintainence glass airlock"
+ name = "maintenance glass airlock"
opacity = FALSE
glass = TRUE
/obj/machinery/door/airlock/maintenance/external/glass
- name = "maintainence external glass airlock"
+ name = "maintenance external glass airlock"
opacity = FALSE
glass = TRUE
normal_integrity = 200
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 5449f7f7cee4c..67605ac1446fe 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -34,6 +34,8 @@
/// A filler object used to fill the space of multi-tile airlocks
var/obj/structure/fluff/airlock_filler/filler
var/welded = FALSE
+ ///Whether this door has a panel or not; FALSE also stops the examine blurb about the panel from showing up
+ var/has_access_panel = TRUE
/// For rglass-windowed airlocks and firedoors
var/heat_proof = FALSE
/// Emergency access override
@@ -122,7 +124,8 @@
. += span_notice("Due to a security threat, its access requirements have been lifted!")
else
. += span_notice("In the event of a red alert, its access requirements will automatically lift.")
- . += span_notice("Its maintenance panel is [panel_open ? "open" : "screwed in place"].")
+ if(has_access_panel)
+ . += span_notice("Its maintenance panel is [panel_open ? "open" : "screwed in place"].")
/obj/machinery/door/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 13126a0436b9f..882d3bebc90cb 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -288,7 +288,7 @@
chemical_list += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01)))
if(reagent.overdosed)
overdose_list += list(list("name" = reagent.name))
- var/obj/item/organ/internal/stomach/belly = patient.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = patient.get_organ_slot(ORGAN_SLOT_STOMACH)
if(belly?.reagents.reagent_list.len) //include the stomach contents if it exists
for(var/bile in belly.reagents.reagent_list)
var/datum/reagent/bit = bile
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 166410cfccf56..134fa7731d028 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -171,7 +171,7 @@
not_eaten += 1
continue
- if (istype(thing, /obj/item/organ/internal/brain) || istype(thing, /obj/item/dullahan_relay))
+ if (istype(thing, /obj/item/organ/brain) || istype(thing, /obj/item/dullahan_relay))
living_detected = TRUE
if (istype(thing, /obj/item/mmi))
diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
index e651c8a3e2402..0bc59ded98d3f 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm
@@ -391,7 +391,7 @@
var/fraction = (seconds_per_tick SECONDS) / initial(lifetime)
reagents.copy_to(smoker, reagents.total_volume, fraction)
- reagents.expose(smoker, INGEST, fraction)
+ reagents.expose(smoker, INHALE, fraction)
return TRUE
/// Helper to quickly create a cloud of reagent smoke
diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm
index 050223525e6e8..2998e9dc6705f 100644
--- a/code/game/objects/effects/spawners/random/medical.dm
+++ b/code/game/objects/effects/spawners/random/medical.dm
@@ -25,20 +25,20 @@
icon_state = "eyes"
spawn_loot_count = 3
loot = list(
- /obj/item/organ/internal/heart/gland/egg = 7,
- /obj/item/organ/internal/heart/gland/plasma = 7,
- /obj/item/organ/internal/heart/gland/chem = 5,
- /obj/item/organ/internal/heart/gland/mindshock = 5,
- /obj/item/organ/internal/heart/gland/transform = 5,
- /obj/item/organ/internal/heart/gland/spiderman = 5,
- /obj/item/organ/internal/heart/gland/slime = 4,
- /obj/item/organ/internal/heart/gland/trauma = 4,
- /obj/item/organ/internal/heart/gland/electric = 3,
- /obj/item/organ/internal/monster_core/regenerative_core = 2,
- /obj/item/organ/internal/monster_core/rush_gland = 2,
- /obj/item/organ/internal/monster_core/brimdust_sac = 2,
- /obj/item/organ/internal/heart/gland/ventcrawling = 1,
- /obj/item/organ/internal/body_egg/alien_embryo = 1,
+ /obj/item/organ/heart/gland/egg = 7,
+ /obj/item/organ/heart/gland/plasma = 7,
+ /obj/item/organ/heart/gland/chem = 5,
+ /obj/item/organ/heart/gland/mindshock = 5,
+ /obj/item/organ/heart/gland/transform = 5,
+ /obj/item/organ/heart/gland/spiderman = 5,
+ /obj/item/organ/heart/gland/slime = 4,
+ /obj/item/organ/heart/gland/trauma = 4,
+ /obj/item/organ/heart/gland/electric = 3,
+ /obj/item/organ/monster_core/regenerative_core = 2,
+ /obj/item/organ/monster_core/rush_gland = 2,
+ /obj/item/organ/monster_core/brimdust_sac = 2,
+ /obj/item/organ/heart/gland/ventcrawling = 1,
+ /obj/item/organ/body_egg/alien_embryo = 1,
)
/obj/effect/spawner/random/medical/memeorgans
@@ -46,23 +46,23 @@
icon_state = "eyes"
spawn_loot_count = 5
loot = list(
- /obj/item/organ/internal/ears/penguin,
- /obj/item/organ/internal/ears/cat,
- /obj/item/organ/internal/eyes/moth,
- /obj/item/organ/internal/eyes/snail,
- /obj/item/organ/internal/tongue/bone,
- /obj/item/organ/internal/tongue/fly,
- /obj/item/organ/internal/tongue/snail,
- /obj/item/organ/internal/tongue/lizard,
- /obj/item/organ/internal/tongue/alien,
- /obj/item/organ/internal/tongue/ethereal,
- /obj/item/organ/internal/tongue/robot,
- /obj/item/organ/internal/tongue/zombie,
- /obj/item/organ/internal/appendix,
- /obj/item/organ/internal/liver/fly,
- /obj/item/organ/internal/lungs/plasmaman,
- /obj/item/organ/external/tail/cat,
- /obj/item/organ/external/tail/lizard,
+ /obj/item/organ/ears/penguin,
+ /obj/item/organ/ears/cat,
+ /obj/item/organ/eyes/moth,
+ /obj/item/organ/eyes/snail,
+ /obj/item/organ/tongue/bone,
+ /obj/item/organ/tongue/fly,
+ /obj/item/organ/tongue/snail,
+ /obj/item/organ/tongue/lizard,
+ /obj/item/organ/tongue/alien,
+ /obj/item/organ/tongue/ethereal,
+ /obj/item/organ/tongue/robot,
+ /obj/item/organ/tongue/zombie,
+ /obj/item/organ/appendix,
+ /obj/item/organ/liver/fly,
+ /obj/item/organ/lungs/plasmaman,
+ /obj/item/organ/tail/cat,
+ /obj/item/organ/tail/lizard,
)
/obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index eb1f54feb25f5..2522b8b9af3ca 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -863,6 +863,8 @@
playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE, vary = sound_vary)
return
var/volume = get_volume_by_throwforce_and_or_w_class()
+ if(.) //it's been caught.
+ return
if (throwforce > 0 || HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND))
if (mob_throw_hit_sound)
playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 3124ba9c39196..2e7e6c39b6cc0 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -73,7 +73,7 @@
return TRUE
/obj/item/airlock_painter/suicide_act(mob/living/user)
- var/obj/item/organ/internal/lungs/L = user.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/L = user.get_organ_slot(ORGAN_SLOT_LUNGS)
if(can_use(user) && L)
user.visible_message(span_suicide("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 39388da561b06..f8824861dba0f 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -35,5 +35,5 @@
var/obj/machinery/power/apc/mounted_apc = locate(/obj/machinery/power/apc) in get_turf(user)
mounted_apc.wallframe_act(user, src)
return ITEM_INTERACT_SUCCESS
- turf.attackby(src, user)
+ turf.item_interaction(user, src)
return ITEM_INTERACT_SUCCESS
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index d8b48e0789b21..d5769ceb8d798 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/body_egg
+/obj/item/organ/body_egg
name = "body egg"
desc = "All slimy and yuck."
icon_state = "innards"
@@ -6,47 +6,47 @@
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_PARASITE_EGG
-/obj/item/organ/internal/body_egg/on_find(mob/living/finder)
+/obj/item/organ/body_egg/on_find(mob/living/finder)
..()
to_chat(finder, span_warning("You found an unknown alien organism in [owner]'s [zone]!"))
-/obj/item/organ/internal/body_egg/Initialize(mapload)
+/obj/item/organ/body_egg/Initialize(mapload)
. = ..()
if(iscarbon(loc))
Insert(loc)
-/obj/item/organ/internal/body_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+/obj/item/organ/body_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
. = ..()
egg_owner.add_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT)
egg_owner.med_hud_set_status()
INVOKE_ASYNC(src, PROC_REF(AddInfectionImages), egg_owner)
-/obj/item/organ/internal/body_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags)
+/obj/item/organ/body_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags)
. = ..()
egg_owner.remove_traits(list(TRAIT_XENO_HOST, TRAIT_XENO_IMMUNE), ORGAN_TRAIT)
egg_owner.med_hud_set_status()
INVOKE_ASYNC(src, PROC_REF(RemoveInfectionImages), egg_owner)
-/obj/item/organ/internal/body_egg/on_death(seconds_per_tick, times_fired)
+/obj/item/organ/body_egg/on_death(seconds_per_tick, times_fired)
. = ..()
if(!owner)
return
egg_process(seconds_per_tick, times_fired)
-/obj/item/organ/internal/body_egg/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/body_egg/on_life(seconds_per_tick, times_fired)
. = ..()
egg_process(seconds_per_tick, times_fired)
-/obj/item/organ/internal/body_egg/proc/egg_process(seconds_per_tick, times_fired)
+/obj/item/organ/body_egg/proc/egg_process(seconds_per_tick, times_fired)
return
-/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage()
+/obj/item/organ/body_egg/proc/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()
-/obj/item/organ/internal/body_egg/proc/AddInfectionImages()
+/obj/item/organ/body_egg/proc/AddInfectionImages()
return
-/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages()
+/obj/item/organ/body_egg/proc/RemoveInfectionImages()
return
diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm
index aa51d71c5eda4..e99ed4b3320a3 100644
--- a/code/game/objects/items/choice_beacon.dm
+++ b/code/game/objects/items/choice_beacon.dm
@@ -147,12 +147,12 @@
augment_list = list()
// cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
var/list/selectable_types = list(
- /obj/item/organ/internal/cyberimp/brain/anti_drop,
- /obj/item/organ/internal/cyberimp/arm/toolset,
- /obj/item/organ/internal/cyberimp/arm/surgery,
- /obj/item/organ/internal/cyberimp/chest/thrusters,
- /obj/item/organ/internal/lungs/cybernetic/tier3,
- /obj/item/organ/internal/liver/cybernetic/tier3,
+ /obj/item/organ/cyberimp/brain/anti_drop,
+ /obj/item/organ/cyberimp/arm/toolset,
+ /obj/item/organ/cyberimp/arm/surgery,
+ /obj/item/organ/cyberimp/chest/thrusters,
+ /obj/item/organ/lungs/cybernetic/tier3,
+ /obj/item/organ/liver/cybernetic/tier3,
)
for(var/obj/item/organ/organ as anything in selectable_types)
augment_list[initial(organ.name)] = organ
diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm
index 69b65149775ba..aab4f59fce338 100644
--- a/code/game/objects/items/cigarettes.dm
+++ b/code/game/objects/items/cigarettes.dm
@@ -444,12 +444,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return
how_long_have_we_been_smokin += seconds_per_tick * (1 SECONDS)
- reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1))
- var/obj/item/organ/internal/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS)
+ reagents.expose(smoker, INHALE, min(to_smoke / reagents.total_volume, 1))
+ var/obj/item/organ/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS)
if(lungs && IS_ORGANIC_ORGAN(lungs))
var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1
smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm * smoker_resistance)
- if(!reagents.trans_to(smoker, to_smoke, methods = INGEST, ignore_stomach = TRUE))
+ if(!reagents.trans_to(smoker, to_smoke, methods = INHALE, ignore_stomach = TRUE))
reagents.remove_all(to_smoke)
/obj/item/cigarette/process(seconds_per_tick)
@@ -992,7 +992,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
e.start(src)
qdel(src)
- if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INGEST, ignore_stomach = TRUE))
+ if(!reagents.trans_to(vaper, REAGENTS_METABOLISM, methods = INHALE, ignore_stomach = TRUE))
reagents.remove_all(REAGENTS_METABOLISM)
/obj/item/vape/process(seconds_per_tick)
diff --git a/code/game/objects/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm
index f10a9db76704c..5ad9e49d0b849 100644
--- a/code/game/objects/items/climbingrope.dm
+++ b/code/game/objects/items/climbingrope.dm
@@ -14,6 +14,7 @@
attack_verb_continuous = list("whacks", "flails", "bludgeons")
attack_verb_simple = list("whack", "flail", "bludgeon")
resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_SMALL
///how many times can we climb with this rope
var/uses = 5
///climb time
@@ -58,7 +59,7 @@
// Misc bonuses to the climb speed.
var/misc_multiplier = 1
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
misc_multiplier *= potential_spine.athletics_boost_multiplier
@@ -97,7 +98,6 @@
desc = "An emergency climbing hook to scale up holes. The rope is EXTREMELY cheap and may not withstand extended use."
uses = 2
climb_time = 4 SECONDS
- w_class = WEIGHT_CLASS_SMALL
/obj/item/climbing_hook/syndicate
name = "suspicious climbing hook"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 9133068cb0027..dd5d78fce0d61 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -583,7 +583,7 @@
if(do_after(user, 3 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message(span_notice("[user] places [src] on [H]'s chest."), span_warning("You place [src] on [H]'s chest."))
playsound(src, 'sound/machines/defib/defib_charge.ogg', 75, FALSE)
- var/obj/item/organ/internal/heart = H.get_organ_by_type(/obj/item/organ/internal/heart)
+ var/obj/item/organ/heart = H.get_organ_by_type(/obj/item/organ/heart)
if(do_after(user, 2 SECONDS, H, extra_checks = CALLBACK(src, PROC_REF(is_wielded)))) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if((!combat && !req_defib) || (req_defib && !defib.combat))
for(var/obj/item/clothing/C in H.get_equipped_items())
@@ -660,7 +660,7 @@
log_combat(user, H, "revived", defib)
do_success()
return
- else if (!H.get_organ_by_type(/obj/item/organ/internal/heart))
+ else if (!H.get_organ_by_type(/obj/item/organ/heart))
user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's heart is missing. Operation aborted."))
playsound(src, 'sound/machines/defib/defib_failed.ogg', 50, FALSE)
else if(H.undergoing_cardiac_arrest())
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 657d054f11cc8..94b7e14fe80fb 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -112,8 +112,8 @@
to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first!"))
return
- var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES)
- var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!E)
to_chat(user, span_warning("[M] doesn't have any eyes!"))
return
@@ -889,7 +889,7 @@
if(!fuel)
user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but it's empty!"))
return SHAME
- var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes)
user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but [user.p_they()] don't have any!"))
return SHAME
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index fcb5318d63bf8..782ba69779cba 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -656,6 +656,9 @@
should_be_listening = TRUE
should_be_broadcasting = FALSE
+/obj/item/radio/entertainment/speakers/proc/toggle_mute()
+ should_be_listening = !should_be_listening
+
/obj/item/radio/entertainment/speakers/Initialize(mapload)
. = ..()
set_broadcasting(FALSE)
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index 5b7ee4f7026b8..aedffb566b276 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -326,7 +326,7 @@
// Cybernetics
var/list/cyberimps
- for(var/obj/item/organ/internal/cyberimp/cyberimp in humantarget.organs)
+ for(var/obj/item/organ/cyberimp/cyberimp in humantarget.organs)
if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN))
LAZYADD(cyberimps, cyberimp.examine_title(user))
if(LAZYLEN(cyberimps))
@@ -468,7 +468,7 @@
render_block.Cut()
// Stomach reagents
- var/obj/item/organ/internal/stomach/belly = target.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = target.get_organ_slot(ORGAN_SLOT_STOMACH)
if(belly)
if(belly.reagents.reagent_list.len)
for(var/bile in belly.reagents.reagent_list)
diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm
index d25c957145561..7f31b155a2650 100644
--- a/code/game/objects/items/drug_items.dm
+++ b/code/game/objects/items/drug_items.dm
@@ -44,6 +44,8 @@
reagent_flags = TRANSPARENT
spillable = FALSE
list_reagents = list(/datum/reagent/drug/blastoff = 10)
+ reagent_consumption_method = INHALE
+ consumption_sound = 'sound/effects/spray2.ogg'
/obj/item/reagent_containers/cup/blastoff_ampoule/update_icon_state()
. = ..()
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index b25765a302443..7f2e54984cae9 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -84,7 +84,7 @@
user.visible_message(span_suicide("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!"))
var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
- var/obj/item/organ/internal/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN)
B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
var/randdir
for(var/i in 1 to 24)//like a headless chicken!
diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm
index b64f15fe69073..fc6685aaf6b2a 100644
--- a/code/game/objects/items/dyespray.dm
+++ b/code/game/objects/items/dyespray.dm
@@ -23,11 +23,34 @@
if(!ishuman(target))
return
var/mob/living/carbon/human/human_target = target
- var/beard_or_hair = tgui_alert(user, "What do you want to dye?", "Character Preference", list("Hair", "Facial Hair"))
- if(!beard_or_hair || !user.can_perform_action(src, NEED_DEXTERITY))
+ var/list/dyables = list("Hair", "Facial Hair")
+ for(var/obj/item/organ/organ as anything in human_target.organs)
+ if(!istype(organ.bodypart_overlay, /datum/bodypart_overlay/mutant))
+ continue
+ var/datum/bodypart_overlay/mutant/overlay = organ.bodypart_overlay
+ if(overlay.dyable && overlay.sprite_datum.color_src)
+ dyables += list("External Body Parts")
+ break
+ var/obj/item/bodypart/head/head = human_target.get_bodypart(BODY_ZONE_HEAD)
+ if(!head || !(head.head_flags & HEAD_HAIR) || HAS_TRAIT(human_target, TRAIT_BALD))
+ dyables -= "Hair"
+ if(!head || !(head.head_flags & HEAD_FACIAL_HAIR) || HAS_TRAIT(human_target, TRAIT_SHAVED))
+ dyables -= "Facial Hair"
+ if(!length(dyables))
+ if(target != user)
+ to_chat(user, span_warning("[human_target] doesn't have anything that can be dyed."))
+ else
+ to_chat(user, span_warning("You have nothing to dye."))
+ return
+ var/what_to_dye = tgui_alert(user, "What do you want to dye?", "Character Preference", dyables)
+ if(!what_to_dye || !user.can_perform_action(src, NEED_DEXTERITY))
+ return
+
+ if(what_to_dye == "External Bodyparts/Organs")
+ dye_organ(target, user)
return
- var/list/choices = beard_or_hair == "Hair" ? SSaccessories.hair_gradients_list : SSaccessories.facial_hair_gradients_list
+ var/list/choices = what_to_dye == "Hair" ? SSaccessories.hair_gradients_list : SSaccessories.facial_hair_gradients_list
var/new_grad_style = tgui_input_list(user, "Choose a color pattern", "Character Preference", choices)
if(isnull(new_grad_style))
return
@@ -41,10 +64,54 @@
to_chat(user, span_notice("You start applying the hair dye..."))
if(!do_after(user, 3 SECONDS, target))
return
- if(beard_or_hair == "Hair")
+ if(what_to_dye == "Hair")
human_target.set_hair_gradient_style(new_grad_style, update = FALSE)
human_target.set_hair_gradient_color(new_grad_color, update = TRUE)
else
human_target.set_facial_hair_gradient_style(new_grad_style, update = FALSE)
human_target.set_facial_hair_gradient_color(new_grad_color, update = TRUE)
playsound(src, 'sound/effects/spray.ogg', 10, vary = TRUE)
+
+/obj/item/dyespray/proc/dye_organ(mob/living/carbon/human/target, mob/user)
+ var/list/dyables = list()
+ var/list/choices = list()
+ for(var/obj/item/organ/organ as anything in target.organs)
+ if(!istype(organ.bodypart_overlay, /datum/bodypart_overlay/mutant))
+ continue
+ var/datum/bodypart_overlay/mutant/overlay = organ.bodypart_overlay
+ if(overlay.dyable && overlay.sprite_datum.color_src)
+ var/choice_name = full_capitalize(organ.name)
+ dyables[choice_name] = organ
+ choices += choice_name
+ if(!length(choices))
+ return
+ var/what_to_dye = tgui_alert(user, "What do you want to dye?", "Character Preference", choices)
+ if(!what_to_dye || !user.can_perform_action(src, NEED_DEXTERITY))
+ return
+
+ var/obj/item/organ/selected = dyables[what_to_dye]
+ if(QDELETED(selected) || !(selected in target.organs))
+ return
+
+ var/datum/bodypart_overlay/mutant/overlay = selected.bodypart_overlay
+ if(overlay.dye_color)
+ var/remove_dye = tgui_alert(user, "Do you want to un-dye [selected]?", "Character Preference", list("Yes", "No"))
+ if(isnull(remove_dye) || !user.can_perform_action(src, NEED_DEXTERITY))
+ return
+ if(QDELETED(selected) || !(selected in target.organs))
+ return
+ if(remove_dye == "Yes")
+ overlay.set_dye_color(null, selected)
+ return
+
+ var/default_color = overlay.dye_color || overlay.draw_color
+ var/new_color = input(user, "Choose a color for [selected]:", "Character Preference", default_color) as color|null
+ if(isnull(new_color) || new_color == default_color || !user.can_perform_action(src, NEED_DEXTERITY))
+ return
+ if(QDELETED(selected) || !(selected in target.organs))
+ return
+ if(!do_after(user, 4.5 SECONDS, target))
+ return
+ if(QDELETED(selected) || !(selected in target.organs))
+ return
+ overlay.set_dye_color(new_color, selected)
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
index 265a05cfac74a..162af703ad2bd 100644
--- a/code/game/objects/items/fireaxe.dm
+++ b/code/game/objects/items/fireaxe.dm
@@ -1,3 +1,5 @@
+GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
+
/*
* Fireaxe
*/
@@ -34,6 +36,9 @@
/obj/item/fireaxe/Initialize(mapload)
. = ..()
+ if(!GLOB.bridge_axe && istype(get_area(src), /area/station/command))
+ GLOB.bridge_axe = src
+
AddComponent(/datum/component/butchering, \
speed = 10 SECONDS, \
effectiveness = 80, \
@@ -43,6 +48,11 @@
//axes are not known for being precision butchering tools
AddComponent(/datum/component/two_handed, force_unwielded=force_unwielded, force_wielded=force_wielded, icon_wielded="[base_icon_state]1")
+/obj/item/fireaxe/Destroy()
+ if(GLOB.bridge_axe == src)
+ GLOB.bridge_axe = null
+ return ..()
+
/obj/item/fireaxe/update_icon_state()
icon_state = "[base_icon_state]0"
return ..()
diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm
index 922ed2eaa6674..993ada424adab 100644
--- a/code/game/objects/items/food/donuts.dm
+++ b/code/game/objects/items/food/donuts.dm
@@ -45,7 +45,7 @@
///Override for checkliked in edible component, because all cops LOVE donuts
/obj/item/food/donut/proc/check_liked(mob/living/carbon/human/consumer)
- var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
return FOOD_LIKED
diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm
index bfd26f534de23..6da965e47578d 100644
--- a/code/game/objects/items/food/misc.dm
+++ b/code/game/objects/items/food/misc.dm
@@ -611,7 +611,7 @@
AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked)))
/obj/item/food/pickle/proc/check_liked(mob/living/carbon/human/consumer)
- var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))
return FOOD_LIKED
diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm
index eb38b5a97836e..9674a7f6d9973 100644
--- a/code/game/objects/items/hand_items.dm
+++ b/code/game/objects/items/hand_items.dm
@@ -635,7 +635,7 @@
if(!iscarbon(target))
return
var/mob/living/carbon/heartbreakee = target
- var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot(ORGAN_SLOT_HEART)
dont_go_breakin_my_heart.apply_organ_damage(999)
// Based on energy gun characteristics
diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm
index 01e5983b7d7aa..775612026b192 100644
--- a/code/game/objects/items/melee/baton.dm
+++ b/code/game/objects/items/melee/baton.dm
@@ -351,7 +351,7 @@
/obj/item/melee/baton/telescopic/suicide_act(mob/living/user)
var/mob/living/carbon/human/human_user = user
- var/obj/item/organ/internal/brain/our_brain = human_user.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/our_brain = human_user.get_organ_by_type(/obj/item/organ/brain)
user.visible_message(span_suicide("[user] stuffs [src] up [user.p_their()] nose and presses the 'extend' button! It looks like [user.p_theyre()] trying to clear [user.p_their()] mind."))
if(active)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 9a1b8bed101f0..7ea8a663caf56 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -95,7 +95,7 @@
*/
/obj/item/melee/sabre/proc/attempt_bane(element_owner, mob/living/carbon/criminal)
SIGNAL_HANDLER
- var/obj/item/organ/internal/liver/liver = criminal.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = criminal.get_organ_slot(ORGAN_SLOT_LIVER)
if(isnull(liver) || !HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM))
return COMPONENT_CANCEL_BANING
diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm
index 1925b3e6ffc66..c217f93962ab2 100644
--- a/code/game/objects/items/rcd/RTD.dm
+++ b/code/game/objects/items/rcd/RTD.dm
@@ -38,7 +38,7 @@
var/datum/tile_info/tile_design
/// overlays on a tile
var/list/design_overlays = list()
-
+ var/ranged = TRUE
/// stores the name, type, icon & cost for each tile type
/datum/tile_info
/// name of this tile design for ui
@@ -289,8 +289,12 @@
if(!checkResource(selected_design.cost, user))
qdel(rcd_effect)
return ITEM_INTERACT_BLOCKING
- var/beam = user.Beam(floor, icon_state = "light_beam", time = delay)
- playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE)
+ var/beam
+ if(!ranged)
+ playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
+ else
+ beam = user.Beam(floor, icon_state = "light_beam", time = delay)
+ playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE)
if(!build_delay(user, delay, target = floor))
qdel(beam)
qdel(rcd_effect)
@@ -392,6 +396,51 @@
/obj/item/construction/rtd/loaded
matter = 350
+
+/obj/item/construction/rtd/borg
+ var/energyfactor = 0.03 * STANDARD_CELL_CHARGE
+ var/delay = 0
+ ranged = FALSE
+
+/obj/item/construction/rtd/borg/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ if(!(interacting_with in view(1, get_turf(user))))
+ return NONE
+ return try_tiling(interacting_with, user)
+
+/obj/item/construction/rtd/borg/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers)
+ return NONE
+
+/obj/item/construction/rtd/borg/get_matter(mob/user)
+ if(!iscyborg(user))
+ return 0
+ var/mob/living/silicon/robot/borgy = user
+ if(!borgy.cell)
+ return 0
+ max_matter = borgy.cell.maxcharge
+ return borgy.cell.charge
+
+/obj/item/construction/rtd/borg/useResource(amount, mob/user)
+ if(!iscyborg(user))
+ return 0
+ var/mob/living/silicon/robot/borgy = user
+ if(!borgy.cell)
+ balloon_alert(user, "no cell found!")
+ return 0
+ . = borgy.cell.use(amount * energyfactor)
+ if(!.)
+ balloon_alert(user, "insufficient charge!")
+
+/obj/item/construction/rtd/borg/checkResource(amount, mob/user)
+ if(!iscyborg(user))
+ return 0
+ var/mob/living/silicon/robot/borgy = user
+ if(!borgy.cell)
+ balloon_alert(user, "no cell found!")
+ return 0
+ . = borgy.cell.charge >= (amount * energyfactor)
+ if(!.)
+ balloon_alert(user, "insufficient charge!")
+
/obj/item/construction/rtd/admin
name = "admin RTD"
max_matter = INFINITY
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index ce350ecb788f8..24b8fc7f73df2 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -239,7 +239,7 @@
else if(istype(W, /obj/item/bodypart/head/robot))
var/obj/item/bodypart/head/robot/HD = W
- if(locate(/obj/item/organ/internal) in HD)
+ if(locate(/obj/item/organ) in HD)
to_chat(user, span_warning("There are organs inside [HD]!"))
return
if(head)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 52c4d13def241..1de9b7731ff55 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -23,6 +23,10 @@
resistance_flags = NONE
max_integrity = 300
storage_type = /datum/storage/backpack
+ pickup_sound = 'sound/items/handling/backpack/backpack_pickup1.ogg'
+ drop_sound = 'sound/items/handling/backpack/backpack_drop1.ogg'
+ equip_sound = 'sound/items/equip/backpack_equip.ogg'
+ sound_vary = TRUE
/obj/item/storage/backpack/Initialize(mapload)
. = ..()
@@ -59,6 +63,8 @@
item_flags = NO_MAT_REDEMPTION
armor_type = /datum/armor/backpack_holding
storage_type = /datum/storage/bag_of_holding
+ pickup_sound = null
+ drop_sound = null
/datum/armor/backpack_holding
fire = 60
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index f410eafcd484e..4fdf903fb5d78 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -427,7 +427,7 @@
/obj/item/lighter,
/obj/item/mining_scanner,
/obj/item/multitool,
- /obj/item/organ/internal/monster_core,
+ /obj/item/organ/monster_core,
/obj/item/pickaxe,
/obj/item/radio,
/obj/item/reagent_containers/cup/glass,
@@ -471,7 +471,7 @@
for(var/i in 1 to 2)
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
for(var/i in 1 to 2)
- var/obj/item/organ/internal/monster_core/core = new /obj/item/organ/internal/monster_core/regenerative_core/legion(src)
+ var/obj/item/organ/monster_core/core = new /obj/item/organ/monster_core/regenerative_core/legion(src)
core.preserve()
/obj/item/storage/belt/mining/primitive
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 120b91a40ffbc..e6dad759c83ed 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -385,7 +385,7 @@
. = ..()
if(.)
return
- if(user.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel))
+ if(user.get_organ_by_type(/obj/item/organ/alien/plasmavessel))
switch(status)
if(BURSTING)
to_chat(user, span_notice("The child is hatching out."))
@@ -457,7 +457,7 @@
return
var/mob/living/carbon/C = AM
- if(C.stat == CONSCIOUS && C.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo))
+ if(C.stat == CONSCIOUS && C.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo))
return
Burst(kill=FALSE)
diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm
index 131e08808fbdb..3a6d6d3ee4a81 100644
--- a/code/game/objects/structures/beds_chairs/alien_nest.dm
+++ b/code/game/objects/structures/beds_chairs/alien_nest.dm
@@ -26,7 +26,7 @@
if(!length(buckled_mobs))
return
- if(hero.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel))
+ if(hero.get_organ_by_type(/obj/item/organ/alien/plasmavessel))
unbuckle_mob(captive)
add_fingerprint(hero)
return
@@ -59,9 +59,9 @@
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated || M.buckled )
return
- if(M.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel))
+ if(M.get_organ_by_type(/obj/item/organ/alien/plasmavessel))
return
- if(!user.get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel))
+ if(!user.get_organ_by_type(/obj/item/organ/alien/plasmavessel))
return
if(has_buckled_mobs())
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 41291cbf146f0..50d06bafef0fd 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -227,6 +227,7 @@
fishing_modifier = -12
/obj/structure/chair/office
+ name = "office chair"
anchored = FALSE
buildstackamount = 5
item_chair = null
@@ -247,6 +248,7 @@
fishing_modifier = -10
/obj/structure/chair/office/light
+ name = "office chair"
icon_state = "officechair_white"
//Stool
diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm
index bba9e4f715c2a..bea51bc1d8c6c 100644
--- a/code/game/objects/structures/gym/punching_bag.dm
+++ b/code/game/objects/structures/gym/punching_bag.dm
@@ -58,7 +58,7 @@
if (is_heavy_gravity)
stamina_exhaustion *= 1.5
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
stamina_exhaustion *= potential_spine.athletics_boost_multiplier
diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm
index 352ef65ff0050..b36e35245c202 100644
--- a/code/game/objects/structures/gym/weight_machine.dm
+++ b/code/game/objects/structures/gym/weight_machine.dm
@@ -172,7 +172,7 @@
// total stamina drain of 1 workout calculated based on the workout length
var/stamina_exhaustion = FLOOR(user.maxHealth / workout_reps / WORKOUT_LENGTH, 0.1)
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
stamina_exhaustion *= potential_spine.athletics_boost_multiplier
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index fb082b72456dc..f9d490a29b2e9 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(3)
new /obj/item/reagent_containers/cup/bottle/potion/flight(loc)
if(4)
- new /obj/item/organ/internal/heart/cursed/wizard(loc)
+ new /obj/item/organ/heart/cursed/wizard(loc)
if(5)
new /obj/item/jacobs_ladder(loc)
if(6)
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 17f81eb242820..0d4c5b490b9ae 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -112,7 +112,7 @@
// Misc bonuses to the climb speed.
var/misc_multiplier = 1
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
misc_multiplier *= potential_spine.athletics_boost_multiplier
diff --git a/code/game/objects/structures/lavaland/gulag_vent.dm b/code/game/objects/structures/lavaland/gulag_vent.dm
index 8cb530e31b18a..d6e30cf1fe3cb 100644
--- a/code/game/objects/structures/lavaland/gulag_vent.dm
+++ b/code/game/objects/structures/lavaland/gulag_vent.dm
@@ -33,7 +33,7 @@
var/boulder_lift_speed = 8 SECONDS
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = living_user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = living_user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
boulder_lift_speed *= potential_spine.athletics_boost_multiplier
diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm
index d27a2e8e1cd8d..895602bb017c7 100644
--- a/code/game/objects/structures/petrified_statue.dm
+++ b/code/game/objects/structures/petrified_statue.dm
@@ -77,7 +77,7 @@
petrified_mob.investigate_log("has been dusted by statue deconstruction.", INVESTIGATE_DEATHS)
if(iscarbon(petrified_mob) && brain)
var/mob/living/carbon/petrified_carbon = petrified_mob
- var/obj/item/organ/internal/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN)
carbon_brain.Remove(petrified_carbon)
carbon_brain.forceMove(get_turf(src))
carbon_brain.name = "petrified [carbon_brain.name]"
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index a5ed048153c41..c4496e6661024 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -63,7 +63,7 @@
///Update the flaps behaviour to gases, if not anchored will let air pass through
/obj/structure/plasticflaps/proc/update_atmos_behaviour()
- can_atmos_pass = anchored ? ATMOS_PASS_YES : ATMOS_PASS_NO
+ can_atmos_pass = anchored ? ATMOS_PASS_NO : ATMOS_PASS_YES
/obj/structure/plasticflaps/wirecutter_act(mob/living/user, obj/item/W)
. = ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ac7282f9386b6..c57ce3bcecfbf 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -288,7 +288,7 @@
tableplace_delay = 2.75 SECONDS
skills_space = " quickly"
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
tableplace_delay *= potential_spine.athletics_boost_multiplier
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 7070fc4cafc7e..f8d66620dc69a 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -321,9 +321,9 @@
)
if(SFX_CAN_OPEN)
soundin = pick(
- 'sound/effects/can/can_open1.ogg',
- 'sound/effects/can/can_open2.ogg',
- 'sound/effects/can/can_open3.ogg',
+ 'sound/items/can/can_open1.ogg',
+ 'sound/items/can/can_open2.ogg',
+ 'sound/items/can/can_open3.ogg',
)
if(SFX_BULLET_MISS)
soundin = pick(
@@ -735,4 +735,16 @@
'sound/effects/industrial_scan/industrial_scan2.ogg',
'sound/effects/industrial_scan/industrial_scan3.ogg',
)
+ if(SFX_MALE_SIGH)
+ soundin = pick(
+ 'sound/mobs/humanoids/human/sigh/male_sigh1.ogg',
+ 'sound/mobs/humanoids/human/sigh/male_sigh2.ogg',
+ 'sound/mobs/humanoids/human/sigh/male_sigh3.ogg',
+ )
+ if(SFX_FEMALE_SIGH)
+ soundin = pick(
+ 'sound/mobs/humanoids/human/sigh/female_sigh1.ogg',
+ 'sound/mobs/humanoids/human/sigh/female_sigh2.ogg',
+ 'sound/mobs/humanoids/human/sigh/female_sigh3.ogg',
+ )
return soundin
diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm
index 28f7cfde8aceb..ddc322185d291 100644
--- a/code/game/turfs/open/space/space.dm
+++ b/code/game/turfs/open/space/space.dm
@@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(starlight)
return
if(istype(C, /obj/item/stack/rods))
build_with_rods(C, user)
- else if(istype(C, /obj/item/stack/tile/iron))
+ else if(istype(C, /obj/item/stack/tile/iron) || istype(C, /obj/item/stack/tile/material) && C.has_material_type(/datum/material/iron))
build_with_floor_tiles(C, user)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 5b39caf571faa..8b30634ac9f22 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -668,7 +668,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
clear_reagents_to_vomit_pool(vomiter, throw_up, purge_ratio)
/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1)
- var/obj/item/organ/internal/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = M.get_organ_slot(ORGAN_SLOT_STOMACH)
if(!belly?.reagents.total_volume)
return
var/chemicals_lost = belly.reagents.total_volume * purge_ratio
diff --git a/code/game/world.dm b/code/game/world.dm
index 184b13be6427f..fe55b3963b504 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -397,6 +397,8 @@ GLOBAL_VAR(tracy_log)
new_status += "
Time: [time2text(STATION_TIME_PASSED(), "hh:mm", 0)]"
if(SSshuttle?.emergency && SSshuttle?.emergency?.mode != (SHUTTLE_IDLE || SHUTTLE_ENDGAME))
new_status += " | Shuttle: [SSshuttle.emergency.getModeStr()] [SSshuttle.emergency.getTimerStr()]"
+ if(SStime_track?.time_dilation_avg > 0)
+ new_status += " | Time Dilation: [round(SStime_track?.time_dilation_avg)]%"
else if(SSticker.current_state == GAME_STATE_FINISHED)
new_status += "
RESTARTING"
if(SSmapping.current_map)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 1510783fc7cb8..98ff0e08e7d8e 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -34,7 +34,7 @@ ADMIN_VERB(admin_ghost, R_ADMIN, "AGhost", "Become a ghost without DNR.", ADMIN_
log_admin("[key_name(user)] admin ghosted.")
message_admins("[key_name_admin(user)] admin ghosted.")
var/mob/body = user.mob
- body.ghostize(TRUE)
+ body.ghostize(TRUE, TRUE)
user.init_verbs()
if(body && !body.key)
body.key = "@[user.key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm
index c58d63581bd34..93b398397c284 100644
--- a/code/modules/admin/verbs/adminfun.dm
+++ b/code/modules/admin/verbs/adminfun.dm
@@ -110,7 +110,7 @@ ADMIN_VERB(mass_zombie_infection, R_ADMIN, "Mass Zombie Infection", "Infects all
for(var/i in GLOB.human_list)
var/mob/living/carbon/human/H = i
- new /obj/item/organ/internal/zombie_infection/nodamage(H)
+ new /obj/item/organ/zombie_infection/nodamage(H)
message_admins("[key_name_admin(user)] added a latent zombie infection to all humans.")
log_admin("[key_name(user)] added a latent zombie infection to all humans.")
@@ -121,7 +121,7 @@ ADMIN_VERB(mass_zombie_cure, R_ADMIN, "Mass Zombie Cure", "Removes the zombie in
if(confirm != "Yes")
return
- for(var/obj/item/organ/internal/zombie_infection/nodamage/I in GLOB.zombie_infection_list)
+ for(var/obj/item/organ/zombie_infection/nodamage/I in GLOB.zombie_infection_list)
qdel(I)
message_admins("[key_name_admin(user)] cured all zombies.")
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
index 368f6f4d6f45e..26cf122211305 100644
--- a/code/modules/admin/verbs/secrets.dm
+++ b/code/modules/admin/verbs/secrets.dm
@@ -517,8 +517,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
if(H.dna.species.id == SPECIES_HUMAN)
if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None")
- var/obj/item/organ/internal/ears/cat/ears = new
- var/obj/item/organ/external/tail/cat/tail = new
+ var/obj/item/organ/ears/cat/ears = new
+ var/obj/item/organ/tail/cat/tail = new
ears.Insert(H, movement_flags = DELETE_IF_REPLACED)
tail.Insert(H, movement_flags = DELETE_IF_REPLACED)
var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun
diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm
index 415130fa1b727..96534967702b7 100644
--- a/code/modules/admin/verbs/selectequipment.dm
+++ b/code/modules/admin/verbs/selectequipment.dm
@@ -213,7 +213,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta
for(var/obj/item/item in human_target.get_equipped_items(includes_flags))
qdel(item)
- var/obj/item/organ/internal/brain/human_brain = human_target.get_organ_slot(BRAIN)
+ var/obj/item/organ/brain/human_brain = human_target.get_organ_slot(BRAIN)
human_brain.destroy_all_skillchips() // get rid of skillchips to prevent runtimes
if(dresscode != "Naked")
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 78d5a988f0849..44ca783ffcd0b 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -63,6 +63,8 @@ GLOBAL_LIST_EMPTY(antagonists)
var/hardcore_random_bonus = FALSE
/// A path to the audio stinger that plays upon gaining this datum.
var/stinger_sound
+ /// Whether this antag datum blocks rolling new antag datums
+ var/block_midrounds = TRUE
//ANTAG UI
diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm
index 2ca46499a7db0..9b8dca4a0e2b0 100644
--- a/code/modules/antagonists/abductor/abductor.dm
+++ b/code/modules/antagonists/abductor/abductor.dm
@@ -93,7 +93,7 @@
//Equip
var/mob/living/carbon/human/new_abductor = owner.current
new_abductor.set_species(/datum/species/abductor)
- var/obj/item/organ/internal/tongue/abductor/abductor_tongue = new_abductor.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/abductor/abductor_tongue = new_abductor.get_organ_slot(ORGAN_SLOT_TONGUE)
abductor_tongue.mothership = "[team.name]"
new_abductor.real_name = "[team.name] [sub_role]"
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
index a02d89e6b1d47..296eef07e8141 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
@@ -29,7 +29,7 @@
accept_hand = 1
time = 32
var/obj/item/organ/IC = null
- var/list/organ_types = list(/obj/item/organ/internal/heart)
+ var/list/organ_types = list(/obj/item/organ/heart)
/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/atom/A in target.organs)
@@ -50,7 +50,7 @@
/datum/surgery_step/gland_insert
name = "insert gland"
- implements = list(/obj/item/organ/internal/heart/gland = 100)
+ implements = list(/obj/item/organ/heart/gland = 100)
time = 32
/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -59,6 +59,6 @@
/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("You insert [tool] into [target]."))
user.temporarilyRemoveItemFromInventory(tool, TRUE)
- var/obj/item/organ/internal/heart/gland/gland = tool
+ var/obj/item/organ/heart/gland/gland = tool
gland.Insert(target, 2)
return 1
diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
index 9f6d10677d198..d70dc3f0e6723 100644
--- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
+++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
@@ -178,7 +178,7 @@
/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user)
if(iscarbon(target))
var/mob/living/carbon/carbon_target = target
- var/obj/item/organ/internal/heart/gland/target_gland = carbon_target.get_organ_slot("heart")
+ var/obj/item/organ/heart/gland/target_gland = carbon_target.get_organ_slot("heart")
if(!istype(target_gland))
to_chat(user, span_warning("Your target does not have an experimental gland!"))
return
@@ -448,7 +448,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
species = span_notice("[human_victim.dna.species.name]")
if(IS_CHANGELING(human_victim))
species = span_warning("Changeling lifeform")
- var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs
+ var/obj/item/organ/heart/gland/temp = locate() in human_victim.organs
if(temp)
helptext = span_warning("Experimental gland detected!")
else
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index d1f240b7f6821..b991a16b8318d 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland
+/obj/item/organ/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/antags/abductor.dmi'
@@ -22,31 +22,31 @@
var/mind_control_duration = 1800
var/active_mind_control = FALSE
-/obj/item/organ/internal/heart/gland/Initialize(mapload)
+/obj/item/organ/heart/gland/Initialize(mapload)
. = ..()
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
AddElement(/datum/element/update_icon_blocker)
-/obj/item/organ/internal/heart/gland/examine(mob/user)
+/obj/item/organ/heart/gland/examine(mob/user)
. = ..()
if(HAS_MIND_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || isobserver(user))
. += span_notice("It is \a [abductor_hint]")
-/obj/item/organ/internal/heart/gland/Stop()
+/obj/item/organ/heart/gland/Stop()
return FALSE
-/obj/item/organ/internal/heart/gland/proc/ownerCheck()
+/obj/item/organ/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return TRUE
if(!human_only && iscarbon(owner))
return TRUE
return FALSE
-/obj/item/organ/internal/heart/gland/proc/Start()
+/obj/item/organ/heart/gland/proc/Start()
active = 1
COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high))
-/obj/item/organ/internal/heart/gland/proc/update_gland_hud()
+/obj/item/organ/heart/gland/proc/update_gland_hud()
if(!owner)
return
var/image/holder = owner.hud_list[GLAND_HUD]
@@ -59,7 +59,7 @@
else
holder.icon_state = "hudgland_spent"
-/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user)
+/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
return FALSE
mind_control_uses--
@@ -75,7 +75,7 @@
addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration)
return TRUE
-/obj/item/organ/internal/heart/gland/proc/clear_mind_control()
+/obj/item/organ/heart/gland/proc/clear_mind_control()
if(!ownerCheck() || !active_mind_control)
return FALSE
owner.balloon_alert(owner, "compulsion forgotten")
@@ -84,7 +84,7 @@
active_mind_control = FALSE
return TRUE
-/obj/item/organ/internal/heart/gland/mob_remove(mob/living/carbon/gland_owner, special, movement_flags)
+/obj/item/organ/heart/gland/mob_remove(mob/living/carbon/gland_owner, special, movement_flags)
. = ..()
active = FALSE
if(initial(uses) == 1)
@@ -93,7 +93,7 @@
hud.remove_atom_from_hud(gland_owner)
clear_mind_control()
-/obj/item/organ/internal/heart/gland/mob_insert(mob/living/carbon/gland_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+/obj/item/organ/heart/gland/mob_insert(mob/living/carbon/gland_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
. = ..()
if(special != 2 && uses) // Special 2 means abductor surgery
@@ -102,7 +102,7 @@
hud.add_atom_to_hud(gland_owner)
update_gland_hud()
-/obj/item/organ/internal/heart/gland/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/gland/on_life(seconds_per_tick, times_fired)
if(!active)
return
if(!ownerCheck())
@@ -115,5 +115,5 @@
if(!uses)
active = FALSE
-/obj/item/organ/internal/heart/gland/proc/activate()
+/obj/item/organ/heart/gland/proc/activate()
return
diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm
index 8e8ff9a7ef9c9..29be30c0cfcff 100644
--- a/code/modules/antagonists/abductor/equipment/glands/access.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/access.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/access
+/obj/item/organ/heart/gland/access
abductor_hint = "anagraphic electro-scrambler. After it activates, grants the abductee intrinsic all access."
cooldown_low = 600
cooldown_high = 1200
@@ -7,6 +7,6 @@
mind_control_uses = 3
mind_control_duration = 900
-/obj/item/organ/internal/heart/gland/access/activate()
+/obj/item/organ/heart/gland/access/activate()
to_chat(owner, span_notice("You feel like a VIP for some reason."))
owner.AddComponent(/datum/component/simple_access, SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)), src)
diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm
index 522354fac3ac5..b1d408526733f 100644
--- a/code/modules/antagonists/abductor/equipment/glands/blood.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/blood.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/blood
+/obj/item/organ/heart/gland/blood
abductor_hint = "pseudonuclear hemo-destabilizer. Periodically randomizes the abductee's bloodtype into a random reagent."
cooldown_low = 1200
cooldown_high = 1800
@@ -9,7 +9,7 @@
mind_control_uses = 3
mind_control_duration = 1500
-/obj/item/organ/internal/heart/gland/blood/activate()
+/obj/item/organ/heart/gland/blood/activate()
if(!ishuman(owner) || !owner.dna.species)
return
var/mob/living/carbon/human/H = owner
diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm
index 965d8f2fc201a..54644bd8e9f3d 100644
--- a/code/modules/antagonists/abductor/equipment/glands/chem.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/chem.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/chem
+/obj/item/organ/heart/gland/chem
abductor_hint = "intrinsic pharma-provider. The abductee constantly produces random chemicals inside their bloodstream. They also quickly regenerate toxin damage."
cooldown_low = 50
cooldown_high = 50
@@ -8,12 +8,12 @@
mind_control_duration = 1200
var/list/possible_reagents = list()
-/obj/item/organ/internal/heart/gland/chem/Initialize(mapload)
+/obj/item/organ/heart/gland/chem/Initialize(mapload)
. = ..()
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
possible_reagents += R
-/obj/item/organ/internal/heart/gland/chem/activate()
+/obj/item/organ/heart/gland/chem/activate()
var/chem_to_add = pick(possible_reagents)
owner.reagents.add_reagent(chem_to_add, 2)
owner.adjustToxLoss(-5, forced = TRUE)
diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm
index 938caeeb36126..67c3efd42cbef 100644
--- a/code/modules/antagonists/abductor/equipment/glands/egg.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/egg.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/egg
+/obj/item/organ/heart/gland/egg
abductor_hint = "roe/enzymatic synthesizer. The abductee will periodically lay eggs filled with random reagents."
cooldown_low = 300
cooldown_high = 400
@@ -9,7 +9,7 @@
mind_control_uses = 2
mind_control_duration = 1800
-/obj/item/organ/internal/heart/gland/egg/activate()
+/obj/item/organ/heart/gland/egg/activate()
owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]"))
var/turf/T = owner.drop_location()
new /obj/item/food/egg/gland(T)
diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm
index e0b3df0f19c32..77c6cfdfeec25 100644
--- a/code/modules/antagonists/abductor/equipment/glands/electric.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/electric
+/obj/item/organ/heart/gland/electric
abductor_hint = "electron accumulator/discharger. The abductee becomes fully immune to electric shocks. Additionally, they will randomly discharge electric bolts."
cooldown_low = 800
cooldown_high = 1200
@@ -7,20 +7,20 @@
mind_control_uses = 2
mind_control_duration = 900
-/obj/item/organ/internal/heart/gland/electric/on_mob_insert(mob/living/carbon/gland_owner)
+/obj/item/organ/heart/gland/electric/on_mob_insert(mob/living/carbon/gland_owner)
. = ..()
ADD_TRAIT(gland_owner, TRAIT_SHOCKIMMUNE, ABDUCTOR_GLAND_TRAIT)
-/obj/item/organ/internal/heart/gland/electric/on_mob_remove(mob/living/carbon/gland_owner)
+/obj/item/organ/heart/gland/electric/on_mob_remove(mob/living/carbon/gland_owner)
. = ..()
REMOVE_TRAIT(gland_owner, TRAIT_SHOCKIMMUNE, ABDUCTOR_GLAND_TRAIT)
-/obj/item/organ/internal/heart/gland/electric/activate()
+/obj/item/organ/heart/gland/electric/activate()
owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\
span_warning("You feel electric energy building up inside you!"))
playsound(get_turf(owner), SFX_SPARKS, 100, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE)
addtimer(CALLBACK(src, PROC_REF(zap)), rand(3 SECONDS, 10 SECONDS))
-/obj/item/organ/internal/heart/gland/electric/proc/zap()
+/obj/item/organ/heart/gland/electric/proc/zap()
tesla_zap(source = owner, zap_range = 4, power = 8e3, cutoff = 1e3, zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN)
playsound(get_turf(owner), 'sound/effects/magic/lightningshock.ogg', 50, TRUE)
diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm
index 83ba7a7ffbdf2..13761ba0cdba3 100644
--- a/code/modules/antagonists/abductor/equipment/glands/heal.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm
@@ -1,6 +1,6 @@
#define REJECTION_VOMIT_FLAGS (MOB_VOMIT_BLOOD | MOB_VOMIT_STUN | MOB_VOMIT_KNOCKDOWN | MOB_VOMIT_FORCE)
-/obj/item/organ/internal/heart/gland/heal
+/obj/item/organ/heart/gland/heal
abductor_hint = "organic replicator. Forcibly ejects damaged and robotic organs from the abductee and regenerates them. Additionally, forcibly removes reagents (via vomit) from the abductee if they have moderate toxin damage or poison within the bloodstream, and regenerates blood to a healthy threshold if too low. The abductee will also reject implants such as mindshields."
cooldown_low = 200
cooldown_high = 400
@@ -10,7 +10,7 @@
mind_control_uses = 3
mind_control_duration = 3000
-/obj/item/organ/internal/heart/gland/heal/activate()
+/obj/item/organ/heart/gland/heal/activate()
if(!(owner.mob_biotypes & MOB_ORGANIC))
return
@@ -19,31 +19,31 @@
return
for(var/organ in owner.organs)
- if(istype(organ, /obj/item/organ/internal/cyberimp))
+ if(istype(organ, /obj/item/organ/cyberimp))
reject_cyberimp(organ)
return
- var/obj/item/organ/internal/appendix/appendix = owner.get_organ_slot(ORGAN_SLOT_APPENDIX)
+ var/obj/item/organ/appendix/appendix = owner.get_organ_slot(ORGAN_SLOT_APPENDIX)
if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || IS_ROBOTIC_ORGAN(appendix))))
replace_appendix(appendix)
return
- var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER)
if((!liver && !HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || IS_ROBOTIC_ORGAN(liver))))
replace_liver(liver)
return
- var/obj/item/organ/internal/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS)
if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || IS_ROBOTIC_ORGAN(lungs))))
replace_lungs(lungs)
return
- var/obj/item/organ/internal/stomach/stomach = owner.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/stomach = owner.get_organ_slot(ORGAN_SLOT_STOMACH)
if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || IS_ROBOTIC_ORGAN(stomach))))
replace_stomach(stomach)
return
- var/obj/item/organ/internal/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || IS_ROBOTIC_ORGAN(eyes))))
replace_eyes(eyes)
return
@@ -78,19 +78,19 @@
replace_chest(chest)
return
-/obj/item/organ/internal/heart/gland/heal/proc/reject_implant(obj/item/implant/implant)
+/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/implant/implant)
owner.visible_message(span_warning("[owner] vomits up a tiny mangled implant!"), span_userdanger("You suddenly vomit up a tiny mangled implant!"))
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
implant.removed(owner)
qdel(implant)
-/obj/item/organ/internal/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/internal/cyberimp/implant)
+/obj/item/organ/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/cyberimp/implant)
owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_userdanger("You suddenly vomit up your [implant.name]!"))
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
implant.Remove(owner)
implant.forceMove(owner.drop_location())
-/obj/item/organ/internal/heart/gland/heal/proc/replace_appendix(obj/item/organ/internal/appendix/appendix)
+/obj/item/organ/heart/gland/heal/proc/replace_appendix(obj/item/organ/appendix/appendix)
if(appendix)
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
appendix.Remove(owner)
@@ -99,13 +99,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
- var/appendix_type = /obj/item/organ/internal/appendix
+ var/appendix_type = /obj/item/organ/appendix
if(owner?.dna?.species?.mutantappendix)
appendix_type = owner.dna.species.mutantappendix
- var/obj/item/organ/internal/appendix/new_appendix = new appendix_type()
+ var/obj/item/organ/appendix/new_appendix = new appendix_type()
new_appendix.Insert(owner)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_liver(obj/item/organ/internal/liver/liver)
+/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
if(liver)
owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_userdanger("You suddenly vomit up your [liver.name]!"))
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
@@ -114,13 +114,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
- var/liver_type = /obj/item/organ/internal/liver
+ var/liver_type = /obj/item/organ/liver
if(owner?.dna?.species?.mutantliver)
liver_type = owner.dna.species.mutantliver
- var/obj/item/organ/internal/liver/new_liver = new liver_type()
+ var/obj/item/organ/liver/new_liver = new liver_type()
new_liver.Insert(owner)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_lungs(obj/item/organ/internal/lungs/lungs)
+/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs)
if(lungs)
owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_userdanger("You suddenly vomit up your [lungs.name]!"))
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
@@ -129,13 +129,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble inside your chest..."))
- var/lung_type = /obj/item/organ/internal/lungs
+ var/lung_type = /obj/item/organ/lungs
if(owner.dna.species && owner.dna.species.mutantlungs)
lung_type = owner.dna.species.mutantlungs
- var/obj/item/organ/internal/lungs/new_lungs = new lung_type()
+ var/obj/item/organ/lungs/new_lungs = new lung_type()
new_lungs.Insert(owner)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_stomach(obj/item/organ/internal/stomach/stomach)
+/obj/item/organ/heart/gland/heal/proc/replace_stomach(obj/item/organ/stomach/stomach)
if(stomach)
owner.visible_message(span_warning("[owner] vomits up his [stomach.name]!"), span_userdanger("You suddenly vomit up your [stomach.name]!"))
owner.vomit(REJECTION_VOMIT_FLAGS, lost_nutrition = 0)
@@ -144,13 +144,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
- var/stomach_type = /obj/item/organ/internal/stomach
+ var/stomach_type = /obj/item/organ/stomach
if(owner?.dna?.species?.mutantstomach)
stomach_type = owner.dna.species.mutantstomach
- var/obj/item/organ/internal/stomach/new_stomach = new stomach_type()
+ var/obj/item/organ/stomach/new_stomach = new stomach_type()
new_stomach.Insert(owner)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_eyes(obj/item/organ/internal/eyes/eyes)
+/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
if(eyes)
owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_userdanger("Your [eyes.name] fall out of their sockets!"))
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
@@ -161,15 +161,15 @@
addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(10 SECONDS, 20 SECONDS))
-/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_eyes()
- var/eye_type = /obj/item/organ/internal/eyes
+/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes()
+ var/eye_type = /obj/item/organ/eyes
if(owner.dna.species && owner.dna.species.mutanteyes)
eye_type = owner.dna.species.mutanteyes
- var/obj/item/organ/internal/eyes/new_eyes = new eye_type()
+ var/obj/item/organ/eyes/new_eyes = new eye_type()
new_eyes.Insert(owner)
owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_userdanger("A pair of new eyes suddenly inflates into your eye sockets!"))
-/obj/item/organ/internal/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
+/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
if(limb)
owner.visible_message(span_warning("[owner]'s [limb.plaintext_zone] suddenly detaches from [owner.p_their()] body!"), span_userdanger("Your [limb.plaintext_zone] suddenly detaches from your body!"))
playsound(owner, SFX_DESECRATION, 50, TRUE, -1)
@@ -179,18 +179,18 @@
addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(15 SECONDS, 30 SECONDS))
-/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_limb(body_zone)
+/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone)
owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"),
span_userdanger("With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!"),
span_warning("Your hear a loud snap."))
playsound(owner, 'sound/effects/magic/demon_consume.ogg', 50, TRUE)
owner.regenerate_limb(body_zone)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_blood()
+/obj/item/organ/heart/gland/heal/proc/replace_blood()
owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_userdanger("You suddenly start vomiting huge amounts of blood!"))
keep_replacing_blood()
-/obj/item/organ/internal/heart/gland/heal/proc/keep_replacing_blood()
+/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood()
var/keep_going = FALSE
owner.vomit(vomit_flags = (MOB_VOMIT_BLOOD | MOB_VOMIT_FORCE), lost_nutrition = 0, distance = 3)
owner.Stun(15)
@@ -209,7 +209,7 @@
if(keep_going)
addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 3 SECONDS)
-/obj/item/organ/internal/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
+/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
if(!IS_ORGANIC_LIMB(chest))
owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_userdanger("Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!"))
playsound(owner, 'sound/effects/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE)
diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm
index 1a3f140c3415d..a4aa88b8da974 100644
--- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/mindshock
+/obj/item/organ/heart/gland/mindshock
abductor_hint = "neural crosstalk uninhibitor. The abductee emits a disrupting psychic wave every so often. This will either stun, cause hallucinations or deal random brain damage to people nearby."
cooldown_low = 40 SECONDS
cooldown_high = 70 SECONDS
@@ -8,7 +8,7 @@
mind_control_duration = 120 SECONDS
var/list/mob/living/carbon/human/broadcasted_mobs = list()
-/obj/item/organ/internal/heart/gland/mindshock/activate()
+/obj/item/organ/heart/gland/mindshock/activate()
to_chat(owner, span_notice("You get a headache."))
var/turf/owner_turf = get_turf(owner)
@@ -30,7 +30,7 @@
if(3)
target.adjust_hallucinations(120 SECONDS)
-/obj/item/organ/internal/heart/gland/mindshock/mind_control(command, mob/living/user)
+/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
return FALSE
mind_control_uses--
@@ -62,7 +62,7 @@
update_gland_hud()
return TRUE
-/obj/item/organ/internal/heart/gland/mindshock/clear_mind_control()
+/obj/item/organ/heart/gland/mindshock/clear_mind_control()
if(!active_mind_control || !LAZYLEN(broadcasted_mobs))
return FALSE
for(var/target_mob in broadcasted_mobs)
diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm
index 76cd806bb42b8..6b4a6150f748b 100644
--- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/plasma.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/plasma
+/obj/item/organ/heart/gland/plasma
abductor_hint = "effluvium sanguine-synonym emitter. The abductee randomly emits clouds of plasma."
cooldown_low = 1200
cooldown_high = 1800
@@ -7,12 +7,12 @@
mind_control_uses = 1
mind_control_duration = 800
-/obj/item/organ/internal/heart/gland/plasma/activate()
+/obj/item/organ/heart/gland/plasma/activate()
to_chat(owner, span_warning("You feel bloated."))
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_userdanger("A massive stomachache overcomes you.")), 15 SECONDS)
addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 20 SECONDS)
-/obj/item/organ/internal/heart/gland/plasma/proc/vomit_plasma()
+/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
if(!owner)
return
owner.visible_message(span_danger("[owner] vomits a cloud of plasma!"))
diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm
index a2a4a9149e741..1991287981c0d 100644
--- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/quantum
+/obj/item/organ/heart/gland/quantum
abductor_hint = "quantic de-observation matrix. Periodically links with a random person in view, then the abductee later swaps positions with that person."
cooldown_low = 150
cooldown_high = 150
@@ -8,7 +8,7 @@
mind_control_duration = 1200
var/mob/living/carbon/entangled_mob
-/obj/item/organ/internal/heart/gland/quantum/activate()
+/obj/item/organ/heart/gland/quantum/activate()
if(entangled_mob)
return
for(var/mob/M in oview(owner, 7))
@@ -18,7 +18,7 @@
addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(1 MINUTES, 4 MINUTES))
return
-/obj/item/organ/internal/heart/gland/quantum/proc/quantum_swap()
+/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
if(QDELETED(entangled_mob))
entangled_mob = null
return
@@ -30,7 +30,7 @@
if(!active_mind_control) //Do not reset entangled mob while mind control is active
entangled_mob = null
-/obj/item/organ/internal/heart/gland/quantum/mind_control(command, mob/living/user)
+/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user)
if(..())
if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD))
to_chat(entangled_mob, span_userdanger("You suddenly feel an irresistible compulsion to follow an order..."))
@@ -41,7 +41,7 @@
user.log_message("mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]", LOG_GAME)
update_gland_hud()
-/obj/item/organ/internal/heart/gland/quantum/clear_mind_control()
+/obj/item/organ/heart/gland/quantum/clear_mind_control()
if(active_mind_control)
to_chat(entangled_mob, span_userdanger("You feel the compulsion fade, and you completely forget about your previous orders."))
entangled_mob.clear_alert(ALERT_MIND_CONTROL)
diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm
index 6d3287ecae632..252afdaa45efa 100644
--- a/code/modules/antagonists/abductor/equipment/glands/slime.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/slime
+/obj/item/organ/heart/gland/slime
abductor_hint = "gastric animation galvanizer. The abductee occasionally vomits slimes. Slimes will no longer attack the abductee."
cooldown_low = 600
cooldown_high = 1200
@@ -7,17 +7,17 @@
mind_control_uses = 1
mind_control_duration = 2400
-/obj/item/organ/internal/heart/gland/slime/on_mob_insert(mob/living/carbon/gland_owner)
+/obj/item/organ/heart/gland/slime/on_mob_insert(mob/living/carbon/gland_owner)
. = ..()
gland_owner.faction |= FACTION_SLIME
gland_owner.grant_language(/datum/language/slime, source = LANGUAGE_GLAND)
-/obj/item/organ/internal/heart/gland/slime/on_mob_remove(mob/living/carbon/gland_owner)
+/obj/item/organ/heart/gland/slime/on_mob_remove(mob/living/carbon/gland_owner)
. = ..()
gland_owner.faction -= FACTION_SLIME
gland_owner.remove_language(/datum/language/slime, source = LANGUAGE_GLAND)
-/obj/item/organ/internal/heart/gland/slime/activate()
+/obj/item/organ/heart/gland/slime/activate()
to_chat(owner, span_warning("You feel nauseated!"))
owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20)
diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm
index 52ff520a876ad..44150d9ed8076 100644
--- a/code/modules/antagonists/abductor/equipment/glands/spider.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/spiderman
+/obj/item/organ/heart/gland/spiderman
abductor_hint = "araneae cloister accelerator. The abductee occasionally exhales spider pheromones and will spawn spiderlings."
cooldown_low = 450
cooldown_high = 900
@@ -7,7 +7,7 @@
mind_control_uses = 2
mind_control_duration = 2400
-/obj/item/organ/internal/heart/gland/spiderman/activate()
+/obj/item/organ/heart/gland/spiderman/activate()
to_chat(owner, span_warning("You feel something crawling in your skin."))
owner.faction |= FACTION_SPIDER
var/mob/living/basic/spider/growing/spiderling/spider = new(owner.drop_location())
diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm
index 3ea10c7725579..f13418a9082a1 100644
--- a/code/modules/antagonists/abductor/equipment/glands/transform.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/transform.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/transform
+/obj/item/organ/heart/gland/transform
abductor_hint = "anthropmorphic transmorphosizer. The abductee will occasionally change appearance and species."
cooldown_low = 900
cooldown_high = 1800
@@ -8,7 +8,7 @@
mind_control_uses = 7
mind_control_duration = 300
-/obj/item/organ/internal/heart/gland/transform/activate()
+/obj/item/organ/heart/gland/transform/activate()
to_chat(owner, span_notice("You feel unlike yourself."))
randomize_human(owner)
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly))
diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm
index 5fab30332ef57..844cc795a944a 100644
--- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/trauma.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/trauma
+/obj/item/organ/heart/gland/trauma
abductor_hint = "white matter randomiser. The abductee occasionally gains a random brain trauma, up to five times. The traumas can range from basic to deep-rooted."
cooldown_low = 800
cooldown_high = 1200
@@ -7,7 +7,7 @@
mind_control_uses = 3
mind_control_duration = 1800
-/obj/item/organ/internal/heart/gland/trauma/activate()
+/obj/item/organ/heart/gland/trauma/activate()
to_chat(owner, span_warning("You feel a spike of pain in your head."))
if(prob(33))
owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
index c7e3a74e4f99e..ed0cc5bbed2d8 100644
--- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/ventcrawling
+/obj/item/organ/heart/gland/ventcrawling
abductor_hint = "pliant cartilage enabler. The abductee can crawl through vents without trouble."
cooldown_low = 1800
cooldown_high = 2400
@@ -7,6 +7,6 @@
mind_control_uses = 4
mind_control_duration = 1800
-/obj/item/organ/internal/heart/gland/ventcrawling/activate()
+/obj/item/organ/heart/gland/ventcrawling/activate()
to_chat(owner, span_notice("You feel very stretchy."))
ADD_TRAIT(owner, TRAIT_VENTCRAWLER_ALWAYS, type)
diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm
index c3d82af967403..9aa4a26e549e5 100644
--- a/code/modules/antagonists/abductor/equipment/glands/viral.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/viral.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/gland/viral
+/obj/item/organ/heart/gland/viral
abductor_hint = "contamination incubator. The abductee becomes a carrier of a random advanced disease - of which they are unaffected by."
cooldown_low = 1800
cooldown_high = 2400
@@ -7,13 +7,13 @@
mind_control_uses = 1
mind_control_duration = 1800
-/obj/item/organ/internal/heart/gland/viral/activate()
+/obj/item/organ/heart/gland/viral/activate()
to_chat(owner, span_warning("You feel sick."))
var/datum/disease/advance/A = random_virus(pick(2,6),6)
A.carrier = TRUE
owner.ForceContractDisease(A, FALSE, TRUE)
-/obj/item/organ/internal/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
+/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
max_symptoms = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/A = new /datum/disease/advance()
diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm
index b133bf3f8a5ec..aa6ef608f6c8f 100644
--- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
name = "Superlingual Matrix"
description = "A mysterious structure that allows for instant communication between users. Using it inhand will attune it to your mothership's channel. Pretty impressive until you need to eat something."
id = "superlingual_matrix"
- build_path = list(/obj/item/organ/internal/tongue/abductor = 1)
+ build_path = list(/obj/item/organ/tongue/abductor = 1)
category = CATEGORY_MISC_GEAR
/datum/abductor_gear/mental_interface
diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm
index 416153c50e58f..8254247f9dd99 100644
--- a/code/modules/antagonists/abductor/machinery/dispenser.dm
+++ b/code/modules/antagonists/abductor/machinery/dispenser.dm
@@ -14,7 +14,7 @@
/obj/machinery/abductor/gland_dispenser/Initialize(mapload)
. = ..()
- gland_types = subtypesof(/obj/item/organ/internal/heart/gland)
+ gland_types = subtypesof(/obj/item/organ/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
amounts = new/list(gland_types.len)
@@ -62,7 +62,7 @@
return TRUE
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/organ/internal/heart/gland))
+ if(istype(W, /obj/item/organ/heart/gland))
if(!user.transferItemToLoc(W, src))
return
for(var/i in 1 to gland_colors.len)
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
index c4e59c505bf04..324ec4381e17f 100644
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ b/code/modules/antagonists/abductor/machinery/experiment.dm
@@ -137,7 +137,7 @@
if(occupant.stat == DEAD)
say("Specimen deceased - please provide fresh sample.")
return "Specimen deceased."
- var/obj/item/organ/internal/heart/gland/GlandTest = locate() in occupant.organs
+ var/obj/item/organ/heart/gland/GlandTest = locate() in occupant.organs
if(!GlandTest)
say("Experimental dissection not detected!")
return "No glands detected!"
@@ -158,7 +158,7 @@
user_abductor.team.abductees += occupant.mind
occupant.mind.add_antag_datum(/datum/antagonist/abductee)
- for(var/obj/item/organ/internal/heart/gland/G in occupant.organs)
+ for(var/obj/item/organ/heart/gland/G in occupant.organs)
G.Start()
point_reward++
if(point_reward > 0)
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index a7cecf1f134e2..70c9081c52ea9 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -143,6 +143,7 @@
RegisterSignal(living_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_fullhealed))
RegisterSignal(living_mob, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item))
RegisterSignals(living_mob, list(COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON), PROC_REF(on_click_sting))
+ ADD_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT)
if(living_mob.hud_used)
var/datum/hud/hud_used = living_mob.hud_used
@@ -160,7 +161,7 @@
make_brain_decoy(living_mob)
/datum/antagonist/changeling/proc/make_brain_decoy(mob/living/ling)
- var/obj/item/organ/internal/brain/our_ling_brain = ling.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/our_ling_brain = ling.get_organ_slot(ORGAN_SLOT_BRAIN)
if(isnull(our_ling_brain) || our_ling_brain.decoy_override)
return
@@ -201,6 +202,7 @@
var/mob/living/living_mob = mob_override || owner.current
handle_clown_mutation(living_mob, removing = FALSE)
UnregisterSignal(living_mob, list(COMSIG_MOB_LOGIN, COMSIG_LIVING_LIFE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON))
+ REMOVE_TRAIT(living_mob, TRAIT_FAKE_SOULLESS, CHANGELING_TRAIT)
if(living_mob.hud_used)
var/datum/hud/hud_used = living_mob.hud_used
diff --git a/code/modules/antagonists/changeling/headslug_eggs.dm b/code/modules/antagonists/changeling/headslug_eggs.dm
index 75c0881c55167..e2238d9d7e703 100644
--- a/code/modules/antagonists/changeling/headslug_eggs.dm
+++ b/code/modules/antagonists/changeling/headslug_eggs.dm
@@ -1,7 +1,7 @@
#define EGG_INCUBATION_TIME (4 MINUTES)
/// The actual organ that the changeling headslug implants into a dead host.
-/obj/item/organ/internal/body_egg/changeling_egg
+/obj/item/organ/body_egg/changeling_egg
name = "changeling egg"
desc = "Twitching and disgusting."
/// The mind of the original changeling that gave forth to the headslug mob.
@@ -11,20 +11,20 @@
/// When this egg last got removed from a body. If -1, the egg hasn't been removed from a body.
var/removal_time = -1
-/obj/item/organ/internal/body_egg/changeling_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+/obj/item/organ/body_egg/changeling_egg/mob_insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED)
. = ..()
hatch_time = world.time + (removal_time == -1 ? EGG_INCUBATION_TIME : (hatch_time - removal_time))
-/obj/item/organ/internal/body_egg/changeling_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags)
+/obj/item/organ/body_egg/changeling_egg/mob_remove(mob/living/carbon/egg_owner, special, movement_flags)
. = ..()
removal_time = world.time
-/obj/item/organ/internal/body_egg/changeling_egg/egg_process(seconds_per_tick, times_fired)
+/obj/item/organ/body_egg/changeling_egg/egg_process(seconds_per_tick, times_fired)
if(owner && hatch_time <= world.time)
pop()
/// Once the egg is fully grown, we gib the host and spawn a monkey (with the changeling's player controlling it). Very descriptive proc name.
-/obj/item/organ/internal/body_egg/changeling_egg/proc/pop()
+/obj/item/organ/body_egg/changeling_egg/proc/pop()
var/mob/living/carbon/human/spawned_monkey = new(owner)
spawned_monkey.set_species(/datum/species/monkey)
diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
index dec2fa6a76e16..52a5d371cf005 100644
--- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
+++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm
@@ -16,7 +16,7 @@
/datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes.
. = ..()
- var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
RegisterSignal(user, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(eye_implanted))
RegisterSignal(user, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(eye_removed))
if(!isnull(ling_eyes))
@@ -27,7 +27,7 @@
if(!istype(user))
return FALSE
- var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
if(isnull(ling_eyes))
user.balloon_alert(user, "no eyes!")
return FALSE
@@ -50,7 +50,7 @@
return TRUE
/datum/action/changeling/augmented_eyesight/Remove(mob/user)
- var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
if(!isnull(ling_eyes))
ling_eyes.flash_protect = initial(ling_eyes.flash_protect)
@@ -64,7 +64,7 @@
/datum/action/changeling/augmented_eyesight/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/ling_eyes = gained
+ var/obj/item/organ/eyes/ling_eyes = gained
if(!istype(ling_eyes))
return
if(active)
@@ -76,7 +76,7 @@
/datum/action/changeling/augmented_eyesight/proc/eye_removed(mob/living/source, obj/item/organ/removed, special)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/ling_eyes = removed
+ var/obj/item/organ/eyes/ling_eyes = removed
if(!istype(ling_eyes))
return
ling_eyes.flash_protect = initial(ling_eyes.flash_protect)
diff --git a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm
index c33b36a785f38..bd498b584820d 100644
--- a/code/modules/antagonists/changeling/powers/darkness_adaptation.dm
+++ b/code/modules/antagonists/changeling/powers/darkness_adaptation.dm
@@ -37,7 +37,7 @@
animate(cling, color = COLOR_DARK, time = 3 SECONDS) // Darkens their overall appearance
var/datum/antagonist/changeling/changeling_data = cling.mind?.has_antag_datum(/datum/antagonist/changeling)
changeling_data?.chem_recharge_slowdown -= recharge_slowdown //Slows down chem regeneration
- var/obj/item/organ/internal/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/eyes)
if(!istype(eyes))
return
eyes.lighting_cutoff = LIGHTING_CUTOFF_MEDIUM // Adds barely usable, kinda shit night vision
@@ -53,7 +53,7 @@
animate(cling, color = null, time = 3 SECONDS)
var/datum/antagonist/changeling/changeling_data = cling.mind?.has_antag_datum(/datum/antagonist/changeling)
changeling_data?.chem_recharge_slowdown += recharge_slowdown
- var/obj/item/organ/internal/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes = cling.get_organ_by_type(/obj/item/organ/eyes)
if(!istype(eyes))
return
eyes.lighting_cutoff = LIGHTING_CUTOFF_VISIBLE
@@ -64,7 +64,7 @@
/datum/action/changeling/darkness_adaptation/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/eyes = gained
+ var/obj/item/organ/eyes/eyes = gained
if(!istype(eyes))
return
if(is_active)
@@ -76,7 +76,7 @@
/datum/action/changeling/darkness_adaptation/proc/eye_removed(mob/living/source, obj/item/organ/removed, special)
SIGNAL_HANDLER
- var/obj/item/organ/internal/eyes/eyes = removed
+ var/obj/item/organ/eyes/eyes = removed
if(!istype(eyes))
return
eyes.flash_protect = initial(eyes.flash_protect)
diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm
index c4f2376f755a0..1af11d3ad15ef 100644
--- a/code/modules/antagonists/changeling/powers/headcrab.dm
+++ b/code/modules/antagonists/changeling/powers/headcrab.dm
@@ -22,7 +22,7 @@
explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src)
for(var/mob/living/carbon/human/blinded_human in range(2, user))
- var/obj/item/organ/internal/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes || blinded_human.is_blind())
continue
to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!"))
diff --git a/code/modules/antagonists/changeling/powers/mmi_talk.dm b/code/modules/antagonists/changeling/powers/mmi_talk.dm
index 2fe90d0831816..ecd64890c422b 100644
--- a/code/modules/antagonists/changeling/powers/mmi_talk.dm
+++ b/code/modules/antagonists/changeling/powers/mmi_talk.dm
@@ -15,7 +15,7 @@
* Set when created via the ling decoy component.
* If the brain ends up being qdelled, this action will also be qdelled, and thus this ref is cleared.
*/
- VAR_FINAL/obj/item/organ/internal/brain/brain_ref
+ VAR_FINAL/obj/item/organ/brain/brain_ref
/// A map view of the area around the MMI.
VAR_FINAL/atom/movable/screen/map_view/mmi_view
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index f6b42bf19f212..158b32df216f0 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -632,7 +632,7 @@
/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, params)
. = ..()
- if(!istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core/legion) || !holds_reagents)
+ if(!istype(attacking_item, /obj/item/organ/monster_core/regenerative_core/legion) || !holds_reagents)
return
visible_message(span_boldwarning("As [user] shoves [attacking_item] into [src], [src] begins to mutate."))
var/mob/living/carbon/wearer = loc
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 68689ee65d4dc..886417a61cdd2 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -12,9 +12,9 @@
to_chat(user, span_notice("We cleanse impurities from our form."))
..()
var/list/bad_organs = list(
- user.get_organ_by_type(/obj/item/organ/internal/body_egg),
- user.get_organ_by_type(/obj/item/organ/internal/legion_tumour),
- user.get_organ_by_type(/obj/item/organ/internal/zombie_infection),
+ user.get_organ_by_type(/obj/item/organ/body_egg),
+ user.get_organ_by_type(/obj/item/organ/legion_tumour),
+ user.get_organ_by_type(/obj/item/organ/zombie_infection),
)
for(var/o in bad_organs)
diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm
index 8873ef73a49fe..b6d6f550d0522 100644
--- a/code/modules/antagonists/changeling/powers/shriek.dm
+++ b/code/modules/antagonists/changeling/powers/shriek.dm
@@ -18,7 +18,7 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!IS_CHANGELING(C))
- var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS)
if(ears)
ears.adjustEarDamage(0, 30)
C.adjust_confusion(25 SECONDS)
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index 3e1cb7276b7f1..739eb3ec2eba1 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -234,7 +234,7 @@
dna_cost = 1
/datum/action/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes)
user.balloon_alert(user, "no eyes!")
return FALSE
diff --git a/code/modules/antagonists/clown_ops/clownop.dm b/code/modules/antagonists/clown_ops/clownop.dm
index 8dbcb3c232d96..2fd2daa7489df 100644
--- a/code/modules/antagonists/clown_ops/clownop.dm
+++ b/code/modules/antagonists/clown_ops/clownop.dm
@@ -29,7 +29,7 @@
/datum/antagonist/nukeop/clownop/equip_op()
. = ..()
var/mob/living/current_mob = owner.current
- var/obj/item/organ/internal/liver/liver = current_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = current_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver)
ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT)
@@ -61,7 +61,7 @@
/datum/antagonist/nukeop/leader/clownop/equip_op()
. = ..()
var/mob/living/L = owner.current
- var/obj/item/organ/internal/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = L.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver)
ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, CLOWNOP_TRAIT)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index e334b17e3603a..af7254119ddc5 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -1092,7 +1092,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
/mob/living/carbon/human/cult_ghost/get_organs_for_zone(zone, include_children)
. = ..()
- for(var/obj/item/organ/internal/brain/B in .) //they're not that smart, really
+ for(var/obj/item/organ/brain/B in .) //they're not that smart, really
. -= B
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
index bbd1fc9ee03a5..5b73476a3afae 100644
--- a/code/modules/antagonists/fugitive/fugitive_outfits.dm
+++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm
@@ -66,7 +66,7 @@
/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visuals_only = FALSE)
if(visuals_only)
return
- var/obj/item/organ/internal/eyes/robotic/glow/eyes = new()
+ var/obj/item/organ/eyes/robotic/glow/eyes = new()
eyes.Insert(H, movement_flags = DELETE_IF_REPLACED)
/datum/outfit/invisible_man
diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm
index fcdb1f1945828..79c7197df40fd 100644
--- a/code/modules/antagonists/heretic/heretic_knowledge.dm
+++ b/code/modules/antagonists/heretic/heretic_knowledge.dm
@@ -615,15 +615,15 @@
/datum/heretic_knowledge/knowledge_ritual/New()
. = ..()
var/static/list/potential_organs = list(
- /obj/item/organ/internal/appendix,
- /obj/item/organ/external/tail,
- /obj/item/organ/internal/eyes,
- /obj/item/organ/internal/tongue,
- /obj/item/organ/internal/ears,
- /obj/item/organ/internal/heart,
- /obj/item/organ/internal/liver,
- /obj/item/organ/internal/stomach,
- /obj/item/organ/internal/lungs,
+ /obj/item/organ/appendix,
+ /obj/item/organ/tail,
+ /obj/item/organ/eyes,
+ /obj/item/organ/tongue,
+ /obj/item/organ/ears,
+ /obj/item/organ/heart,
+ /obj/item/organ/liver,
+ /obj/item/organ/stomach,
+ /obj/item/organ/lungs,
)
var/static/list/potential_easy_items = list(
diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm
index 335279c9553a6..fec25094bb782 100644
--- a/code/modules/antagonists/heretic/items/corrupted_organs.dm
+++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm
@@ -1,17 +1,17 @@
/// Renders you unable to see people who were heretics at the time that this organ is gained
-/obj/item/organ/internal/eyes/corrupt
+/obj/item/organ/eyes/corrupt
name = "corrupt orbs"
desc = "These eyes have seen something they shouldn't have."
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
/// The override images we are applying
var/list/hallucinations
-/obj/item/organ/internal/eyes/corrupt/Initialize(mapload)
+/obj/item/organ/eyes/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes have wide dilated pupils, and no iris. Something is moving in the darkness.", BODY_ZONE_PRECISE_EYES)
-/obj/item/organ/internal/eyes/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/eyes/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
if (!organ_owner.client)
return
@@ -28,7 +28,7 @@
if (LAZYLEN(hallucinations))
organ_owner.client.images |= hallucinations
-/obj/item/organ/internal/eyes/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/eyes/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if (!LAZYLEN(hallucinations))
return
@@ -37,26 +37,26 @@
/// Sometimes speak in incomprehensible tongues
-/obj/item/organ/internal/tongue/corrupt
+/obj/item/organ/tongue/corrupt
name = "corrupt tongue"
desc = "This one tells only lies."
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
-/obj/item/organ/internal/tongue/corrupt/Initialize(mapload)
+/obj/item/organ/tongue/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
AddElement(/datum/element/noticable_organ, "The inside of %PRONOUN_Their mouth is full of stars.", BODY_ZONE_PRECISE_MOUTH)
-/obj/item/organ/internal/tongue/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/tongue/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
RegisterSignal(organ_owner, COMSIG_MOB_SAY, PROC_REF(on_spoken))
-/obj/item/organ/internal/tongue/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/tongue/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_MOB_SAY)
/// When the mob speaks, sometimes put it in a different language
-/obj/item/organ/internal/tongue/corrupt/proc/on_spoken(mob/living/organ_owner, list/speech_args)
+/obj/item/organ/tongue/corrupt/proc/on_spoken(mob/living/organ_owner, list/speech_args)
SIGNAL_HANDLER
if (organ_owner.has_reagent(/datum/reagent/water/holywater) || prob(60))
return
@@ -64,7 +64,7 @@
/// Randomly secretes alcohol or hallucinogens when you're drinking something
-/obj/item/organ/internal/liver/corrupt
+/obj/item/organ/liver/corrupt
name = "corrupt liver"
desc = "After what you've seen you could really go for a drink."
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
@@ -83,20 +83,20 @@
/datum/reagent/drug/mushroomhallucinogen,
)
-/obj/item/organ/internal/liver/corrupt/Initialize(mapload)
+/obj/item/organ/liver/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
-/obj/item/organ/internal/liver/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank))
-/obj/item/organ/internal/liver/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS)
/// If we drank something, add a little extra
-/obj/item/organ/internal/liver/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods)
+/obj/item/organ/liver/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods)
SIGNAL_HANDLER
if (!(methods & INGEST))
return
@@ -108,7 +108,7 @@
/// Rapidly become hungry if you are not digesting blood
-/obj/item/organ/internal/stomach/corrupt
+/obj/item/organ/stomach/corrupt
name = "corrupt stomach"
desc = "This parasite demands an unwholesome diet in order to be satisfied."
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
@@ -119,21 +119,21 @@
/// How long until we prompt the player to drink blood again?
COOLDOWN_DECLARE(message_cooldown)
-/obj/item/organ/internal/stomach/corrupt/Initialize(mapload)
+/obj/item/organ/stomach/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
AddElement(/datum/element/noticable_organ, "%PRONOUN_They %PRONOUN_have an unhealthy pallor.")
-/obj/item/organ/internal/stomach/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/stomach/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank))
-/obj/item/organ/internal/stomach/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/stomach/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS)
/// Check if we drank a little blood
-/obj/item/organ/internal/stomach/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods)
+/obj/item/organ/stomach/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods)
SIGNAL_HANDLER
if (!(methods & INGEST))
return
@@ -148,7 +148,7 @@
deltimer(thirst_timer)
thirst_timer = addtimer(VARSET_CALLBACK(src, thirst_satiated, FALSE), 3 MINUTES, TIMER_STOPPABLE | TIMER_DELETE_ME)
-/obj/item/organ/internal/stomach/corrupt/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired)
+/obj/item/organ/stomach/corrupt/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired)
if (thirst_satiated || human.has_reagent(/datum/reagent/water/holywater))
return ..()
@@ -174,18 +174,18 @@
/// Occasionally bombards you with spooky hands and lets everyone hear your pulse.
-/obj/item/organ/internal/heart/corrupt
+/obj/item/organ/heart/corrupt
name = "corrupt heart"
desc = "What corruption is this spreading along with the blood?"
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
/// How long until the next heart?
COOLDOWN_DECLARE(hand_cooldown)
-/obj/item/organ/internal/heart/corrupt/Initialize(mapload)
+/obj/item/organ/heart/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
-/obj/item/organ/internal/heart/corrupt/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/corrupt/on_life(seconds_per_tick, times_fired)
. = ..()
if (!COOLDOWN_FINISHED(src, hand_cooldown) || IS_IN_MANSUS(owner) || !owner.needs_heart() || !is_beating() || owner.has_reagent(/datum/reagent/water/holywater))
return
@@ -194,7 +194,7 @@
/// Sometimes cough out some kind of dangerous gas
-/obj/item/organ/internal/lungs/corrupt
+/obj/item/organ/lungs/corrupt
name = "corrupt lungs"
desc = "Some things SHOULD be drowned in tar."
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
@@ -209,11 +209,11 @@
/datum/gas/plasma = 20,
)
-/obj/item/organ/internal/lungs/corrupt/Initialize(mapload)
+/obj/item/organ/lungs/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
-/obj/item/organ/internal/lungs/corrupt/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
+/obj/item/organ/lungs/corrupt/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
. = ..()
if (!. || IS_IN_MANSUS(owner) || breather.has_reagent(/datum/reagent/water/holywater) || !prob(cough_chance))
return
@@ -229,19 +229,19 @@
/// It's full of worms
-/obj/item/organ/internal/appendix/corrupt
+/obj/item/organ/appendix/corrupt
name = "corrupt appendix"
desc = "What kind of dark, cosmic force is even going to bother to corrupt an appendix?"
organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS
/// How likely are we to spawn worms?
var/worm_chance = 2
-/obj/item/organ/internal/appendix/corrupt/Initialize(mapload)
+/obj/item/organ/appendix/corrupt/Initialize(mapload)
. = ..()
AddElement(/datum/element/corrupted_organ)
AddElement(/datum/element/noticable_organ, "%PRONOUN_Their abdomen is distended... and wiggling.", BODY_ZONE_PRECISE_GROIN)
-/obj/item/organ/internal/appendix/corrupt/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/appendix/corrupt/on_life(seconds_per_tick, times_fired)
. = ..()
if (owner.stat != CONSCIOUS || owner.has_reagent(/datum/reagent/water/holywater) || IS_IN_MANSUS(owner) || !SPT_PROB(worm_chance, seconds_per_tick))
return
diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm
index 3e9d3675b1351..0cbe1d1117b49 100644
--- a/code/modules/antagonists/heretic/items/eldritch_painting.dm
+++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm
@@ -129,14 +129,14 @@
// A list made of the organs and bodyparts the heretic can get
var/static/list/random_bodypart_or_organ = list(
- /obj/item/organ/internal/brain,
- /obj/item/organ/internal/lungs,
- /obj/item/organ/internal/eyes,
- /obj/item/organ/internal/ears,
- /obj/item/organ/internal/heart,
- /obj/item/organ/internal/liver,
- /obj/item/organ/internal/stomach,
- /obj/item/organ/internal/appendix,
+ /obj/item/organ/brain,
+ /obj/item/organ/lungs,
+ /obj/item/organ/eyes,
+ /obj/item/organ/ears,
+ /obj/item/organ/heart,
+ /obj/item/organ/liver,
+ /obj/item/organ/stomach,
+ /obj/item/organ/appendix,
/obj/item/bodypart/arm/left,
/obj/item/bodypart/arm/right,
/obj/item/bodypart/leg/left,
diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm
index 9384a9af4b9d8..d950de44a34d2 100644
--- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm
@@ -142,7 +142,7 @@
/datum/heretic_knowledge/curse/paralysis,
)
required_atoms = list(
- /obj/item/organ/internal/liver = 1,
+ /obj/item/organ/liver = 1,
/obj/item/melee/baton/security = 1, // Technically means a cattleprod is valid
/obj/item/clothing/mask = 1,
/obj/item/flashlight/flare/candle = 4,
diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
index c0fd2b7bbe381..47db297042331 100644
--- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
@@ -252,7 +252,7 @@
/datum/heretic_knowledge/spell/opening_blast,
)
required_atoms = list(
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/eyes = 1,
/obj/effect/decal/cleanable/blood = 1,
/obj/item/bodypart/arm/left = 1,
)
@@ -295,9 +295,9 @@
/datum/heretic_knowledge/spell/cleave,
)
required_atoms = list(
- /obj/item/organ/external/tail = 1,
- /obj/item/organ/internal/stomach = 1,
- /obj/item/organ/internal/tongue = 1,
+ /obj/item/organ/tail = 1,
+ /obj/item/organ/stomach = 1,
+ /obj/item/organ/tongue = 1,
/obj/item/pen = 1,
/obj/item/paper = 1,
)
diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
index ea0b609ef5c13..00946bea682d8 100644
--- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
@@ -76,10 +76,12 @@
if(ismecha(target))
var/obj/vehicle/sealed/mecha/mecha = target
mecha.dna_lock = null
+ mecha.mecha_flags &= ~ID_LOCK_ON
for(var/mob/living/occupant as anything in mecha.occupants)
if(isAI(occupant))
continue
mecha.mob_exit(occupant, randomstep = TRUE)
+ occupant.Paralyze(5 SECONDS)
else if(istype(target,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/door = target
door.unbolt()
diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm
index b23ed148611b6..b23f3cd2d6c10 100644
--- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm
@@ -130,7 +130,7 @@
/datum/heretic_knowledge/painting,
)
required_atoms = list(
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/heart = 1,
/obj/item/stack/sheet/glass = 2,
/obj/item/clothing/neck/tie = 1,
)
diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm
index 87086de6e0024..782ec6ec55dc2 100644
--- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm
+++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm
@@ -68,15 +68,15 @@
return
var/list/removable_organs = list()
- for(var/obj/item/organ/internal/bodypart_organ in organ_storage.contents)
- if(bodypart_organ.organ_flags & ORGAN_UNREMOVABLE)
+ for(var/obj/item/organ/bodypart_organ in organ_storage.contents)
+ if(bodypart_organ.organ_flags & (ORGAN_EXTERNAL|ORGAN_UNREMOVABLE))
continue
removable_organs += bodypart_organ
if (!length(removable_organs))
return // This one is a little more possible but they're probably already in pretty bad shape by this point
- var/obj/item/organ/internal/removing_organ = pick(removable_organs)
+ var/obj/item/organ/removing_organ = pick(removable_organs)
if (carbon_owner.vomit(vomit_flags = VOMIT_CATEGORY_BLOOD))
carbon_owner.visible_message(span_boldwarning("[carbon_owner] vomits out [carbon_owner.p_their()] [removing_organ]"))
diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
index 65e6b6b2470e7..3a5e84e75bca7 100644
--- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
+++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm
@@ -31,13 +31,13 @@
var/list/return_timers
/// Evil organs we can put in people
var/static/list/grantable_organs = list(
- /obj/item/organ/internal/appendix/corrupt,
- /obj/item/organ/internal/eyes/corrupt,
- /obj/item/organ/internal/heart/corrupt,
- /obj/item/organ/internal/liver/corrupt,
- /obj/item/organ/internal/lungs/corrupt,
- /obj/item/organ/internal/stomach/corrupt,
- /obj/item/organ/internal/tongue/corrupt,
+ /obj/item/organ/appendix/corrupt,
+ /obj/item/organ/eyes/corrupt,
+ /obj/item/organ/heart/corrupt,
+ /obj/item/organ/liver/corrupt,
+ /obj/item/organ/lungs/corrupt,
+ /obj/item/organ/stomach/corrupt,
+ /obj/item/organ/tongue/corrupt,
)
/datum/heretic_knowledge/hunt_and_sacrifice/Destroy(force)
@@ -415,7 +415,7 @@
/datum/heretic_knowledge/hunt_and_sacrifice/proc/curse_organs(mob/living/carbon/human/sac_target)
var/usable_organs = grantable_organs.Copy()
if (isplasmaman(sac_target))
- usable_organs -= /obj/item/organ/internal/lungs/corrupt // Their lungs are already more cursed than anything I could give them
+ usable_organs -= /obj/item/organ/lungs/corrupt // Their lungs are already more cursed than anything I could give them
var/total_implant = rand(2, 4)
@@ -423,7 +423,7 @@
if (!length(usable_organs))
return
var/organ_path = pick_n_take(usable_organs)
- var/obj/item/organ/internal/to_give = new organ_path
+ var/obj/item/organ/to_give = new organ_path
to_give.Insert(sac_target)
new /obj/effect/gibspawner/human/bodypartless(get_turf(sac_target))
diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm
index 3ed3f110a802a..90a51dcccb068 100644
--- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm
@@ -9,7 +9,7 @@
/datum/heretic_knowledge/spell/moon_smile,
)
required_atoms = list(
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/eyes = 1,
/obj/item/shard = 1,
/obj/item/flashlight/flare/candle = 1,
)
diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm
index 1a08236aee64d..7b7bdddb19ac8 100644
--- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm
@@ -12,7 +12,7 @@
)
required_atoms = list(
/obj/effect/decal/cleanable/ash = 1,
- /obj/item/organ/internal/liver = 1,
+ /obj/item/organ/liver = 1,
/obj/item/stack/sheet/mineral/plasma = 1,
)
mob_to_summon = /mob/living/basic/heretic_summon/fire_shark
diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm
index 1e265b974980f..cb719d163d5c2 100644
--- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm
@@ -27,7 +27,7 @@
/datum/heretic_knowledge/moon_amulet,
)
required_atoms = list(
- /obj/item/organ/internal/lungs = 1,
+ /obj/item/organ/lungs = 1,
/obj/item/stack/rods = 3,
/obj/item/storage/belt = 1,
)
@@ -62,11 +62,11 @@
depth = 8
/datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
- if(locate(/obj/item/organ/internal/eyes) in atoms)
+ if(locate(/obj/item/organ/eyes) in atoms)
src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping)
src.required_atoms = list(
/obj/item/canvas = 1,
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/eyes = 1,
)
return TRUE
diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm
index 0a4f7fbe86a1c..d4e5d465125f1 100644
--- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm
@@ -60,7 +60,7 @@
required_atoms = list(
/obj/item/wirecutters = 1,
/obj/effect/decal/cleanable/vomit = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/heart = 1,
)
duration = 0.5 MINUTES
duration_modifier = 4
diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm
index 56945262e3cb0..17eb87affbaf3 100644
--- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm
@@ -162,7 +162,7 @@
/obj/item/stack/sheet/mineral/titanium = 5,
/obj/item/clothing/suit/armor = 1,
/obj/item/assembly/flash = 1,
- /obj/item/organ/internal/lungs = 1,
+ /obj/item/organ/lungs = 1,
)
cost = 1
route = PATH_SIDE
diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm
index 2b5186bb55019..a4560058db818 100644
--- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm
@@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge())
research_tree_icon_state = "living_heart"
research_tree_icon_frame = 1
/// The typepath of the organ type required for our heart.
- var/required_organ_type = /obj/item/organ/internal/heart
+ var/required_organ_type = /obj/item/organ/heart
/datum/heretic_knowledge/living_heart/on_research(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
@@ -65,9 +65,9 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge())
// If a heretic is made from a species without a heart, we need to find a backup.
if(!where_to_put_our_heart)
var/static/list/backup_organs = list(
- ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs,
- ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver,
- ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach,
+ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs,
+ ORGAN_SLOT_LIVER = /obj/item/organ/liver,
+ ORGAN_SLOT_STOMACH = /obj/item/organ/stomach,
)
for(var/backup_slot in backup_organs)
@@ -201,7 +201,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge())
desc = "Allows you to transmute a sheet of glass and a pair of eyes to create an Amber Focus. \
A focus must be worn in order to cast more advanced spells."
required_atoms = list(
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/eyes = 1,
/obj/item/stack/sheet/glass = 1,
)
result_atoms = list(/obj/item/clothing/neck/heretic_focus)
diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm
index 6f0f006842d89..04612a506f3c8 100644
--- a/code/modules/antagonists/heretic/knowledge/void_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm
@@ -258,7 +258,7 @@
heavy_storm = new(user, 10)
if(ishuman(user))
var/mob/living/carbon/human/ascended_human = user
- var/obj/item/organ/internal/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES)
heretic_eyes?.color_cutoffs = list(30, 30, 30)
ascended_human.update_sight()
diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm
index 63bcc4cc84831..e2010ac0f9446 100644
--- a/code/modules/antagonists/heretic/magic/moon_smile.dm
+++ b/code/modules/antagonists/heretic/magic/moon_smile.dm
@@ -40,7 +40,7 @@
cast_on.adjust_temp_blindness(moon_smile_duration + 1 SECONDS)
cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS)
- var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS)
//adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds
ears?.adjustEarDamage(0, (moon_smile_duration + 1 SECONDS) / (2 SECONDS))
diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm
index 4aaacb77e5f3e..70cf4c640836c 100644
--- a/code/modules/antagonists/nightmare/nightmare_organs.dm
+++ b/code/modules/antagonists/nightmare/nightmare_organs.dm
@@ -4,7 +4,7 @@
#define HEART_SPECIAL_SHADOWIFY 2
-/obj/item/organ/internal/brain/shadow/nightmare
+/obj/item/organ/brain/shadow/nightmare
name = "tumorous mass"
desc = "A fleshy growth that was dug out of the skull of a Nightmare."
icon = 'icons/obj/medical/organs/organs.dmi'
@@ -15,7 +15,7 @@
///Our associated terrorize spell, for antagonist nightmares
var/datum/action/cooldown/spell/pointed/terrorize/terrorize_spell
-/obj/item/organ/internal/brain/shadow/nightmare/on_mob_insert(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/shadow/nightmare/on_mob_insert(mob/living/carbon/brain_owner)
. = ..()
if(brain_owner.dna.species.id != SPECIES_NIGHTMARE)
@@ -29,7 +29,7 @@
terrorize_spell = new(src)
terrorize_spell.Grant(brain_owner)
-/obj/item/organ/internal/brain/shadow/nightmare/on_mob_remove(mob/living/carbon/brain_owner)
+/obj/item/organ/brain/shadow/nightmare/on_mob_remove(mob/living/carbon/brain_owner)
. = ..()
QDEL_NULL(our_jaunt)
QDEL_NULL(terrorize_spell)
@@ -62,7 +62,7 @@
playsound(source, SFX_BULLET_MISS, 75, TRUE)
return COMPONENT_BULLET_PIERCED
-/obj/item/organ/internal/heart/nightmare
+/obj/item/organ/heart/nightmare
name = "heart of darkness"
desc = "An alien organ that twists and writhes when exposed to light."
visual = TRUE
@@ -78,7 +78,7 @@
/// The armblade granted to the host of this heart.
var/obj/item/light_eater/blade
-/obj/item/organ/internal/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target)
+/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target)
if(M != user)
return ..()
user.visible_message(
@@ -94,23 +94,23 @@
user.temporarilyRemoveItemFromInventory(src, TRUE)
Insert(user)
-/obj/item/organ/internal/heart/nightmare/on_mob_insert(mob/living/carbon/heart_owner, special)
+/obj/item/organ/heart/nightmare/on_mob_insert(mob/living/carbon/heart_owner, special)
. = ..()
if(special != HEART_SPECIAL_SHADOWIFY)
blade = new/obj/item/light_eater
heart_owner.put_in_hands(blade)
-/obj/item/organ/internal/heart/nightmare/on_mob_remove(mob/living/carbon/heart_owner, special)
+/obj/item/organ/heart/nightmare/on_mob_remove(mob/living/carbon/heart_owner, special)
. = ..()
respawn_progress = 0
if(blade && special != HEART_SPECIAL_SHADOWIFY)
heart_owner.visible_message(span_warning("\The [blade] disintegrates!"))
QDEL_NULL(blade)
-/obj/item/organ/internal/heart/nightmare/Stop()
+/obj/item/organ/heart/nightmare/Stop()
return FALSE
-/obj/item/organ/internal/heart/nightmare/on_death(seconds_per_tick, times_fired)
+/obj/item/organ/heart/nightmare/on_death(seconds_per_tick, times_fired)
if(!owner)
return
var/turf/T = get_turf(owner)
@@ -134,7 +134,7 @@
playsound(owner, 'sound/effects/hallucinations/far_noise.ogg', 50, TRUE)
respawn_progress = 0
-/obj/item/organ/internal/heart/nightmare/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/heart/nightmare/get_availability(datum/species/owner_species, mob/living/owner_mob)
if(isnightmare(owner_mob))
return TRUE
return ..()
diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm
index 38db2dfae8657..e81819e44fccd 100644
--- a/code/modules/antagonists/nightmare/nightmare_species.dm
+++ b/code/modules/antagonists/nightmare/nightmare_species.dm
@@ -24,8 +24,8 @@
TRAIT_NEVER_WOUNDED,
)
- mutantheart = /obj/item/organ/internal/heart/nightmare
- mutantbrain = /obj/item/organ/internal/brain/shadow/nightmare
+ mutantheart = /obj/item/organ/heart/nightmare
+ mutantbrain = /obj/item/organ/brain/shadow/nightmare
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/shadow/nightmare,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/shadow/nightmare,
diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm
index ff4232ab2dc00..cd58d6fec5d9a 100644
--- a/code/modules/antagonists/obsessed/obsessed.dm
+++ b/code/modules/antagonists/obsessed/obsessed.dm
@@ -41,7 +41,7 @@
if(!istype(C))
to_chat(admin, "[roundend_category] come from a brain trauma, so they need to at least be a carbon!")
return
- if(!C.get_organ_by_type(/obj/item/organ/internal/brain)) // If only I had a brain
+ if(!C.get_organ_by_type(/obj/item/organ/brain)) // If only I had a brain
to_chat(admin, "[roundend_category] come from a brain trauma, so they need to HAVE A BRAIN.")
return
message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] into [name].")
diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm
index feb62ec4fca66..da9df063c90d6 100644
--- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm
+++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm
@@ -469,12 +469,12 @@
/datum/export/pirate/cash
cost = 1
- unit_name = "bills"
+ unit_name = "bill"
export_types = list(/obj/item/stack/spacecash)
-/datum/export/pirate/cash/get_amount(obj/exported_item)
+/datum/export/pirate/cash/get_cost(obj/exported_item)
var/obj/item/stack/spacecash/cash = exported_item
- return ..() * cash.amount * cash.value
+ return cash.value * cash.amount
/datum/export/pirate/holochip
cost = 1
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index dc35b76684300..a339b0cc2640d 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -186,7 +186,7 @@
/datum/antagonist/rev/head/on_removal()
if(give_hud)
var/mob/living/carbon/C = owner.current
- var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/S = C.get_organ_slot(ORGAN_SLOT_HUD)
+ var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = C.get_organ_slot(ORGAN_SLOT_HUD)
if(S)
S.Remove(C)
return ..()
@@ -365,7 +365,7 @@
to_chat(carbon_owner, "The Syndicate were unfortunately unable to get you a flash.")
if(give_hud)
- var/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate/hud = new()
+ var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/hud = new()
hud.Insert(carbon_owner)
if(carbon_owner.get_quirk(/datum/quirk/body_purist))
to_chat(carbon_owner, "Being a body purist, you would never accept cybernetic implants. Upon hearing this, your employers signed you up for a special program, which... for \
diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm
index ccab7952a9c2c..1aa318fb6828d 100644
--- a/code/modules/antagonists/spy/spy_bounty.dm
+++ b/code/modules/antagonists/spy/spy_bounty.dm
@@ -621,10 +621,10 @@
/obj/item/bodypart/arm/right,
/obj/item/bodypart/leg/left,
/obj/item/bodypart/leg/right,
- /obj/item/organ/internal/stomach,
- /obj/item/organ/internal/appendix,
- /obj/item/organ/internal/liver,
- /obj/item/organ/internal/eyes,
+ /obj/item/organ/stomach,
+ /obj/item/organ/appendix,
+ /obj/item/organ/liver,
+ /obj/item/organ/eyes,
)
return ..()
diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm
index 7d664b20d36cb..2ddad4913f0d3 100644
--- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm
+++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm
@@ -81,7 +81,7 @@
continue
var/mob/living/carbon/human/targets_current = possible_target.current
- if(!targets_current.get_organ_by_type(/obj/item/organ/internal/eyes))
+ if(!targets_current.get_organ_by_type(/obj/item/organ/eyes))
continue
possible_targets += possible_target
@@ -110,7 +110,7 @@
AddComponent(/datum/component/traitor_objective_register, target, fail_signals = list(COMSIG_QDELETING))
return TRUE
-/datum/traitor_objective/target_player/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed)
+/datum/traitor_objective/target_player/eyesnatching/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed)
SIGNAL_HANDLER
if(!istype(removed))
@@ -159,7 +159,7 @@
if(used || !istype(target) || !target.Adjacent(user)) //Works only once, no TK use
return ..()
- var/obj/item/organ/internal/eyes/eyeballies = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyeballies = target.get_organ_slot(ORGAN_SLOT_EYES)
var/obj/item/bodypart/head/head = target.get_bodypart(BODY_ZONE_HEAD)
if(!head || !eyeballies || target.is_eyes_covered())
@@ -224,7 +224,7 @@
if(used)
. += span_notice("It has been used up.")
-/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/internal/eyes/eyeballies, obj/item/bodypart/head/head, mob/living/carbon/human/target)
+/obj/item/eyesnatcher/proc/eyeballs_exist(obj/item/organ/eyes/eyeballies, obj/item/bodypart/head/head, mob/living/carbon/human/target)
if(!eyeballies || QDELETED(eyeballies))
return FALSE
if(!head || QDELETED(head))
@@ -232,7 +232,7 @@
if(eyeballies.owner != target)
return FALSE
- var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
//got different eyes or doesn't own the head... somehow
if(head.owner != target || eyes != eyeballies)
return FALSE
diff --git a/code/modules/antagonists/voidwalker/voidwalker_organs.dm b/code/modules/antagonists/voidwalker/voidwalker_organs.dm
index e6e3d028ac8ef..23f1c6fb2fe47 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_organs.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_organs.dm
@@ -1,5 +1,5 @@
/// Voidwalker eyes with nightvision and thermals
-/obj/item/organ/internal/eyes/voidwalker
+/obj/item/organ/eyes/voidwalker
name = "blackened orbs"
desc = "These orbs will withstand the light of the sun, yet still see within the darkest voids."
eye_icon_state = null
@@ -9,7 +9,7 @@
sight_flags = SEE_MOBS
/// Voidwalker brain stacked with a lot of the abilities
-/obj/item/organ/internal/brain/voidwalker
+/obj/item/organ/brain/voidwalker
name = "cosmic brain"
desc = "A mind fully integrated into the cosmic thread."
icon = 'icons/obj/medical/organs/shadow_organs.dmi'
@@ -30,7 +30,7 @@
/// Our brain transmit telepathy spell
var/datum/action/transmit = /datum/action/cooldown/spell/list_target/telepathy/voidwalker
-/obj/item/organ/internal/brain/voidwalker/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/brain/voidwalker/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
RegisterSignal(organ_owner, COMSIG_ATOM_ENTERING, PROC_REF(on_atom_entering))
@@ -52,7 +52,7 @@
glass_breaker = new/obj/item/void_eater
organ_owner.put_in_hands(glass_breaker)
-/obj/item/organ/internal/brain/voidwalker/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/brain/voidwalker/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_ENTER_AREA)
@@ -75,7 +75,7 @@
if(glass_breaker)
qdel(glass_breaker)
-/obj/item/organ/internal/brain/voidwalker/proc/on_atom_entering(mob/living/carbon/organ_owner, atom/entering)
+/obj/item/organ/brain/voidwalker/proc/on_atom_entering(mob/living/carbon/organ_owner, atom/entering)
SIGNAL_HANDLER
if(!isturf(entering))
@@ -90,7 +90,7 @@
else
organ_owner.remove_movespeed_modifier(speed_modifier)
-/obj/item/organ/internal/brain/voidwalker/on_death()
+/obj/item/organ/brain/voidwalker/on_death()
. = ..()
var/turf/spawn_loc = get_turf(owner)
diff --git a/code/modules/antagonists/voidwalker/voidwalker_species.dm b/code/modules/antagonists/voidwalker/voidwalker_species.dm
index 5b50c3da69ed9..8c417c97773ea 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_species.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_species.dm
@@ -35,8 +35,8 @@
no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_ICLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_MASK | ITEM_SLOT_HEAD | ITEM_SLOT_FEET | ITEM_SLOT_BACK | ITEM_SLOT_EARS | ITEM_SLOT_EYES
- mutantbrain = /obj/item/organ/internal/brain/voidwalker
- mutanteyes = /obj/item/organ/internal/eyes/voidwalker
+ mutantbrain = /obj/item/organ/brain/voidwalker
+ mutanteyes = /obj/item/organ/eyes/voidwalker
mutantheart = null
mutantlungs = null
mutanttongue = null
diff --git a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
index 9bf5b3c2664c3..f88c09188cf48 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
@@ -63,7 +63,7 @@
hewmon.balloon_alert(user, "shattering...")
if(do_after(user, 4 SECONDS, hewmon))
new /obj/effect/spawner/random/glass_shards (spawnloc)
- var/obj/item/organ/brain = hewmon.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain = hewmon.get_organ_by_type(/obj/item/organ/brain)
if(brain)
brain.Remove(hewmon)
brain.forceMove(spawnloc)
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index ef2a40636d0fc..e56f651a095a8 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -311,7 +311,7 @@
head = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire)
//Provides a decent heal, need to pump every 6 seconds
-/obj/item/organ/internal/heart/cursed/wizard
+/obj/item/organ/heart/cursed/wizard
pump_delay = 6 SECONDS
heal_brute = 25
heal_burn = 25
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 6e448637dbaa4..88b21cf8971ef 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -313,7 +313,7 @@
var/datum/weakref/arm
/obj/item/assembly/flash/armimplant/burn_out()
- var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve()
+ var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve()
if(real_arm?.owner)
to_chat(real_arm.owner, span_warning("Your photon projector implant overheats and deactivates!"))
real_arm.Retract()
@@ -322,7 +322,7 @@
/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null)
if(overheat)
- var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve()
+ var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve()
if(real_arm?.owner)
to_chat(real_arm.owner, span_warning("Your photon projector is running too hot to be used again so quickly!"))
return FALSE
diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm
index be8aa9de8907a..67a56ed9b3232 100644
--- a/code/modules/awaymissions/pamphlet.dm
+++ b/code/modules/awaymissions/pamphlet.dm
@@ -53,7 +53,7 @@
cybernetic augments by Synthman Co. to you in this rare exclusive offer! With this letter, you are being gifted a \
special limited edition choice NTSDA-certified grade-A cybernetic implant, FREE OF CHARGE! Build up your body to \
GREATNESS with Synthman's new exclusive line of cybernetic products! Become greater, stronger, and BETTER today!"
- var/obj/item/organ/internal/heart/cybernetic/sample
+ var/obj/item/organ/heart/cybernetic/sample
/obj/item/paper/pamphlet/cybernetics/Initialize(mapload)
. = ..()
diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm
index 15c267cf0c8dd..7925461652a00 100644
--- a/code/modules/bitrunning/components/avatar_connection.dm
+++ b/code/modules/bitrunning/components/avatar_connection.dm
@@ -95,7 +95,7 @@
*/
RegisterSignals(parent, list(COMSIG_BITRUNNER_ALERT_SEVER, COMSIG_BITRUNNER_CACHE_SEVER, COMSIG_BITRUNNER_LADDER_SEVER), PROC_REF(on_safe_disconnect))
RegisterSignal(parent, COMSIG_LIVING_PILL_CONSUMED, PROC_REF(disconnect_if_red_pill))
- RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection))
+ RegisterSignals(parent, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(on_sever_connection))
RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_linked_damage))
diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm
index ae15ddbd623e7..9f473980bbf96 100644
--- a/code/modules/bitrunning/server/obj_generation.dm
+++ b/code/modules/bitrunning/server/obj_generation.dm
@@ -178,7 +178,7 @@
if(failed)
to_chat(neo, span_warning("One of your disks failed to load. Check for duplicate or inactive disks."))
- var/obj/item/organ/internal/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN)
for(var/obj/item/skillchip/skill_chip as anything in neo_brain?.skillchips)
if(!skill_chip.active)
continue
diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm
index f9b367b12f06e..d15f4405f7b10 100644
--- a/code/modules/cargo/bounties/medical.dm
+++ b/code/modules/cargo/bounties/medical.dm
@@ -3,10 +3,10 @@
description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto! We'll take a cybernetic one if need be, but only if it's upgraded."
reward = CARGO_CRATE_VALUE * 5
wanted_types = list(
- /obj/item/organ/internal/heart = TRUE,
- /obj/item/organ/internal/heart/cybernetic = FALSE,
- /obj/item/organ/internal/heart/cybernetic/tier2 = TRUE,
- /obj/item/organ/internal/heart/cybernetic/tier3 = TRUE,
+ /obj/item/organ/heart = TRUE,
+ /obj/item/organ/heart/cybernetic = FALSE,
+ /obj/item/organ/heart/cybernetic/tier2 = TRUE,
+ /obj/item/organ/heart/cybernetic/tier3 = TRUE,
)
/datum/bounty/item/medical/lung
@@ -15,17 +15,17 @@
reward = CARGO_CRATE_VALUE * 10
required_count = 3
wanted_types = list(
- /obj/item/organ/internal/lungs = TRUE,
- /obj/item/organ/internal/lungs/cybernetic = FALSE,
- /obj/item/organ/internal/lungs/cybernetic/tier2 = TRUE,
- /obj/item/organ/internal/lungs/cybernetic/tier3 = TRUE,
+ /obj/item/organ/lungs = TRUE,
+ /obj/item/organ/lungs/cybernetic = FALSE,
+ /obj/item/organ/lungs/cybernetic/tier2 = TRUE,
+ /obj/item/organ/lungs/cybernetic/tier3 = TRUE,
)
/datum/bounty/item/medical/appendix
name = "Appendix"
description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay."
reward = CARGO_CRATE_VALUE * 5 //there are no synthetic appendixes
- wanted_types = list(/obj/item/organ/internal/appendix = TRUE)
+ wanted_types = list(/obj/item/organ/appendix = TRUE)
/datum/bounty/item/medical/ears
name = "Ears"
@@ -33,11 +33,11 @@
reward = CARGO_CRATE_VALUE * 10
required_count = 3
wanted_types = list(
- /obj/item/organ/internal/ears = TRUE,
- /obj/item/organ/internal/ears/cybernetic = FALSE,
- /obj/item/organ/internal/ears/cybernetic/upgraded = TRUE,
- /obj/item/organ/internal/ears/cybernetic/whisper = TRUE,
- /obj/item/organ/internal/ears/cybernetic/xray = TRUE,
+ /obj/item/organ/ears = TRUE,
+ /obj/item/organ/ears/cybernetic = FALSE,
+ /obj/item/organ/ears/cybernetic/upgraded = TRUE,
+ /obj/item/organ/ears/cybernetic/whisper = TRUE,
+ /obj/item/organ/ears/cybernetic/xray = TRUE,
)
/datum/bounty/item/medical/liver
@@ -46,10 +46,10 @@
reward = CARGO_CRATE_VALUE * 10
required_count = 3
wanted_types = list(
- /obj/item/organ/internal/liver = TRUE,
- /obj/item/organ/internal/liver/cybernetic = FALSE,
- /obj/item/organ/internal/liver/cybernetic/tier2 = TRUE,
- /obj/item/organ/internal/liver/cybernetic/tier3 = TRUE,
+ /obj/item/organ/liver = TRUE,
+ /obj/item/organ/liver/cybernetic = FALSE,
+ /obj/item/organ/liver/cybernetic/tier2 = TRUE,
+ /obj/item/organ/liver/cybernetic/tier3 = TRUE,
)
/datum/bounty/item/medical/eye
@@ -58,8 +58,8 @@
reward = CARGO_CRATE_VALUE * 10
required_count = 3
wanted_types = list(
- /obj/item/organ/internal/eyes = TRUE,
- /obj/item/organ/internal/eyes/robotic = FALSE,
+ /obj/item/organ/eyes = TRUE,
+ /obj/item/organ/eyes/robotic = FALSE,
)
/datum/bounty/item/medical/tongue
@@ -67,19 +67,19 @@
description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues."
reward = CARGO_CRATE_VALUE * 10
required_count = 3
- wanted_types = list(/obj/item/organ/internal/tongue = TRUE)
+ wanted_types = list(/obj/item/organ/tongue = TRUE)
/datum/bounty/item/medical/lizard_tail
name = "Lizard Tail"
description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?"
reward = CARGO_CRATE_VALUE * 6
- wanted_types = list(/obj/item/organ/external/tail/lizard = TRUE)
+ wanted_types = list(/obj/item/organ/tail/lizard = TRUE)
/datum/bounty/item/medical/cat_tail
name = "Cat Tail"
description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?"
reward = CARGO_CRATE_VALUE * 6
- wanted_types = list(/obj/item/organ/external/tail/cat = TRUE)
+ wanted_types = list(/obj/item/organ/tail/cat = TRUE)
/datum/bounty/item/medical/chainsaw
name = "Chainsaw"
diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm
index 268ac2ea03334..8f395b5152fb1 100644
--- a/code/modules/cargo/bounties/special.dm
+++ b/code/modules/cargo/bounties/special.dm
@@ -4,12 +4,12 @@
reward = CARGO_CRATE_VALUE * 50
required_count = 3
wanted_types = list(
- /obj/item/organ/internal/brain/alien = TRUE,
- /obj/item/organ/internal/alien = TRUE,
- /obj/item/organ/internal/body_egg/alien_embryo = TRUE,
- /obj/item/organ/internal/liver/alien = TRUE,
- /obj/item/organ/internal/tongue/alien = TRUE,
- /obj/item/organ/internal/eyes/alien = TRUE,
+ /obj/item/organ/brain/alien = TRUE,
+ /obj/item/organ/alien = TRUE,
+ /obj/item/organ/body_egg/alien_embryo = TRUE,
+ /obj/item/organ/liver/alien = TRUE,
+ /obj/item/organ/tongue/alien = TRUE,
+ /obj/item/organ/eyes/alien = TRUE,
)
/datum/bounty/item/syndicate_documents
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index 179ca701adc0c..1ba739d3343a4 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -176,6 +176,7 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a
data["effectCircle"] = temp_pod.effectCircle //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here
data["effectBurst"] = effectBurst //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area
data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
+ data["create_sparks"] = temp_pod.create_sparks //If true, the pod will create sparks before being deleted. This might cause fires if there is plasma in the air.
data["reverse_option_list"] = temp_pod.reverse_option_list
data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites
data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
@@ -411,6 +412,9 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a
var/reverseOption = params["reverseOption"]
temp_pod.reverse_option_list[reverseOption] = !temp_pod.reverse_option_list[reverseOption]
. = TRUE
+ if("create_sparks") //Toggle: The creates sparks before the pod is deleted
+ temp_pod.create_sparks = !temp_pod.create_sparks
+ . = TRUE
if("effectTarget") //Toggle: Launch at a specific mob (instead of at whatever turf you click on). Used for the supplypod smite
if (specificTarget)
specificTarget = null
@@ -784,12 +788,16 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a
selector.moveToNullspace() //Otherwise, we move the selector to nullspace until it is needed again
/datum/centcom_podlauncher/proc/clearBay() //Clear all objs and mobs from the selected bay
- for (var/obj/O in bay.get_all_contents())
- qdel(O)
- for (var/mob/M in bay.get_all_contents())
- qdel(M)
+ for (var/obj/object in bay.get_all_contents())
+ if (istype(object.type, /obj/effect/light_emitter/podbay))
+ continue
+ qdel(object)
+ for (var/mob/mob in bay.get_all_contents())
+ qdel(mob)
for (var/bayturf in bay)
var/turf/turf_to_clear = bayturf
+ if (istype(turf_to_clear, /obj/effect/light_emitter/podbay))
+ continue
turf_to_clear.ChangeTurf(/turf/open/floor/iron)
/datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game
@@ -839,6 +847,7 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a
effectBurst = dataToLoad["effectBurst"] //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area
temp_pod.reversing = dataToLoad["effectReverse"] //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
temp_pod.reverse_option_list = dataToLoad["reverse_option_list"]
+ temp_pod.create_sparks = dataToLoad["create_sparks"] // If true, creates sparks when the pod vanishes.
specificTarget = dataToLoad["effectTarget"] //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites
temp_pod.adminNamed = dataToLoad["effectName"] //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
temp_pod.name = dataToLoad["podName"]
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index 7102db0dd8f0d..6b621beeaeb1e 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -8,10 +8,10 @@
/obj/item/immortality_talisman,
/obj/item/book_of_babel,
/obj/item/wisp_lantern,
- /obj/item/organ/internal/cyberimp/arm/shard/katana,
+ /obj/item/organ/cyberimp/arm/shard/katana,
/obj/item/clothing/glasses/godeye,
/obj/item/clothing/neck/necklace/memento_mori,
- /obj/item/organ/internal/heart/cursed/wizard,
+ /obj/item/organ/heart/cursed/wizard,
/obj/item/clothing/suit/hooded/cloak/drake,
/obj/item/ship_in_a_bottle,
/obj/item/clothing/shoes/clown_shoes/banana_shoes,
@@ -48,7 +48,7 @@
export_types = list(
/obj/item/hierophant_club,
/obj/item/melee/cleaving_saw,
- /obj/item/organ/internal/vocal_cords/colossus,
+ /obj/item/organ/vocal_cords/colossus,
/obj/machinery/anomalous_crystal,
/obj/item/mayhem,
/obj/item/soulscythe,
diff --git a/code/modules/cargo/exports/organs.dm b/code/modules/cargo/exports/organs.dm
index 784af1c857426..ec042a8613e44 100644
--- a/code/modules/cargo/exports/organs.dm
+++ b/code/modules/cargo/exports/organs.dm
@@ -4,51 +4,51 @@
/datum/export/organ/heart
cost = CARGO_CRATE_VALUE * 0.2 //For the man who has everything and nothing.
unit_name = "humanoid heart"
- export_types = list(/obj/item/organ/internal/heart)
+ export_types = list(/obj/item/organ/heart)
/datum/export/organ/eyes
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid eyes"
- export_types = list(/obj/item/organ/internal/eyes)
+ export_types = list(/obj/item/organ/eyes)
/datum/export/organ/ears
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid ears"
- export_types = list(/obj/item/organ/internal/ears)
+ export_types = list(/obj/item/organ/ears)
/datum/export/organ/liver
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid liver"
- export_types = list(/obj/item/organ/internal/liver)
+ export_types = list(/obj/item/organ/liver)
/datum/export/organ/lungs
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid lungs"
- export_types = list(/obj/item/organ/internal/lungs)
+ export_types = list(/obj/item/organ/lungs)
/datum/export/organ/stomach
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid stomach"
- export_types = list(/obj/item/organ/internal/stomach)
+ export_types = list(/obj/item/organ/stomach)
/datum/export/organ/tongue
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "humanoid tounge"
- export_types = list(/obj/item/organ/internal/tongue)
+ export_types = list(/obj/item/organ/tongue)
/datum/export/organ/external/tail/lizard
cost = CARGO_CRATE_VALUE * 1.25
unit_name = "lizard tail"
- export_types = list(/obj/item/organ/external/tail/lizard)
+ export_types = list(/obj/item/organ/tail/lizard)
/datum/export/organ/external/tail/cat
cost = CARGO_CRATE_VALUE * 1.5
unit_name = "cat tail"
- export_types = list(/obj/item/organ/external/tail/cat)
+ export_types = list(/obj/item/organ/tail/cat)
/datum/export/organ/ears/cat
cost = CARGO_CRATE_VALUE
unit_name = "cat ears"
- export_types = list(/obj/item/organ/internal/ears/cat)
+ export_types = list(/obj/item/organ/ears/cat)
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index a112ada0e554f..d021fa8665ff2 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -188,6 +188,15 @@
name = "Strong-Arm Implant Set"
desc = "A crate containing two implants, which can be surgically implanted to empower the strength of human arms. Warranty void if exposed to electromagnetic pulses."
cost = CARGO_CRATE_VALUE * 6
- contains = list(/obj/item/organ/internal/cyberimp/arm/strongarm = 2)
+ contains = list(/obj/item/organ/cyberimp/arm/strongarm = 2)
crate_name = "Strong-Arm implant crate"
discountable = SUPPLY_PACK_RARE_DISCOUNTABLE
+
+/datum/supply_pack/medical/lost_crew
+ name = "Recovered NT Employee corpse"
+ desc = "We don't have the accomodations to bring them back, could we send them to you? Please revive and employ them. \
+ The price is a downpayment, we will reimburse the medical budget once our employee has been alive again for a bit."
+ cost = CARGO_CRATE_VALUE * 5
+ contains = list(/obj/structure/closet/body_bag/lost_crew/with_body)
+ crate_name = "body freezer"
+ crate_type = /obj/structure/closet/crate/secure/freezer
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index a8678fbdcef13..da3356e82509d 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -39,6 +39,7 @@
var/datum/pod_style/style = /datum/pod_style //Style is a variable that keeps track of what the pod is supposed to look like. Only stores a path, type is set for ease of var access
var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
var/list/reverse_dropoff_coords //Turf that the reverse pod will drop off its newly-acquired cargo to
+ var/create_sparks = TRUE // If true, the pod will create sparks before being deleted.
var/fallingSoundLength = 11
var/fallingSound = 'sound/items/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands
var/landingSound //Admin sound to play when the pod lands
@@ -399,7 +400,7 @@
close(holder)
else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a separate holder exists)
deleteRubble()
- if (!effectQuiet && !ispath(style, /datum/pod_style/invisible) && !ispath(style, /datum/pod_style/seethrough))
+ if (!effectQuiet && create_sparks && !ispath(style, /datum/pod_style/invisible) && !ispath(style, /datum/pod_style/seethrough))
do_sparks(5, TRUE, holder) //Create some sparks right before closing
qdel(src) //Delete ourselves and the holder
if (holder != src)
diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm
index abd9495d09a66..9c15f74efdced 100644
--- a/code/modules/client/preferences/middleware/antags.dm
+++ b/code/modules/client/preferences/middleware/antags.dm
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(non_ruleset_antagonists, list(
for(var/antag_key in GLOB.non_ruleset_antagonists)
var/datum/antagonist/antag = GLOB.non_ruleset_antagonists[antag_key]
var/antag_flag = initial(antag.job_rank)
-
+
var/days_needed = preferences.parent?.get_remaining_days(
GLOB.special_roles[antag_flag]
)
diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm
index 21459697f864f..e456d366b9629 100644
--- a/code/modules/client/preferences/species_features/basic.dm
+++ b/code/modules/client/preferences/species_features/basic.dm
@@ -32,7 +32,7 @@
if(!hetero)
target.eye_color_right = value
- var/obj/item/organ/internal/eyes/eyes_organ = target.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes_organ = target.get_organ_by_type(/obj/item/organ/eyes)
if (!eyes_organ || !istype(eyes_organ))
return
diff --git a/code/modules/client/preferences/species_features/felinid.dm b/code/modules/client/preferences/species_features/felinid.dm
index 5910e42894f02..3aa4fd1083a5c 100644
--- a/code/modules/client/preferences/species_features/felinid.dm
+++ b/code/modules/client/preferences/species_features/felinid.dm
@@ -3,7 +3,7 @@
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
can_randomize = FALSE
- relevant_external_organ = /obj/item/organ/external/tail/cat
+ relevant_external_organ = /obj/item/organ/tail/cat
/datum/preference/choiced/tail_felinid/init_possible_values()
return assoc_to_keys_features(SSaccessories.tails_list_felinid)
@@ -20,7 +20,7 @@
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
can_randomize = FALSE
- relevant_external_organ = /obj/item/organ/internal/ears/cat
+ relevant_external_organ = /obj/item/organ/ears/cat
/datum/preference/choiced/felinid_ears/init_possible_values()
return assoc_to_keys_features(SSaccessories.ears_list)
diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm
index 11fefc17b8b9e..fbf27521365a3 100644
--- a/code/modules/client/preferences/species_features/lizard.dm
+++ b/code/modules/client/preferences/species_features/lizard.dm
@@ -159,7 +159,7 @@
savefile_key = "feature_lizard_spines"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
- relevant_external_organ = /obj/item/organ/external/spines
+ relevant_external_organ = /obj/item/organ/spines
/datum/preference/choiced/lizard_spines/init_possible_values()
return assoc_to_keys_features(SSaccessories.spines_list)
@@ -171,7 +171,7 @@
savefile_key = "feature_lizard_tail"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
- relevant_external_organ = /obj/item/organ/external/tail/lizard
+ relevant_external_organ = /obj/item/organ/tail/lizard
/datum/preference/choiced/lizard_tail/init_possible_values()
return assoc_to_keys_features(SSaccessories.tails_list_lizard)
diff --git a/code/modules/client/preferences/species_features/monkey.dm b/code/modules/client/preferences/species_features/monkey.dm
index 8417cd7142e07..e35b6401553a6 100644
--- a/code/modules/client/preferences/species_features/monkey.dm
+++ b/code/modules/client/preferences/species_features/monkey.dm
@@ -2,7 +2,7 @@
savefile_key = "feature_monkey_tail"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
- relevant_external_organ = /obj/item/organ/external/tail/monkey
+ relevant_external_organ = /obj/item/organ/tail/monkey
can_randomize = FALSE
/datum/preference/choiced/monkey_tail/init_possible_values()
diff --git a/code/modules/client/preferences/species_features/mushperson.dm b/code/modules/client/preferences/species_features/mushperson.dm
index 4b624e9c02b4f..fc89a68521bbe 100644
--- a/code/modules/client/preferences/species_features/mushperson.dm
+++ b/code/modules/client/preferences/species_features/mushperson.dm
@@ -2,7 +2,7 @@
savefile_key = "feature_mushperson_cap"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
- relevant_external_organ = /obj/item/organ/external/mushroom_cap
+ relevant_external_organ = /obj/item/organ/mushroom_cap
/datum/preference/choiced/mushroom_cap/init_possible_values()
return assoc_to_keys_features(SSaccessories.caps_list)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8c595876076ad..5e095f3899378 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -430,7 +430,11 @@
parts_covered += "head"
if(body_parts_covered & CHEST)
parts_covered += "torso"
- if(length(parts_covered)) // Just in case someone makes spaceproof gloves or something
+ if(body_parts_covered & ARMS|HANDS)
+ parts_covered += "arms"
+ if(body_parts_covered & LEGS|FEET)
+ parts_covered += "legs"
+ if(length(parts_covered))
readout += "[output_string] will protect the wearer's [english_list(parts_covered)] from [span_tooltip("The extremely low pressure is the biggest danger posed by the vacuum of space.", "low pressure")]."
var/heat_prot
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 4cff2c52f00bc..cead31d6207c0 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -53,7 +53,7 @@
/obj/item/clothing/glasses/proc/thermal_overload()
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
- var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES)
if(!H.is_blind())
if(H.glasses == src)
to_chat(H, span_danger("[src] overloads and blinds you!"))
@@ -456,7 +456,7 @@
if(!user.get_organ_slot(ORGAN_SLOT_EYES))
to_chat(user, span_warning("You have no eyes to apply the contacts to!"))
return
- var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
to_chat(user, span_notice("You begin applying the contact lenses to your eyes..."))
if(!do_after(user, 3 SECONDS, src))
diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm
index 9c451fb811718..c7acc7f87e287 100644
--- a/code/modules/clothing/gloves/insulated.dm
+++ b/code/modules/clothing/gloves/insulated.dm
@@ -63,6 +63,7 @@
icon_state = "sprayon"
inhand_icon_state = null
item_flags = DROPDEL
+ clothing_traits = list(TRAIT_CHUNKYFINGERS)
armor_type = /datum/armor/none
resistance_flags = ACID_PROOF
var/charges_remaining = 10
diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm
index 88274322e7161..7a005fe7fc313 100644
--- a/code/modules/clothing/gloves/special.dm
+++ b/code/modules/clothing/gloves/special.dm
@@ -168,7 +168,7 @@
resistance_flags = FIRE_PROOF
siemens_coefficient = 0.3
clothing_traits = list(TRAIT_QUICKER_CARRY, TRAIT_CHUNKYFINGERS)
- clothing_flags = THICKMATERIAL
+ clothing_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE
/obj/item/clothing/gloves/atmos/Initialize(mapload)
. = ..()
@@ -215,7 +215,7 @@
var/mob/living/wearer = loc
var/stamina_exhaustion = 2 + challenge.difficulty * 0.02
var/is_heavy_gravity = wearer.has_gravity() > STANDARD_GRAVITY
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = wearer.get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = wearer.get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
stamina_exhaustion *= potential_spine.athletics_boost_multiplier
if(HAS_TRAIT(wearer, TRAIT_STRENGTH))
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index a15a59f05addf..640867a7c9334 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -707,7 +707,7 @@
if(human_examined.is_mouth_covered())
final_message += "\tYou can't see [examining.p_their()] mouth."
else
- var/obj/item/organ/internal/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE)
var/pill_count = 0
for(var/datum/action/item_action/activate_pill/pill in human_examined.actions)
pill_count++
@@ -724,7 +724,7 @@
if(human_examined.is_ears_covered())
final_message += "\tYou can't see [examining.p_their()] ears."
else
- var/obj/item/organ/internal/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS)
if(has_ears)
if(has_ears.deaf)
final_message += "\tDamaged eardrums in [examining.p_their()] ear canals."
@@ -736,7 +736,7 @@
if(human_examined.is_eyes_covered())
final_message += "\tYou can't see [examining.p_their()] eyes."
else
- var/obj/item/organ/internal/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES)
if(has_eyes)
final_message += "\tA pair of [has_eyes.damage ? "" : "healthy "][has_eyes.name]."
else
diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm
index 74ce320a8aba0..c1e6df6c30cfc 100644
--- a/code/modules/clothing/head/tinfoilhat.dm
+++ b/code/modules/clothing/head/tinfoilhat.dm
@@ -109,7 +109,7 @@
";WE REPEAT OUR LIVES DAILY WITHOUT FURTHER QUESTIONS!!"
)
user.say(pick(conspiracy_line), forced=type)
- var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
if(brain)
brain.set_organ_damage(BRAIN_DAMAGE_DEATH)
return OXYLOSS
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index a02c7d1debff9..6d97c116ab11a 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -234,10 +234,10 @@
var/heart_strength
var/pulse_pressure
- var/obj/item/organ/internal/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART)
- var/obj/item/organ/internal/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS)
- var/obj/item/organ/internal/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER)
- var/obj/item/organ/internal/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX)
+ var/obj/item/organ/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX)
var/render_list = list()//information will be packaged in a list for clean display to the user
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 62893c78344df..39f0ec16178a1 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -477,10 +477,11 @@
var/obj/item/mod/control/mod = squaddie.back
if(!istype(mod))
return
- var/obj/item/mod/module/hat_stabilizer/hat_holder = locate() in mod.modules
- var/obj/item/clothing/head/helmet/space/beret/beret = new(hat_holder)
- hat_holder.attached_hat = beret
- squaddie.update_clothing(mod.slot_flags)
+ var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD)
+ var/obj/item/clothing/head/helmet/space/beret/beret = new(helmet)
+ var/datum/component/hat_stabilizer/component = helmet.GetComponent(/datum/component/hat_stabilizer)
+ component.attach_hat(beret)
+ squaddie.update_clothing(helmet.slot_flags)
/datum/outfit/centcom/ert/marine
name = "Marine Commander"
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 53ab86b07718e..3ecec813a95ce 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -4,6 +4,10 @@
lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi'
desc = "Comfortable-looking shoes."
+ pickup_sound = 'sound/items/handling/shoes/sneakers_pickup1.ogg'
+ drop_sound = 'sound/items/handling/shoes/sneakers_drop1.ogg'
+ equip_sound = 'sound/items/equip/sneakers_equip1.ogg'
+ sound_vary = TRUE
gender = PLURAL //Carn: for grammarically correct text-parsing
body_parts_covered = FEET
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 38d4770244abd..0109c422210b9 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -12,7 +12,7 @@
strip_delay = 70
equip_delay_other = 70
resistance_flags = FIRE_PROOF
-
+ clothing_flags = STOPSPRESSUREDAMAGE
slowdown = SHOES_SLOWDOWN
/// Whether the magpulse system is active
var/magpulse = FALSE
diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm
index 32af7abad5f3c..d25f247f5d4db 100644
--- a/code/modules/events/brain_trauma.dm
+++ b/code/modules/events/brain_trauma.dm
@@ -17,7 +17,7 @@
continue
if(H.stat == DEAD) // What are you doing in this list
continue
- if(!H.get_organ_by_type(/obj/item/organ/internal/brain)) // If only I had a brain
+ if(!H.get_organ_by_type(/obj/item/organ/brain)) // If only I had a brain
continue
if(!(H.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) //please stop giving my centcom admin gimmicks full body paralysis
continue
diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm
index 648c2cc9db04c..0dfa87ddfa333 100644
--- a/code/modules/events/creep_awakening.dm
+++ b/code/modules/events/creep_awakening.dm
@@ -19,7 +19,7 @@
continue
if(H.mind.has_antag_datum(/datum/antagonist/obsessed))
continue
- if(!H.get_organ_by_type(/obj/item/organ/internal/brain))
+ if(!H.get_organ_by_type(/obj/item/organ/brain))
continue
H.gain_trauma(/datum/brain_trauma/special/obsessed)
announce_to_ghosts(H)
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 8cc87a60df515..833afd35bbc52 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -61,5 +61,5 @@
/obj/item/food/candy,
/obj/item/food/candiedapple,
/obj/item/food/chocolatebar,
- /obj/item/organ/internal/brain ) // OH GOD THIS ISN'T CANDY!
+ /obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY!
new type(src)
diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm
index c9f4f1b3d1bd7..4b4871e33f67d 100644
--- a/code/modules/experisci/experiment/experiments.dm
+++ b/code/modules/experisci/experiment/experiments.dm
@@ -429,7 +429,7 @@
. = ..()
if (!.)
return
- var/obj/item/organ/internal/brain/scanned_brain = check.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/scanned_brain = check.get_organ_slot(ORGAN_SLOT_BRAIN)
if (isnull(scanned_brain))
experiment_handler.announce_message("Subject is brainless!")
return FALSE
diff --git a/code/modules/experisci/handheld_scanner.dm b/code/modules/experisci/handheld_scanner.dm
index 390937e0dd4e4..67850aedd28a1 100644
--- a/code/modules/experisci/handheld_scanner.dm
+++ b/code/modules/experisci/handheld_scanner.dm
@@ -46,7 +46,7 @@
/obj/item/experi_scanner/proc/make_meat_toilet(mob/living/carbon/user)
///The suicide victim's brain that will be placed inside the toilet's cistern
- var/obj/item/organ/internal/brain/toilet_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/toilet_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
///The toilet we're about to unleash unto this cursed plane of existence
var/obj/structure/toilet/greyscale/result_toilet = new (drop_location())
diff --git a/code/modules/explorer_drone/exploration_events/trader.dm b/code/modules/explorer_drone/exploration_events/trader.dm
index b686a53582d53..0367eb71516e7 100644
--- a/code/modules/explorer_drone/exploration_events/trader.dm
+++ b/code/modules/explorer_drone/exploration_events/trader.dm
@@ -89,7 +89,7 @@
requires_translator = FALSE
required_site_traits = list(EXPLORATION_SITE_HABITABLE,EXPLORATION_SITE_CIVILIZED)
band_values = list(EXOSCANNER_BAND_LIFE=1)
- required_path = list(/obj/item/organ/internal/heart,/obj/item/organ/internal/liver,/obj/item/organ/internal/stomach,/obj/item/organ/internal/eyes)
+ required_path = list(/obj/item/organ/heart,/obj/item/organ/liver,/obj/item/organ/stomach,/obj/item/organ/eyes)
traded_path = list(/obj/item/implanter/explosive)
amount = 1
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 7ef974b596ddf..021f1be45d8a3 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -1324,24 +1324,6 @@
. = ..()
aquarium_vc_color = color || initial(aquarium_vc_color)
-/obj/item/fish/get_infusion_entry()
- var/amphibious = required_fluid_type == AQUARIUM_FLUID_AIR || HAS_TRAIT(src, TRAIT_FISH_AMPHIBIOUS)
- var/list/possible_infusions = list()
- for(var/type in fish_traits)
- var/datum/fish_trait/trait = GLOB.fish_traits[type]
- if(!trait.infusion_entry)
- continue
- possible_infusions |= trait.infusion_entry
- if(!length(possible_infusions) && !amphibious)
- return GLOB.infuser_entries[/datum/infuser_entry/fish]
- var/datum/infuser_entry/fish/entry = new
- if(amphibious)
- entry.output_organs -= /obj/item/organ/internal/lungs/fish
- for(var/key in possible_infusions)
- var/datum/infuser_entry/infusion = GLOB.infuser_entries[key]
- entry.output_organs |= infusion.output_organs
- return entry
-
/// Returns random fish, using random_case_rarity probabilities.
/proc/random_fish_type(required_fluid)
var/static/probability_table
diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm
index e1be9dc909ba9..8b2f1a34e93f7 100644
--- a/code/modules/fishing/fishing_portal_machine.dm
+++ b/code/modules/fishing/fishing_portal_machine.dm
@@ -17,6 +17,8 @@
var/max_fishing_spots = 1
///If true, the fishing portal can stay connected to a linked fishing spot even on different z-levels
var/long_range_link = FALSE
+ /// contains ALL fishing destinations.
+ var/all_destinations = FALSE
/obj/machinery/fishing_portal_generator/Initialize(mapload)
. = ..()
@@ -214,7 +216,7 @@
if(!abort)
RegisterSignal(spot, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_fishing_spot_z_level_changed))
break
- if(abort)
+ if(abort && !all_destinations)
balloon_alert(user, "cannot reach linked!")
return
@@ -256,7 +258,9 @@
if(obj_flags & EMAGGED)
var/datum/fish_source/portal/syndicate = GLOB.preset_fish_sources[/datum/fish_source/portal/syndicate]
available_fish_sources[syndicate.radial_name] = syndicate
- for (var/datum/techweb/techweb as anything in SSresearch.techwebs)
+ if(all_destinations)
+ available_fish_sources = GLOB.preset_fish_sources
+ else for (var/datum/techweb/techweb as anything in SSresearch.techwebs)
var/get_fish_sources = FALSE
for(var/obj/machinery/rnd/server/server as anything in techweb.techweb_servers)
if(!is_valid_z_level(get_turf(server), get_turf(src)))
@@ -274,7 +278,7 @@
var/id = 1
for(var/atom/spot as anything in linked_fishing_spots)
- var/choice_name = "[spot.name] ([id])"
+ var/choice_name = "[id] - [spot.name]"
available_fish_sources[choice_name] = linked_fishing_spots[spot]
id++
@@ -298,3 +302,8 @@
/obj/machinery/fishing_portal_generator/emagged
obj_flags = parent_type::obj_flags | EMAGGED
circuit = /obj/item/circuitboard/machine/fishing_portal_generator/emagged
+
+/obj/machinery/fishing_portal_generator/full
+ name = "fish-porter 4000 deluxe"
+ desc = "the ultimate fishing device"
+ all_destinations = TRUE
diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm
index 9a02e0b270b42..0e80ee423cafd 100644
--- a/code/modules/fishing/sources/_fish_source.dm
+++ b/code/modules/fishing/sources/_fish_source.dm
@@ -458,7 +458,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons())
if(rod)
info = span_tooltip("boldened are the fish you're more likely to catch with your current setup. The opposite is true for smaller names", info)
- examine_text += examine_block(span_info("[info]: [english_list(known_fishes)]."))
+ examine_text += span_info("[info]: [english_list(known_fishes)].")
/datum/fish_source/proc/spawn_reward_from_explosion(atom/location, severity)
if(!explosive_malus)
diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm
index f6cbd969a8d6d..382ffeb386705 100644
--- a/code/modules/fishing/sources/source_types.dm
+++ b/code/modules/fishing/sources/source_types.dm
@@ -375,10 +375,12 @@
/obj/item/stack/sheet/mineral/adamantine = 3,
/obj/item/stack/sheet/mineral/runite = 2,
)
+ overlay_state = "portal_plasma"
/datum/fish_source/moisture_trap
catalog_description = "Moisture trap basins"
radial_state = "garbage"
+ overlay_state = "portal_river" // placeholder
fish_table = list(
FISHING_DUD = 20,
/obj/item/fish/ratfish = 10,
@@ -390,6 +392,7 @@
catalog_description = "Station toilets"
radial_state = "toilet"
duds = list("ewww... nothing", "it was nothing", "it was toilet paper", "it was flushed away", "the hook is empty", "where's the damn money?!")
+ overlay_state = "portal_river" // placeholder
fish_table = list(
FISHING_DUD = 18,
/obj/item/fish/sludgefish = 18,
@@ -473,6 +476,7 @@
/datum/fish_source/hydro_tray
catalog_description = "Hydroponics trays"
radial_state = "hydro"
+ overlay_state = "portal_tray"
fish_table = list(
FISHING_DUD = 25,
/obj/item/food/grown/grass = 25,
@@ -581,6 +585,7 @@
/datum/fish_source/carp_rift
catalog_description = "Space Dragon Rifts"
radial_state = "carp"
+ overlay_state = "portal_rift"
fish_table = list(
FISHING_DUD = 3,
/obj/item/fish/baby_carp = 5,
@@ -600,6 +605,7 @@
/datum/fish_source/deepfryer
catalog_description = "Deep Fryers"
radial_state = "fryer"
+ overlay_state = "portal_fry" // literally resprited lava. better than nothing
fish_table = list(
/obj/item/food/badrecipe = 15,
/obj/item/food/nugget = 5,
diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
index c69de62fbfc97..2aab17f5b9ea0 100644
--- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
@@ -661,7 +661,7 @@
required_reagents = list(/datum/reagent/water = 50)
required_ingredients = list(
/obj/item/food/grown/tomato = 2,
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/eyes = 1,
)
results = list(
/datum/reagent/consumable/nutriment/soup/eyeball = 20,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index 8f78cb01ebc23..d0517272d7769 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -155,8 +155,8 @@
/datum/crafting_recipe/food/breaddog
name = "Living dog/bread hybrid"
reqs = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/organ/heart = 1,
/obj/item/food/bread/plain = 2,
/obj/item/food/meat/slab = 3,
/datum/reagent/blood = 30,
@@ -216,8 +216,8 @@
name = "Bread cat/bread hybrid"
reqs = list(
/obj/item/food/bread/plain = 1,
- /obj/item/organ/internal/ears/cat = 1,
- /obj/item/organ/external/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1,
+ /obj/item/organ/tail/cat = 1,
/obj/item/food/meat/slab = 3,
/datum/reagent/blood = 50,
/datum/reagent/medicine/strange_reagent = 5
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index 4e7c63413ecea..2953f8408ac92 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -39,7 +39,7 @@
/datum/crafting_recipe/food/appendixburger
name = "Appendix burger"
reqs = list(
- /obj/item/organ/internal/appendix = 1,
+ /obj/item/organ/appendix = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/appendix
@@ -48,7 +48,7 @@
/datum/crafting_recipe/food/brainburger
name = "Brain burger"
reqs = list(
- /obj/item/organ/internal/brain = 1,
+ /obj/item/organ/brain = 1,
/obj/item/food/bun = 1
)
result = /obj/item/food/burger/brain
@@ -306,8 +306,8 @@
reqs = list(
/obj/item/food/bun = 1,
/obj/item/food/patty/plain = 1,
- /obj/item/organ/internal/ears/cat = 1,
- /obj/item/organ/external/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1,
+ /obj/item/organ/tail/cat = 1,
)
result = /obj/item/food/burger/catburger
category = CAT_BURGER
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index 4b56874eb7c6b..86956ba861cad 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -90,7 +90,7 @@
/datum/crafting_recipe/food/braincake
name = "Brain cake"
reqs = list(
- /obj/item/organ/internal/brain = 1,
+ /obj/item/organ/brain = 1,
/obj/item/food/cake/plain = 1
)
result = /obj/item/food/cake/brain
@@ -218,8 +218,8 @@
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/organ/heart = 1,
/obj/item/food/cake/birthday = 1,
/obj/item/food/meat/slab = 3,
/datum/reagent/blood = 30,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
index 5a754361ffb1f..5a7947c569e4b 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
@@ -11,10 +11,10 @@
name = "Lizard Wine"
time = 40
reqs = list(
- /obj/item/organ/external/tail/lizard = 1,
+ /obj/item/organ/tail/lizard = 1,
/datum/reagent/consumable/ethanol = 100
)
- blacklist = list(/obj/item/organ/external/tail/lizard/fake)
+ blacklist = list(/obj/item/organ/tail/lizard/fake)
result = /obj/item/reagent_containers/cup/glass/bottle/lizardwine
category = CAT_DRINK
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
index 7b253f32ce17d..d9f9cd16fe940 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
@@ -25,11 +25,11 @@
/obj/item/food/grown/carrot = 1,
/obj/item/food/grown/chili = 1,
/obj/item/food/grown/onion = 1,
- /obj/item/organ/internal/lungs = 1,
+ /obj/item/organ/lungs = 1,
/obj/item/reagent_containers/cup/bowl = 1,
)
blacklist = list(
- /obj/item/organ/internal/lungs/cybernetic,
+ /obj/item/organ/lungs/cybernetic,
)
result = /obj/item/food/shredded_lungs
@@ -38,10 +38,10 @@
/datum/crafting_recipe/food/tsatsikh
name = "Tsatsikh"
reqs = list(
- /obj/item/organ/internal/heart = 1,
- /obj/item/organ/internal/liver = 1,
- /obj/item/organ/internal/lungs = 1,
- /obj/item/organ/internal/stomach = 1,
+ /obj/item/organ/heart = 1,
+ /obj/item/organ/liver = 1,
+ /obj/item/organ/lungs = 1,
+ /obj/item/organ/stomach = 1,
/datum/reagent/consumable/salt = 2,
/datum/reagent/consumable/blackpepper = 2
)
@@ -51,7 +51,7 @@
/datum/crafting_recipe/food/liver_pate
name = "Liver pate"
reqs = list(
- /obj/item/organ/internal/liver = 1,
+ /obj/item/organ/liver = 1,
/obj/item/food/meat/rawcutlet = 1,
/obj/item/food/grown/onion = 1
)
@@ -104,8 +104,8 @@
/datum/crafting_recipe/food/brain_pate
name = "Eyeball-and-brain pate"
reqs = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/eyes = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/organ/eyes = 1,
/obj/item/food/grown/onion = 1,
/datum/reagent/consumable/salt = 3
)
@@ -305,7 +305,7 @@
/obj/item/food/root_flatbread = 1,
/obj/item/food/grown/cucumber = 2,
/obj/item/food/egg = 1,
- /obj/item/organ/internal/liver = 1
+ /obj/item/organ/liver = 1
)
result = /obj/item/food/pizza/flatbread/zmorgast
category = CAT_LIZARD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 804956cbeed5b..9244f4c54f30d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -33,7 +33,7 @@
name = "Lizard tail kebab"
reqs = list(
/obj/item/stack/rods = 1,
- /obj/item/organ/external/tail/lizard = 1
+ /obj/item/organ/tail/lizard = 1
)
result = /obj/item/food/kebab/tail
category = CAT_MEAT
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
index 840d3a8c08b1a..3dbd7093a7415 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
@@ -107,7 +107,7 @@
time = 40
reqs = list(
/obj/item/food/meat/steak/goliath = 1,
- /obj/item/organ/internal/monster_core/regenerative_core/legion = 1,
+ /obj/item/organ/monster_core/regenerative_core/legion = 1,
/datum/reagent/consumable/ketchup = 2,
/datum/reagent/consumable/capsaicin = 2
)
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index cc27a6f078bef..9e145500a17c4 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -154,8 +154,8 @@
/datum/crafting_recipe/food/butterbear //ITS ALIVEEEEEE!
name = "Living bear/butter hybrid"
reqs = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/organ/heart = 1,
/obj/item/food/butter = 4,
/obj/item/food/meat/slab = 5,
/datum/reagent/blood = 50,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 8798f7cd8806c..522f6e9f695f8 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -423,7 +423,7 @@
time = 15
name = "Deluxe Meat-pocket"
reqs = list(
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/heart = 1,
/obj/item/food/meatball = 1,
/obj/item/food/meat/slab = 1,
/obj/item/food/grown/herbs = 1
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 6e09ee3497cdd..db47c5625e3ba 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -39,7 +39,7 @@
///Clowns will always like bananas.
/obj/item/food/grown/banana/proc/check_liked(mob/living/carbon/human/consumer)
- var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
if (!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM))
return FOOD_LIKED
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 3b2bac8b4b289..0646d1d1df350 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -132,6 +132,8 @@
/// Minimal character age for this job
var/required_character_age
+ /// If set, look for a policy with this instead of the job title
+ var/policy_override
/datum/job/New()
. = ..()
@@ -149,7 +151,7 @@
if(length(mind_traits))
spawned.mind.add_traits(mind_traits, JOB_TRAIT)
- var/obj/item/organ/internal/liver/liver = spawned.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = spawned.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && length(liver_traits))
liver.add_traits(liver_traits, JOB_TRAIT)
@@ -304,7 +306,7 @@
SHOULD_CALL_PARENT(TRUE)
var/list/info = list()
info += "You are the [title].\n"
- var/related_policy = get_policy(title)
+ var/related_policy = get_policy(policy_override || title)
var/radio_info = get_radio_information()
if(related_policy)
info += related_policy
diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
index d5eb15d0c4733..a0e8bd47d3c89 100644
--- a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
+++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm
@@ -49,7 +49,7 @@
/datum/outfit/job/assistant/gimmick/cyborg/post_equip(mob/living/carbon/human/equipped, visuals_only)
. = ..()
- var/obj/item/organ/internal/tongue/robot/robotongue = new ()
+ var/obj/item/organ/tongue/robot/robotongue = new ()
robotongue.Insert(equipped, movement_flags = DELETE_IF_REPLACED)
/datum/outfit/job/assistant/gimmick/skater
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
index 7d4ece1d2085a..5a3e7a044e5a0 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
@@ -45,7 +45,7 @@
rods[nullrod_type] = initial(nullrod_type.menu_description)
//special non-nullrod subtyped shit
rods[/obj/item/gun/ballistic/bow/divine/with_quiver] = "A divine bow and 10 quivered holy arrows."
- rods[/obj/item/organ/internal/cyberimp/arm/shard/scythe] = "A shard that implants itself into your arm, \
+ rods[/obj/item/organ/cyberimp/arm/shard/scythe] = "A shard that implants itself into your arm, \
allowing you to conjure forth a vorpal scythe. \
Allows you to behead targets for empowered strikes. \
Harms you if you dismiss the scythe without first causing harm to a creature. \
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
index e6f34b894b3de..d2f6f61251dd2 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
@@ -5,17 +5,17 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and
#define SCYTHE_SATED 1
#define SCYTHE_EMPOWERED 2
-/obj/item/organ/internal/cyberimp/arm/shard/scythe
+/obj/item/organ/cyberimp/arm/shard/scythe
name = "sinister shard"
desc = "This shard seems to be directly linked to some sinister entity. It might be your god! It also gives you a really horrible rash when you hold onto it for too long."
items_to_create = list(/obj/item/vorpalscythe)
-/obj/item/organ/internal/cyberimp/arm/shard/scythe/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/cyberimp/arm/shard/scythe/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
if(receiver.mind)
ADD_TRAIT(receiver.mind, TRAIT_MORBID, ORGAN_TRAIT)
-/obj/item/organ/internal/cyberimp/arm/shard/scythe/Retract()
+/obj/item/organ/cyberimp/arm/shard/scythe/Retract()
var/obj/item/vorpalscythe/scythe = active_item
if(!scythe)
return FALSE
diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
index d776ae6251f7f..562ec695d8a10 100644
--- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
+++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
@@ -37,7 +37,9 @@
/datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client)
. = ..()
- ADD_TRAIT(spawned, TRAIT_NO_TWOHANDING, JOB_TRAIT)
+ var/mob/living/carbon/bridgie = spawned
+ if(istype(bridgie))
+ bridgie.gain_trauma(/datum/brain_trauma/special/axedoration)
/datum/job/bridge_assistant/get_roundstart_spawn_point()
var/list/chair_turfs = list()
diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm
index b328679795a2c..f0626d111522e 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -128,7 +128,7 @@
if(visuals_only)
return
if(!equipped.get_quirk(/datum/quirk/body_purist))
- var/obj/item/organ/internal/tongue/robot/cybernetic = new()
+ var/obj/item/organ/tongue/robot/cybernetic = new()
cybernetic.Insert(equipped, special = TRUE, movement_flags = DELETE_IF_REPLACED)
//you only get respect if you go all the way, man.
ADD_TRAIT(equipped, TRAIT_COMMISSIONED, INNATE_TRAIT)
diff --git a/code/modules/language/_language.dm b/code/modules/language/_language.dm
index 6a00610c0adf2..595b591a0dd90 100644
--- a/code/modules/language/_language.dm
+++ b/code/modules/language/_language.dm
@@ -85,7 +85,7 @@
syllable_max = default_name_syllable_max,
force_use_syllables = FALSE,
)
- if(gender != MALE)
+ if(gender != MALE && gender != FEMALE)
gender = pick(MALE, FEMALE)
if(!length(syllables) || always_use_default_namelist)
return default_name(gender)
diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm
index 2dec45a6abf77..dc42dd7db90a3 100644
--- a/code/modules/library/skill_learning/skill_station.dm
+++ b/code/modules/library/skill_learning/skill_station.dm
@@ -229,7 +229,7 @@
.["slots_max"] = null
return
- var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
// If there's no brain, we don't need to worry either.
if(QDELETED(occupant_brain))
@@ -272,7 +272,7 @@
return TRUE
var/chipref = params["ref"]
var/mob/living/carbon/carbon_occupant = occupant
- var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(carbon_occupant) || QDELETED(occupant_brain))
return TRUE
var/obj/item/skillchip/to_be_removed = locate(chipref) in occupant_brain.skillchips
@@ -297,7 +297,7 @@
stack_trace("[usr] tried to toggle skillchip activation when [src] was in an invalid state.")
return TRUE
var/mob/living/carbon/carbon_occupant = occupant
- var/obj/item/organ/internal/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/occupant_brain = carbon_occupant.get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(carbon_occupant) || QDELETED(occupant_brain))
return TRUE
var/obj/item/skillchip/to_be_removed = locate(chipref) in occupant_brain.skillchips
diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm
index eddaf300e08a9..5ca3f784ecbec 100644
--- a/code/modules/library/skill_learning/skillchip.dm
+++ b/code/modules/library/skill_learning/skillchip.dm
@@ -42,7 +42,7 @@
/// Set to TRUE when the skill chip's effects are applied. Set to FALSE when they're not.
var/active = FALSE
/// Brain that holds this skillchip.
- var/obj/item/organ/internal/brain/holding_brain
+ var/obj/item/organ/brain/holding_brain
/obj/item/skillchip/Initialize(mapload, is_removable = TRUE)
. = ..()
@@ -131,7 +131,7 @@
* Arguments:
* * owner_brain - The brain that this skillchip was implanted in to.
*/
-/obj/item/skillchip/proc/on_implant(obj/item/organ/internal/brain/owner_brain)
+/obj/item/skillchip/proc/on_implant(obj/item/organ/brain/owner_brain)
if(holding_brain)
CRASH("Skillchip is trying to be implanted into [owner_brain], but it's already implanted in [holding_brain]")
@@ -205,7 +205,7 @@
* Arguments:
* * skillchip - The skillchip you're intending to activate. Does not activate the chip.
*/
-/obj/item/skillchip/proc/has_activate_incompatibility(obj/item/organ/internal/brain/brain)
+/obj/item/skillchip/proc/has_activate_incompatibility(obj/item/organ/brain/brain)
if(QDELETED(brain))
return "No brain detected."
@@ -255,7 +255,7 @@
return "Incompatible lifeform detected."
// No brain
- var/obj/item/organ/internal/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(brain))
return "No brain detected."
@@ -274,7 +274,7 @@
* Arguments:
* * brain - The brain to check for implantability with.
*/
-/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/internal/brain/brain)
+/obj/item/skillchip/proc/has_brain_incompatibility(obj/item/organ/brain/brain)
if(!istype(brain))
stack_trace("Attempted to check incompatibility with invalid brain object [brain].")
return "Incompatible brain."
diff --git a/code/modules/lost_crew/body_bags.dm b/code/modules/lost_crew/body_bags.dm
new file mode 100644
index 0000000000000..7b4643dc232c3
--- /dev/null
+++ b/code/modules/lost_crew/body_bags.dm
@@ -0,0 +1,50 @@
+/obj/item/bodybag/lost_crew
+ name = "long-term body bag"
+ desc = "A folded bag designed for the long-term storage and transportation of cadavers."
+ unfoldedbag_path = /obj/structure/closet/body_bag/lost_crew
+ icon_state = "bodybag_lost_folded"
+
+/obj/structure/closet/body_bag/lost_crew
+ name = "long-term body bag"
+ desc = "A plastic bag designed for the long-term storage and transportation of cadavers."
+
+ icon_state = "bodybag_lost"
+
+ foldedbag_path = /obj/item/bodybag/lost_crew
+
+/// Filled with one body. If folded, gives the parent type so we dont make infinite corpses
+/obj/structure/closet/body_bag/lost_crew/with_body
+ /// Whether or not we spawn a paper with everything thats happened to the body
+ var/debug = FALSE
+
+/obj/structure/closet/body_bag/lost_crew/with_body/PopulateContents()
+ var/list/recovered_items = list()
+ var/list/protected_items = list()
+ var/list/lost_crew_data = list()
+ var/mob/living/corpse = GLOB.lost_crew_manager.create_lost_crew(revivable = TRUE, recovered_items = recovered_items, protected_items = protected_items, body_data = lost_crew_data)
+ corpse.mind_initialize()
+ corpse.forceMove(src)
+
+ // Drop stuff like dropped limbs and organs with them in the bag
+ for(var/obj/object in recovered_items)
+ object.forceMove(src)
+
+ // Spawn a mind lockbox with job stuffs for them to work with when they return
+ if(protected_items.len && corpse.mind)
+ var/obj/item/storage/lockbox/mind/box = new(src)
+ box.mind = corpse.mind
+ for(var/obj/object in protected_items)
+ object.forceMove(box)
+
+ process_data(lost_crew_data)
+
+/obj/structure/closet/body_bag/lost_crew/with_body/proc/process_data(list/crew_data)
+ if(!debug)
+ return
+
+ var/obj/item/paper/paper = new(src)
+ paper.add_raw_text(english_list(crew_data), advanced_html = TRUE)
+
+/// Subtype for debugging damage types
+/obj/structure/closet/body_bag/lost_crew/with_body/debug
+ debug = TRUE
diff --git a/code/modules/lost_crew/character/_assignment.dm b/code/modules/lost_crew/character/_assignment.dm
new file mode 100644
index 0000000000000..69d8ac96f7922
--- /dev/null
+++ b/code/modules/lost_crew/character/_assignment.dm
@@ -0,0 +1,139 @@
+/// Possible assignments corpses can have, both for flavor and to push them towards contributing to the round
+/datum/corpse_assignment
+ /// Message we send to the player upon revival concerning their job
+ var/job_lore
+ /// Gear to give to the crewie in a special locked box
+ var/list/job_stuffs
+ /// Trim on the ID we give to the revived person (no trim = no id)
+ var/datum/id_trim/trim
+ /// Job datum to apply to the human
+ var/datum/job/job_datum
+
+/datum/corpse_assignment/proc/apply_assignment(mob/living/carbon/human/working_dead, list/job_gear, list/datum/callback/on_revive_and_player_occupancy)
+ if(!job_gear)
+ return
+
+ for(var/item in job_stuffs)
+ job_gear += new item ()
+ job_gear += job_stuffs
+
+ if(job_datum)
+ on_revive_and_player_occupancy += CALLBACK(src, PROC_REF(assign_job), working_dead) //this needs to happen once the body has been succesfully occupied and revived
+
+ if(trim)
+ var/obj/item/card/id/advanced/card = new()
+ card.registered_name = working_dead.name
+ card.registered_age = working_dead.age
+ SSid_access.apply_trim_to_card(card, trim)
+ job_gear += card
+
+/datum/corpse_assignment/proc/assign_job(mob/living/carbon/human/working_undead)
+ working_undead.mind.set_assigned_role_with_greeting(new job_datum (), working_undead.client)
+
+/datum/corpse_assignment/engineer
+ job_lore = "I was employed as an engineer"
+ job_stuffs = list(/obj/item/clothing/under/rank/engineering/engineer)
+ trim = /datum/id_trim/job/visiting_engineer
+ job_datum = /datum/job/recovered_crew/engineer
+
+/datum/id_trim/job/visiting_engineer
+ assignment = JOB_LOSTCREW_ENGINEER
+ trim_state = "trim_stationengineer"
+ department_color = COLOR_ENGINEERING_ORANGE
+ subdepartment_color = COLOR_ENGINEERING_ORANGE
+ sechud_icon_state = SECHUD_STATION_ENGINEER
+ minimal_access = list(
+ ACCESS_CONSTRUCTION,
+ ACCESS_EXTERNAL_AIRLOCKS,
+ ACCESS_MAINT_TUNNELS,
+ )
+
+/datum/corpse_assignment/medical
+ job_lore = "I was employed as a doctor"
+ job_stuffs = list(/obj/item/clothing/under/rank/medical/doctor)
+ trim = /datum/id_trim/job/visiting_doctor
+ job_datum = /datum/job/recovered_crew/doctor
+
+/datum/id_trim/job/visiting_doctor
+ assignment = JOB_LOSTCREW_MEDICAL
+ trim_state = "trim_medicaldoctor"
+ department_color = COLOR_MEDICAL_BLUE
+ subdepartment_color = COLOR_MEDICAL_BLUE
+ sechud_icon_state = SECHUD_MEDICAL_DOCTOR
+
+ minimal_access = list(
+ ACCESS_MEDICAL,
+ )
+
+/datum/corpse_assignment/security
+ job_lore = "I was employed as security"
+ job_stuffs = list(/obj/item/clothing/under/rank/security/officer)
+ trim = /datum/id_trim/job/visiting_security
+ job_datum = /datum/job/recovered_crew/security
+
+/datum/corpse_assignment/security/apply_assignment(mob/living/carbon/human/working_dead, list/job_gear)
+ . = ..()
+
+ var/obj/item/implant/mindshield/shield = new()
+ shield.implant(working_dead)
+
+/datum/id_trim/job/visiting_security
+ assignment = JOB_LOSTCREW_SECURITY
+ trim_state = "trim_securityofficer"
+ department_color = COLOR_SECURITY_RED
+ subdepartment_color = COLOR_SECURITY_RED
+ sechud_icon_state = SECHUD_SECURITY_OFFICER
+
+ minimal_access = list(
+ ACCESS_BRIG_ENTRANCE,
+ )
+
+/datum/corpse_assignment/science
+ job_lore = "I was employed as a scientist"
+ job_stuffs = list(/obj/item/clothing/under/rank/rnd/scientist)
+ trim = /datum/id_trim/job/visiting_scientist
+ job_datum = /datum/job/recovered_crew/scientist
+
+/datum/id_trim/job/visiting_scientist
+ assignment = JOB_LOSTCREW_SCIENCE
+ trim_state = "trim_scientist"
+ department_color = COLOR_SCIENCE_PINK
+ subdepartment_color = COLOR_SCIENCE_PINK
+ sechud_icon_state = SECHUD_SCIENTIST
+ minimal_access = list(
+ ACCESS_AUX_BASE,
+ ACCESS_SCIENCE,
+ )
+
+/datum/corpse_assignment/cargo
+ job_lore = "I was employed as a technician"
+ job_stuffs = list(/obj/item/clothing/under/rank/cargo/tech)
+ trim = /datum/id_trim/job/visiting_technician
+ job_datum = /datum/job/recovered_crew/cargo
+
+/datum/id_trim/job/visiting_technician
+ assignment = JOB_LOSTCREW_CARGO
+ trim_state = "trim_cargotechnician"
+ department_color = COLOR_CARGO_BROWN
+ subdepartment_color = COLOR_CARGO_BROWN
+ sechud_icon_state = SECHUD_CARGO_TECHNICIAN
+ minimal_access = list(
+ ACCESS_CARGO,
+ ACCESS_MAINT_TUNNELS,
+ )
+
+/datum/corpse_assignment/civillian
+ job_lore = "I was employed as a civllian"
+ job_stuffs = list(/obj/item/clothing/under/color/grey)
+ trim = /datum/id_trim/job/visiting_civillian
+ job_datum = /datum/job/recovered_crew/civillian
+
+/datum/id_trim/job/visiting_civillian
+ assignment = JOB_LOSTCREW_CIVILLIAN
+ trim_state = "trim_assistant"
+ sechud_icon_state = SECHUD_ASSISTANT
+ minimal_access = list()
+ extra_access = list(
+ ACCESS_MAINT_TUNNELS,
+ ACCESS_SERVICE,
+ )
diff --git a/code/modules/lost_crew/character/_character.dm b/code/modules/lost_crew/character/_character.dm
new file mode 100644
index 0000000000000..4129a7f122795
--- /dev/null
+++ b/code/modules/lost_crew/character/_character.dm
@@ -0,0 +1,44 @@
+/// Datum for controlling the base character, such as species, scarring, styles, augments etc
+/datum/corpse_character
+ /// Species type to spawn with
+ var/datum/species/species_type = /datum/species/human
+
+/datum/corpse_character/proc/apply_character(mob/living/carbon/human/fashionable_corpse, list/saved_objects, list/datum/callback/on_revive_and_player_occupancy)
+ fashionable_corpse.set_species(species_type)
+ fashionable_corpse.fully_replace_character_name(fashionable_corpse.real_name, fashionable_corpse.generate_random_mob_name())
+
+/// Not really all roundstart species, but plasmaman is a bit too flamboyant and felinids aren't interesting
+/datum/corpse_character/mostly_roundstart
+ var/list/possible_species = list(
+ /datum/species/human = 10,
+ /datum/species/lizard = 2,
+ /datum/species/ethereal = 1,
+ /datum/species/moth = 1,
+ )
+
+/datum/corpse_character/mostly_roundstart/apply_character(mob/living/carbon/human/fashionable_corpse, list/saved_objects, list/datum/callback/on_revive_and_player_occupancy)
+ species_type = pick_weight(possible_species)
+ ..()
+
+/datum/corpse_character/human
+ species_type = /datum/species/human
+
+/// used by the morgue trays to spawn bodies (obeying three different configs???????????????????? yes please daddy give me more config for benign features)
+/datum/corpse_character/morgue
+
+/datum/corpse_character/morgue/apply_character(mob/living/carbon/human/fashionable_corpse, list/saved_objects, list/datum/callback/on_revive_and_player_occupancy)
+ var/use_species = !(CONFIG_GET(flag/morgue_cadaver_disable_nonhumans))
+ var/species_probability = CONFIG_GET(number/morgue_cadaver_other_species_probability) * use_species
+ var/override_species = CONFIG_GET(string/morgue_cadaver_override_species)
+
+ if(override_species)
+ species_type = GLOB.species_list[override_species]
+
+ else if(prob(species_probability))
+ species_type = GLOB.species_list[pick(get_selectable_species())]
+
+ if(!species_type)
+ stack_trace("failed to spawn cadaver with species ID [species_type]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol.
+ species_type = initial(species_type)
+
+ return ..()
diff --git a/code/modules/lost_crew/character/job_datums.dm b/code/modules/lost_crew/character/job_datums.dm
new file mode 100644
index 0000000000000..5b9ad43311fea
--- /dev/null
+++ b/code/modules/lost_crew/character/job_datums.dm
@@ -0,0 +1,33 @@
+/datum/job/recovered_crew
+ policy_override = "Recovered Crew"
+ faction = FACTION_STATION
+
+/datum/job/recovered_crew/doctor
+ title = JOB_LOSTCREW_MEDICAL
+ department_head = list(JOB_CHIEF_MEDICAL_OFFICER)
+ supervisors = SUPERVISOR_CMO
+
+/datum/job/recovered_crew/engineer
+ title = JOB_LOSTCREW_ENGINEER
+ department_head = list(JOB_CHIEF_ENGINEER)
+ supervisors = SUPERVISOR_CE
+
+/datum/job/recovered_crew/security
+ title = JOB_LOSTCREW_SECURITY
+ department_head = list(JOB_HEAD_OF_SECURITY)
+ supervisors = SUPERVISOR_HOS
+
+/datum/job/recovered_crew/cargo
+ title = JOB_LOSTCREW_CARGO
+ department_head = list(JOB_QUARTERMASTER)
+ supervisors = SUPERVISOR_QM
+
+/datum/job/recovered_crew/scientist
+ title = JOB_LOSTCREW_SCIENCE
+ department_head = list(JOB_RESEARCH_DIRECTOR)
+ supervisors = SUPERVISOR_RD
+
+/datum/job/recovered_crew/civillian
+ title = JOB_LOSTCREW_CIVILLIAN
+ department_head = list(JOB_HEAD_OF_PERSONNEL)
+ supervisors = SUPERVISOR_HOP
diff --git a/code/modules/lost_crew/damages/_damages.dm b/code/modules/lost_crew/damages/_damages.dm
new file mode 100644
index 0000000000000..0dcbe4ad203d1
--- /dev/null
+++ b/code/modules/lost_crew/damages/_damages.dm
@@ -0,0 +1,110 @@
+// Unique damage types we can apply for blacklisting, so we dont remove all organs twice etc
+#define CORPSE_DAMAGE_ORGAN_DECAY "organ decay"
+#define CORPSE_DAMAGE_ORGAN_LOSS "organ loss"
+#define CORPSE_DAMAGE_LIMB_LOSS "limb loss"
+
+/// The main style controller for new dead bodies! Determines the character, lore, possible causes of death, decay and every other modifier!
+/datum/corpse_damage_class
+ /// Message sent to the recovered crew, constructed from the different death lores
+ var/list/death_lore = list()
+ /// Lore we give on revival, this is the first line
+ var/area_lore = "I was doing something"
+ /// Weight given to this class. Setting this is all that's needed for it to be rollable
+ var/weight
+ /// Different character archetypes we can spawn
+ var/list/possible_character_types
+ /// Assignments that can be given to the corpse
+ var/list/possible_character_assignments
+ /// Whatever killed us
+ var/list/possible_causes_of_death
+ /// Goddamn space vultures stealing my organs
+ var/list/post_mortem_effects
+ /// A random decay we apply. Defined here so we can vary it (i.e. a spaced body has less decay than one in a warm jungle)
+ var/list/decays = list(/datum/corpse_damage/post_mortem/organ_decay)
+ /// When healthscanned, this is the minimum time that shows
+ var/lore_death_time_min = 1 DAYS
+ /// When healthscanned, this is the maximum time that shows
+ var/lore_death_time_max = 5 YEARS
+
+/// Generate and apply a possible character (species etc)
+/datum/corpse_damage_class/proc/apply_character(mob/living/carbon/human/fashion_corpse, list/protected_objects, list/datum/callback/on_revive_and_player_occupancy, list/body_data)
+ var/datum/corpse_character/character = pick_weight(possible_character_types)
+ character = new character()
+ character.apply_character(fashion_corpse, protected_objects, on_revive_and_player_occupancy)
+
+ var/datum/corpse_assignment/assignment = pick_weight(possible_character_assignments)
+ if(assignment)
+ assignment = new assignment()
+ assignment.apply_assignment(fashion_corpse, protected_objects, on_revive_and_player_occupancy)
+
+ death_lore += assignment?.job_lore
+
+ body_data += character.type
+ body_data += assignment?.type
+
+/// Set up injuries
+/datum/corpse_damage_class/proc/apply_injuries(mob/living/carbon/human/victim, list/saved_objects, list/datum/callback/on_revive_and_player_occupancy, list/body_data)
+ var/datum/corpse_damage/cause_of_death/cause_of_death = pick_damage_type(possible_causes_of_death)
+ cause_of_death.apply_to_body(victim, rand(), saved_objects, on_revive_and_player_occupancy)
+
+ var/datum/corpse_damage/post_mortem = pick_damage_type(post_mortem_effects)
+ post_mortem?.apply_to_body(victim, rand(), saved_objects, on_revive_and_player_occupancy)
+
+ var/datum/corpse_damage/decay = pick_damage_type(decays)
+ decay?.apply_to_body(victim, rand(), saved_objects, on_revive_and_player_occupancy)
+
+ // Simulate bloodloss by dragging/moving
+ victim.blood_volume = max(victim.blood_volume - victim.bleedDragAmount() * rand(20, 100), 0)
+ set_death_date(victim)
+
+ body_data += cause_of_death.type
+ body_data += post_mortem?.type
+ body_data += decay.type
+
+ death_lore += area_lore + " " + cause_of_death.cause_of_death
+
+/// Wrapped pickweight so we can have a bit more controle over how we pick our rules
+/datum/corpse_damage_class/proc/pick_damage_type(list/damages, list/used_damage_types)
+ var/list/possible_damages = list()
+
+ for(var/datum/corpse_damage/damage as anything in damages)
+ if(isdatum(damage) && damage.damage_type && (damage.damage_type in used_damage_types))
+ continue
+ possible_damages[damage] = damages[damage]
+
+ var/datum/corpse_damage/chosen = pick_weight(possible_damages)
+ if(!ispath(chosen)) //can also be null for some variants
+ return null
+
+ chosen = new chosen()
+
+ if(chosen.damage_type)
+ used_damage_types += chosen.damage_type
+ return chosen
+
+/// Soulfully give a date of death for health analyzers
+/datum/corpse_damage_class/proc/set_death_date(mob/living/carbon/body)
+ var/died_how_long_ago = rand(lore_death_time_min, lore_death_time_max)
+ body.timeofdeath = world.time - died_how_long_ago
+
+ var/death_real_time = world.realtime - died_how_long_ago
+ var/current_date = time2text(death_real_time, "DD Month")
+ var/current_year = text2num(time2text(death_real_time, "YYYY")) + STATION_YEAR_OFFSET
+ body.station_timestamp_timeofdeath = "[current_date] [current_year]"
+
+/// Main corpse damage type that's used to apply damages to a body
+/datum/corpse_damage
+ /// When given, automatically blacklist corpse_damages with the same damage_type flag to avoid stuff like being delimbed twice (dragon ate me AND I got space vultures???)
+ var/damage_type
+
+/// Tear IT UPPP!!! Apply any damages to the body that we need to
+/datum/corpse_damage/proc/apply_to_body(mob/living/carbon/human/body, severity, list/storage)
+ return
+
+/// This is the reason we died
+/datum/corpse_damage/cause_of_death
+ /// I was in x, [when I ....]
+ var/cause_of_death = "when I tripped and died."
+
+/// Some post mortem damages from space vultures
+/datum/corpse_damage/post_mortem
diff --git a/code/modules/lost_crew/damages/accident.dm b/code/modules/lost_crew/damages/accident.dm
new file mode 100644
index 0000000000000..da5f4d0b0a09d
--- /dev/null
+++ b/code/modules/lost_crew/damages/accident.dm
@@ -0,0 +1,36 @@
+/datum/corpse_damage/cause_of_death/plasmafire
+ cause_of_death = "when I got caught in a plasmafire!"
+ /// The max tox damage we deal
+ var/tox_damage_max = 40
+ /// Guaranteed burn damage
+ var/burn_damage_base = 100
+ /// Burn damage that fluctuates with severity
+ var/burn_damage_max = 100
+
+/datum/corpse_damage/cause_of_death/plasmafire/apply_to_body(mob/living/carbon/human/body, severity, list/storage, list/datum/callback/on_revive_and_player_occupancy)
+ body.apply_damage(burn_damage_base + burn_damage_max * severity, BURN, wound_bonus = 100 * severity, spread_damage = TRUE)
+ body.apply_damage(tox_damage_max * severity, TOX)
+
+/datum/corpse_damage/cause_of_death/explosion
+ cause_of_death = "when I noticed a bomb!"
+
+ /// The explosion severity
+ var/severity = EXPLODE_HEAVY
+ /// The maximum amount of explosions we can proc
+ var/explosion_count_max = 4
+
+/datum/corpse_damage/cause_of_death/explosion/apply_to_body(mob/living/carbon/human/body, severity, list/storage, list/datum/callback/on_revive_and_player_occupancy)
+ for(var/i in 1 to max(round(explosion_count_max * severity), 1))
+ body.ex_act(EXPLODE_HEAVY)
+
+/datum/corpse_damage/cause_of_death/spaced
+ cause_of_death = "when I got spaced!"
+ /// Guaranteed brute and burn damage
+ var/base_damage = 90
+ /// Damage influenced by the severity
+ var/damage_max = 100
+
+/datum/corpse_damage/cause_of_death/spaced/apply_to_body(mob/living/carbon/human/body, severity, list/storage, list/datum/callback/on_revive_and_player_occupancy)
+ body.apply_damage(base_damage + damage_max * (severity * rand(80, 120) * 0.01), BURN, spread_damage = TRUE)
+ body.apply_damage(base_damage + damage_max * (severity * rand(80, 120) * 0.01), BRUTE, spread_damage = TRUE)
+ body.set_coretemperature(TCMB)
diff --git a/code/modules/lost_crew/damages/decay.dm b/code/modules/lost_crew/damages/decay.dm
new file mode 100644
index 0000000000000..55674894474e5
--- /dev/null
+++ b/code/modules/lost_crew/damages/decay.dm
@@ -0,0 +1,23 @@
+/// We simulate decay on bodies. This is always used, but severity can differ (though tending to the more severe)
+/datum/corpse_damage/post_mortem/organ_decay
+ damage_type = CORPSE_DAMAGE_ORGAN_DECAY
+ /// The max amount of decay we can apply to organs, scaled by severity
+ var/max_decay_time = 40 MINUTES
+
+/datum/corpse_damage/post_mortem/organ_decay/apply_to_body(mob/living/carbon/human/body, severity, list/sorage, list/datum/callback/on_revive_and_player_occupancy)
+ if(!body.organs)
+ return FALSE
+
+ // * 0.5 because life ticks happen about every 2 seconds (we really need a way to get the current life tickspeed)
+ var/decay_ticks = max_decay_time * severity * 0.5
+
+ for(var/obj/item/organ/internal in body.organs)
+ internal.apply_organ_damage(decay_ticks * internal.decay_factor)
+
+ return TRUE
+
+/datum/corpse_damage/post_mortem/organ_decay/light
+ max_decay_time = 15 MINUTES
+
+/datum/corpse_damage/post_mortem/organ_decay/heavy
+ max_decay_time = 48 HOURS
diff --git a/code/modules/lost_crew/damages/melee.dm b/code/modules/lost_crew/damages/melee.dm
new file mode 100644
index 0000000000000..4896930772ae5
--- /dev/null
+++ b/code/modules/lost_crew/damages/melee.dm
@@ -0,0 +1,45 @@
+/// Simulates a melee attack with a specified weapon
+/datum/corpse_damage/cause_of_death/melee_weapon
+ /// The weapon with which we hit
+ var/obj/item/weapon
+ /// The minimal amount of hits
+ var/min_hits = 5
+ /// The maximum amount of hits
+ var/max_hits = 15
+
+/datum/corpse_damage/cause_of_death/melee_weapon/apply_to_body(mob/living/carbon/human/body, severity, list/storage, list/datum/callback/on_revive_and_player_occupancy)
+ weapon = get_weapon(body)
+
+ var/hits = ((max_hits - min_hits) * severity + min_hits)
+ for(var/i in 1 to hits)
+ weapon.attack(body, body) //needs an attacker, no reason it cant be the body as well
+ body.zone_selected = pick(GLOB.all_body_zones)
+
+/datum/corpse_damage/cause_of_death/melee_weapon/proc/get_weapon(mob/living/carbon/human/body)
+ return new weapon(null)
+
+/datum/corpse_damage/cause_of_death/melee_weapon/esword
+ weapon = /obj/item/melee/energy/sword
+ cause_of_death = "when I was attacked by a filthy traitor!"
+
+/datum/corpse_damage/cause_of_death/melee_weapon/esword/get_weapon(mob/living/carbon/human/body)
+ . = ..()
+
+ var/obj/item/melee/energy/sword/esword = .
+
+ esword.attack_self() //need to activate it
+
+/datum/corpse_damage/cause_of_death/melee_weapon/changeling
+ weapon = /obj/item/melee/arm_blade
+ cause_of_death = "when I was attacked by a terrifying changeling!"
+
+/datum/corpse_damage/cause_of_death/melee_weapon/toolbox
+ cause_of_death = "when some worthless assistant toolboxed me!"
+ weapon = /obj/item/storage/toolbox
+
+/datum/corpse_damage/cause_of_death/melee_weapon/heretic
+ cause_of_death = "when a flipping heretic attacked me!"
+
+/datum/corpse_damage/cause_of_death/melee_weapon/heretic/get_weapon(mob/living/carbon/human/body)
+ var/obj/item/melee/sickly_blade/blade = pick(subtypesof(/obj/item/melee/sickly_blade)) //pick a random blade, can be a bunch of fun stuff
+ return new blade (null)
diff --git a/code/modules/lost_crew/damages/post_mortem.dm b/code/modules/lost_crew/damages/post_mortem.dm
new file mode 100644
index 0000000000000..91f4ac8c60d0a
--- /dev/null
+++ b/code/modules/lost_crew/damages/post_mortem.dm
@@ -0,0 +1,47 @@
+/// Damn space vultures man! At least they dont go for the brain
+/datum/corpse_damage/post_mortem/organ_loss
+ damage_type = CORPSE_DAMAGE_ORGAN_LOSS
+
+ /// Chance that the organ is stored and delivered with the body
+ var/organ_save_chance = 20
+ /// Minimum organs we can lose
+ var/min_organs = 2
+ /// Maximum organs we can lose
+ var/max_organs = 8
+
+/datum/corpse_damage/post_mortem/organ_loss/apply_to_body(mob/living/carbon/human/body, severity, list/saved_movables, list/datum/callback/on_revive_and_player_occupancy)
+ var/organs_to_take = round(min_organs + (max_organs - min_organs) * severity)
+ var/list/organs_we_can_take = body.organs - body.get_organ_slot(ORGAN_SLOT_BRAIN)
+
+ for(var/i in 1 to organs_to_take)
+ var/obj/organ = pick(organs_we_can_take)
+ if(prob(organ_save_chance) && saved_movables) //if lucky, we can save the organ and have it be delivered with the body
+ organ.moveToNullspace()
+ saved_movables += organ
+ else
+ qdel(organ)
+
+/// Damn space vultures man! At least they dont go for the chest or head, or they do but we don't get to see those bodies :O
+/datum/corpse_damage/post_mortem/limb_loss
+ damage_type = CORPSE_DAMAGE_LIMB_LOSS
+
+ /// Chance that the limb is stored and delivered with the body
+ var/limb_save_chance = 20
+ /// Min limbs we can lose
+ var/min_limbs = 1
+ /// Max limbs we can lose
+ var/max_limbs = 4
+
+/datum/corpse_damage/post_mortem/limb_loss/apply_to_body(mob/living/carbon/human/body, severity, list/saved_movables, list/datum/callback/on_revive_and_player_occupancy)
+ var/limbs_to_take = round(min_limbs + (max_limbs - min_limbs) * severity)
+ var/list/limbs_we_can_take = body.bodyparts - body.get_bodypart(BODY_ZONE_HEAD) - body.get_bodypart(BODY_ZONE_CHEST)
+
+ if(!limbs_we_can_take.len)
+ return
+ for(var/i in 1 to limbs_to_take)
+ var/obj/limb = pick(limbs_we_can_take)
+ if(prob(limb_save_chance) && saved_movables)
+ limb.moveToNullspace()
+ saved_movables += limb
+ else
+ qdel(limb)
diff --git a/code/modules/lost_crew/damages/scenarios.dm b/code/modules/lost_crew/damages/scenarios.dm
new file mode 100644
index 0000000000000..2904f3721ad00
--- /dev/null
+++ b/code/modules/lost_crew/damages/scenarios.dm
@@ -0,0 +1,46 @@
+/// Default scenario, with normal species, assignments and damages etc
+/datum/corpse_damage_class/station
+ area_lore = "I was working in a space station"
+ weight = 10
+ possible_character_types = list(/datum/corpse_character/mostly_roundstart = 1)
+ possible_character_assignments = list(
+ /datum/corpse_assignment/engineer = 1,
+ /datum/corpse_assignment/medical = 1,
+ /datum/corpse_assignment/security = 1,
+ /datum/corpse_assignment/science = 1,
+ /datum/corpse_assignment/cargo = 1,
+ /datum/corpse_assignment/civillian = 1,
+ )
+
+ possible_causes_of_death = list(
+ /datum/corpse_damage/cause_of_death/melee_weapon/esword = 1,
+ /datum/corpse_damage/cause_of_death/melee_weapon/changeling = 1,
+ /datum/corpse_damage/cause_of_death/melee_weapon/toolbox = 1,
+ /datum/corpse_damage/cause_of_death/melee_weapon/heretic = 1,
+ /datum/corpse_damage/cause_of_death/explosion = 1,
+ /datum/corpse_damage/cause_of_death/plasmafire = 1,
+ )
+
+ post_mortem_effects = list(
+ /datum/corpse_damage/post_mortem/limb_loss = 5,
+ /datum/corpse_damage/post_mortem/organ_loss = 5,
+ null = 1,
+ )
+
+ decays = list(
+ /datum/corpse_damage/post_mortem/organ_decay = 3,
+ /datum/corpse_damage/post_mortem/organ_decay/light = 1,
+ /datum/corpse_damage/post_mortem/organ_decay/heavy = 1,
+ )
+
+/// Less decay, spread burn and brute damage
+/datum/corpse_damage_class/station/spaced
+ weight = 2
+ possible_causes_of_death = list(/datum/corpse_damage/cause_of_death/spaced = 1)
+ decays = list(/datum/corpse_damage/post_mortem/organ_decay/light = 1)
+
+/// Human morgue body
+/datum/corpse_damage_class/station/morgue
+ weight = 0
+ possible_character_types = list(/datum/corpse_character/morgue = 1)
+ possible_character_assignments = list()
diff --git a/code/modules/lost_crew/lost_crew_manager.dm b/code/modules/lost_crew/lost_crew_manager.dm
new file mode 100644
index 0000000000000..aa9ea571df703
--- /dev/null
+++ b/code/modules/lost_crew/lost_crew_manager.dm
@@ -0,0 +1,136 @@
+/// Manager for the lost crew bodies, for spawning and granting rewards
+GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new)
+
+/// Handles procs and timers for the lost crew bodies
+/datum/lost_crew_manager
+ /// How many credits we reward the medical budget on a succesful revive
+ var/credits_on_succes = /datum/supply_pack/medical/lost_crew::cost + CARGO_CRATE_VALUE * 2
+ /// How long after succesful revival we check to see if theyre still alive, and give rewards
+ var/succes_check_time = 3 MINUTES
+ /// How much the revived crew start with on their cards
+ var/starting_funds = 100
+
+/**
+ * Creates a body with random background and injuries
+ *
+ * Arguments:
+ * * revivable - Whether or not we can be revived to grand a ghost controle
+ * * forced_class - To force a specific damage class for some specific lore reason
+ * * recovered_items - Items recovered, such as some organs, dropped directly with the body
+ * * protected_items - Items that can only be recovered by the revived player
+ * * body_data - Debug data we can use to get a readout of what has been done
+ */
+/datum/lost_crew_manager/proc/create_lost_crew(revivable = TRUE, datum/corpse_damage_class/forced_class, list/recovered_items, list/protected_items, list/body_data = list())
+ var/mob/living/carbon/human/new_body = new(null)
+ new_body.death()
+
+ var/static/list/scenarios = list()
+ if(!scenarios.len)
+ var/list/types = subtypesof(/datum/corpse_damage_class)
+ for(var/datum/corpse_damage_class/scenario as anything in types)
+ scenarios[scenario] = initial(scenario.weight)
+
+ var/list/datum/callback/on_revive_and_player_occupancy = list()
+
+ var/datum/corpse_damage_class/scenario = forced_class || pick_weight(scenarios)
+ scenario = new scenario ()
+
+ scenario.apply_character(new_body, protected_items, on_revive_and_player_occupancy, body_data)
+ scenario.apply_injuries(new_body, recovered_items, on_revive_and_player_occupancy, body_data)
+ scenario.death_lore += "I should get a formalized assignment!"
+
+ . = new_body
+ // so bodies can also be used for runes, morgue, etc
+ if(!revivable)
+ return
+
+ //it's not necessary since we dont spawn the body until we open the bodybag, but why not be nice for once
+ new_body.reagents.add_reagent(/datum/reagent/toxin/formaldehyde, 5)
+
+ if(!recovered_items)
+ return
+
+ var/obj/item/paper/paper = new()
+ recovered_items += paper
+
+ if(!HAS_TRAIT(new_body, TRAIT_HUSK))
+ paper.name = "DO NOT REMOVE BRAIN"
+ paper.add_raw_text("Body swapping is not covered by medical insurance for unhusked bodies. Chemical brain explosives have been administered to enforce stipend.")
+ var/obj/item/organ/brain/boombrain = new_body.get_organ_by_type(/obj/item/organ/brain)
+ //I swear to fuck I will explode you. you're not clever
+ //everyone thought of this, but I am the fool for having any faith
+ //in people actually wanting to play the job in an interesting manner
+ //instead of just taking the easiest way out and learning nothing
+ //(no one abused it yet but I am already getting pinged by people who think they've broken the system when really I just expected better of them)
+ boombrain.AddElement(/datum/element/dangerous_organ_removal)
+ else
+ paper.name = "BODYSWAPPING PERMITTED"
+ paper.add_raw_text("Body swapping is covered by medical insurance in case of husking and a lack of skill in the practictioner.")
+
+ var/obj/item/organ/brain/hersens = new_body.get_organ_by_type(/obj/item/organ/brain)
+ hersens.AddComponent(
+ /datum/component/ghostrole_on_revive, \
+ /* refuse_revival_if_failed = */ TRUE, \
+ /*on_revival = */ CALLBACK(src, PROC_REF(on_succesful_revive), hersens, scenario.death_lore, on_revive_and_player_occupancy) \
+ )
+
+/// Set a timer for awarding succes and drop some awesome deathlore
+/datum/lost_crew_manager/proc/on_succesful_revive(obj/item/organ/brain/brain, list/death_lore, list/datum/callback/on_revive_and_player_occupancy)
+ var/mob/living/carbon/human/owner = brain.owner
+
+ owner.mind.add_antag_datum(/datum/antagonist/recovered_crew) //for tracking mostly
+
+ var/datum/bank_account/bank_account = new(owner.real_name, owner.mind.assigned_role, owner.dna.species.payday_modifier)
+ bank_account.adjust_money(starting_funds, "[starting_funds]cr given to [owner.name] as starting fund.")
+ owner.account_id = bank_account.account_id
+ bank_account.replaceable = FALSE
+
+ owner.add_mob_memory(/datum/memory/key/account, remembered_id = owner.account_id)
+
+ death_lore += "My account number was [owner.account_id]."
+
+ brain.RemoveElement(/datum/element/dangerous_organ_removal)
+
+ // Drop the sick ass death lore and give them an indicator of who they were and what they can do
+ for(var/i in 1 to death_lore.len)
+ addtimer(CALLBACK(src, GLOBAL_PROC_REF(to_chat), owner, span_boldnotice(death_lore[i])), 10 SECONDS + 2 SECONDS * i)
+
+ addtimer(CALLBACK(src, PROC_REF(award_succes), owner.mind, death_lore), succes_check_time)
+
+ // Run any callbacks our characters or damages may have placed for some effects for when the player is revived
+ for(var/datum/callback/callback as anything in on_revive_and_player_occupancy)
+ callback.Invoke()
+
+/// Give medbay a happy announcement and put some money into their budget
+/datum/lost_crew_manager/proc/award_succes(datum/mind/revived_mind, list/death_lore)
+ var/obj/item/radio/headset/radio = new /obj/item/radio/headset/silicon/ai(revived_mind.current) //radio cant be in nullspace or brit shakes
+ radio.set_frequency(FREQ_MEDICAL)
+ radio.name = "Medical Announcer"
+
+ // i am incredibly disappointed in you
+ if(revived_mind.current.stat == DEAD)
+ radio.talk_into(radio, "Sensors indicate lifesigns of [revived_mind.name] have seized. Please inform their family of your failure.", RADIO_CHANNEL_MEDICAL)
+ return
+
+ // You are a credit to society
+ radio.talk_into(radio, "Sensors indicate continued survival of [revived_mind.name]. Well done, [credits_on_succes]cr has been transferred to the medical budget.", RADIO_CHANNEL_MEDICAL)
+
+ var/datum/bank_account/medical_budget = SSeconomy.get_dep_account(ACCOUNT_MED)
+ medical_budget.adjust_money(credits_on_succes)
+ qdel(radio)
+
+/// A box for recovered items that can only be opened by the new crewmember
+/obj/item/storage/lockbox/mind
+ name = "mind lockbox"
+ desc = "A locked box, openable only by one mind."
+
+ /// The mind needed to unlock the box
+ var/datum/mind/mind
+
+/obj/item/storage/lockbox/mind/attack_self(mob/user, modifiers)
+ . = ..()
+
+ if(user.mind == mind)
+ atom_storage.locked = STORAGE_NOT_LOCKED
+ balloon_alert(user, atom_storage.locked ? "locked" : "unlocked")
+ update_appearance()
diff --git a/code/modules/lost_crew/recovered_crew.dm b/code/modules/lost_crew/recovered_crew.dm
new file mode 100644
index 0000000000000..65c6a3715fb67
--- /dev/null
+++ b/code/modules/lost_crew/recovered_crew.dm
@@ -0,0 +1,9 @@
+/// Revived crew ready to serve once more! Only here for tracking/admin reasons, otherwise hidden
+/datum/antagonist/recovered_crew
+ name = "\improper Recovered Crew"
+ show_in_antagpanel = TRUE
+ job_rank = ROLE_RECOVERED_CREW
+ show_name_in_check_antagonists = TRUE
+ show_to_ghosts = FALSE
+ silent = TRUE
+ block_midrounds = FALSE
diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
index c49b5c1399625..172c0e2f9e5cb 100644
--- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
@@ -29,13 +29,13 @@
/obj/structure/closet/crate/secure/freezer/commsagent/PopulateContents()
. = ..() //Contains a variety of less exotic tongues (And tongue accessories) for the comms agent to mess with.
- new /obj/item/organ/internal/tongue(src)
- new /obj/item/organ/internal/tongue/lizard(src)
- new /obj/item/organ/internal/tongue/fly(src)
- new /obj/item/organ/internal/tongue/zombie(src)
- new /obj/item/organ/internal/tongue/bone(src)
- new /obj/item/organ/internal/tongue/robot(src) //DANGER! CRYSTAL HYPERSTRUCTURE-
- new /obj/item/organ/internal/tongue/ethereal(src)
+ new /obj/item/organ/tongue(src)
+ new /obj/item/organ/tongue/lizard(src)
+ new /obj/item/organ/tongue/fly(src)
+ new /obj/item/organ/tongue/zombie(src)
+ new /obj/item/organ/tongue/bone(src)
+ new /obj/item/organ/tongue/robot(src) //DANGER! CRYSTAL HYPERSTRUCTURE-
+ new /obj/item/organ/tongue/ethereal(src)
new /obj/item/autosurgeon/syndicate/commsagent(src)
new /obj/item/book/granter/sign_language(src)
new /obj/item/clothing/gloves/radio(src)
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
index 8be91920719c1..9a5d3a3db869e 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm
@@ -162,12 +162,12 @@
use_power = NO_POWER_USE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
id_tag = "derelictvault"
+ has_access_panel = FALSE
-///Overrides screwdriver attack to prevent all deconstruction and hacking.
-/obj/machinery/door/airlock/vault/derelict/attackby(obj/item/C, mob/user, params)
- if(C.tool_behaviour == TOOL_SCREWDRIVER)
- return
- ..()
+///Overrides screwdriver act to prevent all deconstruction and hacking. Override for extra tuff fluff
+/obj/machinery/door/airlock/vault/derelict/screwdriver_act(mob/living/user, obj/item/tool)
+ to_chat(user, span_danger("The robust make of [src] makes it impossible to access the panel in any way!"))
+ return ITEM_INTERACT_SUCCESS
/obj/structure/fluff/oldturret
name = "broken turret"
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
index a91d033f1ee7b..d40d9178f3a85 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
@@ -73,27 +73,27 @@
var/stored_organ
/// Types of organ we can spawn
var/static/list/allowed_organs = list(
- /obj/item/organ/internal/heart/gland/egg = 7,
- /obj/item/organ/internal/heart/gland/plasma = 7,
- /obj/item/organ/internal/alien/plasmavessel = 5,
- /obj/item/organ/internal/heart/gland/chem = 5,
- /obj/item/organ/internal/heart/gland/mindshock = 5,
- /obj/item/organ/internal/heart/gland/spiderman = 5,
- /obj/item/organ/internal/heart/gland/transform = 5,
- /obj/item/organ/internal/heart/gland/slime = 4,
- /obj/item/organ/internal/heart/gland/trauma = 4,
- /obj/item/organ/internal/heart/carp = 3,
- /obj/item/organ/internal/heart/rat = 3,
- /obj/item/organ/internal/heart/gland/electric = 3,
- /obj/item/organ/internal/monster_core/brimdust_sac = 3,
- /obj/item/organ/internal/monster_core/regenerative_core = 3,
- /obj/item/organ/internal/monster_core/rush_gland = 3,
- /obj/item/organ/internal/tongue/carp = 3,
- /obj/item/organ/internal/alien/acid = 2,
- /obj/item/organ/internal/alien/resinspinner = 2,
- /obj/item/organ/internal/eyes/night_vision/goliath = 2,
- /obj/item/organ/internal/eyes/night_vision/rat = 2,
- /obj/item/organ/internal/heart/gland/ventcrawling = 1,
+ /obj/item/organ/heart/gland/egg = 7,
+ /obj/item/organ/heart/gland/plasma = 7,
+ /obj/item/organ/alien/plasmavessel = 5,
+ /obj/item/organ/heart/gland/chem = 5,
+ /obj/item/organ/heart/gland/mindshock = 5,
+ /obj/item/organ/heart/gland/spiderman = 5,
+ /obj/item/organ/heart/gland/transform = 5,
+ /obj/item/organ/heart/gland/slime = 4,
+ /obj/item/organ/heart/gland/trauma = 4,
+ /obj/item/organ/heart/carp = 3,
+ /obj/item/organ/heart/rat = 3,
+ /obj/item/organ/heart/gland/electric = 3,
+ /obj/item/organ/monster_core/brimdust_sac = 3,
+ /obj/item/organ/monster_core/regenerative_core = 3,
+ /obj/item/organ/monster_core/rush_gland = 3,
+ /obj/item/organ/tongue/carp = 3,
+ /obj/item/organ/alien/acid = 2,
+ /obj/item/organ/alien/resinspinner = 2,
+ /obj/item/organ/eyes/night_vision/goliath = 2,
+ /obj/item/organ/eyes/night_vision/rat = 2,
+ /obj/item/organ/heart/gland/ventcrawling = 1,
)
/obj/structure/meateor_fluff/flesh_pod/Initialize(mapload)
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index 55b802cc26c1d..e5f53c2b02dd5 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -874,11 +874,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_atoms_ontop)
var/admin_spawned
///number of bodies to spawn
var/bodycount = 3
- /// These species IDs will be barred from spawning if morgue_cadaver_disable_nonhumans is disabled (In the future, we can also dehardcode this)
- var/list/blacklisted_from_rng_placement = list(
- SPECIES_ETHEREAL, // they revive on death which is bad juju
- SPECIES_HUMAN, // already have a 50% chance of being selected
- )
+ /// Corpse type we spawn thats always human
+ var/datum/corpse_damage_class/morgue_body_class = /datum/corpse_damage_class/station/morgue
/obj/effect/mapping_helpers/dead_body_placer/Initialize(mapload)
. = ..()
@@ -906,57 +903,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_atoms_ontop)
var/reuse_trays = (numtrays < bodycount) //are we going to spawn more trays than bodies?
- var/use_species = !(CONFIG_GET(flag/morgue_cadaver_disable_nonhumans))
- var/species_probability = CONFIG_GET(number/morgue_cadaver_other_species_probability)
- var/override_species = CONFIG_GET(string/morgue_cadaver_override_species)
- var/list/usable_races
- if(use_species)
- var/list/temp_list = get_selectable_species()
- usable_races = temp_list.Copy()
- LAZYREMOVE(usable_races, blacklisted_from_rng_placement)
- if(!LAZYLEN(usable_races))
- notice("morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!")
- if(override_species)
- warning("morgue_cadaver_override_species BEING OVERRIDEN since morgue_cadaver_disable_nonhumans is disabled.")
- else if(override_species)
- LAZYADD(usable_races, override_species)
-
- var/guaranteed_human_spawned = FALSE
for (var/i in 1 to bodycount)
var/obj/structure/bodycontainer/morgue/morgue_tray = reuse_trays ? pick(trays) : pick_n_take(trays)
var/obj/structure/closet/body_bag/body_bag = new(morgue_tray.loc)
- var/mob/living/carbon/human/new_human = new(morgue_tray.loc)
-
- var/species_to_pick
-
- if(guaranteed_human_spawned && use_species)
- if(LAZYLEN(usable_races))
- if(!isnum(species_probability))
- species_probability = 50
- stack_trace("WARNING: morgue_cadaver_other_species_probability CONFIG SET TO 0% WHEN SPAWNING. DEFAULTING TO [species_probability]%.")
- if(prob(species_probability))
- species_to_pick = pick(usable_races)
- var/datum/species/new_human_species = GLOB.species_list[species_to_pick]
- if(new_human_species)
- new_human.set_species(new_human_species)
- new_human.fully_replace_character_name(new_human.real_name, new_human.generate_random_mob_name())
- else
- stack_trace("failed to spawn cadaver with species ID [species_to_pick]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol.
- else
- guaranteed_human_spawned = TRUE
+ var/mob/living/carbon/human/new_human = GLOB.lost_crew_manager.create_lost_crew(revivable = FALSE, forced_class = morgue_body_class)
body_bag.insert(new_human, TRUE)
body_bag.close()
- body_bag.handle_tag("[new_human.real_name][species_to_pick ? " - [capitalize(species_to_pick)]" : " - Human"]")
+ body_bag.handle_tag("[new_human.real_name][new_human.dna?.species ? " - [new_human.dna.species.name]" : " - Human"]")
body_bag.forceMove(morgue_tray)
- new_human.death() //here lies the mans, rip in pepperoni.
- for (var/obj/item/organ/internal/part in new_human.organs) //randomly remove organs from each body, set those we keep to be in stasis
- if (prob(40))
- qdel(part)
- else
- part.organ_flags |= ORGAN_FROZEN
-
morgue_tray.update_appearance()
qdel(src)
diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm
index b7664f09ff2d8..61f252edf2b17 100644
--- a/code/modules/mapping/space_management/zlevel_manager.dm
+++ b/code/modules/mapping/space_management/zlevel_manager.dm
@@ -37,7 +37,9 @@
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S)
return S
-/datum/controller/subsystem/mapping/proc/get_level(z)
- if (z_list && z >= 1 && z <= z_list.len)
+/// Returns the /datum/space_level associated with the given z level.
+/datum/controller/subsystem/mapping/proc/get_level(z) as /datum/space_level
+ RETURN_TYPE(/datum/space_level)
+ if(ISINRANGE(z, 1, length(z_list)))
return z_list[z]
CRASH("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list ? z_list.len : "null"]")
diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm
index 36fdad25d842e..ba135081532da 100644
--- a/code/modules/meteors/meteor_types.dm
+++ b/code/modules/meteors/meteor_types.dm
@@ -379,7 +379,7 @@
hits = 2
heavy = TRUE
meteorsound = 'sound/effects/blob/blobattack.ogg'
- meteordrop = list(/obj/item/food/meat/slab/human, /obj/item/food/meat/slab/human/mutant, /obj/item/organ/internal/heart, /obj/item/organ/internal/lungs, /obj/item/organ/internal/tongue, /obj/item/organ/internal/appendix/)
+ meteordrop = list(/obj/item/food/meat/slab/human, /obj/item/food/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
var/meteorgibs = /obj/effect/gibspawner/generic
threat = 2
signature = "culinary material"
@@ -391,7 +391,7 @@
meteordrop += pick(subtypesof(path))
for(var/path in meteordrop)
- if(path == /obj/item/organ/internal/tongue)
+ if(path == /obj/item/organ/tongue)
meteordrop -= path
meteordrop += pick(typesof(path))
return ..()
@@ -412,12 +412,12 @@
//Meaty Ore Xeno edition
/obj/effect/meteor/meaty/xeno
color = "#5EFF00"
- meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/internal/tongue/alien)
+ meteordrop = list(/obj/item/food/meat/slab/xeno, /obj/item/organ/tongue/alien)
meteorgibs = /obj/effect/gibspawner/xeno
signature = "exotic culinary material"
/obj/effect/meteor/meaty/xeno/Initialize(mapload)
- meteordrop += subtypesof(/obj/item/organ/internal/alien)
+ meteordrop += subtypesof(/obj/item/organ/alien)
return ..()
/obj/effect/meteor/meaty/xeno/ram_turf(turf/T)
diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
index a77e526a9d1f7..d58ecf4da425d 100644
--- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
+++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm
@@ -11,7 +11,7 @@
* If implanted, you can shake off a cloud of brimdust to give this buff to people around you.area
* It will also automatically grant you one stack every 30 seconds if you are on lavaland.
*/
-/obj/item/organ/internal/monster_core/brimdust_sac
+/obj/item/organ/monster_core/brimdust_sac
name = "brimdust sac"
desc = "A strange organ from a brimdemon. You can shake it out to coat yourself in explosive powder."
icon_state = "brim_sac"
@@ -24,16 +24,16 @@
/// You will gain a stack of the buff every x seconds
COOLDOWN_DECLARE(brimdust_auto_apply_cooldown)
-/obj/item/organ/internal/monster_core/brimdust_sac/Initialize(mapload)
+/obj/item/organ/monster_core/brimdust_sac/Initialize(mapload)
. = ..()
AddComponent(/datum/component/explodable, light_impact_range = 1)
-/obj/item/organ/internal/monster_core/brimdust_sac/apply_to(mob/living/target, mob/user)
+/obj/item/organ/monster_core/brimdust_sac/apply_to(mob/living/target, mob/user)
target.apply_status_effect(user_status, BRIMDUST_STACKS_ON_USE)
qdel(src)
// Every x seconds, if on lavaland, add one stack
-/obj/item/organ/internal/monster_core/brimdust_sac/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/monster_core/brimdust_sac/on_life(seconds_per_tick, times_fired)
. = ..()
if(!COOLDOWN_FINISHED(src, brimdust_auto_apply_cooldown))
return
@@ -43,7 +43,7 @@
owner.apply_status_effect(user_status, BRIMDUST_STACKS_ON_LIFE)
/// Make a cloud which applies brimdust to everyone nearby
-/obj/item/organ/internal/monster_core/brimdust_sac/on_triggered_internal()
+/obj/item/organ/monster_core/brimdust_sac/on_triggered_internal()
var/turf/origin_turf = get_turf(owner)
do_smoke(range = 2, holder = owner, location = origin_turf, smoke_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm
index 679f3f81dd608..b6bd54a361eb5 100644
--- a/code/modules/mining/equipment/monster_organs/monster_organ.dm
+++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm
@@ -11,7 +11,7 @@
/obj/item/mining_stabilizer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!isorgan(interacting_with))
return NONE
- var/obj/item/organ/internal/monster_core/target_core = interacting_with
+ var/obj/item/organ/monster_core/target_core = interacting_with
if (!istype(target_core))
balloon_alert(user, "invalid target!")
return ITEM_INTERACT_BLOCKING
@@ -29,7 +29,7 @@
* Generalised behaviour is that they will decay and become useless unless provided with serum.
* These should usually do something both when used in-hand, or when implanted into someone.
*/
-/obj/item/organ/internal/monster_core
+/obj/item/organ/monster_core
name = "monster core"
desc = "All that remains of a monster. This abstract item should not spawn. \
It will rapidly decay into uselessness. but don't worry because it's already useless."
@@ -58,11 +58,11 @@
/// Status effect applied by this organ
var/datum/status_effect/user_status
-/obj/item/organ/internal/monster_core/Initialize(mapload)
+/obj/item/organ/monster_core/Initialize(mapload)
. = ..()
decay_timer = addtimer(CALLBACK(src, PROC_REF(go_inert)), time_to_decay, TIMER_STOPPABLE)
-/obj/item/organ/internal/monster_core/examine(mob/user)
+/obj/item/organ/monster_core/examine(mob/user)
. = ..()
if(!decay_timer)
return
@@ -79,11 +79,11 @@
if(0 SECONDS to 1 MINUTES)
. += span_warning("Signs of decay have set in, but it still looks alive. It's probably about to become unusable really quickly.")
-/obj/item/organ/internal/monster_core/Destroy(force)
+/obj/item/organ/monster_core/Destroy(force)
deltimer(decay_timer)
return ..()
-/obj/item/organ/internal/monster_core/mob_insert(mob/living/carbon/target_carbon, special = FALSE, movement_flags)
+/obj/item/organ/monster_core/mob_insert(mob/living/carbon/target_carbon, special = FALSE, movement_flags)
. = ..()
if (inert)
@@ -96,7 +96,7 @@
target_carbon.visible_message(span_notice("[src] stabilizes as it's inserted."))
return TRUE
-/obj/item/organ/internal/monster_core/mob_remove(mob/living/carbon/target_carbon, special, movement_flags)
+/obj/item/organ/monster_core/mob_remove(mob/living/carbon/target_carbon, special, movement_flags)
if (!inert && !special)
owner.visible_message(span_notice("[src] rapidly decays as it's removed."))
go_inert()
@@ -107,7 +107,7 @@
* Returns true if successful.
* * Implanted - If true, organ has just been inserted into someone.
*/
-/obj/item/organ/internal/monster_core/proc/preserve(implanted = FALSE)
+/obj/item/organ/monster_core/proc/preserve(implanted = FALSE)
if (inert)
return FALSE
deltimer(decay_timer)
@@ -118,7 +118,7 @@
/**
* Decays the organ, it is now useless.
*/
-/obj/item/organ/internal/monster_core/proc/go_inert()
+/obj/item/organ/monster_core/proc/go_inert()
if (inert)
return FALSE
inert = TRUE
@@ -128,7 +128,7 @@
update_appearance()
return TRUE
-/obj/item/organ/internal/monster_core/update_desc()
+/obj/item/organ/monster_core/update_desc()
if (inert)
desc = desc_inert ? desc_inert : initial(desc)
return ..()
@@ -138,7 +138,7 @@
desc = initial(desc)
return ..()
-/obj/item/organ/internal/monster_core/update_icon_state()
+/obj/item/organ/monster_core/update_icon_state()
if (inert)
icon_state = icon_state_inert ? icon_state_inert : initial(icon_state)
return ..()
@@ -148,14 +148,14 @@
icon_state = initial(icon_state)
return ..()
-/obj/item/organ/internal/monster_core/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+/obj/item/organ/monster_core/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!isliving(interacting_with))
return NONE
try_apply(interacting_with, user)
return ITEM_INTERACT_SUCCESS
-/obj/item/organ/internal/monster_core/attack_self(mob/user)
+/obj/item/organ/monster_core/attack_self(mob/user)
if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH|ALLOW_RESTING))
return
try_apply(user, user)
@@ -167,7 +167,7 @@
* * target - Person you are applying this to.
* * user - Person who is doing the applying.
*/
-/obj/item/organ/internal/monster_core/proc/try_apply(atom/target, mob/user)
+/obj/item/organ/monster_core/proc/try_apply(atom/target, mob/user)
if (!isliving(target))
balloon_alert(user, "invalid target!")
return
@@ -187,7 +187,7 @@
* * target - Person you are applying this to.
* * user - Person who is doing the applying.
*/
-/obj/item/organ/internal/monster_core/proc/apply_to(mob/living/target, mob/user)
+/obj/item/organ/monster_core/proc/apply_to(mob/living/target, mob/user)
if (user_status)
target.apply_status_effect(user_status)
qdel(src)
@@ -196,7 +196,7 @@
* Utility proc to find the associated monster organ action and trigger it.
* Call this instead of on_triggered_internal() if the action needs to trigger automatically, or the cooldown won't happen.
*/
-/obj/item/organ/internal/monster_core/proc/trigger_organ_action(trigger_flags)
+/obj/item/organ/monster_core/proc/trigger_organ_action(trigger_flags)
var/datum/action/cooldown/monster_core_action/action = locate() in actions
action?.Trigger(trigger_flags = trigger_flags)
@@ -204,7 +204,7 @@
* Called when activated while implanted inside someone.
* This could be via clicking the associated action button or through the above method.
*/
-/obj/item/organ/internal/monster_core/proc/on_triggered_internal()
+/obj/item/organ/monster_core/proc/on_triggered_internal()
SHOULD_CALL_PARENT(FALSE)
CRASH("Someone forgot to make their organ do something when you implant it.")
@@ -221,7 +221,7 @@
. = ..()
if (!target)
return
- var/obj/item/organ/internal/monster_core/organ = target
+ var/obj/item/organ/monster_core/organ = target
if (!istype(organ))
return
organ.on_triggered_internal()
diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm
index 98758d5a369ce..e601ac89f8c59 100644
--- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm
+++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm
@@ -2,7 +2,7 @@
* On use in hand, heals you over time and removes injury movement debuffs. Also makes you a bit sad.
* On use when implanted, fully heals. Automatically fully heals if you would enter crit.
*/
-/obj/item/organ/internal/monster_core/regenerative_core
+/obj/item/organ/monster_core/regenerative_core
name = "regenerative core"
desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness."
desc_preserved = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
@@ -12,30 +12,30 @@
icon_state = "hivelord_core"
icon_state_inert = "hivelord_core_decayed"
-/obj/item/organ/internal/monster_core/regenerative_core/preserve(implanted = FALSE)
+/obj/item/organ/monster_core/regenerative_core/preserve(implanted = FALSE)
if (implanted)
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "implanted"))
else
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer"))
return ..()
-/obj/item/organ/internal/monster_core/regenerative_core/go_inert()
+/obj/item/organ/monster_core/regenerative_core/go_inert()
. = .. ()
if (!.)
return
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert"))
-/obj/item/organ/internal/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired)
. = ..()
if (owner.health <= owner.crit_threshold)
trigger_organ_action(TRIGGER_FORCE_AVAILABLE)
-/obj/item/organ/internal/monster_core/regenerative_core/on_triggered_internal()
+/obj/item/organ/monster_core/regenerative_core/on_triggered_internal()
owner.revive(HEAL_ALL)
qdel(src)
/// Log applications and apply moodlet.
-/obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user)
+/obj/item/organ/monster_core/regenerative_core/apply_to(mob/living/target, mob/user)
target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman)
if (target != user)
target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!"))
@@ -46,7 +46,7 @@
return ..()
/// Different graphics/desc for the lavaland legion
-/obj/item/organ/internal/monster_core/regenerative_core/legion
+/obj/item/organ/monster_core/regenerative_core/legion
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
desc_preserved = "The core has been stabilized, allowing you to use it to heal completely without danger of decay."
desc_inert = "The core has decayed, and is completely useless."
diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm
index f9cfa1b88f1c3..cf901269e904c 100644
--- a/code/modules/mining/equipment/monster_organs/rush_gland.dm
+++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm
@@ -5,7 +5,7 @@
* On use in hand, makes you run really fast for 5 seconds and ignore injury movement decrease.
* On use when implanted, run for longer and ignore all negative movement. Automatically triggers if health is low (to escape).
*/
-/obj/item/organ/internal/monster_core/rush_gland
+/obj/item/organ/monster_core/rush_gland
name = "rush gland"
icon_state = "lobster_gland"
icon_state_preserved = "lobster_gland_stable"
@@ -16,23 +16,23 @@
user_status = /datum/status_effect/lobster_rush
actions_types = list(/datum/action/cooldown/monster_core_action/adrenal_boost)
-/obj/item/organ/internal/monster_core/rush_gland/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/monster_core/rush_gland/on_life(seconds_per_tick, times_fired)
. = ..()
if (owner.health <= HEALTH_DANGER_ZONE)
trigger_organ_action()
-/obj/item/organ/internal/monster_core/rush_gland/on_mob_insert(mob/living/carbon/organ_owner)
+/obj/item/organ/monster_core/rush_gland/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
RegisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED, PROC_REF(trigger_organ_action_on_sig))
-/obj/item/organ/internal/monster_core/rush_gland/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/monster_core/rush_gland/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED)
-/obj/item/organ/internal/monster_core/rush_gland/on_triggered_internal()
+/obj/item/organ/monster_core/rush_gland/on_triggered_internal()
owner.apply_status_effect(/datum/status_effect/lobster_rush/extended)
-/obj/item/organ/internal/monster_core/rush_gland/proc/trigger_organ_action_on_sig(datum/source)
+/obj/item/organ/monster_core/rush_gland/proc/trigger_organ_action_on_sig(datum/source)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(trigger_organ_action))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 3a1e88d5af13b..58b7b437d7c54 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -27,7 +27,7 @@
if(2)
new /obj/item/soulstone/anybody/mining(src)
if(3)
- new /obj/item/organ/internal/cyberimp/arm/shard/katana(src)
+ new /obj/item/organ/cyberimp/arm/shard/katana(src)
if(4)
new /obj/item/clothing/glasses/godeye(src)
if(5)
@@ -48,7 +48,7 @@
if(8)
new /obj/item/rod_of_asclepius(src)
if(9)
- new /obj/item/organ/internal/heart/cursed/wizard(src)
+ new /obj/item/organ/heart/cursed/wizard(src)
if(10)
new /obj/item/ship_in_a_bottle(src)
if(11)
@@ -154,7 +154,7 @@
var/list/choices = subtypesof(/obj/machinery/anomalous_crystal)
var/random_crystal = pick(choices)
new random_crystal(src)
- new /obj/item/organ/internal/vocal_cords/colossus(src)
+ new /obj/item/organ/vocal_cords/colossus(src)
/obj/structure/closet/crate/necropolis/colossus/crusher
name = "angelic colossus chest"
diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm
index 02156684afac4..fe338b35ccb93 100644
--- a/code/modules/mining/lavaland/tendril_loot.dm
+++ b/code/modules/mining/lavaland/tendril_loot.dm
@@ -552,7 +552,7 @@
to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as your wings change shape!"))
else
to_chat(exposed_human, span_userdanger("A terrible pain travels down your back as wings burst out!"))
- var/obj/item/organ/external/wings/functional/wings = get_wing_choice(exposed_human, chest)
+ var/obj/item/organ/wings/functional/wings = get_wing_choice(exposed_human, chest)
wings = new wings()
wings.Insert(exposed_human)
playsound(exposed_human.loc, 'sound/items/poster/poster_ripped.ogg', 50, TRUE, -1)
@@ -565,7 +565,7 @@
return wing_types[1]
var/list/radial_wings = list()
var/list/name2type = list()
- for(var/obj/item/organ/external/wings/functional/possible_type as anything in wing_types)
+ for(var/obj/item/organ/wings/functional/possible_type as anything in wing_types)
var/datum/sprite_accessory/accessory = initial(possible_type.sprite_accessory_override) //get the type
accessory = SSaccessories.wings_list[initial(accessory.name)] //get the singleton instance
var/image/img = image(icon = accessory.icon, icon_state = "m_wingsopen_[accessory.icon_state]_BEHIND") //Process the HUD elements
@@ -927,7 +927,7 @@
name = "Scan Target"
desc = "Contact may or may not be close."
-/obj/item/organ/internal/cyberimp/arm/shard
+/obj/item/organ/cyberimp/arm/shard
name = "dark spoon shard"
desc = "An eerie metal shard surrounded by dark energies...of soup drinking. You probably don't think you should have been able to find this."
icon = 'icons/obj/mining_zones/artefacts.dmi'
@@ -937,7 +937,7 @@
extend_sound = 'sound/items/unsheath.ogg'
retract_sound = 'sound/items/sheath.ogg'
-/obj/item/organ/internal/cyberimp/arm/shard/attack_self(mob/user, modifiers)
+/obj/item/organ/cyberimp/arm/shard/attack_self(mob/user, modifiers)
. = ..()
to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!"))
playsound(user, 'sound/effects/magic/demon_consume.ogg', 50, TRUE)
@@ -947,15 +947,15 @@
user.temporarilyRemoveItemFromInventory(src, TRUE)
Insert(user)
-/obj/item/organ/internal/cyberimp/arm/shard/screwdriver_act(mob/living/user, obj/item/screwtool)
+/obj/item/organ/cyberimp/arm/shard/screwdriver_act(mob/living/user, obj/item/screwtool)
return
-/obj/item/organ/internal/cyberimp/arm/shard/katana
+/obj/item/organ/cyberimp/arm/shard/katana
name = "dark shard"
desc = "An eerie metal shard surrounded by dark energies."
items_to_create = list(/obj/item/cursed_katana)
-/obj/item/organ/internal/cyberimp/arm/shard/katana/Retract()
+/obj/item/organ/cyberimp/arm/shard/katana/Retract()
var/obj/item/cursed_katana/katana = active_item
if(!katana || katana.shattered)
return FALSE
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 5567162d8bd78..74be453b2b1d1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -263,20 +263,20 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
Works together with spawning an observer, noted above.
*/
-/mob/proc/ghostize(can_reenter_corpse = TRUE)
+/mob/proc/ghostize(can_reenter_corpse = TRUE, admin_ghost = FALSE)
if(!key)
return
if(key[1] == "@") // Skip aghosts.
return
- if(HAS_TRAIT(src, TRAIT_CORPSELOCKED))
+ if(HAS_TRAIT(src, TRAIT_CORPSELOCKED) && !admin_ghost)
if(can_reenter_corpse) //If you can re-enter the corpse you can't leave when corpselocked
return
if(ishuman(usr)) //following code only applies to those capable of having an ethereal heart, ie humans
var/mob/living/carbon/human/crystal_fella = usr
var/our_heart = crystal_fella.get_organ_slot(ORGAN_SLOT_HEART)
- if(istype(our_heart, /obj/item/organ/internal/heart/ethereal)) //so you got the heart?
- var/obj/item/organ/internal/heart/ethereal/ethereal_heart = our_heart
+ if(istype(our_heart, /obj/item/organ/heart/ethereal)) //so you got the heart?
+ var/obj/item/organ/heart/ethereal/ethereal_heart = our_heart
ethereal_heart.stop_crystalization_process(crystal_fella) //stops the crystallization process
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
diff --git a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
index 1fa30063dd581..13caade7c9416 100644
--- a/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
+++ b/code/modules/mob/living/basic/bots/honkbots/honkbot.dm
@@ -83,7 +83,7 @@
if(HAS_TRAIT(current_target, TRAIT_DEAF))
return
- var/obj/item/organ/internal/ears/target_ears = current_target.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/target_ears = current_target.get_organ_slot(ORGAN_SLOT_EARS)
target_ears?.adjustEarDamage(0, 5)
/mob/living/basic/bot/honkbot/ui_data(mob/user)
diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm
index 3fd2328458293..ebc15182c2f23 100644
--- a/code/modules/mob/living/basic/clown/clown.dm
+++ b/code/modules/mob/living/basic/clown/clown.dm
@@ -478,7 +478,6 @@
button_icon = 'icons/mob/actions/actions_animal.dmi'
button_icon_state = "regurgitate"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED
- melee_cooldown_time = 0 SECONDS
click_to_activate = TRUE
/datum/action/cooldown/regurgitate/set_click_ability(mob/on_who)
diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm
index 2eae87310591e..e9dd79fd5ef06 100644
--- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm
+++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm
@@ -70,6 +70,7 @@
AddComponent(/datum/component/swarming)
AddComponent(/datum/component/obeys_commands, pet_commands)
AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+ AddElement(/datum/element/basic_allergenic_attack, allergen = BUGS, allergen_chance = 33, histamine_add = 5)
/mob/living/basic/bee/mob_pickup(mob/living/picker)
if(flags_1 & HOLOGRAM_1)
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
index 82c69149f6ed3..b3c0684571d54 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm
@@ -35,7 +35,6 @@
button_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "smoke"
cooldown_time = 20 SECONDS
- melee_cooldown_time = 0 SECONDS
background_icon = 'icons/hud/guardian.dmi'
background_icon_state = "base"
/// After this amount of time passses, bomb deactivates.
diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
index b43b8e64ea4af..bc6415c1a5312 100644
--- a/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
+++ b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm
@@ -81,7 +81,6 @@
button_icon = 'icons/mob/actions/actions_spells.dmi'
button_icon_state = "smoke"
cooldown_time = 0 SECONDS // We're here for the interface not the cooldown
- melee_cooldown_time = 0 SECONDS
click_to_activate = FALSE
/// Gas being expelled.
var/active_gas = null
diff --git a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm
index b83c4f253f362..6f8c2e5c96f07 100644
--- a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm
+++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm
@@ -28,7 +28,7 @@
var/static/list/loot = list(
/obj/effect/decal/cleanable/ash,
/obj/item/clothing/suit/armor/vest,
- /obj/item/organ/internal/lungs,
+ /obj/item/organ/lungs,
/obj/item/shard,
)
AddElement(/datum/element/death_drops, loot)
diff --git a/code/modules/mob/living/basic/heretic/raw_prophet.dm b/code/modules/mob/living/basic/heretic/raw_prophet.dm
index f4ed7229a005e..1d0d0f93f203b 100644
--- a/code/modules/mob/living/basic/heretic/raw_prophet.dm
+++ b/code/modules/mob/living/basic/heretic/raw_prophet.dm
@@ -25,7 +25,7 @@
/mob/living/basic/heretic_summon/raw_prophet/Initialize(mapload)
. = ..()
AddElement(/datum/element/wheel)
- var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes)
+ var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/eyes)
AddElement(/datum/element/death_drops, body_parts)
AddComponent(/datum/component/focused_attacker)
var/on_link_message = "You feel something new enter your sphere of mind... \
diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm
index af17fc0cb01aa..350106d707fdb 100644
--- a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm
+++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm
@@ -14,7 +14,6 @@
button_icon = 'icons/obj/ore.dmi'
button_icon_state = "bluespace_crystal"
cooldown_time = 3 SECONDS
- melee_cooldown_time = 0 SECONDS
///time delay before teleport
var/time_delay = 0.5 SECONDS
@@ -38,7 +37,6 @@
button_icon_state = "ice_cube"
cooldown_time = 2 SECONDS
click_to_activate = FALSE
- melee_cooldown_time = 0 SECONDS
///perimeter we will spawn the iced floors on
var/radius = 1
///intervals we will spawn the ice floors in
diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm
index 026106516fb67..d4a05bf227ede 100644
--- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm
+++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm
@@ -5,7 +5,6 @@
button_icon = 'icons/effects/magic.dmi'
button_icon_state = "fireball"
cooldown_time = 3 SECONDS
- melee_cooldown_time = 0 SECONDS
fire_range = 4
fire_damage = 10
@@ -26,7 +25,6 @@
button_icon = 'icons/effects/fire.dmi'
button_icon_state = "1"
cooldown_time = 4 SECONDS
- melee_cooldown_time = 0 SECONDS
click_to_activate = FALSE
fire_range = 6
diff --git a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm
index d753c42c51ec8..153b74fbbbce5 100644
--- a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm
+++ b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm
@@ -10,7 +10,6 @@
projectile_type = /obj/projectile/leaper
projectile_sound = 'sound/effects/snap.ogg'
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
// bubble ability objects and effects
/obj/projectile/leaper
@@ -119,7 +118,6 @@
cooldown_time = 10 SECONDS
click_to_activate = FALSE
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
/// how many droplets we will fire
var/volley_count = 8
/// time between each droplet launched
@@ -197,7 +195,6 @@
background_icon_state = "bg_revenant"
overlay_icon_state = "bg_revenant_border"
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
/datum/action/cooldown/mob_cooldown/belly_flop/Activate(atom/target)
var/turf/target_turf = get_turf(target)
diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm
index 2d2b69d119abf..7fe69e23da018 100644
--- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm
+++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm
@@ -43,7 +43,6 @@
button_icon_state = "default"
desc = "Secrete a slippery acid!"
cooldown_time = 15 SECONDS
- melee_cooldown_time = 0 SECONDS
click_to_activate = FALSE
/datum/action/cooldown/mob_cooldown/secrete_acid/Activate(atom/target_atom)
diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm
index 3af0675a7f864..0df19c5c27d31 100644
--- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm
+++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm
@@ -230,7 +230,6 @@
default_projectile_spread = 10
shot_count = 10
shot_delay = 0.2 SECONDS
- melee_cooldown_time = 0 SECONDS
shared_cooldown = NONE
///how long we must charge up before firing off
var/charge_up_timer = 3 SECONDS
diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
index 81dc34002eedb..e314fe152caf6 100644
--- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
+++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
@@ -31,7 +31,7 @@
butcher_results = list(
/obj/item/food/meat/slab = 2,
/obj/effect/decal/cleanable/brimdust = 1,
- /obj/item/organ/internal/monster_core/brimdust_sac = 1,
+ /obj/item/organ/monster_core/brimdust_sac = 1,
)
/// How we get blasting
var/datum/action/cooldown/mob_cooldown/brimbeam/beam
diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm
index f76479dc1312d..286e7539624fb 100644
--- a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm
+++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm
@@ -29,7 +29,7 @@
/mob/living/basic/mining/hivelord/Initialize(mapload)
. = ..()
- var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core)
+ var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core)
AddElement(/datum/element/relay_attackers)
AddElement(/datum/element/death_drops, death_loot)
AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") // They writhe so much.
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm
index 76d3f51947e63..007d8b6bfa666 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm
@@ -50,7 +50,7 @@
/// Create what we want to drop on death, in proc form so we can always return a static list
/mob/living/basic/mining/legion/proc/get_loot_list()
- var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion)
+ var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core/legion)
return death_loot
/mob/living/basic/mining/legion/Exited(atom/movable/gone, direction)
@@ -88,7 +88,7 @@
if (prob(75))
return
// Congratulations you have won a special prize: cancer
- var/obj/item/organ/internal/legion_tumour/cancer = new()
+ var/obj/item/organ/legion_tumour/cancer = new()
cancer.Insert(consumed, special = TRUE, movement_flags = DELETE_IF_REPLACED)
/// A Legion which only drops skeletons instead of corpses which might have fun loot, so it cannot be farmed
@@ -167,5 +167,5 @@
/// Create what we want to drop on death, in proc form so we can always return a static list
/mob/living/basic/mining/legion/large/get_loot_list()
- var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4)
+ var/static/list/death_loot = list(/obj/item/organ/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4)
return death_loot
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
index d4503230e482f..984080907c2a8 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
@@ -1,5 +1,5 @@
/// Left behind when a legion infects you, for medical enrichment
-/obj/item/organ/internal/legion_tumour
+/obj/item/organ/legion_tumour
name = "legion tumour"
desc = "A mass of pulsing flesh and dark tendrils, containing the power to regenerate flesh at a terrible cost."
failing_desc = "pulses and writhes with horrible life, reaching towards you with its tendrils!"
@@ -27,22 +27,22 @@
'sound/mobs/non-humanoids/hiss/lowHiss4.ogg',
)
-/obj/item/organ/internal/legion_tumour/Initialize(mapload)
+/obj/item/organ/legion_tumour/Initialize(mapload)
. = ..()
animate_pulse()
-/obj/item/organ/internal/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag)
+/obj/item/organ/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag)
var/was_failing = organ_flags & ORGAN_FAILING
. = ..()
if (was_failing != (organ_flags & ORGAN_FAILING))
animate_pulse()
-/obj/item/organ/internal/legion_tumour/set_organ_damage(damage_amount, required_organ_flag)
+/obj/item/organ/legion_tumour/set_organ_damage(damage_amount, required_organ_flag)
. = ..()
animate_pulse()
/// Do a heartbeat animation depending on if we're failing or not
-/obj/item/organ/internal/legion_tumour/proc/animate_pulse()
+/obj/item/organ/legion_tumour/proc/animate_pulse()
animate(src, transform = matrix()) // Stop any current animation
var/speed_divider = organ_flags & ORGAN_FAILING ? 2 : 1
@@ -51,23 +51,23 @@
animate(transform = matrix(), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_IN)
animate(transform = matrix(), time = 2 SECONDS / speed_divider)
-/obj/item/organ/internal/legion_tumour/Remove(mob/living/carbon/egg_owner, special, movement_flags)
+/obj/item/organ/legion_tumour/Remove(mob/living/carbon/egg_owner, special, movement_flags)
. = ..()
stage = 0
elapsed_time = 0
-/obj/item/organ/internal/legion_tumour/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/legion_tumour/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
owner.log_message("has received [src] which will eventually turn them into a Legion.", LOG_VICTIM)
-/obj/item/organ/internal/legion_tumour/attack(mob/living/target, mob/living/user, params)
+/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, params)
if (try_apply(target, user))
qdel(src)
return
return ..()
/// Smear it on someone like a regen core, why not. Make sure they're alive though.
-/obj/item/organ/internal/legion_tumour/proc/try_apply(mob/living/target, mob/user)
+/obj/item/organ/legion_tumour/proc/try_apply(mob/living/target, mob/user)
if(!user.Adjacent(target) || !isliving(target))
return FALSE
@@ -90,7 +90,7 @@
skull.melee_attack(target)
return TRUE
-/obj/item/organ/internal/legion_tumour/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/legion_tumour/on_life(seconds_per_tick, times_fired)
. = ..()
if (QDELETED(src) || QDELETED(owner))
return
@@ -146,7 +146,7 @@
to_chat(owner, span_bolddanger("Something is moving under your skin!"))
/// Consume our host
-/obj/item/organ/internal/legion_tumour/proc/infest()
+/obj/item/organ/legion_tumour/proc/infest()
if (QDELETED(src) || QDELETED(owner))
return
owner.log_message("has been turned into a Legion by their tumour.", LOG_VICTIM)
@@ -155,7 +155,7 @@
new_legion.consume(owner)
qdel(src)
-/obj/item/organ/internal/legion_tumour/on_find(mob/living/finder)
+/obj/item/organ/legion_tumour/on_find(mob/living/finder)
. = ..()
to_chat(finder, span_warning("There's an enormous tumour in [owner]'s [zone]!"))
if(stage < 4)
diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
index d7f5a024aceb1..d8288360bd1a2 100644
--- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
+++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
@@ -22,7 +22,7 @@
butcher_results = list(
/obj/item/food/meat/slab/rawcrab = 2,
/obj/item/stack/sheet/bone = 2,
- /obj/item/organ/internal/monster_core/rush_gland = 1,
+ /obj/item/organ/monster_core/rush_gland = 1,
)
crusher_loot = /obj/item/crusher_trophy/lobster_claw
ai_controller = /datum/ai_controller/basic_controller/lobstrosity
@@ -146,7 +146,7 @@
butcher_results = list(
/obj/item/food/meat/slab/rawcrab = 1,
/obj/item/stack/sheet/bone = 1,
- /obj/item/organ/internal/monster_core/rush_gland = 1,
+ /obj/item/organ/monster_core/rush_gland = 1,
)
crusher_loot = null
ai_controller = /datum/ai_controller/basic_controller/lobstrosity/juvenile
diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
index 90d7cb0d5b42d..69aa5026a934e 100644
--- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
+++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm
@@ -29,7 +29,6 @@
desc = "Leap towards the enemy!"
cooldown_time = 7 SECONDS
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
///telegraph time before jumping
var/wind_up_time = 2 SECONDS
///intervals between each of our attacks
@@ -92,7 +91,6 @@
desc = "Soar high in the air!"
cooldown_time = 14 SECONDS
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
click_to_activate = FALSE
/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump/Activate(atom/target)
diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm
index 940803299524b..7d0ad8f191ad1 100644
--- a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm
+++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm
@@ -11,7 +11,6 @@
cooldown_time = 20 SECONDS
click_to_activate = FALSE
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
/// At what range do we check for vision?
var/effect_radius = 7
/// How long does it take to play our various animation stages
diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
index a421c5d81f48c..bc778a7bfe799 100644
--- a/code/modules/mob/living/basic/minebots/minebot_abilities.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm
@@ -58,7 +58,6 @@
desc = "Launch a missile towards the target!"
cooldown_time = 10 SECONDS
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
///how long before we launch said missile
var/wind_up_timer = 1 SECONDS
@@ -100,7 +99,6 @@
overlay_icon_state = "bg_default_border"
cooldown_time = 10 SECONDS
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
click_to_activate = FALSE
/datum/action/cooldown/mob_cooldown/drop_landmine/IsAvailable(feedback = TRUE)
diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm
index 3c2ab3f7c9f9b..3075aa6bcb72b 100644
--- a/code/modules/mob/living/basic/pets/cat/cat.dm
+++ b/code/modules/mob/living/basic/pets/cat/cat.dm
@@ -12,8 +12,8 @@
unsuitable_atmos_damage = 0.5
butcher_results = list(
/obj/item/food/meat/slab = 1,
- /obj/item/organ/internal/ears/cat = 1,
- /obj/item/organ/external/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1,
+ /obj/item/organ/tail/cat = 1,
/obj/item/stack/sheet/animalhide/cat = 1
)
response_help_continuous = "pets"
@@ -181,8 +181,8 @@
can_interact_with_stove = TRUE
butcher_results = list(
/obj/item/food/meat/slab = 2,
- /obj/item/organ/internal/ears/cat = 1,
- /obj/item/organ/external/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1,
+ /obj/item/organ/tail/cat = 1,
/obj/item/food/breadslice/plain = 1
)
collar_icon_state = null
diff --git a/code/modules/mob/living/basic/pets/cat/keeki.dm b/code/modules/mob/living/basic/pets/cat/keeki.dm
index 4c18d22b02a73..7314f9b49068a 100644
--- a/code/modules/mob/living/basic/pets/cat/keeki.dm
+++ b/code/modules/mob/living/basic/pets/cat/keeki.dm
@@ -8,8 +8,8 @@
maxHealth = 50
gender = FEMALE
butcher_results = list(
- /obj/item/organ/internal/brain = 1,
- /obj/item/organ/internal/heart = 1,
+ /obj/item/organ/brain = 1,
+ /obj/item/organ/heart = 1,
/obj/item/food/cakeslice/birthday = 3,
/obj/item/food/meat/slab = 2
)
@@ -40,7 +40,7 @@
/mob/living/basic/pet/cat/cak/CheckParts(list/parts)
. = ..()
- var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
+ var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents
if(isnull(candidate?.brainmob?.mind))
return
var/datum/mind/candidate_mind = candidate.brainmob.mind
diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
index 9ac8e10d8f4f9..c5fac5f966e48 100644
--- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
+++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm
@@ -91,7 +91,7 @@
maxHealth = 50
gender = NEUTER
damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, STAMINA = 0, OXY = 1)
- butcher_results = list(/obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1, /obj/item/food/breadslice/plain = 3, \
+ butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/breadslice/plain = 3, \
/obj/item/food/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
response_harm_simple = "take a bite out of"
@@ -101,7 +101,7 @@
/mob/living/basic/pet/dog/breaddog/CheckParts(list/parts)
. = ..()
- var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
+ var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents
if(!candidate || !candidate.brainmob || !candidate.brainmob.mind)
return
candidate.brainmob.mind.transfer_to(src)
diff --git a/code/modules/mob/living/basic/pets/penguin/penguin.dm b/code/modules/mob/living/basic/pets/penguin/penguin.dm
index 5a4732039987d..0df0dfedcb29c 100644
--- a/code/modules/mob/living/basic/pets/penguin/penguin.dm
+++ b/code/modules/mob/living/basic/pets/penguin/penguin.dm
@@ -36,6 +36,13 @@
AddElement(/datum/element/pet_bonus, "honk")
AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling)
ADD_TRAIT(src, TRAIT_MOB_CAN_DIG, INNATE_TRAIT)
+
+ var/static/list/fishable_objects = typecacheof(list(/turf/open/misc/ice))
+ ai_controller.set_blackboard_key(BB_FISHABLE_LIST, fishable_objects)
+ var/static/list/delicious_food = list(/obj/item/fish)
+ AddElement(/datum/element/basic_eating, heal_amt = 10, food_types = delicious_food)
+ ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(delicious_food))
+
if(!can_lay_eggs)
return
AddComponent(\
@@ -48,11 +55,6 @@
max_eggs_held = 1,\
egg_laid_callback = CALLBACK(src, PROC_REF(lay_penguin_egg)),\
)
- var/static/list/fishable_objects = typecacheof(list(/turf/open/misc/ice))
- ai_controller.set_blackboard_key(BB_FISHABLE_LIST, fishable_objects)
- var/static/list/delicious_food = list(/obj/item/fish)
- AddElement(/datum/element/basic_eating, heal_amt = 10, food_types = delicious_food)
- ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(delicious_food))
/mob/living/basic/pet/penguin/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers)
. = ..()
@@ -131,7 +133,7 @@
density = FALSE
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
- butcher_results = list(/obj/item/organ/internal/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1)
+ butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/food/meat/slab/penguin = 1)
ai_controller = /datum/ai_controller/basic_controller/penguin/baby
can_lay_eggs = FALSE
///will it grow up?
diff --git a/code/modules/mob/living/basic/pets/pet_designer.dm b/code/modules/mob/living/basic/pets/pet_designer.dm
index a0cc7ca4018d9..988fee6603817 100644
--- a/code/modules/mob/living/basic/pets/pet_designer.dm
+++ b/code/modules/mob/living/basic/pets/pet_designer.dm
@@ -163,6 +163,9 @@ GLOBAL_LIST_INIT(pet_options, list(
var/list/trick_moves = params["selected_trick_moves"]
if(length(trick_moves))
+ for (var/trick_move in trick_moves)
+ if (!length(GLOB.emote_list[LOWER_TEXT(trick_move)]))
+ trick_moves -= trick_move
pet_trick_moves = trick_moves
var/selected_color = params["selected_carrier"]
diff --git a/code/modules/mob/living/basic/space_fauna/ant.dm b/code/modules/mob/living/basic/space_fauna/ant.dm
index 3ae46b7f53947..60b91c5dcc215 100644
--- a/code/modules/mob/living/basic/space_fauna/ant.dm
+++ b/code/modules/mob/living/basic/space_fauna/ant.dm
@@ -52,6 +52,7 @@
AddElement(/datum/element/pet_bonus, "clack")
AddElement(/datum/element/ai_retaliate)
AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW)
+ AddElement(/datum/element/basic_allergenic_attack, allergen = BUGS, allergen_chance = 20, histamine_add = 5)
/datum/ai_controller/basic_controller/ant
blackboard = list(
diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
index 7a28473f1fa9a..e6d77586e4b1b 100644
--- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
+++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm
@@ -132,7 +132,7 @@
response_harm_simple = "take a bite out of"
attacked_sound = 'sound/items/eatfood.ogg'
death_message = "loses its false life and collapses!"
- butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/internal/brain = 1, /obj/item/organ/internal/heart = 1)
+ butcher_results = list(/obj/item/food/butter = 6, /obj/item/food/meat/slab = 3, /obj/item/organ/brain = 1, /obj/item/organ/heart = 1)
attack_sound = 'sound/items/weapons/slap.ogg'
attack_vis_effect = ATTACK_EFFECT_DISARM
attack_verb_simple = "slap"
@@ -160,7 +160,7 @@
/mob/living/basic/bear/butter/CheckParts(list/parts) //Borrowed code from Cak, allows the brain used to actually control the bear.
. = ..()
- var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents
+ var/obj/item/organ/brain/candidate = locate(/obj/item/organ/brain) in contents
if(!candidate || !candidate.brainmob || !candidate.brainmob.mind)
return
var/datum/mind/candidate_mind = candidate.brainmob.mind
diff --git a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm
index 246b025d559dc..926ce374fafe1 100644
--- a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm
+++ b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm
@@ -51,7 +51,7 @@
return
var/mob/living/carbon/human/attacked = target
- var/obj/item/organ/external/tail/cat/tail = attacked.get_organ_by_type(/obj/item/organ/external/tail/cat)
+ var/obj/item/organ/tail/cat/tail = attacked.get_organ_by_type(/obj/item/organ/tail/cat)
if(QDELETED(tail))
return
diff --git a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
index d7aa8903398a6..f2585aecd6276 100644
--- a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
+++ b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm
@@ -74,7 +74,7 @@
/// Simply infects the target corpse with our changeling eggs. This shouldn't fail, because all checks should have been done in check_and_implant()
/// Just to be super-duper safe to the player, we do return TRUE if all goes well and read that value in check_and_implant() to be nice to the player.
/mob/living/basic/headslug/proc/infect(mob/living/carbon/victim)
- var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
+ var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
egg.origin = mind
diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm
index 811186d43ad9a..fdc92d06f661f 100644
--- a/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm
+++ b/code/modules/mob/living/basic/space_fauna/demon/demon_items.dm
@@ -1,16 +1,16 @@
/// The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
-/obj/item/organ/internal/heart/demon
+/obj/item/organ/heart/demon
name = "demon heart"
desc = "Still it beats furiously, emanating an aura of utter hate."
icon = 'icons/obj/medical/organs/organs.dmi'
icon_state = "demon_heart-on"
decay_factor = 0
-/obj/item/organ/internal/heart/demon/Initialize(mapload)
+/obj/item/organ/heart/demon/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
return ..()
-/obj/item/organ/internal/heart/demon/attack(mob/target_mob, mob/living/carbon/user, obj/target)
+/obj/item/organ/heart/demon/attack(mob/target_mob, mob/living/carbon/user, obj/target)
if(target_mob != user)
return ..()
@@ -33,18 +33,18 @@
user.temporarilyRemoveItemFromInventory(src, TRUE)
src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
-/obj/item/organ/internal/heart/demon/on_mob_insert(mob/living/carbon/heart_owner)
+/obj/item/organ/heart/demon/on_mob_insert(mob/living/carbon/heart_owner)
. = ..()
// Gives a non-eat-people crawl to the new owner
var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = new(heart_owner)
crawl.Grant(heart_owner)
-/obj/item/organ/internal/heart/demon/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE)
+/obj/item/organ/heart/demon/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE)
. = ..()
var/datum/action/cooldown/spell/jaunt/bloodcrawl/crawl = locate() in heart_owner.actions
qdel(crawl)
-/obj/item/organ/internal/heart/demon/Stop()
+/obj/item/organ/heart/demon/Stop()
return FALSE // Always beating.
/obj/effect/decal/cleanable/blood/innards
diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
index a8073fa8329f7..add0ba237f86b 100644
--- a/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
+++ b/code/modules/mob/living/basic/space_fauna/demon/demon_subtypes.dm
@@ -45,7 +45,7 @@
var/static/list/droppable_loot = list(
/obj/effect/decal/cleanable/blood,
/obj/effect/decal/cleanable/blood/innards,
- /obj/item/organ/internal/heart/demon,
+ /obj/item/organ/heart/demon,
)
return droppable_loot
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
index e735067b3ed8d..9c56ec044c75f 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
@@ -100,13 +100,13 @@
if(!ishuman(target))
return TRUE
var/mob/living/carbon/human_target = target
- var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES)
if(isnull(eyes) || eyes.damage < 10)
return TRUE
heal_eye_damage(human_target, eyes)
return FALSE
-/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/internal/eyes/eyes)
+/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/eyes/eyes)
if(!COOLDOWN_FINISHED(src, eye_healing))
return
to_chat(target, span_warning("[src] seems to be healing your [eyes.zone]!"))
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
index 5051f8153714d..27f637d3a879a 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm
@@ -7,7 +7,7 @@
if(!eye_damage_threshold)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
for(var/mob/living/carbon/blind in oview(9, living_pawn))
- var/obj/item/organ/internal/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES)
if(isnull(eyes))
continue
if(eyes.damage < eye_damage_threshold)
@@ -36,7 +36,7 @@
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
- var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
var/datum/callback/callback = CALLBACK(living_pawn, TYPE_PROC_REF(/mob/living/basic/eyeball, heal_eye_damage), target, eyes)
callback.Invoke()
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
index 17b260d03ed72..f71594ea0ec1e 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm
@@ -34,7 +34,7 @@
var/eye_damage_threshold = owner.ai_controller.blackboard[BB_EYE_DAMAGE_THRESHOLD]
if(!eye_damage_threshold)
return TRUE
- var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes.damage > eye_damage_threshold) //we dont attack people with bad vision
return FALSE
diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm
index feb6ebb7c3b66..f7997e589695d 100644
--- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm
+++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm
@@ -8,7 +8,6 @@
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED
click_to_activate = FALSE
cooldown_time = 6 SECONDS
- melee_cooldown_time = 0 SECONDS
button_icon = 'icons/mob/actions/actions_animal.dmi'
background_icon_state = "bg_clock"
overlay_icon_state = "bg_clock_border"
@@ -57,7 +56,6 @@
background_icon_state = "bg_clock"
overlay_icon_state = "bg_clock_border"
cooldown_time = 8 SECONDS
- melee_cooldown_time = 0 SECONDS
shared_cooldown = NONE
/// How close does something need to be for us to recruit it?
var/range = 5
diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm
index 5be5038b3a416..0093b76c826bd 100644
--- a/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm
+++ b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm
@@ -6,7 +6,6 @@
fire_range = 20
fire_temperature = 700 // Even hotter than a megafauna for some reason
shared_cooldown = NONE
- melee_cooldown_time = 0 SECONDS
/datum/action/cooldown/mob_cooldown/fire_breath/carp/on_burn_mob(mob/living/barbecued, mob/living/source)
if (!source.faction_check_atom(barbecued))
diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
index 195b814983301..d71f6791a9c9a 100644
--- a/code/modules/mob/living/basic/space_fauna/spider/spider.dm
+++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm
@@ -69,6 +69,7 @@
AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!")
AddElement(/datum/element/cliff_walking)
AddComponent(/datum/component/health_scaling_effects, min_health_slowdown = 1.5)
+ AddElement(/datum/element/basic_allergenic_attack, allergen = BUGS, allergen_chance = 20, histamine_add = 5)
if(poison_per_bite)
AddElement(/datum/element/venomous, poison_type, poison_per_bite, injection_flags = bite_injection_flags)
diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm
index a25b3c52ad8fc..1281cb06f5756 100644
--- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm
+++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm
@@ -11,7 +11,6 @@
background_icon_state = "bg_fugu"
overlay_icon_state = "bg_fugu_border"
cooldown_time = 16 SECONDS
- melee_cooldown_time = 0 SECONDS
/datum/action/cooldown/fugu_expand/IsAvailable(feedback)
. = ..()
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 7ae89e8d0ae1d..592d187ebbf0b 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -10,7 +10,7 @@
var/mob/living/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm.
- var/obj/item/organ/internal/brain/brain = null //The actual brain
+ var/obj/item/organ/brain/brain = null //The actual brain
var/datum/ai_laws/laws = new()
var/force_replace_ai_name = FALSE
var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core.
@@ -35,7 +35,7 @@
if(!brain)
icon_state = "[base_icon_state]_off"
return ..()
- icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/internal/brain/alien) ? "_alien" : null]"
+ icon_state = "[base_icon_state]_brain[istype(brain, /obj/item/organ/brain/alien) ? "_alien" : null]"
return ..()
/obj/item/mmi/update_overlays()
@@ -51,8 +51,8 @@
/obj/item/mmi/attackby(obj/item/O, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
- if(istype(O, /obj/item/organ/internal/brain)) //Time to stick a brain in it --NEO
- var/obj/item/organ/internal/brain/newbrain = O
+ if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
+ var/obj/item/organ/brain/newbrain = O
if(brain)
to_chat(user, span_warning("There's already a brain in the MMI!"))
return
@@ -99,7 +99,7 @@
name = "[initial(name)]: [brainmob.real_name]"
update_appearance()
- if(istype(brain, /obj/item/organ/internal/brain/alien))
+ if(istype(brain, /obj/item/organ/brain/alien))
braintype = "Xenoborg" //HISS....Beep.
else
braintype = "Cyborg"
@@ -121,7 +121,7 @@
* Arguments:
* * new_brain - Brain to be force-inserted into the MMI. Any calling code should handle proper removal of the brain from the mob, as this proc only forceMoves.
*/
-/obj/item/mmi/proc/force_brain_into(obj/item/organ/internal/brain/new_brain)
+/obj/item/mmi/proc/force_brain_into(obj/item/organ/brain/new_brain)
if(isnull(new_brain))
stack_trace("Proc called with null brain.")
return FALSE
@@ -160,7 +160,7 @@
name = "[initial(name)]: [brainmob.real_name]"
update_appearance()
- if(istype(brain, /obj/item/organ/internal/brain/alien))
+ if(istype(brain, /obj/item/organ/brain/alien))
braintype = "Xenoborg"
else
braintype = "Cyborg"
@@ -209,7 +209,7 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
- var/obj/item/organ/internal/brain/newbrain = H.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/newbrain = H.get_organ_by_type(/obj/item/organ/brain)
newbrain.Remove(H, special = TRUE, movement_flags = NO_ID_TRANSFER)
newbrain.forceMove(src)
brain = newbrain
@@ -220,7 +220,7 @@
name = "[initial(name)]: [brainmob.real_name]"
update_appearance()
- if(istype(brain, /obj/item/organ/internal/brain/alien))
+ if(istype(brain, /obj/item/organ/brain/alien))
braintype = "Xenoborg" //HISS....Beep.
else
braintype = "Cyborg"
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 17f5be02a91cf..ccce0269e54ea 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -11,7 +11,7 @@
create_dna(src)
stored_dna.initialize_dna(random_blood_type())
if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned)
- var/obj/item/organ/internal/brain/OB = new(loc) //we create a new brain organ for it.
+ var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
OB.brainmob = src
forceMove(OB)
if(!container?.mecha && (!container || container.immobilize)) //Unless inside a mecha, brains are rather helpless.
@@ -19,7 +19,7 @@
ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
/mob/living/brain/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
- var/obj/item/organ/internal/brain/brain_loc = loc
+ var/obj/item/organ/brain/brain_loc = loc
if(brain_loc && isnull(new_turf) && brain_loc.owner) //we're actively being put inside a new body.
return ..(old_turf, get_turf(brain_loc.owner), same_z_layer, notify_contents)
return ..()
@@ -79,10 +79,10 @@
/mob/living/brain/forceMove(atom/destination)
if(container)
return container.forceMove(destination)
- else if (istype(loc, /obj/item/organ/internal/brain))
- var/obj/item/organ/internal/brain/B = loc
+ else if (istype(loc, /obj/item/organ/brain))
+ var/obj/item/organ/brain/B = loc
B.forceMove(destination)
- else if (istype(destination, /obj/item/organ/internal/brain))
+ else if (istype(destination, /obj/item/organ/brain))
doMove(destination)
else if (istype(destination, /obj/item/mmi))
doMove(destination)
@@ -102,8 +102,8 @@
/mob/living/brain/proc/get_traumas()
. = list()
- if(istype(loc, /obj/item/organ/internal/brain))
- var/obj/item/organ/internal/brain/B = loc
+ if(istype(loc, /obj/item/organ/brain))
+ var/obj/item/organ/brain/B = loc
. = B.traumas
/mob/living/brain/get_policy_keywords()
diff --git a/code/modules/mob/living/brain/brain_cybernetic.dm b/code/modules/mob/living/brain/brain_cybernetic.dm
index d87b6d902837c..c88db6dc1a1a4 100644
--- a/code/modules/mob/living/brain/brain_cybernetic.dm
+++ b/code/modules/mob/living/brain/brain_cybernetic.dm
@@ -1,11 +1,11 @@
-/obj/item/organ/internal/brain/cybernetic
+/obj/item/organ/brain/cybernetic
name = "cybernetic brain"
desc = "A mechanical brain found inside of androids. Not to be confused with a positronic brain."
icon_state = "brain-c"
organ_flags = ORGAN_ROBOTIC | ORGAN_VITAL
failing_desc = "seems to be broken, and will not work without repairs."
-/obj/item/organ/internal/brain/cybernetic/brain_damage_examine()
+/obj/item/organ/brain/cybernetic/brain_damage_examine()
if(suicided)
return span_info("Its circuitry is smoking slightly. They must not have been able to handle the stress of it all.")
if(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost()))
@@ -18,7 +18,7 @@
else
return span_info("This one is completely devoid of life.")
-/obj/item/organ/internal/brain/cybernetic/check_for_repair(obj/item/item, mob/user)
+/obj/item/organ/brain/cybernetic/check_for_repair(obj/item/item, mob/user)
if (item.tool_behaviour == TOOL_MULTITOOL) //attempt to repair the brain
if (brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing
to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!"))
@@ -48,7 +48,7 @@
return TRUE
return FALSE
-/obj/item/organ/internal/brain/cybernetic/emp_act(severity)
+/obj/item/organ/brain/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index be9c6dc1d1cd1..7907fabbfc0a5 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/brain
+/obj/item/organ/brain
name = "brain"
desc = "A piece of juicy meat found in a person's head."
icon_state = "brain"
@@ -45,12 +45,12 @@
/// We got smooth from being washed
var/smooth_brain = FALSE
-/obj/item/organ/internal/brain/Initialize(mapload)
+/obj/item/organ/brain/Initialize(mapload)
. = ..()
// Brain size logic
transform = transform.Scale(brain_size)
-/obj/item/organ/internal/brain/examine()
+/obj/item/organ/brain/examine()
. = ..()
if (smooth_brain)
. += span_notice("All the pesky wrinkles are gone. Now it just needs a good drying...")
@@ -59,7 +59,7 @@
if(brain_size > 1)
. += span_notice("It is bigger than average...")
-/obj/item/organ/internal/brain/mob_insert(mob/living/carbon/brain_owner, special = FALSE, movement_flags)
+/obj/item/organ/brain/mob_insert(mob/living/carbon/brain_owner, special = FALSE, movement_flags)
. = ..()
if(!.)
return
@@ -115,7 +115,7 @@
if(!special && !(brain_owner.living_flags & STOP_OVERLAY_UPDATE_BODY_PARTS))
brain_owner.update_body_parts()
-/obj/item/organ/internal/brain/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/brain/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
// Delete skillchips first as parent proc sets owner to null, and skillchips need to know the brain's owner.
if(!QDELETED(organ_owner) && length(skillchips))
if(!special)
@@ -139,11 +139,11 @@
organ_owner.update_body_parts()
organ_owner.clear_mood_event("brain_damage")
-/obj/item/organ/internal/brain/update_icon_state()
+/obj/item/organ/brain/update_icon_state()
icon_state = "[initial(icon_state)][smooth_brain ? "-smooth_brain" : ""]"
return ..()
-/obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L)
+/obj/item/organ/brain/proc/transfer_identity(mob/living/L)
name = "[L.name]'s [initial(name)]"
if(brainmob)
if(!decoy_override)
@@ -175,7 +175,7 @@
L.mind.transfer_to(brainmob)
to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain."))
-/obj/item/organ/internal/brain/attackby(obj/item/item, mob/user, params)
+/obj/item/organ/brain/attackby(obj/item/item, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
if(istype(item, /obj/item/borg/apparatus/organ_storage))
@@ -217,7 +217,7 @@
visible_message(span_danger("[user] hits [src] with [item]!"))
to_chat(user, span_danger("You hit [src] with [item]!"))
-/obj/item/organ/internal/brain/proc/check_for_repair(obj/item/item, mob/user)
+/obj/item/organ/brain/proc/check_for_repair(obj/item/item, mob/user)
if(damage && item.is_drainable() && item.reagents.has_reagent(/datum/reagent/medicine/mannitol) && (organ_flags & ORGAN_ORGANIC)) //attempt to heal the brain
if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing
to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!"))
@@ -236,7 +236,7 @@
return TRUE
return FALSE
-/obj/item/organ/internal/brain/examine(mob/user)
+/obj/item/organ/brain/examine(mob/user)
. = ..()
if(length(skillchips))
. += span_info("It has a skillchip embedded in it.")
@@ -247,7 +247,7 @@
. += span_notice("It is bigger than average...")
/// Needed so subtypes can override examine text while still calling parent
-/obj/item/organ/internal/brain/proc/brain_damage_examine()
+/obj/item/organ/brain/proc/brain_damage_examine()
if(suicided)
return span_info("It's started turning slightly grey. They must not have been able to handle the stress of it all.")
if(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost()))
@@ -260,7 +260,7 @@
else
return span_info("This one is completely devoid of life.")
-/obj/item/organ/internal/brain/get_status_appendix(advanced, add_tooltips)
+/obj/item/organ/brain/get_status_appendix(advanced, add_tooltips)
var/list/trauma_text
for(var/datum/brain_trauma/trauma as anything in traumas)
var/trauma_desc = ""
@@ -280,7 +280,7 @@
if(LAZYLEN(trauma_text))
return "Mental trauma: [english_list(trauma_text, and_text = ", and ")]."
-/obj/item/organ/internal/brain/attack(mob/living/carbon/C, mob/user)
+/obj/item/organ/brain/attack(mob/living/carbon/C, mob/user)
if(!istype(C))
return ..()
@@ -289,7 +289,7 @@
if(user.zone_selected != BODY_ZONE_HEAD)
return ..()
- var/target_has_brain = C.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/target_has_brain = C.get_organ_by_type(/obj/item/organ/brain)
if(!target_has_brain && C.is_eyes_covered())
to_chat(user, span_warning("You're going to need to remove [C.p_their()] head cover first!"))
@@ -317,7 +317,7 @@
else
..()
-/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
+/obj/item/organ/brain/Destroy() //copypasted from MMIs.
QDEL_NULL(brainmob)
QDEL_LIST(traumas)
@@ -325,13 +325,13 @@
owner?.mind?.set_current(null) //You aren't allowed to return to brains that don't exist
return ..()
-/obj/item/organ/internal/brain/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/brain/on_life(seconds_per_tick, times_fired)
if(damage >= BRAIN_DAMAGE_DEATH) //rip
to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out..."))
owner.investigate_log("has been killed by brain damage.", INVESTIGATE_DEATHS)
owner.death()
-/obj/item/organ/internal/brain/check_damage_thresholds(mob/M)
+/obj/item/organ/brain/check_damage_thresholds(mob/M)
. = ..()
//if we're not more injured than before, return without gambling for a trauma
if(damage <= prev_damage)
@@ -364,9 +364,9 @@
else
return brain_message
-/obj/item/organ/internal/brain/before_organ_replacement(obj/item/organ/replacement)
+/obj/item/organ/brain/before_organ_replacement(obj/item/organ/replacement)
. = ..()
- var/obj/item/organ/internal/brain/replacement_brain = replacement
+ var/obj/item/organ/brain/replacement_brain = replacement
if(!istype(replacement_brain))
return
@@ -403,7 +403,7 @@
remove_trauma_from_traumas(trauma)
replacement_brain.add_trauma_to_traumas(trauma)
-/obj/item/organ/internal/brain/machine_wash(obj/machinery/washing_machine/brainwasher)
+/obj/item/organ/brain/machine_wash(obj/machinery/washing_machine/brainwasher)
. = ..()
if (can_smoothen_out && !smooth_brain)
smooth_brain = TRUE
@@ -415,19 +415,19 @@
else
set_organ_damage(BRAIN_DAMAGE_DEATH)
-/obj/item/organ/internal/brain/zombie
+/obj/item/organ/brain/zombie
name = "zombie brain"
desc = "This glob of green mass can't have much intelligence inside it."
icon_state = "brain-x"
organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE)
-/obj/item/organ/internal/brain/alien
+/obj/item/organ/brain/alien
name = "alien brain"
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
icon_state = "brain-x"
organ_traits = list(TRAIT_CAN_STRIP)
-/obj/item/organ/internal/brain/primitive //No like books and stompy metal men
+/obj/item/organ/brain/primitive //No like books and stompy metal men
name = "primitive brain"
desc = "This juicy piece of meat has a clearly underdeveloped frontal lobe."
organ_traits = list(
@@ -440,7 +440,7 @@
TRAIT_BEAST_EMPATHY, // know the way of beast, calm with food
)
-/obj/item/organ/internal/brain/golem
+/obj/item/organ/brain/golem
name = "crystalline matrix"
desc = "This collection of sparkling gems somehow allows a golem to think."
icon_state = "adamantine_resonator"
@@ -449,32 +449,32 @@
organ_flags = ORGAN_MINERAL
organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP, TRAIT_ROCK_METAMORPHIC)
-/obj/item/organ/internal/brain/lustrous
+/obj/item/organ/brain/lustrous
name = "lustrous brain"
desc = "This is your brain on bluespace dust. Not even once."
icon_state = "random_fly_4"
can_smoothen_out = FALSE
organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP)
-/obj/item/organ/internal/brain/lustrous/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/brain/lustrous/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
organ_owner.cure_trauma_type(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
organ_owner.RemoveElement(/datum/element/tenacious)
-/obj/item/organ/internal/brain/lustrous/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/brain/lustrous/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
organ_owner.AddElement(/datum/element/tenacious)
-/obj/item/organ/internal/brain/felinid //A bit smaller than average
+/obj/item/organ/brain/felinid //A bit smaller than average
brain_size = 0.8
-/obj/item/organ/internal/brain/lizard //A bit smaller than average
+/obj/item/organ/brain/lizard //A bit smaller than average
name = "lizard brain"
desc = "This juicy piece of meat has a oversized brain stem and cerebellum, with not much of a limbic system to speak of at all. You would expect it's owner to be pretty cold blooded."
organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER)
-/obj/item/organ/internal/brain/abductor
+/obj/item/organ/brain/abductor
name = "grey brain"
desc = "A piece of juicy meat found in an ayy lmao's head."
icon_state = "brain-x"
@@ -483,20 +483,20 @@
////////////////////////////////////TRAUMAS////////////////////////////////////////
-/obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
+/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
for(var/X in traumas)
var/datum/brain_trauma/BT = X
if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience))
return BT
-/obj/item/organ/internal/brain/proc/get_traumas_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
+/obj/item/organ/brain/proc/get_traumas_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
. = list()
for(var/X in traumas)
var/datum/brain_trauma/BT = X
if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience))
. += BT
-/obj/item/organ/internal/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE)
+/obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE)
if(!ispath(trauma))
trauma = trauma.type
if(!initial(trauma.can_gain))
@@ -532,19 +532,19 @@
return TRUE
//Proc to use when directly adding a trauma to the brain, so extra args can be given
-/obj/item/organ/internal/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...)
+/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...)
var/list/arguments = list()
if(args.len > 2)
arguments = args.Copy(3)
. = brain_gain_trauma(trauma, resilience, arguments)
-/obj/item/organ/internal/brain/vv_edit_var(var_name, var_value)
+/obj/item/organ/brain/vv_edit_var(var_name, var_value)
. = ..()
if(var_name == NAMEOF(src, smooth_brain))
update_appearance()
//Direct trauma gaining proc. Necessary to assign a trauma to its brain. Avoid using directly.
-/obj/item/organ/internal/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments)
+/obj/item/organ/brain/proc/brain_gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments)
if(!can_gain_trauma(trauma, resilience))
return FALSE
@@ -574,18 +574,18 @@
/// Adds the passed trauma instance to our list of traumas and links it to our brain.
/// DOES NOT handle setting up the trauma, that's done by [proc/brain_gain_trauma]!
-/obj/item/organ/internal/brain/proc/add_trauma_to_traumas(datum/brain_trauma/trauma)
+/obj/item/organ/brain/proc/add_trauma_to_traumas(datum/brain_trauma/trauma)
trauma.brain = src
traumas += trauma
/// Removes the passed trauma instance to our list of traumas and links it to our brain
/// DOES NOT handle removing the trauma's effects, that's done by [/datum/brain_trauma/Destroy()]!
-/obj/item/organ/internal/brain/proc/remove_trauma_from_traumas(datum/brain_trauma/trauma)
+/obj/item/organ/brain/proc/remove_trauma_from_traumas(datum/brain_trauma/trauma)
trauma.brain = null
traumas -= trauma
//Add a random trauma of a certain subtype
-/obj/item/organ/internal/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE)
+/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience, natural_gain = FALSE)
var/list/datum/brain_trauma/possible_traumas = list()
for(var/T in subtypesof(brain_trauma_type))
var/datum/brain_trauma/BT = T
@@ -599,12 +599,12 @@
return gain_trauma(trauma_type, resilience)
//Cure a random trauma of a certain resilience level
-/obj/item/organ/internal/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC)
+/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC)
var/list/traumas = get_traumas_type(brain_trauma_type, resilience)
if(LAZYLEN(traumas))
qdel(pick(traumas))
-/obj/item/organ/internal/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC)
+/obj/item/organ/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC)
var/amount_cured = 0
var/list/traumas = get_traumas_type(resilience = resilience)
for(var/X in traumas)
@@ -612,7 +612,7 @@
amount_cured++
return amount_cured
-/obj/item/organ/internal/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE)
+/obj/item/organ/brain/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag = NONE)
. = ..()
if(!owner)
return FALSE
@@ -622,7 +622,7 @@
owner.clear_mood_event("brain_damage")
/// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike.
-/obj/item/organ/internal/brain/proc/get_attacking_limb(mob/living/carbon/human/target)
+/obj/item/organ/brain/proc/get_attacking_limb(mob/living/carbon/human/target)
var/obj/item/bodypart/arm/active_hand = owner.get_active_hand()
if(target.body_position == LYING_DOWN && owner.usable_legs)
var/obj/item/bodypart/found_bodypart = owner.get_bodypart((active_hand.held_index % 2) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG)
@@ -630,8 +630,8 @@
return active_hand
/// Brains REALLY like ghosting people. we need special tricks to avoid that, namely removing the old brain with no_id_transfer
-/obj/item/organ/internal/brain/replace_into(mob/living/carbon/new_owner)
- var/obj/item/organ/internal/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN)
+/obj/item/organ/brain/replace_into(mob/living/carbon/new_owner)
+ var/obj/item/organ/brain/old_brain = new_owner.get_organ_slot(ORGAN_SLOT_BRAIN)
old_brain.Remove(new_owner, special = TRUE, movement_flags = NO_ID_TRANSFER)
qdel(old_brain)
return Insert(new_owner, special = TRUE, movement_flags = NO_ID_TRANSFER | DELETE_IF_REPLACED)
diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm
index 60487aa0c3599..8166e9f844600 100644
--- a/code/modules/mob/living/brain/death.dm
+++ b/code/modules/mob/living/brain/death.dm
@@ -15,6 +15,6 @@
if(container)
qdel(container)//Gets rid of the MMI if there is one
if(loc)
- if(istype(loc, /obj/item/organ/internal/brain))
+ if(istype(loc, /obj/item/organ/brain))
qdel(loc)//Gets rid of the brain item
..()
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index 7ffe49951ec26..5b016db7fba61 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -20,10 +20,10 @@
return
if(stat != DEAD)
death()
- var/obj/item/organ/internal/brain/BR
+ var/obj/item/organ/brain/BR
if(container?.brain)
BR = container.brain
- else if(istype(loc, /obj/item/organ/internal/brain))
+ else if(istype(loc, /obj/item/organ/brain))
BR = loc
if(BR)
BR.set_organ_damage(BRAIN_DAMAGE_DEATH) //beaten to a pulp
diff --git a/code/modules/mob/living/brain/skillchip.dm b/code/modules/mob/living/brain/skillchip.dm
index 2c066c7e73570..4bab004c685dc 100644
--- a/code/modules/mob/living/brain/skillchip.dm
+++ b/code/modules/mob/living/brain/skillchip.dm
@@ -6,7 +6,7 @@
* Arguments:
* * skillchip - The skillchip you'd like to remove.
*/
-/obj/item/organ/internal/brain/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE)
+/obj/item/organ/brain/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE)
// Check this skillchip is in the brain.
if(!(skillchip in skillchips))
stack_trace("Attempted to remove skillchip [skillchip] that wasn't in [src] skillchip list.")
@@ -27,7 +27,7 @@
* * skillchip - The skillchip you'd like to implant.
* * force - Whether or not to force the skillchip to be implanted, ignoring any checks.
*/
-/obj/item/organ/internal/brain/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE)
+/obj/item/organ/brain/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE)
// If we're not forcing the implant, so let's do some checks.
if(!force)
// Slot capacity check!
@@ -50,7 +50,7 @@
* Arguments:
* * not_removable - Special override, whether or not to force cloned chips to be non-removable, i.e. to delete on removal.
*/
-/obj/item/organ/internal/brain/proc/clone_skillchip_list(not_removable = FALSE)
+/obj/item/organ/brain/proc/clone_skillchip_list(not_removable = FALSE)
var/list/skillchip_metadata = list()
// Remove and call on_removal proc if successful.
for(var/chip in skillchips)
@@ -76,7 +76,7 @@
* Arguments:
* * silent - Whether to give the user a chat notification with the removal flavour text.
*/
-/obj/item/organ/internal/brain/proc/destroy_all_skillchips(silent = TRUE)
+/obj/item/organ/brain/proc/destroy_all_skillchips(silent = TRUE)
if(!QDELETED(owner))
for(var/chip in skillchips)
var/obj/item/skillchip/skillchip = chip
@@ -86,7 +86,7 @@
/**
* Returns the total maximum skillchip complexity supported by this brain.
*/
-/obj/item/organ/internal/brain/proc/get_max_skillchip_complexity()
+/obj/item/organ/brain/proc/get_max_skillchip_complexity()
if(!QDELETED(owner))
return max_skillchip_complexity + owner.skillchip_complexity_modifier
@@ -95,7 +95,7 @@
/**
* Returns the total current skillchip complexity used in this brain.
*/
-/obj/item/organ/internal/brain/proc/get_used_skillchip_complexity()
+/obj/item/organ/brain/proc/get_used_skillchip_complexity()
var/complexity_tally = 0
for(var/chip in skillchips)
@@ -111,13 +111,13 @@
/**
* Returns the total maximum skillchip slot capacity supported by this brain.
*/
-/obj/item/organ/internal/brain/proc/get_max_skillchip_slots()
+/obj/item/organ/brain/proc/get_max_skillchip_slots()
return max_skillchip_slots
/**
* Returns the total current skillchip slot capacity used in this brain.
*/
-/obj/item/organ/internal/brain/proc/get_used_skillchip_slots()
+/obj/item/organ/brain/proc/get_used_skillchip_slots()
var/slot_tally = 0
for(var/chip in skillchips)
@@ -130,7 +130,7 @@
/**
* Deactivates all chips currently in the brain.
*/
-/obj/item/organ/internal/brain/proc/activate_skillchip_failsafe(silent = TRUE)
+/obj/item/organ/brain/proc/activate_skillchip_failsafe(silent = TRUE)
if(QDELETED(owner))
return
@@ -154,7 +154,7 @@
to_chat(owner, span_warning("Unusual brain biology detected during regeneration. Failsafe procedure engaged. [chip_tally] skillchips have been deactivated."))
/// Disables or re-enables any extra skillchips after skillchip limit changes.
-/obj/item/organ/internal/brain/proc/update_skillchips()
+/obj/item/organ/brain/proc/update_skillchips()
var/limit = get_max_skillchip_complexity()
var/dt = limit - get_used_skillchip_complexity()
diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm
index c53491e0ce782..d2c41e61a12fb 100644
--- a/code/modules/mob/living/carbon/alien/adult/adult.dm
+++ b/code/modules/mob/living/carbon/alien/adult/adult.dm
@@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items)
/mob/living/carbon/alien/adult/create_internal_organs()
- organs += new /obj/item/organ/internal/stomach/alien()
+ organs += new /obj/item/organ/stomach/alien()
return ..()
/mob/living/carbon/alien/adult/cuff_resist(obj/item/I)
@@ -127,7 +127,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
if(!can_consume(lucky_winner))
return TRUE
- var/obj/item/organ/internal/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH)
if(!istype(melting_pot))
visible_message(span_clown("[src] can't seem to consume [lucky_winner]!"), \
span_alien("You feel a pain in your... chest? You can't get [lucky_winner] down."))
diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm
index 0b760c0f2e7b9..bfdcd1a5fd2ea 100644
--- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm
@@ -14,7 +14,6 @@ Doesn't work on other aliens/AI.*/
button_icon = 'icons/mob/actions/actions_xeno.dmi'
button_icon_state = "spell_default"
check_flags = AB_CHECK_IMMOBILE | AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED
- melee_cooldown_time = 0 SECONDS
/// How much plasma this action uses.
var/plasma_cost = 0
@@ -367,7 +366,7 @@ Doesn't work on other aliens/AI.*/
if(!iscarbon(owner))
return
var/mob/living/carbon/alien/adult/alieninated_owner = owner
- var/obj/item/organ/internal/stomach/alien/melting_pot = alieninated_owner.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/alien/melting_pot = alieninated_owner.get_organ_slot(ORGAN_SLOT_STOMACH)
if(!melting_pot)
owner.visible_message(span_clown("[src] gags, and spits up a bit of purple liquid. Ewwww."), \
span_alien("You feel a pain in your... chest? There's nothing there there's nothing there no no n-"))
@@ -384,14 +383,14 @@ Doesn't work on other aliens/AI.*/
/// Gets the plasma level of this carbon's plasma vessel, or -1 if they don't have one
/mob/living/carbon/proc/getPlasma()
- var/obj/item/organ/internal/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)
+ var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel)
if(!vessel)
return -1
return vessel.stored_plasma
/// Adjusts the plasma level of the carbon's plasma vessel if they have one
/mob/living/carbon/proc/adjustPlasma(amount)
- var/obj/item/organ/internal/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/internal/alien/plasmavessel)
+ var/obj/item/organ/alien/plasmavessel/vessel = get_organ_by_type(/obj/item/organ/alien/plasmavessel)
if(!vessel)
return FALSE
vessel.stored_plasma = max(vessel.stored_plasma + amount,0)
diff --git a/code/modules/mob/living/carbon/alien/adult/caste/drone.dm b/code/modules/mob/living/carbon/alien/adult/caste/drone.dm
index ff208baabd229..c238f1013ab29 100644
--- a/code/modules/mob/living/carbon/alien/adult/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/adult/caste/drone.dm
@@ -10,9 +10,9 @@
return ..()
/mob/living/carbon/alien/adult/drone/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel/large
- organs += new /obj/item/organ/internal/alien/resinspinner
- organs += new /obj/item/organ/internal/alien/acid
+ organs += new /obj/item/organ/alien/plasmavessel/large
+ organs += new /obj/item/organ/alien/resinspinner
+ organs += new /obj/item/organ/alien/acid
return ..()
/datum/action/cooldown/alien/evolve_to_praetorian
@@ -33,7 +33,7 @@
return FALSE
var/mob/living/carbon/alien/adult/royal/evolver = owner
- var/obj/item/organ/internal/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/internal/alien/hivenode)
+ var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode)
// Players are Murphy's Law. We may not expect
// there to ever be a living xeno with no hivenode,
// but they _WILL_ make it happen.
diff --git a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm
index 51d9a3bce1b7a..3bfbe7961648a 100644
--- a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm
@@ -10,7 +10,7 @@
var/pounce_speed = 2
/mob/living/carbon/alien/adult/hunter/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel/small
+ organs += new /obj/item/organ/alien/plasmavessel/small
..()
//Hunter verbs
diff --git a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm
index 8fa142a38f05f..473cdfafec21d 100644
--- a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm
+++ b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm
@@ -19,10 +19,10 @@
return ..()
/mob/living/carbon/alien/adult/royal/praetorian/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel/large
- organs += new /obj/item/organ/internal/alien/resinspinner
- organs += new /obj/item/organ/internal/alien/acid
- organs += new /obj/item/organ/internal/alien/neurotoxin
+ organs += new /obj/item/organ/alien/plasmavessel/large
+ organs += new /obj/item/organ/alien/resinspinner
+ organs += new /obj/item/organ/alien/acid
+ organs += new /obj/item/organ/alien/neurotoxin
return ..()
/datum/action/cooldown/alien/evolve_to_queen
@@ -43,7 +43,7 @@
return FALSE
var/mob/living/carbon/alien/adult/royal/evolver = owner
- var/obj/item/organ/internal/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/internal/alien/hivenode)
+ var/obj/item/organ/alien/hivenode/node = evolver.get_organ_by_type(/obj/item/organ/alien/hivenode)
if(!node || node.recent_queen_death)
return FALSE
diff --git a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm
index bef621905f442..2560522c405f9 100644
--- a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm
@@ -11,7 +11,7 @@
return ..()
/mob/living/carbon/alien/adult/sentinel/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel
- organs += new /obj/item/organ/internal/alien/acid
- organs += new /obj/item/organ/internal/alien/neurotoxin
+ organs += new /obj/item/organ/alien/plasmavessel
+ organs += new /obj/item/organ/alien/acid
+ organs += new /obj/item/organ/alien/neurotoxin
..()
diff --git a/code/modules/mob/living/carbon/alien/adult/death.dm b/code/modules/mob/living/carbon/alien/adult/death.dm
index ce99343ea2c9a..d71d466089cad 100644
--- a/code/modules/mob/living/carbon/alien/adult/death.dm
+++ b/code/modules/mob/living/carbon/alien/adult/death.dm
@@ -15,7 +15,7 @@
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
if(C == src) //Make sure not to proc it on ourselves.
continue
- var/obj/item/organ/internal/alien/hivenode/node = C.get_organ_by_type(/obj/item/organ/internal/alien/hivenode)
+ var/obj/item/organ/alien/hivenode/node = C.get_organ_by_type(/obj/item/organ/alien/hivenode)
if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot
node.queen_death()
diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm
index a925b4c5460ea..8cbd55719774c 100644
--- a/code/modules/mob/living/carbon/alien/adult/queen.dm
+++ b/code/modules/mob/living/carbon/alien/adult/queen.dm
@@ -65,11 +65,11 @@
return ..()
/mob/living/carbon/alien/adult/royal/queen/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel/large/queen
- organs += new /obj/item/organ/internal/alien/resinspinner
- organs += new /obj/item/organ/internal/alien/acid
- organs += new /obj/item/organ/internal/alien/neurotoxin
- organs += new /obj/item/organ/internal/alien/eggsac
+ organs += new /obj/item/organ/alien/plasmavessel/large/queen
+ organs += new /obj/item/organ/alien/resinspinner
+ organs += new /obj/item/organ/alien/acid
+ organs += new /obj/item/organ/alien/neurotoxin
+ organs += new /obj/item/organ/alien/eggsac
return ..()
//Queen verbs
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index dcf00435fba91..663001c2cc7b0 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -53,12 +53,12 @@
CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_has_trait), src, TRAIT_ADVANCEDTOOLUSER))
/mob/living/carbon/alien/create_internal_organs()
- organs += new /obj/item/organ/internal/brain/alien
- organs += new /obj/item/organ/internal/alien/hivenode
- organs += new /obj/item/organ/internal/tongue/alien
- organs += new /obj/item/organ/internal/eyes/alien
- organs += new /obj/item/organ/internal/liver/alien
- organs += new /obj/item/organ/internal/ears
+ organs += new /obj/item/organ/brain/alien
+ organs += new /obj/item/organ/alien/hivenode
+ organs += new /obj/item/organ/tongue/alien
+ organs += new /obj/item/organ/eyes/alien
+ organs += new /obj/item/organ/liver/alien
+ organs += new /obj/item/organ/ears
..()
/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums
@@ -100,7 +100,7 @@ Des: Gives the client of the alien an image on each infected mob.
for (var/i in GLOB.mob_living_list)
var/mob/living/L = i
if(HAS_TRAIT(L, TRAIT_XENO_HOST))
- var/obj/item/organ/internal/body_egg/alien_embryo/A = L.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)
+ var/obj/item/organ/body_egg/alien_embryo/A = L.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)
if(A)
var/I = image('icons/mob/nonhuman-player/alien.dmi', loc = L, icon_state = "infected[A.stage]")
client.images += I
@@ -145,8 +145,8 @@ Des: Removes all infected images from the alien.
mind.name = new_xeno.real_name
mind.transfer_to(new_xeno)
- var/obj/item/organ/internal/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH)
- var/obj/item/organ/internal/stomach/alien/frying_pan = new_xeno.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/alien/frying_pan = new_xeno.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(melting_pot) && istype(frying_pan))
for (var/atom/movable/poor_sod as anything in melting_pot.stomach_contents)
frying_pan.consume_thing(poor_sod)
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 0217a99fa04be..751676a74ae26 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -71,7 +71,7 @@ In all, this is a lot like the monkey code. /N
if(!. || QDELETED(src))
return FALSE
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
switch (severity)
if (EXPLODE_DEVASTATE)
gib(DROP_ALL_REMAINS)
diff --git a/code/modules/mob/living/carbon/alien/alien_say.dm b/code/modules/mob/living/carbon/alien/alien_say.dm
index 4cfdc265abfaf..29f55300d9114 100644
--- a/code/modules/mob/living/carbon/alien/alien_say.dm
+++ b/code/modules/mob/living/carbon/alien/alien_say.dm
@@ -20,6 +20,6 @@
..(message, shown_name, TRUE)
/mob/living/carbon/hivecheck()
- var/obj/item/organ/internal/alien/hivenode/N = get_organ_by_type(/obj/item/organ/internal/alien/hivenode)
+ var/obj/item/organ/alien/hivenode/N = get_organ_by_type(/obj/item/organ/alien/hivenode)
if(N && !N.recent_queen_death) //Mob has alien hive node and is not under the dead queen special effect.
return TRUE
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index f4159813ed9bc..39915a0384d5d 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -40,7 +40,7 @@
return ..()
/mob/living/carbon/alien/larva/create_internal_organs()
- organs += new /obj/item/organ/internal/alien/plasmavessel/small/tiny
+ organs += new /obj/item/organ/alien/plasmavessel/small/tiny
..()
//This needs to be fixed
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 52f7b8dfc4789..a8de80b705827 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -14,7 +14,7 @@
if(HAS_TRAIT(src, TRAIT_GODMODE))
return
if(stat != DEAD)
- if(health <= -maxHealth || !get_organ_by_type(/obj/item/organ/internal/brain))
+ if(health <= -maxHealth || !get_organ_by_type(/obj/item/organ/brain))
death()
return
if((HAS_TRAIT(src, TRAIT_KNOCKEDOUT)))
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index ac9fd81cf976b..f0bf6bb2d11fa 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -1,8 +1,8 @@
-/obj/item/organ/internal/alien
+/obj/item/organ/alien
icon_state = "acid"
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10)
-/obj/item/organ/internal/alien/plasmavessel
+/obj/item/organ/alien/plasmavessel
name = "plasma vessel"
icon_state = "plasma"
w_class = WEIGHT_CLASS_NORMAL
@@ -23,7 +23,7 @@
/// The rate this organ regenerates plasma at per second.
var/plasma_rate = 5
-/obj/item/organ/internal/alien/plasmavessel/large
+/obj/item/organ/alien/plasmavessel/large
name = "large plasma vessel"
icon_state = "plasma_large"
w_class = WEIGHT_CLASS_BULKY
@@ -31,10 +31,10 @@
max_plasma = 500
plasma_rate = 7.5
-/obj/item/organ/internal/alien/plasmavessel/large/queen
+/obj/item/organ/alien/plasmavessel/large/queen
plasma_rate = 10
-/obj/item/organ/internal/alien/plasmavessel/small
+/obj/item/organ/alien/plasmavessel/small
name = "small plasma vessel"
icon_state = "plasma_small"
w_class = WEIGHT_CLASS_SMALL
@@ -42,14 +42,14 @@
max_plasma = 150
plasma_rate = 2.5
-/obj/item/organ/internal/alien/plasmavessel/small/tiny
+/obj/item/organ/alien/plasmavessel/small/tiny
name = "tiny plasma vessel"
icon_state = "plasma_tiny"
w_class = WEIGHT_CLASS_TINY
max_plasma = 100
actions_types = list(/datum/action/cooldown/alien/transfer)
-/obj/item/organ/internal/alien/plasmavessel/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/alien/plasmavessel/on_life(seconds_per_tick, times_fired)
var/delta_time = DELTA_WORLD_TIME(SSmobs)
//Instantly healing to max health in a single tick would be silly. If it takes 8 seconds to fire, then something's fucked.
var/delta_time_capped = min(delta_time, 8)
@@ -68,27 +68,27 @@
else
owner.adjustPlasma(0.1 * plasma_rate * delta_time)
-/obj/item/organ/internal/alien/plasmavessel/on_mob_insert(mob/living/carbon/organ_owner)
+/obj/item/organ/alien/plasmavessel/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
if(isalien(organ_owner))
var/mob/living/carbon/alien/target_alien = organ_owner
target_alien.updatePlasmaDisplay()
RegisterSignal(organ_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item))
-/obj/item/organ/internal/alien/plasmavessel/on_mob_remove(mob/living/carbon/organ_owner)
+/obj/item/organ/alien/plasmavessel/on_mob_remove(mob/living/carbon/organ_owner)
. = ..()
if(isalien(organ_owner))
var/mob/living/carbon/alien/organ_owner_alien = organ_owner
organ_owner_alien.updatePlasmaDisplay()
UnregisterSignal(organ_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS)
-/obj/item/organ/internal/alien/plasmavessel/proc/get_status_tab_item(mob/living/carbon/source, list/items)
+/obj/item/organ/alien/plasmavessel/proc/get_status_tab_item(mob/living/carbon/source, list/items)
SIGNAL_HANDLER
items += "Plasma Stored: [stored_plasma]/[max_plasma]"
#define QUEEN_DEATH_DEBUFF_DURATION 2400
-/obj/item/organ/internal/alien/hivenode
+/obj/item/organ/alien/hivenode
name = "hive node"
icon_state = "hivenode"
zone = BODY_ZONE_HEAD
@@ -99,17 +99,17 @@
/// Indicates if the queen died recently, aliens are heavily weakened while this is active.
var/recent_queen_death = FALSE
-/obj/item/organ/internal/alien/hivenode/on_mob_insert(mob/living/carbon/organ_owner)
+/obj/item/organ/alien/hivenode/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
organ_owner.faction |= ROLE_ALIEN
-/obj/item/organ/internal/alien/hivenode/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE)
+/obj/item/organ/alien/hivenode/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE)
if(organ_owner)
organ_owner.faction -= ROLE_ALIEN
return ..()
//When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her.
-/obj/item/organ/internal/alien/hivenode/proc/queen_death()
+/obj/item/organ/alien/hivenode/proc/queen_death()
if(!owner || owner.stat == DEAD)
return
if(isalien(owner)) //Different effects for aliens than humans
@@ -132,7 +132,7 @@
addtimer(CALLBACK(src, PROC_REF(clear_queen_death)), QUEEN_DEATH_DEBUFF_DURATION)
-/obj/item/organ/internal/alien/hivenode/proc/clear_queen_death()
+/obj/item/organ/alien/hivenode/proc/clear_queen_death()
if(QDELETED(src)) //In case the node is deleted
return
recent_queen_death = FALSE
@@ -143,7 +143,7 @@
#undef QUEEN_DEATH_DEBUFF_DURATION
-/obj/item/organ/internal/alien/resinspinner
+/obj/item/organ/alien/resinspinner
name = "resin spinner"
icon_state = "spinner-x"
zone = BODY_ZONE_PRECISE_MOUTH
@@ -151,7 +151,7 @@
actions_types = list(/datum/action/cooldown/alien/make_structure/resin)
-/obj/item/organ/internal/alien/acid
+/obj/item/organ/alien/acid
name = "acid gland"
icon_state = "acid"
zone = BODY_ZONE_PRECISE_MOUTH
@@ -159,7 +159,7 @@
actions_types = list(/datum/action/cooldown/alien/acid/corrosion)
-/obj/item/organ/internal/alien/neurotoxin
+/obj/item/organ/alien/neurotoxin
name = "neurotoxin gland"
icon_state = "neurotox"
zone = BODY_ZONE_PRECISE_MOUTH
@@ -167,7 +167,7 @@
actions_types = list(/datum/action/cooldown/alien/acid/neurotoxin)
-/obj/item/organ/internal/alien/eggsac
+/obj/item/organ/alien/eggsac
name = "egg sac"
icon_state = "eggsac"
zone = BODY_ZONE_PRECISE_GROIN
@@ -176,18 +176,18 @@
actions_types = list(/datum/action/cooldown/alien/make_structure/lay_egg)
/// The stomach that lets aliens eat people/things
-/obj/item/organ/internal/stomach/alien
+/obj/item/organ/stomach/alien
name = "alien stomach"
icon_state = "stomach-x"
w_class = WEIGHT_CLASS_BULKY
actions_types = list(/datum/action/cooldown/alien/regurgitate)
var/list/atom/movable/stomach_contents = list()
-/obj/item/organ/internal/stomach/alien/Destroy()
+/obj/item/organ/stomach/alien/Destroy()
QDEL_LIST(stomach_contents)
return ..()
-/obj/item/organ/internal/stomach/alien/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/stomach/alien/on_life(seconds_per_tick, times_fired)
. = ..()
if(!owner || SSmobs.times_fired % 3 != 0)
return
@@ -198,7 +198,7 @@
continue
thing.acid_act(75, 10)
-/obj/item/organ/internal/stomach/alien/proc/consume_thing(atom/movable/thing)
+/obj/item/organ/stomach/alien/proc/consume_thing(atom/movable/thing)
RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(content_moved))
RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(content_deleted))
if(isliving(thing))
@@ -206,30 +206,30 @@
stomach_contents += thing
thing.forceMove(owner || src) // We assert that if we have no owner, we will not be nullspaced
-/obj/item/organ/internal/stomach/alien/proc/content_died(atom/movable/source)
+/obj/item/organ/stomach/alien/proc/content_died(atom/movable/source)
SIGNAL_HANDLER
qdel(source)
-/obj/item/organ/internal/stomach/alien/proc/content_deleted(atom/movable/source)
+/obj/item/organ/stomach/alien/proc/content_deleted(atom/movable/source)
SIGNAL_HANDLER
stomach_contents -= source
-/obj/item/organ/internal/stomach/alien/proc/content_moved(atom/movable/source)
+/obj/item/organ/stomach/alien/proc/content_moved(atom/movable/source)
SIGNAL_HANDLER
if(source.loc == src || source.loc == owner) // not in us? out da list then
return
stomach_contents -= source
UnregisterSignal(source, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_DEATH, COMSIG_QDELETING))
-/obj/item/organ/internal/stomach/alien/mob_insert(mob/living/carbon/stomach_owner, special, movement_flags)
+/obj/item/organ/stomach/alien/mob_insert(mob/living/carbon/stomach_owner, special, movement_flags)
RegisterSignal(stomach_owner, COMSIG_ATOM_RELAYMOVE, PROC_REF(something_moved))
return ..()
-/obj/item/organ/internal/stomach/alien/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags)
+/obj/item/organ/stomach/alien/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags)
UnregisterSignal(stomach_owner, COMSIG_ATOM_RELAYMOVE)
return ..()
-/obj/item/organ/internal/stomach/alien/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
+/obj/item/organ/stomach/alien/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
if(loc == null && owner)
for(var/atom/movable/thing as anything in contents)
@@ -238,12 +238,12 @@
for(var/atom/movable/thing as anything in contents)
thing.forceMove(src)
-/obj/item/organ/internal/stomach/alien/proc/something_moved(mob/living/source, mob/living/user, direction)
+/obj/item/organ/stomach/alien/proc/something_moved(mob/living/source, mob/living/user, direction)
SIGNAL_HANDLER
relaymove(user, direction)
return COMSIG_BLOCK_RELAYMOVE
-/obj/item/organ/internal/stomach/alien/relaymove(mob/living/user, direction)
+/obj/item/organ/stomach/alien/relaymove(mob/living/user, direction)
if(!(user in src.stomach_contents))
return
if(!prob(40))
@@ -327,7 +327,7 @@
owner.gib(DROP_ALL_REMAINS)
qdel(src)
-/obj/item/organ/internal/stomach/alien/proc/eject_stomach(list/turf/targets, spit_range, content_speed, particle_delay, particle_count=4)
+/obj/item/organ/stomach/alien/proc/eject_stomach(list/turf/targets, spit_range, content_speed, particle_delay, particle_count=4)
var/atom/spit_as = owner || src
// Throw out the stuff in our stomach
for(var/atom/movable/thing as anything in stomach_contents)
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index f4b0fffb7a085..b6b2d2f9953b6 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -1,6 +1,6 @@
// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
-/obj/item/organ/internal/body_egg/alien_embryo
+/obj/item/organ/body_egg/alien_embryo
name = "alien embryo"
icon = 'icons/mob/nonhuman-player/alien.dmi'
icon_state = "larva0_dead"
@@ -12,11 +12,11 @@
/// How long does it take to advance one stage? Growth time * 5 = how long till we make a Larva!
var/growth_time = 60 SECONDS
-/obj/item/organ/internal/body_egg/alien_embryo/Initialize(mapload)
+/obj/item/organ/body_egg/alien_embryo/Initialize(mapload)
. = ..()
advance_embryo_stage()
-/obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder)
+/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder)
..()
if(stage < 5)
to_chat(finder, span_notice("It's small and weak, barely the size of a foetus."))
@@ -25,7 +25,7 @@
if(prob(10))
attempt_grow(gib_on_success = FALSE)
-/obj/item/organ/internal/body_egg/alien_embryo/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/body_egg/alien_embryo/on_life(seconds_per_tick, times_fired)
. = ..()
if(QDELETED(src) || QDELETED(owner))
return
@@ -58,7 +58,7 @@
owner.adjustToxLoss(5 * seconds_per_tick) // Why is this [TOX]?
/// Controls Xenomorph Embryo growth. If embryo is fully grown (or overgrown), stop the proc. If not, increase the stage by one and if it's not fully grown (stage 6), add a timer to do this proc again after however long the growth time variable is.
-/obj/item/organ/internal/body_egg/alien_embryo/proc/advance_embryo_stage()
+/obj/item/organ/body_egg/alien_embryo/proc/advance_embryo_stage()
if(stage >= 6)
return
stage++
@@ -73,7 +73,7 @@
addtimer(CALLBACK(src, PROC_REF(advance_embryo_stage)), growth_time*slowdown)
-/obj/item/organ/internal/body_egg/alien_embryo/egg_process()
+/obj/item/organ/body_egg/alien_embryo/egg_process()
if(stage == 6 && prob(50))
for(var/datum/surgery/operations as anything in owner.surgeries)
if(operations.location != BODY_ZONE_CHEST)
@@ -85,7 +85,7 @@
attempt_grow()
/// Attempt to burst an alien outside of the host, getting a ghost to play as the xeno.
-/obj/item/organ/internal/body_egg/alien_embryo/proc/attempt_grow(gib_on_success = TRUE)
+/obj/item/organ/body_egg/alien_embryo/proc/attempt_grow(gib_on_success = TRUE)
if(QDELETED(owner) || bursting)
return
@@ -104,7 +104,7 @@
on_poll_concluded(gib_on_success, chosen_one)
/// Poll has concluded with a suitor
-/obj/item/organ/internal/body_egg/alien_embryo/proc/on_poll_concluded(gib_on_success, mob/dead/observer/ghost)
+/obj/item/organ/body_egg/alien_embryo/proc/on_poll_concluded(gib_on_success, mob/dead/observer/ghost)
if(QDELETED(owner))
return
@@ -150,7 +150,7 @@
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
----------------------------------------*/
-/obj/item/organ/internal/body_egg/alien_embryo/AddInfectionImages()
+/obj/item/organ/body_egg/alien_embryo/AddInfectionImages()
for(var/mob/living/carbon/alien/alien in GLOB.player_list)
var/I = image('icons/mob/nonhuman-player/alien.dmi', loc = owner, icon_state = "infected[stage]")
alien.client?.images += I
@@ -159,7 +159,7 @@ Des: Adds the infection image to all aliens for this embryo
Proc: RemoveInfectionImage(C)
Des: Removes all images from the mob infected by this embryo
----------------------------------------*/
-/obj/item/organ/internal/body_egg/alien_embryo/RemoveInfectionImages()
+/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages()
for(var/mob/living/carbon/alien/alien in GLOB.player_list)
for(var/image/I in alien.client?.images)
var/searchfor = "infected"
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 597769f11f271..532fa10727ecd 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -213,8 +213,8 @@
worn_icon_state = "[base_icon_state]_impregnated"
var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST)
- if((!LC || IS_ORGANIC_LIMB(LC)) && !target.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo))
- new /obj/item/organ/internal/body_egg/alien_embryo(target)
+ if((!LC || IS_ORGANIC_LIMB(LC)) && !target.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo))
+ new /obj/item/organ/body_egg/alien_embryo(target)
target.log_message("was impregnated by a facehugger", LOG_GAME)
target.log_message("was impregnated by a facehugger", LOG_VICTIM, log_globally = FALSE)
if(target.stat != DEAD && istype(target.buckled, /obj/structure/bed/nest)) //Handles toggling the nest sustenance status effect if the user was already buckled to a nest.
@@ -257,7 +257,7 @@
AddComponent(/datum/component/knockoff, knockoff_chance = 40, target_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST), slots_knockoffable = slot_flags)
/obj/item/clothing/mask/facehugger/allow_attack_hand_drop(mob/living/carbon/human/user)
- if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo))
+ if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo))
return ..()
if(istype(user) && ishuman(loc) && stat != DEAD)
if(user == loc && user.get_item_by_slot(slot_flags) == src)
@@ -269,7 +269,7 @@
var/mob/living/carbon/human/wearer = loc
if(!istype(wearer) || user != wearer)
return
- if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo))
+ if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo))
return ..()
if(wearer.get_item_by_slot(slot_flags) == src && stat != DEAD)
to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!"))
@@ -281,7 +281,7 @@
return FALSE
if(M.stat == DEAD)
return FALSE
- if(M.get_organ_by_type(/obj/item/organ/internal/alien/hivenode))
+ if(M.get_organ_by_type(/obj/item/organ/alien/hivenode))
return FALSE
var/mob/living/carbon/C = M
if(ishuman(C) && !(C.dna.species.no_equip_flags & ITEM_SLOT_MASK))
@@ -316,6 +316,7 @@
sterile = TRUE
tint = 3 //Makes it feel more authentic when it latches on
slowdown = 0
+ integrity_failure = 0
/obj/item/clothing/mask/facehugger/toy/Die()
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cbfcd5d5a5c6d..af5dded4a1028 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -202,7 +202,7 @@
log_message("has thrown [thrown_thing] [power_throw_text]", LOG_ATTACK)
var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
extra_throw_range += potential_spine.added_throw_range
@@ -244,7 +244,7 @@
/mob/living/carbon/on_fall()
. = ..()
- loc.handle_fall(src)//it's loc so it doesn't call the mob's handle_fall which does nothing
+ loc?.handle_fall(src)//it's loc so it doesn't call the mob's handle_fall which does nothing
/mob/living/carbon/resist_buckle()
if(!HAS_TRAIT(src, TRAIT_RESTRAINED))
@@ -596,7 +596,7 @@
lighting_cutoff = initial(lighting_cutoff)
lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue)
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
set_invis_see(eyes.see_invisible)
new_sight |= eyes.sight_flags
@@ -652,7 +652,7 @@
for(var/obj/item/clothing/worn_item in get_equipped_items())
tint += worn_item.tint
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
tint += eyes.tint
@@ -953,7 +953,7 @@
return ..()
/mob/living/carbon/can_be_revived()
- if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK))
+ if(!get_organ_by_type(/obj/item/organ/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK))
return FALSE
return ..()
@@ -972,7 +972,7 @@
// Only check for a heart if they actually need a heart. Who would've thunk
if (needs_heart())
- var/obj/item/organ/internal/heart = get_organ_by_type(/obj/item/organ/internal/heart)
+ var/obj/item/organ/heart = get_organ_by_type(/obj/item/organ/heart)
if (!heart)
return DEFIB_FAIL_NO_HEART
@@ -980,7 +980,7 @@
if (heart.organ_flags & ORGAN_FAILING)
return DEFIB_FAIL_FAILING_HEART
- var/obj/item/organ/internal/brain/current_brain = get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/current_brain = get_organ_by_type(/obj/item/organ/brain)
if (QDELETED(current_brain))
return DEFIB_FAIL_NO_BRAIN
@@ -1091,7 +1091,7 @@
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bodypart, update = TRUE, multiplicative_slowdown = final_modification)
/mob/living/carbon/proc/create_internal_organs()
- for(var/obj/item/organ/internal/internal_organ in organs)
+ for(var/obj/item/organ/internal_organ in organs)
internal_organ.Insert(src)
/proc/cmp_organ_slot_asc(slot_a, slot_b)
@@ -1344,7 +1344,7 @@
/mob/living/carbon/proc/adjust_skillchip_complexity_modifier(delta)
skillchip_complexity_modifier += delta
- var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(!brain)
return
@@ -1459,7 +1459,7 @@
/// Accepts an optional timeout after which we remove the tail wagging
/// Returns true if successful, false otherwise
/mob/living/carbon/proc/wag_tail(timeout = INFINITY)
- var/obj/item/organ/external/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(!wagged)
return FALSE
return wagged.start_wag(src, timeout)
@@ -1467,7 +1467,7 @@
/// Helper to cleanly stop all tail wagging
/// Returns true if successful, false otherwise
/mob/living/carbon/proc/unwag_tail() // can't unwag a tail
- var/obj/item/organ/external/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(!unwagged)
return FALSE
return unwagged.stop_wag(src)
diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm
index 59d3a6db71a47..b376ea3e113fe 100644
--- a/code/modules/mob/living/carbon/carbon_context.dm
+++ b/code/modules/mob/living/carbon/carbon_context.dm
@@ -25,7 +25,7 @@
if (body_position == STANDING_UP)
if(check_zone(user.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD))
context[SCREENTIP_CONTEXT_LMB] = "Headpat"
- else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(get_organ_by_type(/obj/item/organ/external/tail)))
+ else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(get_organ_by_type(/obj/item/organ/tail)))
context[SCREENTIP_CONTEXT_LMB] = "Pull tail"
else
context[SCREENTIP_CONTEXT_LMB] = "Hug"
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index f8552fdfa243f..fd76fa07ddd59 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -4,7 +4,7 @@
. = ..()
if(is_blind() && !is_blind_from(list(UNCONSCIOUS_TRAIT, HYPNOCHAIR_TRAIT)))
return INFINITY //For all my homies that can not see in the world
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
. += eyes.flash_protect
else
@@ -20,7 +20,7 @@
. = ..()
if(HAS_TRAIT(src, TRAIT_DEAF))
return INFINITY //For all my homies that can not hear in the world
- var/obj/item/organ/internal/ears/E = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/E = get_organ_slot(ORGAN_SLOT_EARS)
if(!E)
return INFINITY
else
@@ -45,7 +45,7 @@
return null
/mob/living/carbon/is_pepper_proof(check_flags = ALL)
- var/obj/item/organ/internal/eyes/eyes = get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes = get_organ_by_type(/obj/item/organ/eyes)
if(eyes && eyes.pepperspray_protect)
return eyes
if((check_flags & ITEM_SLOT_HEAD) && head && (head.flags_cover & PEPPERPROOF))
@@ -312,7 +312,7 @@
if(HAS_TRAIT(src, TRAIT_BADTOUCH))
to_chat(helper, span_warning("[src] looks visibly upset as you pat [p_them()] on the head."))
- else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.get_organ_by_type(/obj/item/organ/external/tail)))
+ else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.get_organ_by_type(/obj/item/organ/tail)))
helper.visible_message(span_notice("[helper] pulls on [src]'s tail!"), \
null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src))
to_chat(helper, span_notice("You pull on [src]'s tail!"))
@@ -427,7 +427,7 @@
/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25)
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes) //can't flash what can't see!
return
@@ -478,7 +478,7 @@
SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist)
intensity = reflist[1]
var/ear_safety = get_ear_protection()
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
var/effect_amount = intensity - ear_safety
if(effect_amount > 0)
if(stun_pwr)
@@ -520,7 +520,7 @@
/mob/living/carbon/can_hear()
. = FALSE
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
if(ears && !HAS_TRAIT(src, TRAIT_DEAF))
. = TRUE
if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))
@@ -695,7 +695,7 @@
body_parts -= part
GLOB.bioscrambler_valid_parts = body_parts
- var/list/organs = subtypesof(/obj/item/organ/internal) + subtypesof(/obj/item/organ/external)
+ var/list/organs = subtypesof(/obj/item/organ) + subtypesof(/obj/item/organ)
for(var/obj/item/organ/organ_type as anything in organs)
if(!is_type_in_typecache(organ_type, GLOB.bioscrambler_organs_blacklist) && !(initial(organ_type.organ_flags) & ORGAN_ROBOTIC))
continue
diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm
index 3e4c29fa0e837..e1dc3d279921f 100644
--- a/code/modules/mob/living/carbon/carbon_say.dm
+++ b/code/modules/mob/living/carbon/carbon_say.dm
@@ -7,7 +7,7 @@
return ..()
/mob/living/carbon/could_speak_language(datum/language/language_path)
- var/obj/item/organ/internal/tongue/spoken_with = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/spoken_with = get_organ_slot(ORGAN_SLOT_TONGUE)
if(spoken_with)
// the tower of babel needs to bypass the tongue language restrictions without giving omnitongue
return HAS_MIND_TRAIT(src, TRAIT_TOWER_OF_BABEL) || spoken_with.could_speak_language(language_path)
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index abf7cdaabdd99..bb34100877375 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -34,7 +34,7 @@
var/atom/Tsec = drop_location()
for(var/obj/item/organ/organ as anything in organs)
- if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/internal/brain))
+ if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/brain))
if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST)) // chests can't drop
continue // the head will drop, so the brain should stay inside
@@ -43,7 +43,7 @@
organ.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1,3), 5)
continue
- if((drop_bitflags & DROP_ORGANS) && !istype(organ, /obj/item/organ/internal/brain))
+ if((drop_bitflags & DROP_ORGANS) && !istype(organ, /obj/item/organ/brain))
if((drop_bitflags & DROP_BODYPARTS) && (check_zone(organ.zone) != BODY_ZONE_CHEST))
continue // only chest & groin organs will be ejected
@@ -65,7 +65,7 @@
/mob/living/carbon/set_suicide(suicide_state) //you thought that box trick was pretty clever, didn't you? well now hardmode is on, boyo.
. = ..()
- var/obj/item/organ/internal/brain/userbrain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/userbrain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(userbrain)
userbrain.suicided = suicide_state
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index a1a032d84a66f..fcf1fae0a5326 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -51,7 +51,7 @@
if (length(status_examines))
. += status_examines
- if(get_bodypart(BODY_ZONE_HEAD) && !get_organ_by_type(/obj/item/organ/internal/brain))
+ if(get_bodypart(BODY_ZONE_HEAD) && !get_organ_by_type(/obj/item/organ/brain))
. += span_deadsay("It appears that [t_his] brain is missing...")
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
@@ -239,9 +239,12 @@
if(CONSCIOUS)
if(HAS_TRAIT(src, TRAIT_DUMB))
. += "[t_He] [t_has] a stupid expression on [t_his] face."
- if(get_organ_by_type(/obj/item/organ/internal/brain) && isnull(ai_controller))
+ var/obj/item/organ/brain/brain = get_organ_by_type(/obj/item/organ/brain)
+ if(brain && isnull(ai_controller))
var/npc_message = ""
- if(!key)
+ if(HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE))
+ npc_message = "Soul is pending..."
+ else if(!key)
npc_message = "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely."
else if(!client)
npc_message ="[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon."
@@ -317,10 +320,15 @@
var/t_his = p_their()
var/t_is = p_are()
//This checks to see if the body is revivable
- if(get_organ_by_type(/obj/item/organ/internal/brain) && (client || HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) || (ghost?.can_reenter_corpse && ghost?.client)))
+ var/obj/item/organ/brain = get_organ_by_type(/obj/item/organ/brain)
+ if(brain && HAS_TRAIT(brain, TRAIT_GHOSTROLE_ON_REVIVE))
+ return span_deadsay("[t_He] [t_is] limp and unresponsive; but [t_his] soul might yet come back...")
+ var/client_like = client || HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE)
+ var/valid_ghost = ghost?.can_reenter_corpse && ghost?.client
+ var/valid_soul = brain || !HAS_TRAIT(src, TRAIT_FAKE_SOULLESS)
+ if((brain && client_like) || (valid_ghost && valid_soul))
return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life...")
- else
- return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...")
+ return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...")
/// Returns a list of "damtype" => damage description based off of which bodypart description is most common
/mob/living/carbon/proc/get_majority_bodypart_damage_desc()
@@ -511,7 +519,7 @@
. = list()
var/list/cybers = list()
- for(var/obj/item/organ/internal/cyberimp/cyberimp in organs)
+ for(var/obj/item/organ/cyberimp/cyberimp in organs)
if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN))
cybers += cyberimp.examine_title(user)
if(length(cybers))
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index 2a97e9c7746b0..8aeda13ee3cf3 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -1,3 +1,4 @@
+/// List of roundstart races' their species_id's
GLOBAL_LIST_EMPTY(roundstart_races)
///List of all roundstart languages by path except common
GLOBAL_LIST_EMPTY(uncommon_roundstart_languages)
@@ -72,23 +73,23 @@ GLOBAL_LIST_EMPTY(features_by_species)
///Internal organs that are unique to this race, like a tail or other cosmetic organs. list(typepath of organ 1, typepath of organ 2 = "Round").
var/list/mutant_organs = list()
///Replaces default brain with a different organ
- var/obj/item/organ/internal/brain/mutantbrain = /obj/item/organ/internal/brain
+ var/obj/item/organ/brain/mutantbrain = /obj/item/organ/brain
///Replaces default heart with a different organ
- var/obj/item/organ/internal/heart/mutantheart = /obj/item/organ/internal/heart
+ var/obj/item/organ/heart/mutantheart = /obj/item/organ/heart
///Replaces default lungs with a different organ
- var/obj/item/organ/internal/lungs/mutantlungs = /obj/item/organ/internal/lungs
+ var/obj/item/organ/lungs/mutantlungs = /obj/item/organ/lungs
///Replaces default eyes with a different organ
- var/obj/item/organ/internal/eyes/mutanteyes = /obj/item/organ/internal/eyes
+ var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
///Replaces default ears with a different organ
- var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears
+ var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
///Replaces default tongue with a different organ
- var/obj/item/organ/internal/tongue/mutanttongue = /obj/item/organ/internal/tongue
+ var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue
///Replaces default liver with a different organ
- var/obj/item/organ/internal/liver/mutantliver = /obj/item/organ/internal/liver
+ var/obj/item/organ/liver/mutantliver = /obj/item/organ/liver
///Replaces default stomach with a different organ
- var/obj/item/organ/internal/stomach/mutantstomach = /obj/item/organ/internal/stomach
+ var/obj/item/organ/stomach/mutantstomach = /obj/item/organ/stomach
///Replaces default appendix with a different organ.
- var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix
+ var/obj/item/organ/appendix/mutantappendix = /obj/item/organ/appendix
/// Store body marking defines. See mobs.dm for bitflags
var/list/body_markings = list()
@@ -192,7 +193,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
return ..()
-/// Gets a list of all species available to choose in roundstart.
+/// Gets a list of all species id's available to choose in roundstart.
/proc/get_selectable_species()
RETURN_TYPE(/list)
@@ -322,7 +323,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(remove_existing)
health_pct = (existing_organ.maxHealth - existing_organ.damage) / existing_organ.maxHealth
if(slot == ORGAN_SLOT_BRAIN)
- var/obj/item/organ/internal/brain/existing_brain = existing_organ
+ var/obj/item/organ/brain/existing_brain = existing_organ
existing_brain.before_organ_replacement(new_organ)
existing_brain.Remove(organ_holder, special = TRUE, movement_flags = NO_ID_TRANSFER)
else
@@ -488,7 +489,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD)
if(noggin?.head_flags & HEAD_EYESPRITES)
// eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now)
- var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES)
if(eye_organ)
eye_organ.refresh(call_update = FALSE)
standing += eye_organ.generate_body_overlay(species_human)
@@ -654,7 +655,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(ITEM_SLOT_EYES)
if(!H.get_bodypart(BODY_ZONE_HEAD))
return FALSE
- var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes?.no_glasses)
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
@@ -841,7 +842,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
to_chat(user, span_warning("You don't want to harm [target]!"))
return FALSE
- var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
var/obj/item/bodypart/attacking_bodypart
if(brain)
attacking_bodypart = brain.get_attacking_limb(target)
@@ -1366,7 +1367,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
if((H.movement_type & FLYING) && !H.buckled)
- var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(wings)
wings.toggle_flight(H)
wings.fly_slip(H)
@@ -1535,7 +1536,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
return null
var/static/list/food_flags = FOOD_FLAGS
- var/obj/item/organ/internal/tongue/fake_tongue = mutanttongue
+ var/obj/item/organ/tongue/fake_tongue = mutanttongue
return list(
"liked_food" = bitfield_to_list(initial(fake_tongue.liked_foodtypes), food_flags),
@@ -1858,7 +1859,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/list/to_add = list()
var/alcohol_tolerance = initial(mutantliver.alcohol_tolerance)
- var/obj/item/organ/internal/liver/base_liver = /obj/item/organ/internal/liver
+ var/obj/item/organ/liver/base_liver = /obj/item/organ/liver
var/tolerance_difference = alcohol_tolerance - initial(base_liver.alcohol_tolerance)
if (tolerance_difference != 0)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index dd97c12bd844f..9f7f156c98f00 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
if(stat == DEAD)
return
stop_sound_channel(CHANNEL_HEARTBEAT)
- var/obj/item/organ/internal/heart/human_heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/human_heart = get_organ_slot(ORGAN_SLOT_HEART)
human_heart?.beat = BEAT_NONE
human_heart?.Stop()
@@ -49,7 +49,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
readout += "
[round(reagent.volume, 0.001)] units of [reagent.name]"
readout += "
Stomach:"
- var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
for(var/datum/reagent/bile in belly?.reagents?.reagent_list)
if(!belly.food_reagents[bile.type])
readout += "
[round(bile.volume, 0.001)] units of [bile.name]"
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 3d03d4ffc6689..cae75ae990c55 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -119,7 +119,7 @@
/datum/emote/living/carbon/human/wag/run_emote(mob/user, params, type_override, intentional)
. = ..()
- var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
//I am so sorry my son
//We bypass helpers here cause we already have the tail
if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote()
@@ -129,14 +129,14 @@
/datum/emote/living/carbon/human/wag/select_message_type(mob/user, intentional)
. = ..()
- var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(oranges_accessory.wag_flags & WAG_WAGGING)
. = "stops wagging " + message
else
. = "wags " + message
/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check, intentional, params)
- var/obj/item/organ/external/tail/tail = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/tail = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(tail?.wag_flags & WAG_ABLE)
return ..()
return FALSE
@@ -148,7 +148,7 @@
/datum/emote/living/carbon/human/wing/run_emote(mob/user, params, type_override, intentional)
. = ..()
- var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(isnull(wings))
CRASH("[type] ran on a mob that has no wings!")
if(wings.wings_open)
@@ -157,12 +157,12 @@
wings.open_wings()
/datum/emote/living/carbon/human/wing/select_message_type(mob/user, intentional)
- var/obj/item/organ/external/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/functional/wings = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
var/emote_verb = wings.wings_open ? "closes" : "opens"
return "[emote_verb] [message]"
/datum/emote/living/carbon/human/wing/can_run_emote(mob/user, status_check = TRUE, intentional, params)
- if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/external/wings/functional))
+ if(!istype(user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/wings/functional))
return FALSE
return ..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 462b9b8e33124..ba3ecbf83cfe1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -527,7 +527,7 @@
to_chat(src, span_warning("you can't breathe!"))
return FALSE
- var/obj/item/organ/internal/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
if(isnull(human_lungs))
balloon_alert(src, "you don't have lungs!")
return FALSE
@@ -882,7 +882,7 @@
if(result != "Yes")
return
- var/obj/item/organ/internal/brain/target_brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(isnull(target_brain))
to_chat(usr, "This mob has no brain to insert into an MMI.")
@@ -943,7 +943,7 @@
// can remove up to 2 seconds at legendary
carrydelay -= fitness_level * (1/3) SECONDS
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
carrydelay *= potential_spine.athletics_boost_multiplier
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 68e6640bdeb10..caec7392a4601 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -285,7 +285,7 @@
//200 max knockdown for EXPLODE_HEAVY
//160 max knockdown for EXPLODE_LIGHT
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
switch (severity)
if (EXPLODE_DEVASTATE)
if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD
@@ -394,7 +394,7 @@
//Note we both check that the user is in cardiac arrest and can actually heartattack
//If they can't, they're missing their heart and this would runtime
if(undergoing_cardiac_arrest() && can_heartattack() && (shock_damage * siemens_coeff >= 1) && prob(25))
- var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
if(heart.Restart() && stat == CONSCIOUS)
to_chat(src, span_notice("You feel your heart beating again!"))
if (!(flags & SHOCK_NO_HUMAN_ANIM))
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 07325c97137d1..a9875773fe84b 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -137,7 +137,7 @@
. += "[dna.species.type]"
/mob/living/carbon/human/proc/get_eye_scars()
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if (!isnull(eyes))
return eyes.scarring
diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm
index 8edeeb8088403..2908ae52364a3 100644
--- a/code/modules/mob/living/carbon/human/human_say.dm
+++ b/code/modules/mob/living/carbon/human/human_say.dm
@@ -22,7 +22,7 @@
return ..()
/mob/living/carbon/human/get_default_say_verb()
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
if(isnull(tongue))
if(HAS_TRAIT(src, TRAIT_SIGN_LANG))
return "signs"
diff --git a/code/modules/mob/living/carbon/human/human_suicide.dm b/code/modules/mob/living/carbon/human/human_suicide.dm
index 318cba1587d4a..e6b4bbac8e073 100644
--- a/code/modules/mob/living/carbon/human/human_suicide.dm
+++ b/code/modules/mob/living/carbon/human/human_suicide.dm
@@ -22,7 +22,7 @@
if(combat_mode)
send_applicable_messages(HUMAN_COMBAT_MODE_SUICIDE_MESSAGE)
else
- var/obj/item/organ/internal/brain/userbrain = get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/userbrain = get_organ_by_type(/obj/item/organ/brain)
if(userbrain?.damage >= 75)
send_applicable_messages(HUMAN_BRAIN_DAMAGE_SUICIDE_MESSAGE)
else
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 6bdbf8322f26e..6befcb5c9fe69 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -52,15 +52,21 @@
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
- var/chest_covered = FALSE
- var/head_covered = FALSE
+ var/chest_covered = !get_bodypart(BODY_ZONE_CHEST)
+ var/head_covered = !get_bodypart(BODY_ZONE_HEAD)
+ var/hands_covered = !get_bodypart(BODY_ZONE_L_ARM) && !get_bodypart(BODY_ZONE_R_ARM)
+ var/feet_covered = !get_bodypart(BODY_ZONE_L_LEG) && !get_bodypart(BODY_ZONE_R_LEG)
for(var/obj/item/clothing/equipped in get_equipped_items())
- if((equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
+ if(!chest_covered && (equipped.body_parts_covered & CHEST) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
chest_covered = TRUE
- if((equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
+ if(!head_covered && (equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
head_covered = TRUE
+ if(!hands_covered && (equipped.body_parts_covered & HANDS|ARMS) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
+ hands_covered = TRUE
+ if(!feet_covered && (equipped.body_parts_covered & FEET|LEGS) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE))
+ feet_covered = TRUE
- if(chest_covered && head_covered)
+ if(chest_covered && head_covered && hands_covered && feet_covered)
return ONE_ATMOSPHERE
if(ismovable(loc))
/// If we're in a space with 0.5 content pressure protection, it averages the values, for example.
@@ -73,7 +79,7 @@
return ..()
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
- var/obj/item/organ/internal/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/human_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
if(human_lungs)
return human_lungs.check_breath(breath, src)
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 04df6a7058884..db332b0efde8c 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -12,11 +12,11 @@
TRAIT_NO_UNDERWEAR,
TRAIT_VIRUSIMMUNE,
)
- mutanttongue = /obj/item/organ/internal/tongue/abductor
+ mutanttongue = /obj/item/organ/tongue/abductor
mutantstomach = null
mutantheart = null
mutantlungs = null
- mutantbrain = /obj/item/organ/internal/brain/abductor
+ mutantbrain = /obj/item/organ/brain/abductor
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
bodypart_overrides = list(
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 86f745bb8be61..2974155515d13 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -26,15 +26,15 @@
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
meat = null
- mutantbrain = /obj/item/organ/internal/brain/cybernetic
- mutanttongue = /obj/item/organ/internal/tongue/robot
+ mutantbrain = /obj/item/organ/brain/cybernetic
+ mutanttongue = /obj/item/organ/tongue/robot
mutantstomach = null
mutantappendix = null
mutantheart = null
mutantliver = null
mutantlungs = null
- mutanteyes = /obj/item/organ/internal/eyes/robotic
- mutantears = /obj/item/organ/internal/ears/cybernetic
+ mutanteyes = /obj/item/organ/eyes/robotic
+ mutantears = /obj/item/organ/ears/cybernetic
species_language_holder = /datum/language_holder/synthetic
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index d4dea2abfcc6a..1dcc922b13f48 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -19,10 +19,10 @@
BODY_ZONE_CHEST = /obj/item/bodypart/chest,
)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
- mutantbrain = /obj/item/organ/internal/brain/dullahan
- mutanteyes = /obj/item/organ/internal/eyes/dullahan
- mutanttongue = /obj/item/organ/internal/tongue/dullahan
- mutantears = /obj/item/organ/internal/ears/dullahan
+ mutantbrain = /obj/item/organ/brain/dullahan
+ mutanteyes = /obj/item/organ/eyes/dullahan
+ mutanttongue = /obj/item/organ/tongue/dullahan
+ mutantears = /obj/item/organ/ears/dullahan
mutantstomach = null
mutantlungs = null
skinned_type = /obj/item/stack/sheet/animalhide/human
@@ -51,7 +51,7 @@
human.put_in_hands(head)
// We want to give the head some boring old eyes just so it doesn't look too jank on the head sprite.
- var/obj/item/organ/internal/eyes/eyes = new /obj/item/organ/internal/eyes(head)
+ var/obj/item/organ/eyes/eyes = new /obj/item/organ/eyes(head)
eyes.eye_color_left = human.eye_color_left
eyes.eye_color_right = human.eye_color_right
eyes.bodypart_insert(my_head)
@@ -95,7 +95,7 @@
human.reset_perspective(human)
/datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/human)
- var/obj/item/organ/internal/eyes/eyes = human.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = human.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
human.update_tint()
if(eyes.tint)
@@ -106,7 +106,7 @@
prevent_perspective_change = TRUE
/datum/species/dullahan/on_owner_login(mob/living/carbon/human/owner)
- var/obj/item/organ/internal/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = owner.get_organ_slot(ORGAN_SLOT_EYES)
if(owner_first_client_connection_handled)
if(!eyes.tint)
owner.reset_perspective(my_head, TRUE)
@@ -164,15 +164,15 @@
return to_add
-/obj/item/organ/internal/brain/dullahan
+/obj/item/organ/brain/dullahan
decoy_override = TRUE
organ_flags = ORGAN_ORGANIC //not vital
-/obj/item/organ/internal/tongue/dullahan
+/obj/item/organ/tongue/dullahan
zone = "abstract"
modifies_speech = TRUE
-/obj/item/organ/internal/tongue/dullahan/handle_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args)
if(ishuman(owner))
var/mob/living/carbon/human/human = owner
if(isdullahan(human))
@@ -182,10 +182,10 @@
head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], message_range = speech_args[SPEECH_RANGE])
speech_args[SPEECH_MESSAGE] = ""
-/obj/item/organ/internal/ears/dullahan
+/obj/item/organ/ears/dullahan
zone = "abstract"
-/obj/item/organ/internal/eyes/dullahan
+/obj/item/organ/eyes/dullahan
name = "head vision"
desc = "An abstraction."
actions_types = list(/datum/action/item_action/organ_action/dullahan)
@@ -198,7 +198,7 @@
/datum/action/item_action/organ_action/dullahan/Trigger(trigger_flags)
. = ..()
- var/obj/item/organ/internal/eyes/dullahan/dullahan_eyes = target
+ var/obj/item/organ/eyes/dullahan/dullahan_eyes = target
dullahan_eyes.tint = dullahan_eyes.tint ? NONE : INFINITY
if(ishuman(owner))
@@ -247,7 +247,7 @@
return // It's so over
detached_head.real_name = wearer.real_name
detached_head.name = wearer.real_name
- var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in detached_head
+ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in detached_head
brain.name = "[wearer.name]'s brain"
/obj/item/dullahan_relay/proc/examinate_check(mob/user, atom/source)
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index a7e88cf7b526c..1f1d7d3af478d 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -2,10 +2,10 @@
name = "\improper Ethereal"
id = SPECIES_ETHEREAL
meat = /obj/item/food/meat/slab/human/mutant/ethereal
- mutantlungs = /obj/item/organ/internal/lungs/ethereal
- mutantstomach = /obj/item/organ/internal/stomach/ethereal
- mutanttongue = /obj/item/organ/internal/tongue/ethereal
- mutantheart = /obj/item/organ/internal/heart/ethereal
+ mutantlungs = /obj/item/organ/lungs/ethereal
+ mutantstomach = /obj/item/organ/stomach/ethereal
+ mutanttongue = /obj/item/organ/tongue/ethereal
+ mutantheart = /obj/item/organ/heart/ethereal
exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer
exotic_bloodtype = "LE"
siemens_coeff = 0.5 //They thrive on energy
@@ -60,7 +60,7 @@
ethereal_light = new_ethereal.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species)
refresh_light_color(new_ethereal)
- var/obj/item/organ/internal/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/ethereal/ethereal_heart = new_ethereal.get_organ_slot(ORGAN_SLOT_HEART)
ethereal_heart.ethereal_color = default_color
for(var/obj/item/bodypart/limb as anything in new_ethereal.bodyparts)
@@ -241,8 +241,8 @@
name = "Lustrous"
id = SPECIES_ETHEREAL_LUSTROUS
examine_limb_id = SPECIES_ETHEREAL
- mutantbrain = /obj/item/organ/internal/brain/lustrous
- changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN
+ mutantbrain = /obj/item/organ/brain/lustrous
+ changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_FIXED_MUTANT_COLORS,
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 11fecb60bfcc4..0f151f5f8f5fd 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -3,11 +3,11 @@
name = "Felinid"
id = SPECIES_FELINE
examine_limb_id = SPECIES_HUMAN
- mutantbrain = /obj/item/organ/internal/brain/felinid
- mutanttongue = /obj/item/organ/internal/tongue/cat
- mutantears = /obj/item/organ/internal/ears/cat
+ mutantbrain = /obj/item/organ/brain/felinid
+ mutanttongue = /obj/item/organ/tongue/cat
+ mutantears = /obj/item/organ/ears/cat
mutant_organs = list(
- /obj/item/organ/external/tail/cat = "Cat",
+ /obj/item/organ/tail/cat = "Cat",
)
inherent_traits = list(
TRAIT_CATLIKE_GRACE,
@@ -41,9 +41,9 @@
if(target_human.dna.features["ears"] == "None")
target_human.dna.features["ears"] = "Cat"
if(target_human.dna.features["ears"] == "None")
- mutantears = /obj/item/organ/internal/ears
+ mutantears = /obj/item/organ/ears
else
- var/obj/item/organ/internal/ears/cat/ears = new(FALSE, target_human.dna.features["ears"])
+ var/obj/item/organ/ears/cat/ears = new(FALSE, target_human.dna.features["ears"])
ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED)
return ..()
@@ -101,8 +101,8 @@
/datum/species/human/felinid/get_sigh_sound(mob/living/carbon/human/felinid)
if(felinid.physique == FEMALE)
- return 'sound/mobs/humanoids/human/sigh/female_sigh.ogg'
- return 'sound/mobs/humanoids/human/sigh/male_sigh.ogg'
+ return SFX_FEMALE_SIGH
+ return SFX_MALE_SIGH
/datum/species/human/felinid/get_sniff_sound(mob/living/carbon/human/felinid)
if(felinid.physique == FEMALE)
@@ -128,7 +128,7 @@
/proc/purrbation_toggle(mob/living/carbon/human/target_human, silent = FALSE)
if(!ishuman(target_human))
return
- if(!istype(target_human.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/internal/ears/cat))
+ if(!istype(target_human.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat))
purrbation_apply(target_human, silent = silent)
. = TRUE
else
@@ -144,7 +144,7 @@
cat_species.original_felinid = FALSE
else
// This removes the spines if they exist
- var/obj/item/organ/external/spines/current_spines = soon_to_be_felinid.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES)
+ var/obj/item/organ/spines/current_spines = soon_to_be_felinid.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES)
if(current_spines)
current_spines.Remove(soon_to_be_felinid, special = TRUE)
qdel(current_spines)
@@ -153,10 +153,10 @@
// Humans get converted directly to felinids, and the key is handled in on_species_gain.
// Now when we get mob.dna.features[feature_key], it returns None, which is why the tail is invisible.
// stored_feature_id is only set once (the first time an organ is inserted), so this should be safe.
- var/obj/item/organ/internal/ears/cat/kitty_ears = new
+ var/obj/item/organ/ears/cat/kitty_ears = new
kitty_ears.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED)
- if(should_visual_organ_apply_to(/obj/item/organ/external/tail/cat, soon_to_be_felinid)) //only give them a tail if they actually have sprites for it / are a compatible subspecies.
- var/obj/item/organ/external/tail/cat/kitty_tail = new
+ if(should_visual_organ_apply_to(/obj/item/organ/tail/cat, soon_to_be_felinid)) //only give them a tail if they actually have sprites for it / are a compatible subspecies.
+ var/obj/item/organ/tail/cat/kitty_tail = new
kitty_tail.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED)
if(!silent)
@@ -173,24 +173,24 @@
var/datum/species/target_species = purrbated_human.dna.species
// From the previous check we know they're not a felinid, therefore removing cat ears and tail is safe
- var/obj/item/organ/external/tail/old_tail = purrbated_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
- if(istype(old_tail, /obj/item/organ/external/tail/cat))
+ var/obj/item/organ/tail/old_tail = purrbated_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ if(istype(old_tail, /obj/item/organ/tail/cat))
old_tail.Remove(purrbated_human, special = TRUE)
qdel(old_tail)
// Locate does not work on assoc lists, so we do it by hand
for(var/external_organ in target_species.mutant_organs)
if(!should_visual_organ_apply_to(external_organ, purrbated_human))
continue
- if(ispath(external_organ, /obj/item/organ/external/tail))
- var/obj/item/organ/external/tail/new_tail = new external_organ()
+ if(ispath(external_organ, /obj/item/organ/tail))
+ var/obj/item/organ/tail/new_tail = new external_organ()
new_tail.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED)
// Don't forget the spines we removed earlier
- else if(ispath(external_organ, /obj/item/organ/external/spines))
- var/obj/item/organ/external/spines/new_spines = new external_organ()
+ else if(ispath(external_organ, /obj/item/organ/spines))
+ var/obj/item/organ/spines/new_spines = new external_organ()
new_spines.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED)
- var/obj/item/organ/internal/ears/old_ears = purrbated_human.get_organ_slot(ORGAN_SLOT_EARS)
- if(istype(old_ears, /obj/item/organ/internal/ears/cat))
+ var/obj/item/organ/ears/old_ears = purrbated_human.get_organ_slot(ORGAN_SLOT_EARS)
+ if(istype(old_ears, /obj/item/organ/ears/cat))
var/obj/item/organ/new_ears = new target_species.mutantears()
new_ears.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED)
if(!silent)
@@ -200,7 +200,7 @@
human_for_preview.set_haircolor("#ffcccc", update = FALSE) // pink
human_for_preview.set_hairstyle("Hime Cut", update = TRUE)
- var/obj/item/organ/internal/ears/cat/cat_ears = human_for_preview.get_organ_by_type(/obj/item/organ/internal/ears/cat)
+ var/obj/item/organ/ears/cat/cat_ears = human_for_preview.get_organ_by_type(/obj/item/organ/ears/cat)
if (cat_ears)
cat_ears.color = human_for_preview.hair_color
human_for_preview.update_body()
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 0f2072b777353..11548c7b12952 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -4,18 +4,18 @@
id = SPECIES_FLYPERSON
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
meat = /obj/item/food/meat/slab/human/mutant/fly
- mutanteyes = /obj/item/organ/internal/eyes/fly
+ mutanteyes = /obj/item/organ/eyes/fly
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/fly
payday_modifier = 1.0
- mutanttongue = /obj/item/organ/internal/tongue/fly
- mutantheart = /obj/item/organ/internal/heart/fly
- mutantlungs = /obj/item/organ/internal/lungs/fly
- mutantliver = /obj/item/organ/internal/liver/fly
- mutantstomach = /obj/item/organ/internal/stomach/fly
- mutantappendix = /obj/item/organ/internal/appendix/fly
- mutant_organs = list(/obj/item/organ/internal/fly, /obj/item/organ/internal/fly/groin)
+ mutanttongue = /obj/item/organ/tongue/fly
+ mutantheart = /obj/item/organ/heart/fly
+ mutantlungs = /obj/item/organ/lungs/fly
+ mutantliver = /obj/item/organ/liver/fly
+ mutantstomach = /obj/item/organ/stomach/fly
+ mutantappendix = /obj/item/organ/appendix/fly
+ mutant_organs = list(/obj/item/organ/fly, /obj/item/organ/fly/groin)
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fly,
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 416178fd3bbdd..e610f05bb54ea 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -34,13 +34,13 @@
bodytemp_heat_damage_limit = BODYTEMP_HEAT_LAVALAND_SAFE
bodytemp_cold_damage_limit = BODYTEMP_COLD_ICEBOX_SAFE
- mutant_organs = list(/obj/item/organ/internal/adamantine_resonator)
- mutanteyes = /obj/item/organ/internal/eyes/golem
- mutantbrain = /obj/item/organ/internal/brain/golem
- mutanttongue = /obj/item/organ/internal/tongue/golem
- mutantstomach = /obj/item/organ/internal/stomach/golem
- mutantliver = /obj/item/organ/internal/liver/golem
- mutantappendix = /obj/item/organ/internal/appendix/golem
+ mutant_organs = list(/obj/item/organ/adamantine_resonator)
+ mutanteyes = /obj/item/organ/eyes/golem
+ mutantbrain = /obj/item/organ/brain/golem
+ mutanttongue = /obj/item/organ/tongue/golem
+ mutantstomach = /obj/item/organ/stomach/golem
+ mutantliver = /obj/item/organ/liver/golem
+ mutantappendix = /obj/item/organ/appendix/golem
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem,
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 92f9110d03f1a..68dab15d1b7c9 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -80,8 +80,8 @@
/datum/species/human/get_sigh_sound(mob/living/carbon/human/human)
if(human.physique == FEMALE)
- return 'sound/mobs/humanoids/human/sigh/female_sigh.ogg'
- return 'sound/mobs/humanoids/human/sigh/male_sigh.ogg'
+ return SFX_FEMALE_SIGH
+ return SFX_MALE_SIGH
/datum/species/human/get_sniff_sound(mob/living/carbon/human/human)
if(human.physique == FEMALE)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 3b1f8fe4037fe..d866e9c8105dd 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -17,9 +17,9 @@
TRAIT_TOXINLOVER,
TRAIT_NOBLOOD,
)
- mutanttongue = /obj/item/organ/internal/tongue/jelly
- mutantlungs = /obj/item/organ/internal/lungs/slime
- mutanteyes = /obj/item/organ/internal/eyes/jelly
+ mutanttongue = /obj/item/organ/tongue/jelly
+ mutantlungs = /obj/item/organ/lungs/slime
+ mutanteyes = /obj/item/organ/eyes/jelly
mutantheart = null
meat = /obj/item/food/meat/slab/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
@@ -178,7 +178,7 @@
plural_form = "Slimepeople"
id = SPECIES_SLIMEPERSON
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
- mutanteyes = /obj/item/organ/internal/eyes
+ mutanteyes = /obj/item/organ/eyes
var/datum/action/innate/split_body/slime_split
var/list/mob/living/carbon/bodies
var/datum/action/innate/swap_body/swap_body
@@ -488,7 +488,7 @@
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly/luminescent,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly/luminescent,
)
- mutanteyes = /obj/item/organ/internal/eyes
+ mutanteyes = /obj/item/organ/eyes
/// How strong is our glow
var/glow_intensity = LUMINESCENT_DEFAULT_GLOW
/// Internal dummy used to glow (very cool)
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index de24a90071c5e..bf22c032b0589 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -9,13 +9,13 @@
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None")
mutant_organs = list(
- /obj/item/organ/external/horns = "None",
- /obj/item/organ/external/frills = "None",
- /obj/item/organ/external/snout = "Round",
- /obj/item/organ/external/spines = "None",
- /obj/item/organ/external/tail/lizard = "Smooth",
+ /obj/item/organ/horns = "None",
+ /obj/item/organ/frills = "None",
+ /obj/item/organ/snout = "Round",
+ /obj/item/organ/spines = "None",
+ /obj/item/organ/tail/lizard = "Smooth",
)
- mutanttongue = /obj/item/organ/internal/tongue/lizard
+ mutanttongue = /obj/item/organ/tongue/lizard
coldmod = 1.5
heatmod = 0.67
payday_modifier = 1.0
@@ -101,8 +101,8 @@
/datum/species/lizard/get_sigh_sound(mob/living/carbon/human/lizard)
if(lizard.physique == FEMALE)
- return 'sound/mobs/humanoids/human/sigh/female_sigh.ogg'
- return 'sound/mobs/humanoids/human/sigh/male_sigh.ogg'
+ return SFX_FEMALE_SIGH
+ return SFX_MALE_SIGH
/datum/species/lizard/get_sniff_sound(mob/living/carbon/human/lizard)
if(lizard.physique == FEMALE)
@@ -165,8 +165,8 @@ Lizard subspecies: ASHWALKERS
name = "Ash Walker"
id = SPECIES_LIZARD_ASH
examine_limb_id = SPECIES_LIZARD
- mutantlungs = /obj/item/organ/internal/lungs/lavaland
- mutantbrain = /obj/item/organ/internal/brain/primitive
+ mutantlungs = /obj/item/organ/lungs/lavaland
+ mutantbrain = /obj/item/organ/brain/primitive
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_VIRUSIMMUNE,
@@ -207,8 +207,8 @@ Lizard subspecies: SILVER SCALED
mutantlungs = null
damage_modifier = 10 //very light silvery scales soften blows
species_language_holder = /datum/language_holder/lizard/silver
- mutanttongue = /obj/item/organ/internal/tongue/lizard/silver
- changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN
+ mutanttongue = /obj/item/organ/tongue/lizard/silver
+ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN
examine_limb_id = SPECIES_LIZARD
///stored mutcolor for when we turn back off of a silverscale.
var/old_mutcolor
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
index 1ca2979d3d6fc..a1f98250e7456 100644
--- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -4,10 +4,10 @@
name = "\improper Monkey"
id = SPECIES_MONKEY
mutant_organs = list(
- /obj/item/organ/external/tail/monkey = "Monkey",
+ /obj/item/organ/tail/monkey = "Monkey",
)
- mutanttongue = /obj/item/organ/internal/tongue/monkey
- mutantbrain = /obj/item/organ/internal/brain/primate
+ mutanttongue = /obj/item/organ/tongue/monkey
+ mutantbrain = /obj/item/organ/brain/primate
skinned_type = /obj/item/stack/sheet/animalhide/monkey
meat = /obj/item/food/meat/slab/monkey
knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
@@ -124,7 +124,7 @@
return to_add
-/obj/item/organ/internal/brain/primate //Ook Ook
+/obj/item/organ/brain/primate //Ook Ook
name = "Primate Brain"
desc = "This wad of meat is small, but has enlaged occipital lobes for spotting bananas."
organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE, TRAIT_GUN_NATURAL) // No literacy or advanced tool usage.
@@ -144,7 +144,7 @@
if(!.)
return
- var/obj/item/organ/internal/brain/primate/monkey_brain = target
+ var/obj/item/organ/brain/primate/monkey_brain = target
if(monkey_brain.tripping)
monkey_brain.tripping = FALSE
background_icon_state = "bg_default"
@@ -155,21 +155,21 @@
to_chat(monkey_brain.owner, span_notice("You will now stumble while while colliding with people who are in combat mode."))
build_all_button_icons()
-/obj/item/organ/internal/brain/primate/on_mob_insert(mob/living/carbon/primate)
+/obj/item/organ/brain/primate/on_mob_insert(mob/living/carbon/primate)
. = ..()
RegisterSignal(primate, COMSIG_LIVING_MOB_BUMPED, PROC_REF(on_mob_bump))
-/obj/item/organ/internal/brain/primate/on_mob_remove(mob/living/carbon/primate)
+/obj/item/organ/brain/primate/on_mob_remove(mob/living/carbon/primate)
. = ..()
UnregisterSignal(primate, COMSIG_LIVING_MOB_BUMPED)
-/obj/item/organ/internal/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob)
+/obj/item/organ/brain/primate/proc/on_mob_bump(mob/source, mob/living/crossing_mob)
SIGNAL_HANDLER
if(!tripping || !crossing_mob.combat_mode)
return
crossing_mob.knockOver(owner)
-/obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target)
+/obj/item/organ/brain/primate/get_attacking_limb(mob/living/carbon/human/target)
if(!HAS_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER))
return owner.get_bodypart(BODY_ZONE_HEAD)
return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
index 1ae9c959c3c6e..e95990148fc9f 100644
--- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -4,10 +4,10 @@
id = SPECIES_MOTH
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None")
- mutant_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain")
+ mutant_organs = list(/obj/item/organ/wings/moth = "Plain", /obj/item/organ/antennae = "Plain")
meat = /obj/item/food/meat/slab/human/mutant/moth
- mutanttongue = /obj/item/organ/internal/tongue/moth
- mutanteyes = /obj/item/organ/internal/eyes/moth
+ mutanttongue = /obj/item/organ/tongue/moth
+ mutanteyes = /obj/item/organ/eyes/moth
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT
species_cookie = /obj/item/food/muffin/moffin
species_language_holder = /datum/language_holder/moth
@@ -90,8 +90,8 @@
/datum/species/moth/get_sigh_sound(mob/living/carbon/human/moth)
if(moth.physique == FEMALE)
- return 'sound/mobs/humanoids/human/sigh/female_sigh.ogg'
- return 'sound/mobs/humanoids/human/sigh/male_sigh.ogg'
+ return SFX_FEMALE_SIGH
+ return SFX_MALE_SIGH
/datum/species/moth/get_sniff_sound(mob/living/carbon/human/moth)
if(moth.physique == FEMALE)
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 1e2b73616d91c..4e53fe462087a 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -6,7 +6,7 @@
fixed_mut_color = "#DBBF92"
- mutant_organs = list(/obj/item/organ/external/mushroom_cap = "Round")
+ mutant_organs = list(/obj/item/organ/mushroom_cap = "Round")
inherent_traits = list(
TRAIT_MUTANT_COLORS,
@@ -20,8 +20,8 @@
heatmod = 1.5
- mutanttongue = /obj/item/organ/internal/tongue/mush
- mutanteyes = /obj/item/organ/internal/eyes/night_vision/mushroom
+ mutanttongue = /obj/item/organ/tongue/mush
+ mutanteyes = /obj/item/organ/eyes/night_vision/mushroom
mutantlungs = null
species_language_holder = /datum/language_holder/mushroom
@@ -61,7 +61,7 @@
return "#FF4B19" //cap color, spot color uses eye color
/// A mushpersons mushroom cap organ
-/obj/item/organ/external/mushroom_cap
+/obj/item/organ/mushroom_cap
name = "mushroom cap"
desc = "These are yummie, no cap."
@@ -77,10 +77,13 @@
bodypart_overlay = /datum/bodypart_overlay/mutant/mushroom_cap
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
/// Bodypart overlay for the mushroom cap organ
/datum/bodypart_overlay/mutant/mushroom_cap
layers = EXTERNAL_ADJACENT
feature_key = "caps"
+ dyable = TRUE
/datum/bodypart_overlay/mutant/mushroom_cap/get_global_feature_list()
return SSaccessories.caps_list
@@ -90,3 +93,7 @@
return FALSE
return TRUE
+
+/datum/bodypart_overlay/mutant/mushroom_cap/override_color(obj/item/bodypart/bodypart_owner)
+ //The mushroom cap is red by default (can still be dyed)
+ return "#FF4B19"
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index c8a8faaa4827c..b27759e594faa 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -18,10 +18,10 @@
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
inherent_respiration_type = RESPIRATION_PLASMA
- mutantlungs = /obj/item/organ/internal/lungs/plasmaman
- mutanttongue = /obj/item/organ/internal/tongue/bone/plasmaman
- mutantliver = /obj/item/organ/internal/liver/bone/plasmaman
- mutantstomach = /obj/item/organ/internal/stomach/bone/plasmaman
+ mutantlungs = /obj/item/organ/lungs/plasmaman
+ mutanttongue = /obj/item/organ/tongue/bone/plasmaman
+ mutantliver = /obj/item/organ/liver/bone/plasmaman
+ mutantstomach = /obj/item/organ/stomach/bone/plasmaman
mutantappendix = null
mutantheart = null
heatmod = 1.5
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index e5e735b31e44f..87ea18af437fc 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -8,7 +8,7 @@
TRAIT_PLANT_SAFE,
)
mutant_organs = list(
- /obj/item/organ/external/pod_hair = "None",
+ /obj/item/organ/pod_hair = "None",
)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
inherent_factions = list(FACTION_PLANTS, FACTION_VINES)
@@ -19,7 +19,7 @@
exotic_blood = /datum/reagent/water
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/plant
- mutanttongue = /obj/item/organ/internal/tongue/pod
+ mutanttongue = /obj/item/organ/tongue/pod
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/pod,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/pod,
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 7f1173841effd..8a8c16c182a84 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -16,8 +16,8 @@
inherent_factions = list(FACTION_FAITHLESS)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
- mutantbrain = /obj/item/organ/internal/brain/shadow
- mutanteyes = /obj/item/organ/internal/eyes/shadow
+ mutantbrain = /obj/item/organ/brain/shadow
+ mutanteyes = /obj/item/organ/eyes/shadow
mutantheart = null
mutantlungs = null
@@ -89,7 +89,7 @@
return to_add
-/obj/item/organ/internal/eyes/shadow
+/obj/item/organ/eyes/shadow
name = "burning red eyes"
desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread."
icon = 'icons/obj/medical/organs/shadow_organs.dmi'
@@ -98,14 +98,14 @@
flash_protect = FLASH_PROTECTION_SENSITIVE
/// the key to some of their powers
-/obj/item/organ/internal/brain/shadow
+/obj/item/organ/brain/shadow
name = "shadowling tumor"
desc = "Something that was once a brain, before being remolded by a shadowling. It has adapted to the dark, irreversibly."
icon = 'icons/obj/medical/organs/shadow_organs.dmi'
/// What status effect do we gain while in darkness?
var/applied_status = /datum/status_effect/shadow_regeneration
-/obj/item/organ/internal/brain/shadow/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/brain/shadow/on_life(seconds_per_tick, times_fired)
. = ..()
var/turf/owner_turf = owner.loc
if(!isturf(owner_turf))
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 4718645b56346..da8c1dadd0b22 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -24,14 +24,14 @@
TRAIT_XENO_IMMUNE,
)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
- mutanttongue = /obj/item/organ/internal/tongue/bone
- mutantstomach = /obj/item/organ/internal/stomach/bone
+ mutanttongue = /obj/item/organ/tongue/bone
+ mutantstomach = /obj/item/organ/stomach/bone
mutantappendix = null
mutantheart = null
- mutantliver = /obj/item/organ/internal/liver/bone
+ mutantliver = /obj/item/organ/liver/bone
mutantlungs = null
//They can technically be in an ERT
- changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
+ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN
species_cookie = /obj/item/reagent_containers/condiment/milk
species_language_holder = /datum/language_holder/skeleton
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 741e40bed6b33..a10499a4863d3 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -13,8 +13,8 @@
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP
sexes = FALSE //snails are hermaphrodites
- mutanteyes = /obj/item/organ/internal/eyes/snail
- mutanttongue = /obj/item/organ/internal/tongue/snail
+ mutanteyes = /obj/item/organ/eyes/snail
+ mutanttongue = /obj/item/organ/tongue/snail
exotic_blood = /datum/reagent/lube
bodypart_overrides = list(
@@ -113,6 +113,9 @@
armor_type = /datum/armor/backpack_snail
max_integrity = 200
resistance_flags = FIRE_PROOF | ACID_PROOF
+ drop_sound = null
+ pickup_sound = null
+ equip_sound = null
/datum/armor/backpack_snail
melee = 40
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index d3dfb81352004..d0b052a888865 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -17,11 +17,11 @@
TRAIT_NO_MIRROR_REFLECTION,
)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
- changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
+ changesource_flags = MIRROR_BADMIN | MIRROR_PRIDE | WABBAJACK | ERT_SPAWN
exotic_bloodtype = "U"
blood_deficiency_drain_rate = BLOOD_DEFICIENCY_MODIFIER // vampires already passively lose blood, so this just makes them lose it slightly more quickly when they have blood deficiency.
- mutantheart = /obj/item/organ/internal/heart/vampire
- mutanttongue = /obj/item/organ/internal/tongue/vampire
+ mutantheart = /obj/item/organ/heart/vampire
+ mutanttongue = /obj/item/organ/tongue/vampire
mutantstomach = null
mutantlungs = null
skinned_type = /obj/item/stack/sheet/animalhide/human
@@ -147,7 +147,7 @@
return to_add
-/obj/item/organ/internal/tongue/vampire
+/obj/item/organ/tongue/vampire
name = "vampire tongue"
actions_types = list(/datum/action/item_action/organ_action/vampire)
color = COLOR_CRAYON_BLACK
@@ -161,7 +161,7 @@
. = ..()
if(iscarbon(owner))
var/mob/living/carbon/H = owner
- var/obj/item/organ/internal/tongue/vampire/V = target
+ var/obj/item/organ/tongue/vampire/V = target
if(!COOLDOWN_FINISHED(V, drain_cooldown))
to_chat(H, span_warning("You just drained blood, wait a few seconds!"))
return
@@ -197,19 +197,19 @@
if(!victim.blood_volume)
to_chat(H, span_notice("You finish off [victim]'s blood supply."))
-/obj/item/organ/internal/heart/vampire
+/obj/item/organ/heart/vampire
name = "vampire heart"
color = COLOR_CRAYON_BLACK
-/obj/item/organ/internal/heart/vampire/on_mob_insert(mob/living/carbon/receiver)
+/obj/item/organ/heart/vampire/on_mob_insert(mob/living/carbon/receiver)
. = ..()
RegisterSignal(receiver, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item))
-/obj/item/organ/internal/heart/vampire/on_mob_remove(mob/living/carbon/heartless)
+/obj/item/organ/heart/vampire/on_mob_remove(mob/living/carbon/heartless)
. = ..()
UnregisterSignal(heartless, COMSIG_MOB_GET_STATUS_TAB_ITEMS)
-/obj/item/organ/internal/heart/vampire/proc/get_status_tab_item(mob/living/carbon/source, list/items)
+/obj/item/organ/heart/vampire/proc/get_status_tab_item(mob/living/carbon/source, list/items)
SIGNAL_HANDLER
items += "Blood Level: [source.blood_volume]/[BLOOD_VOLUME_MAXIMUM]"
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index da7cf8f6be336..77d2765ba98b3 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -4,7 +4,7 @@
id = SPECIES_ZOMBIE
sexes = FALSE
meat = /obj/item/food/meat/slab/human/mutant/zombie
- mutanttongue = /obj/item/organ/internal/tongue/zombie
+ mutanttongue = /obj/item/organ/tongue/zombie
inherent_traits = list(
// SHARED WITH ALL ZOMBIES
TRAIT_EASILY_WOUNDED,
@@ -32,7 +32,7 @@
mutantliver = null
mutantlungs = null
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
- changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN
+ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN
bodytemp_normal = T0C // They have no natural body heat, the environment regulates body temp
bodytemp_heat_damage_limit = FIRE_MINIMUM_TEMPERATURE_TO_EXIST // Take damage at fire temp
bodytemp_cold_damage_limit = MINIMUM_TEMPERATURE_TO_MOVE // take damage below minimum movement temp
@@ -95,9 +95,9 @@
id = SPECIES_ZOMBIE_INFECTIOUS
examine_limb_id = SPECIES_ZOMBIE
damage_modifier = 20 // 120 damage to KO a zombie, which kills it
- mutanteyes = /obj/item/organ/internal/eyes/zombie
- mutantbrain = /obj/item/organ/internal/brain/zombie
- mutanttongue = /obj/item/organ/internal/tongue/zombie
+ mutanteyes = /obj/item/organ/eyes/zombie
+ mutantbrain = /obj/item/organ/brain/zombie
+ mutanttongue = /obj/item/organ/tongue/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
inherent_traits = list(
@@ -139,7 +139,7 @@
// Deal with the source of this zombie corruption
// Infection organ needs to be handled separately from mutant_organs
// because it persists through species transitions
- var/obj/item/organ/internal/zombie_infection/infection = new_zombie.get_organ_slot(ORGAN_SLOT_ZOMBIE)
+ var/obj/item/organ/zombie_infection/infection = new_zombie.get_organ_slot(ORGAN_SLOT_ZOMBIE)
if(isnull(infection))
infection = new()
infection.Insert(new_zombie)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index db6ad1a80e3fd..93d6f9ce2e19f 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -41,8 +41,8 @@
// Start of a breath chain, calls [carbon/proc/breathe()]
/mob/living/carbon/handle_breathing(seconds_per_tick, times_fired)
var/next_breath = 4
- var/obj/item/organ/internal/lungs/L = get_organ_slot(ORGAN_SLOT_LUNGS)
- var/obj/item/organ/internal/heart/H = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/lungs/L = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/heart/H = get_organ_slot(ORGAN_SLOT_HEART)
if(L)
if(L.damage > L.high_threshold)
next_breath--
@@ -63,7 +63,7 @@
// Second link in a breath chain, calls [carbon/proc/check_breath()]
/mob/living/carbon/proc/breathe(seconds_per_tick, times_fired)
- var/obj/item/organ/internal/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
var/is_on_internals = FALSE
if(SEND_SIGNAL(src, COMSIG_CARBON_ATTEMPT_BREATHE, seconds_per_tick, times_fired) & COMSIG_CARBON_BLOCK_BREATH)
@@ -169,7 +169,7 @@
/// Indicates if there are moles of gas in the breath.
var/has_moles = breath.total_moles() != 0
- var/obj/item/organ/internal/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
// Indicates if lungs can breathe without gas.
var/can_breathe_vacuum = FALSE
if(lungs)
@@ -464,7 +464,7 @@
if(stat == DEAD)
if(reagents && (reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/cryostylane))) // No organ decay if the body contains formaldehyde.
return
- for(var/obj/item/organ/internal/organ in organs)
+ for(var/obj/item/organ/organ in organs)
// On-death is where organ decay is handled
if(organ?.owner) // organ + owner can be null due to reagent metabolization causing organ shuffling
organ.on_death(seconds_per_tick, times_fired)
@@ -477,7 +477,7 @@
for(var/slot in organs_slot)
// We don't use get_organ_slot here because we know we have the organ we want, since we're iterating the list containing em already
// This code is hot enough that it's just not worth the time
- var/obj/item/organ/internal/organ = organs_slot[slot]
+ var/obj/item/organ/organ = organs_slot[slot]
if(organ?.owner) // This exist mostly because reagent metabolization can cause organ reshuffling
organ.on_life(seconds_per_tick, times_fired)
@@ -689,7 +689,7 @@
/mob/living/carbon/get_fullness()
var/fullness = nutrition
- var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
if(!belly) //nothing to see here if we do not have a stomach
return fullness
@@ -707,7 +707,7 @@
. = ..()
if(.)
return
- var/obj/item/organ/internal/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
if(!belly)
return FALSE
return belly.reagents.has_reagent(reagent, amount, needs_metabolizing)
@@ -722,7 +722,7 @@
if(isnull(has_dna()))
return
- var/obj/item/organ/internal/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
if(liver)
return
@@ -736,7 +736,7 @@
adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* seconds_per_tick)
/mob/living/carbon/proc/undergoing_liver_failure()
- var/obj/item/organ/internal/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
if(liver?.organ_flags & ORGAN_FAILING)
return TRUE
@@ -756,7 +756,7 @@
/mob/living/carbon/proc/can_heartattack()
if(!needs_heart())
return FALSE
- var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
if(!heart || IS_ROBOTIC_ORGAN(heart))
return FALSE
return TRUE
@@ -776,7 +776,7 @@
* related situations (i.e not just cardiac arrest)
*/
/mob/living/carbon/proc/undergoing_cardiac_arrest()
- var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
if(istype(heart) && heart.is_beating())
return FALSE
else if(!needs_heart())
@@ -794,7 +794,7 @@
if(status && !can_heartattack())
return FALSE
- var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
if(!istype(heart))
return FALSE
diff --git a/code/modules/mob/living/carbon/skillchip.dm b/code/modules/mob/living/carbon/skillchip.dm
index 19009f21892a1..062ec616a5142 100644
--- a/code/modules/mob/living/carbon/skillchip.dm
+++ b/code/modules/mob/living/carbon/skillchip.dm
@@ -9,7 +9,7 @@
*/
/mob/living/carbon/proc/implant_skillchip(obj/item/skillchip/skillchip, force = FALSE)
// Grab the brain.
- var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
// Check for the brain. No brain = no implant.
if(QDELETED(brain))
@@ -37,7 +37,7 @@
*/
/mob/living/carbon/proc/remove_skillchip(obj/item/skillchip/skillchip, silent = FALSE)
// Check the target's brain, making sure the target exists and has a brain.
- var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(brain))
return FALSE
@@ -59,7 +59,7 @@
*/
/mob/living/carbon/proc/clone_skillchip_list(not_removable = FALSE)
// Check the target's brain, making sure the target exists and has a brain.
- var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(brain))
return list()
@@ -70,7 +70,7 @@
*/
/mob/living/carbon/proc/destroy_all_skillchips(silent = FALSE)
// Check the target's brain, making sure the target exists and has a brain.
- var/obj/item/organ/internal/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = get_organ_slot(ORGAN_SLOT_BRAIN)
if(QDELETED(brain))
return FALSE
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index b1ca17337115e..a7f4652533440 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -16,17 +16,17 @@
/mob/living/carbon/proc/get_traumas()
. = list()
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
. = B.traumas
/mob/living/carbon/proc/has_trauma_type(brain_trauma_type, resilience)
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
. = B.has_trauma_type(brain_trauma_type, resilience)
/mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, resilience, ...)
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
var/list/arguments = list()
if(args.len > 2)
@@ -34,16 +34,16 @@
. = B.brain_gain_trauma(trauma, resilience, arguments)
/mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
. = B.gain_trauma_type(brain_trauma_type, resilience)
/mob/living/carbon/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
. = B.cure_trauma_type(brain_trauma_type, resilience)
/mob/living/carbon/proc/cure_all_traumas(resilience)
- var/obj/item/organ/internal/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = get_organ_slot(ORGAN_SLOT_BRAIN)
if(B)
. = B.cure_all_traumas(resilience)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index a6078afc9d521..5666ac00560be 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -308,7 +308,7 @@
if(HAS_TRAIT(src, TRAIT_GODMODE))
return FALSE
if (required_respiration_type)
- var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
if(isnull(affected_lungs))
if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type
return FALSE
@@ -335,7 +335,7 @@
if(HAS_TRAIT(src, TRAIT_GODMODE))
return FALSE
- var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
if(isnull(affected_lungs))
if(!(mob_respiration_type & required_respiration_type))
return FALSE
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 92099c7dac3b7..360d975cb9ed8 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -143,7 +143,7 @@
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/open = FALSE
- var/obj/item/organ/external/wings/functional/wings = human_user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/functional/wings = human_user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
// open/close functional wings
if(istype(wings))
@@ -152,7 +152,7 @@
wings.close_wings()
else
wings.open_wings()
- addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/external/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/external/wings/functional, close_wings)), wing_time)
+ addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/wings/functional, close_wings)), wing_time)
// play a flapping noise if the wing has this implemented
wings.make_flap_sound(human_user)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index d1a0819bcdaed..b1c71055f2417 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -65,14 +65,14 @@
// multiplier for the damage taken from falling
var/damage_softening_multiplier = 1
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
damage_softening_multiplier *= potential_spine.athletics_boost_multiplier
// If you are incapped, you probably can't brace yourself
var/can_help_themselves = !INCAPACITATED_IGNORING(src, INCAPABLE_RESTRAINTS)
if(levels <= 1 && can_help_themselves)
- var/obj/item/organ/external/wings/gliders = get_organ_by_type(/obj/item/organ/external/wings)
+ var/obj/item/organ/wings/gliders = get_organ_by_type(/obj/item/organ/wings)
if(HAS_TRAIT(src, TRAIT_FREERUNNING) || gliders?.can_soften_fall()) // the power of parkour or wings allows falling short distances unscathed
var/graceful_landing = HAS_TRAIT(src, TRAIT_CATLIKE_GRACE)
@@ -697,7 +697,7 @@
var/get_up_time = 1 SECONDS
- var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
+ var/obj/item/organ/cyberimp/chest/spine/potential_spine = get_organ_slot(ORGAN_SLOT_SPINE)
if(istype(potential_spine))
get_up_time *= potential_spine.athletics_boost_multiplier
@@ -1473,6 +1473,7 @@
var/static/list/possible_results = list(
WABBAJACK_MONKEY,
+ WABBAJACK_CLOWN,
WABBAJACK_ROBOT,
WABBAJACK_SLIME,
WABBAJACK_XENO,
@@ -1487,10 +1488,25 @@
if(WABBAJACK_MONKEY)
new_mob = new /mob/living/carbon/human/species/monkey(loc)
+ if(WABBAJACK_CLOWN)
+ var/picked_clown = pick(typesof(/mob/living/basic/clown))
+ new_mob = new picked_clown(loc)
+
if(WABBAJACK_ROBOT)
var/static/list/robot_options = list(
/mob/living/silicon/robot = 200,
/mob/living/basic/drone/polymorphed = 200,
+ /mob/living/basic/bot/dedbot = 25,
+ /mob/living/basic/bot/cleanbot = 25,
+ /mob/living/basic/bot/firebot = 25,
+ /mob/living/basic/bot/honkbot = 25,
+ /mob/living/basic/bot/hygienebot = 25,
+ /mob/living/basic/bot/medbot/mysterious = 12,
+ /mob/living/basic/bot/medbot = 13,
+ /mob/living/basic/bot/vibebot = 25,
+ /mob/living/basic/hivebot/strong = 50,
+ /mob/living/basic/hivebot/mechanic = 50,
+ /mob/living/basic/netguardian = 1,
/mob/living/silicon/robot/model/syndicate = 1,
/mob/living/silicon/robot/model/syndicate/medical = 1,
/mob/living/silicon/robot/model/syndicate/saboteur = 1,
@@ -1519,56 +1535,128 @@
picked_xeno_type = pick(
/mob/living/carbon/alien/adult/hunter,
/mob/living/carbon/alien/adult/sentinel,
+ /mob/living/basic/alien/maid,
)
else
picked_xeno_type = pick(
/mob/living/carbon/alien/adult/hunter,
/mob/living/basic/alien/sentinel,
+ /mob/living/basic/alien/maid,
)
new_mob = new picked_xeno_type(loc)
if(WABBAJACK_ANIMAL)
var/picked_animal = pick(
+ /mob/living/basic/ant,
+ /mob/living/basic/axolotl,
/mob/living/basic/bat,
/mob/living/basic/bear,
+ /mob/living/basic/bear/butter,
+ /mob/living/basic/bear/snow,
+ /mob/living/basic/bear/russian,
/mob/living/basic/blob_minion/blobbernaut,
+ /mob/living/basic/blob_minion/spore,
/mob/living/basic/butterfly,
/mob/living/basic/carp,
+ /mob/living/basic/carp/mega,
/mob/living/basic/carp/magic,
/mob/living/basic/carp/magic/chaos,
/mob/living/basic/chick,
+ /mob/living/basic/chick/permanent,
/mob/living/basic/chicken,
/mob/living/basic/cow,
+ /mob/living/basic/cow/moonicorn,
/mob/living/basic/crab,
+ /mob/living/basic/crab/evil,
+ /mob/living/basic/crab/kreb,
+ /mob/living/basic/crab/evil/kreb,
+ /mob/living/basic/flesh_spider,
+ /mob/living/basic/frog, // finally we can turn people into the most iconic polymorph form.
+ /mob/living/basic/deer,
+ /mob/living/basic/eyeball,
/mob/living/basic/goat,
/mob/living/basic/gorilla,
+ /mob/living/basic/gorilla/lesser,
/mob/living/basic/headslug,
/mob/living/basic/killer_tomato,
/mob/living/basic/lizard,
+ /mob/living/basic/lizard/space,
+ /mob/living/basic/lightgeist,
+ /mob/living/basic/migo,
+ /mob/living/basic/migo/hatsune,
+ /mob/living/basic/mining/basilisk,
+ /mob/living/basic/mining/brimdemon,
+ /mob/living/basic/mining/goldgrub,
+ /mob/living/basic/mining/goldgrub/baby,
/mob/living/basic/mining/goliath,
+ /mob/living/basic/mining/goliath/ancient/immortal,
+ /mob/living/basic/mining/gutlunch/warrior,
+ /mob/living/basic/mining/mook,
+ /mob/living/basic/mining/mook/worker,
+ /mob/living/basic/mining/mook/worker/bard,
+ /mob/living/basic/mining/mook/worker/tribal_chief,
+ /mob/living/basic/mining/legion/monkey,
+ /mob/living/basic/mining/legion/monkey/snow,
+ /mob/living/basic/mining/lobstrosity,
+ /mob/living/basic/mining/lobstrosity/lava,
+ /mob/living/basic/mining/ice_demon,
+ /mob/living/basic/mining/ice_whelp,
/mob/living/basic/mining/watcher,
+ /mob/living/basic/mining/watcher/icewing,
+ /mob/living/basic/mining/watcher/magmawing,
+ /mob/living/basic/mining/wolf,
/mob/living/basic/morph,
+ /mob/living/basic/mothroach,
+ /mob/living/basic/mothroach/bar,
/mob/living/basic/mouse,
/mob/living/basic/mushroom,
/mob/living/basic/parrot,
/mob/living/basic/pet/cat,
/mob/living/basic/pet/cat/cak,
/mob/living/basic/pet/dog/breaddog,
+ /mob/living/basic/pet/dog/bullterrier,
/mob/living/basic/pet/dog/corgi,
+ /mob/living/basic/pet/dog/corgi/exoticcorgi,
+ /mob/living/basic/pet/dog/corgi/narsie,
/mob/living/basic/pet/dog/pug,
+ /mob/living/basic/pet/gondola,
/mob/living/basic/pet/fox,
- /mob/living/basic/spider/giant,
- /mob/living/basic/spider/giant/hunter,
+ /mob/living/basic/pet/penguin,
+ /mob/living/basic/pet/penguin/baby,
+ /mob/living/basic/pet/penguin/baby/permanent,
+ /mob/living/basic/pet/penguin/emperor,
+ /mob/living/basic/pet/penguin/emperor/shamebrero,
+ /mob/living/basic/pony,
+ /mob/living/basic/pony/syndicate,
+ /mob/living/basic/rabbit,
+ /mob/living/basic/rabbit/easter,
+ /mob/living/basic/rabbit/easter/space,
+ /mob/living/basic/regal_rat,
+ /mob/living/basic/seedling,
+ /mob/living/basic/seedling/meanie,
+ /mob/living/basic/sheep,
+ /mob/living/basic/snake,
+ /mob/living/basic/snake/banded,
+ /mob/living/basic/snake/banded/harmless,
+ /mob/living/basic/spider/giant/tangle, // curated for the most 'interesting' ones
+ /mob/living/basic/spider/giant/breacher,
+ /mob/living/basic/spider/giant/tank,
+ /mob/living/basic/spider/giant/ambush,
+ /mob/living/basic/spider/maintenance,
/mob/living/basic/statue,
+ /mob/living/basic/statue/frosty,
+ /mob/living/basic/statue/mannequin/suspicious,
/mob/living/basic/stickman,
/mob/living/basic/stickman/dog,
+ /mob/living/basic/stickman/ranged,
+ /mob/living/basic/living_limb_flesh,
/mob/living/simple_animal/hostile/megafauna/dragon/lesser,
)
new_mob = new picked_animal(loc)
if(WABBAJACK_HUMAN)
var/mob/living/carbon/human/new_human = new(loc)
- // 50% chance that we'll also randomice race
+ // 50% chance that we'll also randomize race
if(prob(50))
var/list/chooseable_races = list()
for(var/datum/species/species_type as anything in subtypesof(/datum/species))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index ff8406ac4ca15..ca6096914fd40 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -622,7 +622,7 @@
/** Handles exposing a mob to reagents.
*
- * If the methods include INGEST the mob tastes the reagents.
+ * If the methods include INGEST or INHALE, the mob tastes the reagents.
* If the methods include VAPOR it incorporates permiability protection.
*/
/mob/living/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE)
@@ -630,7 +630,7 @@
if(. & COMPONENT_NO_EXPOSE_REAGENTS)
return
- if(methods & INGEST)
+ if(methods & (INGEST | INHALE))
taste(source)
var/touch_protection = (methods & VAPOR) ? getarmor(null, BIO) * 0.01 : 0
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 3550b16829cdb..e41a07d52cd11 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -120,7 +120,7 @@
create_eye()
- if(target_ai.mind)
+ if(target_ai.mind && target_ai.mind.active)
target_ai.mind.transfer_to(src)
if(mind.special_role)
to_chat(src, span_userdanger("You have been installed as an AI! "))
@@ -456,7 +456,7 @@
if(hack_software)
new/obj/item/malf_upgrade(get_turf(src))
the_mmi = mmi_type
- the_mmi.brain = new /obj/item/organ/internal/brain(the_mmi)
+ the_mmi.brain = new /obj/item/organ/brain(the_mmi)
the_mmi.brain.organ_flags |= ORGAN_FROZEN
the_mmi.brain.name = "[real_name]'s brain"
the_mmi.name = "[initial(the_mmi.name)]: [real_name]"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e53fa80dfdd8c..d88573510d3d1 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -66,7 +66,7 @@
//MMI stuff. Held togheter by magic. ~Miauw
if(!mmi?.brainmob)
mmi = new (src)
- mmi.brain = new /obj/item/organ/internal/brain(mmi)
+ mmi.brain = new /obj/item/organ/brain(mmi)
mmi.brain.organ_flags |= ORGAN_FROZEN
mmi.brain.name = "[real_name]'s brain"
mmi.name = "[initial(mmi.name)]: [real_name]"
diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm
index 77764f5ea44d0..9acdd0ae5f2dc 100644
--- a/code/modules/mob/living/silicon/robot/robot_model.dm
+++ b/code/modules/mob/living/silicon/robot/robot_model.dm
@@ -397,7 +397,7 @@
/obj/item/stack/sheet/glass,
/obj/item/borg/apparatus/sheet_manipulator,
/obj/item/stack/rods/cyborg,
- /obj/item/stack/tile/iron/base/cyborg,
+ /obj/item/construction/rtd/borg,
/obj/item/stack/cable_coil,
)
radio_channels = list(RADIO_CHANNEL_ENGINEERING)
@@ -415,7 +415,7 @@
/obj/item/assembly/flash/cyborg,
/obj/item/screwdriver/cyborg,
/obj/item/crowbar/cyborg,
- /obj/item/stack/tile/iron/base/cyborg,
+ /obj/item/stack/tile/iron/base/cyborg, // haha jani will have old tiles >:D
/obj/item/soap/nanotrasen/cyborg,
/obj/item/storage/bag/trash/cyborg,
/obj/item/melee/flyswatter,
@@ -919,7 +919,7 @@
/obj/item/stack/sheet/glass,
/obj/item/borg/apparatus/sheet_manipulator,
/obj/item/stack/rods/cyborg,
- /obj/item/stack/tile/iron/base/cyborg,
+ /obj/item/construction/rtd/borg,
/obj/item/dest_tagger/borg,
/obj/item/stack/cable_coil,
/obj/item/pinpointer/syndicate_cyborg,
diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm
index 061e6375088af..5d63fbdee2b35 100644
--- a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm
@@ -8,7 +8,6 @@
button_icon_state = "intercom"
cooldown_time = 5 SECONDS
shared_cooldown = MOB_SHARED_COOLDOWN_BOT_ANNOUNCMENT
- melee_cooldown_time = 0 SECONDS
/// List of strings to sound effects corresponding to automated messages we can play
var/list/automated_announcements
/// Maximum amount of buttons this can have
@@ -173,7 +172,6 @@
/datum/action/cooldown/bot_announcement_shortcut
desc = "Play a prerecorded message for the benefit of those around you."
shared_cooldown = MOB_SHARED_COOLDOWN_BOT_ANNOUNCMENT
- melee_cooldown_time = 0 SECONDS
background_icon_state = "bg_tech_blue"
overlay_icon_state = "bg_tech_blue_border"
button_icon = 'icons/obj/machines/wallmounts.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index c7171b3c5556a..f1e3461271359 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -153,7 +153,7 @@ Difficulty: Hard
*/
/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params)
. = ..()
- if(istype(W, /obj/item/organ/internal/tongue))
+ if(istype(W, /obj/item/organ/tongue))
user.client?.give_award(/datum/award/achievement/jobs/frenching, user)
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 253fe799bfd2c..0d8c1d86bdd40 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -275,11 +275,11 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list(
Pewgun.chambered.forceMove(loc) //rip revolver immersions, blame shotgun snowflake procs
Pewgun.chambered = null
if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len)
- Pewgun.chambered = Pewgun.magazine.get_round(0)
+ Pewgun.chambered = Pewgun.magazine.get_round()
Pewgun.chambered.forceMove(Pewgun)
Pewgun.update_appearance()
else if(Pewgun.magazine && Pewgun.magazine.stored_ammo.len) //only true for pumpguns i think
- Pewgun.chambered = Pewgun.magazine.get_round(0)
+ Pewgun.chambered = Pewgun.magazine.get_round()
Pewgun.chambered.forceMove(Pewgun)
visible_message(span_danger("The [src] cocks itself!"))
else
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index b40a793f0fc74..1cf118d587675 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -274,8 +274,8 @@ While using this makes the system rely on OnFire, it still gives options for tim
/obj/structure/elite_tumor/item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers)
. = NONE
- if(istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core) && activity == TUMOR_INACTIVE && !boosted)
- var/obj/item/organ/internal/monster_core/regenerative_core/core = attacking_item
+ if(istype(attacking_item, /obj/item/organ/monster_core/regenerative_core) && activity == TUMOR_INACTIVE && !boosted)
+ var/obj/item/organ/monster_core/regenerative_core/core = attacking_item
visible_message(span_boldwarning("As [user] drops the core into [src], [src] appears to swell."))
icon_state = "advanced_tumor"
boosted = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
index d77649562430c..8eab28a52e6a5 100644
--- a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
+++ b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
@@ -52,7 +52,6 @@
button_icon_state = "tentacle_slap"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED
cooldown_time = 12 SECONDS
- melee_cooldown_time = 0 SECONDS
click_to_activate = TRUE
ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi'
diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm
index 28dbbc078c5af..8790def4bd10e 100644
--- a/code/modules/mob/living/taste.dm
+++ b/code/modules/mob/living/taste.dm
@@ -14,7 +14,7 @@
return DEFAULT_TASTE_SENSITIVITY
/mob/living/carbon/get_taste_sensitivity()
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
if(istype(tongue))
. = tongue.taste_sensitivity
else
@@ -57,7 +57,7 @@
// Handled in here since the brain trauma can't modify taste directly (/datum/brain_trauma/severe/flesh_desire)
if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE))
return GORE | MEAT
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
. = tongue.liked_foodtypes
if(HAS_TRAIT(src, TRAIT_VEGETARIAN))
. &= ~MEAT
@@ -73,7 +73,7 @@
/mob/living/carbon/get_disliked_foodtypes()
if(HAS_TRAIT(src, TRAIT_AGEUSIA))
return NONE
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
. = tongue.disliked_foodtypes
if(HAS_TRAIT(src, TRAIT_VEGETARIAN))
. |= MEAT
@@ -86,7 +86,7 @@
return TOXIC
/mob/living/carbon/get_toxic_foodtypes()
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return ..()
if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE))
@@ -101,6 +101,28 @@
var/datum/quirk/item_quirk/food_allergic/allergy = get_quirk(/datum/quirk/item_quirk/food_allergic)
return allergy?.target_foodtypes || NONE
+/**
+ * Checks if the mob has an allergic reaction to the given food type.
+ * If so, the mob will contract anaphylaxis.
+ *
+ * * to_foodtype: The food type to check for an allergic reaction to.
+ * * chance: The chance of an allergic reaction occurring. Default is 100 (guaranteed).
+ * * histamine_add: The amount of histamine to add to the mob if they are already experiencing an allergic reaction.
+ *
+ * Returns TRUE if the mob had an allergic reaction, FALSE otherwise.
+ */
+/mob/living/proc/check_allergic_reaction(to_foodtype = NONE, chance = 100, histamine_add = 0)
+ if(!(get_allergic_foodtypes() & to_foodtype))
+ return FALSE
+ if(!prob(chance))
+ return FALSE
+ if(ForceContractDisease(new /datum/disease/anaphylaxis(), make_copy = FALSE, del_on_fail = TRUE))
+ to_chat(src, span_warning("You feel your throat start to itch."))
+ add_mood_event("allergic_food", /datum/mood_event/allergic_food)
+ else if(histamine_add)
+ reagents.add_reagent(/datum/reagent/toxin/histamine, histamine_add)
+ return TRUE
+
/**
* Gets the food reaction a mob would normally have from the given food item,
* assuming that no check_liked callback was used in the edible component.
@@ -118,7 +140,7 @@
return food_taste_reaction
/mob/living/carbon/get_food_taste_reaction(obj/item/food, foodtypes)
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
// No tongue, no tastin'
if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA))
// i hate that i have to do this, but we want to ensure toxic food is still BAD
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 23e405c873729..d3e0df9440b69 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -532,7 +532,7 @@
var/list/result = examinify.examine_more(src)
if(!length(result))
result += span_notice("You examine [examinify] closer, but find nothing of interest...")
- result_combined = jointext(result, "
")
+ result_combined = examine_block(jointext(result, "
"))
else
client.recent_examines[ref_to_atom] = world.time // set to when we last normal examine'd them
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 45e54a8475ca8..a90a3fedc2489 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -153,7 +153,7 @@
if(mind) //TODO //TODO WHAT
if(!transfer_after)
mind.active = FALSE
- mind.transfer_to(new_borg)
+ mind.transfer_to(new_borg, TRUE)
else if(transfer_after)
new_borg.key = key
diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm
index 3963cefcb4931..e9a4a9b05044d 100644
--- a/code/modules/mob_spawn/corpses/mining_corpses.dm
+++ b/code/modules/mob_spawn/corpses/mining_corpses.dm
@@ -26,7 +26,7 @@
/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human)
. = ..()
- var/obj/item/organ/internal/legion_tumour/cancer = new()
+ var/obj/item/organ/legion_tumour/cancer = new()
cancer.Insert(spawned_human, special = TRUE, movement_flags = DELETE_IF_REPLACED)
/// Returns the outfit worn by our corpse
diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm
index 5fc643bffa622..af7cde7320d0c 100644
--- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm
+++ b/code/modules/mob_spawn/ghost_roles/golem_roles.dm
@@ -78,7 +78,7 @@
if(!ishuman(new_spawn))
return
var/mob/living/carbon/human/new_golem = new_spawn
- var/obj/item/organ/internal/vocal_cords/adamantine/free_golem_radio = new()
+ var/obj/item/organ/vocal_cords/adamantine/free_golem_radio = new()
free_golem_radio.Insert(new_golem)
// Subtype which follows orders
diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm
index a9a793d8a2fd5..ed19d0a4f6a2d 100644
--- a/code/modules/mod/mod_activation.dm
+++ b/code/modules/mod/mod_activation.dm
@@ -26,8 +26,7 @@
return
var/parts_to_check = parts - part
if(part.loc == src)
- deploy(user, part)
- if(active && !delayed_seal_part(part))
+ if(!deploy(user, part) || (active && !delayed_seal_part(part)))
return
SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user)
for(var/obj/item/checking_part as anything in parts_to_check)
@@ -36,9 +35,8 @@
choose_deploy(user)
break
else
- if(active && !delayed_seal_part(part))
+ if((active && !delayed_seal_part(part, silent = TRUE)) || !retract(user, part))
return
- retract(user, part)
SEND_SIGNAL(src, COMSIG_MOD_RETRACTED, user)
for(var/obj/item/checking_part as anything in parts_to_check)
if(checking_part.loc == src)
@@ -49,28 +47,30 @@
/// Quickly deploys all parts (or retracts if all are on the wearer)
/obj/item/mod/control/proc/quick_deploy(mob/user)
if(activating)
- balloon_alert(user, "currently sealing/unsealing!")
+ balloon_alert(user, "currently [active ? "unsealing" : "sealing"]!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE
- var/deploy = TRUE
+ var/deploy = FALSE
for(var/obj/item/part as anything in get_parts())
- if(part.loc == src)
+ if(part.loc != src)
continue
- deploy = FALSE
+ deploy = TRUE
break
+ wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
+ span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
+ span_hear("You hear a mechanical hiss."))
+ playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
for(var/obj/item/part as anything in get_parts())
if(deploy && part.loc == src)
- deploy(null, part)
+ if(!deploy(null, part))
+ continue
if(active && !delayed_seal_part(part))
+ retract(null, part)
return
else if(!deploy && part.loc != src)
if(active && !delayed_seal_part(part))
return
retract(null, part)
- wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
- span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
- span_hear("You hear a mechanical hiss."))
- playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
if(deploy)
SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user)
else
@@ -96,6 +96,7 @@
RegisterSignal(part, COMSIG_ATOM_EXITED, PROC_REF(on_overslot_exit))
if(wearer.equip_to_slot_if_possible(part, part.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
ADD_TRAIT(part, TRAIT_NODROP, MOD_TRAIT)
+ wearer.update_clothing(slot_flags)
if(!user)
return TRUE
wearer.visible_message(span_notice("[wearer]'s [part.name] deploy[part.p_s()] with a mechanical hiss."),
@@ -105,6 +106,10 @@
SEND_SIGNAL(src, COMSIG_MOD_PART_DEPLOYED, user, part)
return TRUE
else
+ if(part_datum.overslotting)
+ var/obj/item/overslot = part_datum.overslotting
+ if(!wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
+ wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE)
if(!user)
return FALSE
balloon_alert(user, "bodypart clothed!")
@@ -119,21 +124,22 @@
return FALSE
balloon_alert(user, "[part.name] already retracted!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
REMOVE_TRAIT(part, TRAIT_NODROP, MOD_TRAIT)
wearer.transferItemToLoc(part, src, force = TRUE)
if(part_datum.overslotting)
- UnregisterSignal(part, COMSIG_ATOM_EXITED)
var/obj/item/overslot = part_datum.overslotting
if(!QDELING(wearer) && !wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE)
- part_datum.overslotting = null
+ wearer.update_clothing(slot_flags)
SEND_SIGNAL(src, COMSIG_MOD_PART_RETRACTED, user, part)
if(!user)
- return
+ return TRUE
wearer.visible_message(span_notice("[wearer]'s [part.name] retract[part.p_s()] back into [src] with a mechanical hiss."),
span_notice("[part] retract[part.p_s()] back into [src] with a mechanical hiss."),
span_hear("You hear a mechanical hiss."))
playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ return TRUE
/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on.
/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE)
@@ -168,46 +174,71 @@
module.deactivate(display_message = FALSE)
activating = TRUE
mod_link.end_call()
+ var/original_active_status = active
to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
//deploy the control unit
- if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
- playsound(src, active ? 'sound/machines/synth/synth_no.ogg' : 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 8000)
- else
- activating = FALSE
- return
+ if(original_active_status)
+ if(delayed_activation())
+ playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ to_chat(wearer, span_notice("Control unit offline. Module capability removed."))
+ else
+ activating = FALSE
+ return
+
+ var/list/sealed_parts = list()
for(var/obj/item/part as anything in get_parts()) //seals/unseals all deployed parts
if(part.loc == src)
continue
- delayed_seal_part(part, no_activation = TRUE)
+ if(!delayed_seal_part(part)) //shit something broke, revert it all
+ activating = FALSE
+ for(var/obj/item/sealed_part as anything in sealed_parts)
+ seal_part(sealed_part, is_sealed = !get_part_datum(sealed_part).sealed)
+ if(original_active_status)
+ control_activation(is_on = TRUE)
+ to_chat(wearer, span_notice("Critical error in sealing systems. Reverting process."))
+ playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ sealed_parts += part
- //finish activation
- to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
- if(ai_assistant)
- to_chat(ai_assistant, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai_assistant]\""))
- finish_activation(is_on = !active)
- if(active)
- playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
- if(!malfunctioning)
- wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50)
- else
- playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ if(!original_active_status)
+ if(delayed_activation())
+ playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ if(!malfunctioning)
+ wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50)
+ else
+ activating = FALSE
+ for(var/obj/item/sealed_part as anything in sealed_parts)
+ seal_part(sealed_part, is_sealed = !get_part_datum(sealed_part).sealed)
+ to_chat(wearer, span_notice("Critical error in sealing systems. Reverting process."))
+ playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ to_chat(wearer, span_notice("Systems [active ? "started up. Parts sealed. Welcome" : "shut down. Parts unsealed. Goodbye"], [wearer]."))
+ if(ai_assistant)
+ to_chat(ai_assistant, span_notice("SYSTEMS [active ? "ACTIVATED. WELCOME" : "DEACTIVATED. GOODBYE"]: \"[ai_assistant]\""))
activating = FALSE
SEND_SIGNAL(src, COMSIG_MOD_TOGGLED, user)
return TRUE
-/obj/item/mod/control/proc/delayed_seal_part(obj/item/clothing/part, no_activation = FALSE)
+/obj/item/mod/control/proc/delayed_seal_part(obj/item/clothing/part, silent = FALSE)
. = FALSE
var/datum/mod_part/part_datum = get_part_datum(part)
if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
- to_chat(wearer, span_notice("[part] [!part_datum.sealed ? part_datum.sealed_message : part_datum.unsealed_message]."))
- playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(part, is_sealed = !part_datum.sealed, no_activation = no_activation)
+ if(!silent)
+ to_chat(wearer, span_notice("[part] [!part_datum.sealed ? part_datum.sealed_message : part_datum.unsealed_message]."))
+ playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(part, is_sealed = !part_datum.sealed)
+ return TRUE
+
+/obj/item/mod/control/proc/delayed_activation()
+ . = FALSE
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
+ control_activation(is_on = !active)
return TRUE
///Seals or unseals the given part.
-/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed, no_activation = FALSE)
+/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed)
var/datum/mod_part/part_datum = get_part_datum(part)
part_datum.sealed = is_sealed
if(part_datum.sealed)
@@ -226,57 +257,60 @@
part.heat_protection = NONE
part.cold_protection = NONE
part.alternate_worn_layer = part_datum.unsealed_layer
- wearer.update_clothing(part.slot_flags)
+ generate_suit_mask()
+ wearer.update_clothing(part.slot_flags | slot_flags)
wearer.update_obscured_slots(part.visor_flags_inv)
if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals())
wearer.cutoff_internals()
- if(!active || no_activation)
+ if(!active)
return
- // these only matter during sealing and unsealing while active via deployment
if(is_sealed)
for(var/obj/item/mod/module/module as anything in modules)
- if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE))
+ if(module.part_activated || !module.has_required_parts(mod_parts, need_active = TRUE))
continue
- module.on_suit_activation()
+ module.on_part_activation()
+ module.part_activated = TRUE
else
for(var/obj/item/mod/module/module as anything in modules)
- if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE))
+ if(!module.part_activated || module.has_required_parts(mod_parts, need_active = TRUE))
continue
- module.on_suit_deactivation()
+ module.on_part_deactivation()
+ module.part_activated = FALSE
if(!module.active || (module.allow_flags & MODULE_ALLOW_INACTIVE))
continue
module.deactivate(display_message = FALSE)
/// Finishes the suit's activation
-/obj/item/mod/control/proc/finish_activation(is_on)
+/obj/item/mod/control/proc/control_activation(is_on)
var/datum/mod_part/part_datum = get_part_datum(src)
part_datum.sealed = is_on
active = is_on
if(active)
for(var/obj/item/mod/module/module as anything in modules)
- if(!module.has_required_parts(mod_parts, need_extended = TRUE))
+ if(module.part_activated || !module.has_required_parts(mod_parts, need_active = TRUE))
continue
- module.on_suit_activation()
+ module.on_part_activation()
+ module.part_activated = TRUE
else
for(var/obj/item/mod/module/module as anything in modules)
- if(!module.has_required_parts(mod_parts, need_extended = TRUE)) //it probably will runtime if we dont do this
+ if(!module.part_activated || module.has_required_parts(mod_parts, need_active = TRUE))
continue
- module.on_suit_deactivation()
+ module.on_part_deactivation()
+ module.part_activated = FALSE
update_speed()
- update_appearance(UPDATE_ICON_STATE)
update_charge_alert()
+ update_appearance(UPDATE_ICON_STATE)
+ generate_suit_mask()
wearer.update_clothing(slot_flags)
/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits.
/obj/item/mod/control/proc/quick_activation()
- var/seal = TRUE
for(var/obj/item/part as anything in get_parts())
- if(!deploy(null, part))
- seal = FALSE
- if(!seal)
- return
+ deploy(null, part)
for(var/obj/item/part as anything in get_parts())
+ if(part.loc == src)
+ continue
seal_part(part, is_sealed = TRUE)
- finish_activation(is_on = TRUE)
+ control_activation(is_on = TRUE)
#undef MOD_ACTIVATION_STEP_FLAGS
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
index 2eac9105c0a46..29377c66c6da4 100644
--- a/code/modules/mod/mod_clothes.dm
+++ b/code/modules/mod/mod_clothes.dm
@@ -59,3 +59,4 @@
cold_protection = FEET|LEGS
item_flags = IGNORE_DIGITIGRADE | IMMUTABLE_SLOW
can_be_tied = FALSE
+ equip_sound = null
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 21bf8509d6b99..0f521e40691f4 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -475,6 +475,30 @@
wearer.update_spacesuit_hud_icon("0")
wearer = null
+/obj/item/mod/control/proc/get_sealed_slots(list/parts)
+ var/covered_slots = NONE
+ for(var/obj/item/part as anything in parts)
+ if(!get_part_datum(part).sealed)
+ parts -= part
+ continue
+ covered_slots |= part.slot_flags
+ return covered_slots
+
+/obj/item/mod/control/proc/generate_suit_mask()
+ var/list/parts = get_parts(all = TRUE)
+ var/covered_slots = get_sealed_slots(parts)
+ if(GLOB.mod_masks[skin])
+ if(GLOB.mod_masks[skin]["[covered_slots]"])
+ return GLOB.mod_masks[skin]["[covered_slots]"]
+ else
+ GLOB.mod_masks[skin] = list()
+ var/icon/slot_mask = icon('icons/blanks/32x32.dmi', "nothing")
+ for(var/obj/item/part as anything in parts)
+ slot_mask.Blend(icon(part.worn_icon, part.icon_state), ICON_OVERLAY)
+ slot_mask.Blend("#fff", ICON_ADD)
+ GLOB.mod_masks[skin]["[covered_slots]"] = slot_mask
+ return GLOB.mod_masks[skin]["[covered_slots]"]
+
/obj/item/mod/control/proc/clean_up()
if(QDELING(src))
unset_wearer()
@@ -489,7 +513,7 @@
for(var/obj/item/part as anything in get_parts())
retract(null, part)
if(active)
- finish_activation(is_on = FALSE)
+ control_activation(is_on = FALSE)
mod_link?.end_call()
var/mob/old_wearer = wearer
unset_wearer()
@@ -583,8 +607,9 @@
new_module.on_install()
if(wearer)
new_module.on_equip()
- if(active && new_module.has_required_parts(mod_parts, need_extended = TRUE))
- new_module.on_suit_activation()
+ if(active && new_module.has_required_parts(mod_parts, need_active = TRUE))
+ new_module.on_part_activation()
+ new_module.part_activated = TRUE
if(user)
balloon_alert(user, "[new_module] added")
playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
@@ -595,7 +620,7 @@
if(wearer)
old_module.on_unequip()
if(active)
- old_module.on_suit_deactivation(deleting = deleting)
+ old_module.on_part_deactivation(deleting = deleting)
if(old_module.active)
old_module.deactivate(display_message = !deleting, deleting = deleting)
old_module.UnregisterSignal(src, COMSIG_ITEM_GET_WORN_OVERLAYS)
@@ -654,7 +679,7 @@
/obj/item/mod/control/proc/update_speed()
for(var/obj/item/part as anything in get_parts(all = TRUE))
- part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(mod_parts)
+ part.slowdown = (get_part_datum(part).sealed ? slowdown_active : slowdown_inactive) / length(mod_parts)
wearer?.update_equipment_speed_mods()
/obj/item/mod/control/proc/power_off()
@@ -681,6 +706,9 @@
uninstall(part)
return
if(part in get_parts())
+ var/datum/mod_part/part_datum = get_part_datum(part)
+ if(part_datum.sealed)
+ seal_part(part, is_sealed = FALSE)
if(isnull(part.loc))
return
if(!wearer)
@@ -709,6 +737,7 @@
var/datum/mod_part/part_datum = get_part_datum(part)
if(overslot != part_datum.overslotting)
return
+ UnregisterSignal(part, COMSIG_ATOM_EXITED)
part_datum.overslotting = null
/obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user)
diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm
index 791c5347722b6..79a8eff5e290a 100644
--- a/code/modules/mod/mod_core.dm
+++ b/code/modules/mod/mod_core.dm
@@ -265,27 +265,27 @@
var/charge_modifier = 0.1
/obj/item/mod/core/ethereal/charge_source()
- var/obj/item/organ/internal/stomach/ethereal/ethereal_stomach = mod.wearer.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/ethereal_stomach = mod.wearer.get_organ_slot(ORGAN_SLOT_STOMACH)
if(!istype(ethereal_stomach))
return
return ethereal_stomach
/obj/item/mod/core/ethereal/charge_amount()
- var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source()
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
return charge_source?.cell.charge() || ETHEREAL_CHARGE_NONE
/obj/item/mod/core/ethereal/max_charge_amount()
return ETHEREAL_CHARGE_FULL
/obj/item/mod/core/ethereal/add_charge(amount)
- var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source()
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
if(!charge_source)
return FALSE
charge_source.adjust_charge(amount*charge_modifier)
return TRUE
/obj/item/mod/core/ethereal/subtract_charge(amount)
- var/obj/item/organ/internal/stomach/ethereal/charge_source = charge_source()
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
if(!charge_source)
return FALSE
return -charge_source.adjust_charge(-amount*charge_modifier)
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
index 664f9118b83a7..76f9063df0b9c 100644
--- a/code/modules/mod/mod_theme.dm
+++ b/code/modules/mod/mod_theme.dm
@@ -62,8 +62,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -205,8 +203,6 @@
SEALED_COVER = HEADCOVERSEYES,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
@@ -270,8 +266,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -340,8 +334,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -414,8 +406,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -490,8 +480,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT,
@@ -524,8 +512,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT,
@@ -602,8 +588,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE,
@@ -676,8 +660,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -711,8 +693,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -793,8 +773,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -867,8 +845,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -936,8 +912,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1005,8 +979,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1080,8 +1052,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1150,8 +1120,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1227,8 +1195,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1262,8 +1228,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1337,8 +1301,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1414,8 +1376,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEMUTWINGS,
CAN_OVERSLOT = TRUE,
@@ -1501,8 +1461,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1573,8 +1531,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL|CASTING_CLOTHES,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1644,8 +1600,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1717,8 +1671,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1787,8 +1739,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1856,8 +1806,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1889,8 +1837,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1973,8 +1919,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2044,8 +1988,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2110,8 +2052,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2178,8 +2118,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2245,8 +2183,6 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
- UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
- SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
index 3055d0616f983..28a588609a783 100644
--- a/code/modules/mod/modules/_module.dm
+++ b/code/modules/mod/modules/_module.dm
@@ -39,12 +39,18 @@
var/cooldown_time = 0
/// The mouse button needed to use this module
var/used_signal
+ /// Are all parts needed active- have we ran on_part_activation
+ var/part_activated = FALSE
+ /// Do we need the parts to be extended to run process
+ var/part_process = TRUE
/// List of REF()s mobs we are pinned to, linked with their action buttons
var/list/pinned_to = list()
/// flags that let the module ability be used in odd circumstances
var/allow_flags = NONE
/// A list of slots required in the suit to work. Formatted like list(x|y, z, ...) where either x or y are required and z is required.
var/list/required_slots = list()
+ /// If TRUE worn overlay will be masked with the suit, preventing any bits from poking out of its controur
+ var/mask_worn_overlay = FALSE
/// Timer for the cooldown
COOLDOWN_DECLARE(cooldown_timer)
@@ -77,14 +83,14 @@
. += span_notice("Complexity level: [complexity]")
/// Looks through the MODsuit's parts to see if it has the parts required to support this module
-/obj/item/mod/module/proc/has_required_parts(list/parts, need_extended = FALSE)
+/obj/item/mod/module/proc/has_required_parts(list/parts, need_active = FALSE)
if(!length(required_slots))
return TRUE
var/total_slot_flags = NONE
for(var/part_slot in parts)
- if(need_extended)
+ if(need_active)
var/datum/mod_part/part_datum = parts[part_slot]
- if(part_datum.part_item.loc == mod)
+ if(!part_datum.sealed)
continue
total_slot_flags |= text2num(part_slot)
var/list/needed_slots = required_slots.Copy()
@@ -108,7 +114,7 @@
if(mod.wearer)
balloon_alert(mod.wearer, "not active!")
return
- if(!has_required_parts(mod.mod_parts, need_extended = TRUE))
+ if(!has_required_parts(mod.mod_parts, need_active = TRUE))
if(mod.wearer)
balloon_alert(mod.wearer, "required parts inactive!")
var/list/slot_strings = list()
@@ -167,7 +173,6 @@
balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use")
active = TRUE
mod.wearer.update_clothing(mod.slot_flags)
- start_cooldown()
SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED)
on_activation()
return TRUE
@@ -229,6 +234,8 @@
/// Called on the MODsuit's process
/obj/item/mod/module/proc/on_process(seconds_per_tick)
+ if(part_process && !part_activated)
+ return FALSE
if(active)
if(!drain_power(active_power_cost * seconds_per_tick))
deactivate()
@@ -263,11 +270,11 @@
return
/// Called when the MODsuit is activated
-/obj/item/mod/module/proc/on_suit_activation()
+/obj/item/mod/module/proc/on_part_activation()
return
/// Called when the MODsuit is deactivated
-/obj/item/mod/module/proc/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/proc/on_part_deactivation(deleting = FALSE)
return
/// Called when the MODsuit is equipped
@@ -335,23 +342,47 @@
/// Generates an icon to be used for the suit's worn overlays
/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing)
. = list()
- if(!mod.active)
+ if(!mod.active || !has_required_parts(mod.mod_parts, need_active = TRUE))
return
- var/used_overlay
- if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer))
- used_overlay = overlay_state_use
- else if(overlay_state_active && active)
- used_overlay = overlay_state_active
- else if(overlay_state_inactive)
- used_overlay = overlay_state_inactive
- else
+ var/used_overlay = get_current_overlay_state()
+ if (!used_overlay)
return
- var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1)
+ var/mutable_appearance/module_icon
+ if(mask_worn_overlay)
+ module_icon = mutable_appearance(get_module_icon_cache(used_overlay), layer = standing.layer + 0.1)
+ else
+ module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1)
if(!use_mod_colors)
module_icon.appearance_flags |= RESET_COLOR
+
. += module_icon
SEND_SIGNAL(src, COMSIG_MODULE_GENERATE_WORN_OVERLAY, ., standing)
+/obj/item/mod/module/proc/get_current_overlay_state()
+ if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer))
+ return overlay_state_use
+ if(overlay_state_active && active)
+ return overlay_state_active
+ if(overlay_state_inactive)
+ return overlay_state_inactive
+ return null
+
+/obj/item/mod/module/proc/get_module_icon_cache(used_overlay)
+ var/covered_slots = mod.get_sealed_slots(mod.get_parts(all = TRUE))
+ if (GLOB.mod_module_overlays[mod.skin])
+ if (GLOB.mod_module_overlays[mod.skin]["[covered_slots]"])
+ if (GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay])
+ return GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay]
+ else
+ GLOB.mod_module_overlays[mod.skin]["[covered_slots]"] = list()
+ else
+ GLOB.mod_module_overlays[mod.skin] = list()
+ GLOB.mod_module_overlays[mod.skin]["[covered_slots]"] = list()
+ var/icon/mod_mask = icon(mod.generate_suit_mask())
+ mod_mask.Blend(icon(overlay_icon_file, used_overlay), ICON_MULTIPLY)
+ GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay] = mod_mask
+ return GLOB.mod_module_overlays[mod.skin]["[covered_slots]"][used_overlay]
+
/// Updates the signal used by active modules to be activated
/obj/item/mod/module/proc/update_signal(value)
switch(value)
diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm
index 8fa2670c76091..e2ec36fe37779 100644
--- a/code/modules/mod/modules/modules_antag.dm
+++ b/code/modules/mod/modules/modules_antag.dm
@@ -16,6 +16,7 @@
overlay_state_inactive = "module_armorbooster_off"
overlay_state_active = "module_armorbooster_on"
use_mod_colors = TRUE
+ mask_worn_overlay = TRUE
/// Whether or not this module removes pressure protection.
var/remove_pressure_protection = TRUE
/// Speed added to the control unit.
@@ -36,12 +37,12 @@
laser = 15
energy = 15
-/obj/item/mod/module/armor_booster/on_suit_activation()
+/obj/item/mod/module/armor_booster/on_part_activation()
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
if(istype(head_cover))
head_cover.flash_protect = FLASH_PROTECTION_WELDER
-/obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/armor_booster/on_part_deactivation(deleting = FALSE)
if(deleting)
return
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
@@ -52,36 +53,38 @@
playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
balloon_alert(mod.wearer, "armor boosted, EVA lost")
actual_speed_added = max(0, min(mod.slowdown_active, speed_added))
- mod.slowdown -= actual_speed_added
- mod.wearer.update_equipment_speed_mods()
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
if(istype(head_cover))
ADD_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT)
+ var/list/mod_parts = mod.get_parts(all = TRUE)
for(var/obj/item/part as anything in mod.get_parts(all = TRUE))
part.set_armor(part.get_armor().add_other_armor(armor_mod))
+ part.slowdown -= speed_added / length(mod_parts)
if(!remove_pressure_protection || !isclothing(part))
continue
var/obj/item/clothing/clothing_part = part
if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE)
clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE
spaceproofed[clothing_part] = TRUE
+ mod.wearer.update_equipment_speed_mods()
/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE)
if(!deleting)
playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
balloon_alert(mod.wearer, "armor retracts, EVA ready")
- mod.slowdown += actual_speed_added
- mod.wearer.update_equipment_speed_mods()
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
if(istype(head_cover))
REMOVE_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT)
+ var/list/mod_parts = mod.get_parts(all = TRUE)
for(var/obj/item/part as anything in mod.get_parts(all = TRUE))
part.set_armor(part.get_armor().subtract_other_armor(armor_mod))
+ part.slowdown += speed_added / length(mod_parts)
if(!remove_pressure_protection || !isclothing(part))
continue
var/obj/item/clothing/clothing_part = part
if(spaceproofed[clothing_part])
clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE
+ mod.wearer.update_equipment_speed_mods()
spaceproofed = list()
/obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing)
@@ -125,12 +128,12 @@
. = ..()
charges = max_charges
-/obj/item/mod/module/energy_shield/on_suit_activation()
+/obj/item/mod/module/energy_shield/on_part_activation()
mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \
charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon)
RegisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(shield_reaction))
-/obj/item/mod/module/energy_shield/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/energy_shield/on_part_deactivation(deleting = FALSE)
var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded)
charges = shield.current_charges
qdel(shield)
@@ -181,10 +184,10 @@
incompatible_modules = list(/obj/item/mod/module/anti_magic)
required_slots = list(ITEM_SLOT_BACK)
-/obj/item/mod/module/anti_magic/on_suit_activation()
+/obj/item/mod/module/anti_magic/on_part_activation()
mod.wearer.add_traits(list(TRAIT_ANTIMAGIC, TRAIT_HOLY), MOD_TRAIT)
-/obj/item/mod/module/anti_magic/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/anti_magic/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(list(TRAIT_ANTIMAGIC, TRAIT_HOLY), MOD_TRAIT)
/obj/item/mod/module/anti_magic/wizard
@@ -196,10 +199,10 @@
icon_state = "magic_neutralizer"
required_slots = list()
-/obj/item/mod/module/anti_magic/wizard/on_suit_activation()
+/obj/item/mod/module/anti_magic/wizard/on_part_activation()
mod.wearer.add_traits(list(TRAIT_ANTIMAGIC, TRAIT_ANTIMAGIC_NO_SELFBLOCK), MOD_TRAIT)
-/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/anti_magic/wizard/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(list(TRAIT_ANTIMAGIC, TRAIT_ANTIMAGIC_NO_SELFBLOCK), MOD_TRAIT)
///Insignia - Gives you a skin specific stripe.
@@ -213,6 +216,7 @@
removable = FALSE
incompatible_modules = list(/obj/item/mod/module/insignia)
overlay_state_inactive = "module_insignia"
+ mask_worn_overlay = TRUE
/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing)
overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
@@ -258,14 +262,15 @@
incompatible_modules = list(/obj/item/mod/module/noslip)
required_slots = list(ITEM_SLOT_FEET)
-/obj/item/mod/module/noslip/on_suit_activation()
+/obj/item/mod/module/noslip/on_part_activation()
ADD_TRAIT(mod.wearer, TRAIT_NO_SLIP_WATER, MOD_TRAIT)
-/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/noslip/on_part_deactivation(deleting = FALSE)
REMOVE_TRAIT(mod.wearer, TRAIT_NO_SLIP_WATER, MOD_TRAIT)
//Bite of 87 Springlock - Equips faster, disguised as DNA lock.
/obj/item/mod/module/springlock/bite_of_87
+ step_change = 0.1
/obj/item/mod/module/springlock/bite_of_87/Initialize(mapload)
. = ..()
@@ -276,13 +281,7 @@
complexity = initial(the_dna_lock_behind_the_slaughter.complexity)
use_energy_cost = initial(the_dna_lock_behind_the_slaughter.use_energy_cost)
-/obj/item/mod/module/springlock/bite_of_87/on_install()
- mod.activation_step_time *= 0.1
-
-/obj/item/mod/module/springlock/bite_of_87/on_uninstall(deleting = FALSE)
- mod.activation_step_time *= 10
-
-/obj/item/mod/module/springlock/bite_of_87/on_suit_activation()
+/obj/item/mod/module/springlock/bite_of_87/on_part_activation()
..()
if(check_holidays(APRIL_FOOLS) || prob(1))
mod.set_mod_color("#b17f00")
@@ -488,11 +487,11 @@
required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT)
var/datum/proximity_monitor/advanced/demoraliser/demoralizer
-/obj/item/mod/module/demoralizer/on_suit_activation()
+/obj/item/mod/module/demoralizer/on_part_activation()
var/datum/demoralise_moods/module/mood_category = new()
demoralizer = new(mod.wearer, 7, TRUE, mood_category)
-/obj/item/mod/module/demoralizer/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/demoralizer/on_part_deactivation(deleting = FALSE)
QDEL_NULL(demoralizer)
/obj/item/mod/module/infiltrator
@@ -515,19 +514,19 @@
/obj/item/mod/module/infiltrator/on_uninstall(deleting = FALSE)
mod.item_flags &= ~EXAMINE_SKIP
-/obj/item/mod/module/infiltrator/on_suit_activation()
+/obj/item/mod/module/infiltrator/on_part_activation()
mod.wearer.add_traits(traits_to_add, MOD_TRAIT)
RegisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH, PROC_REF(on_speech_modification))
- var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE)
user_tongue.temp_say_mod = "states"
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD)
if(istype(head_cover))
head_cover.flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE
-/obj/item/mod/module/infiltrator/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/infiltrator/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(traits_to_add, MOD_TRAIT)
UnregisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH)
- var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE)
user_tongue.temp_say_mod = initial(user_tongue.temp_say_mod)
if(deleting)
return
@@ -587,7 +586,16 @@
if(disrupted.on_saboteur(src, 1 MINUTES))
mod.add_charge(DEFAULT_CHARGE_DRAIN * 250)
-/obj/item/mod/module/stealth/wraith/on_suit_activation()
+/obj/item/mod/module/stealth/wraith/on_part_activation()
+ start_stealth()
+
+/obj/item/mod/module/stealth/wraith/on_part_deactivation(deleting)
+ if(bumpoff)
+ UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP)
+ UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED))
+ animate(mod.wearer, alpha = 255, time = 1.5 SECONDS)
+
+/obj/item/mod/module/stealth/wraith/proc/start_stealth()
if(bumpoff)
RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth))
RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack))
@@ -596,16 +604,10 @@
animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS)
drain_power(use_energy_cost)
-/obj/item/mod/module/stealth/wraith/on_suit_deactivation(deleting)
- if(bumpoff)
- UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP)
- UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED))
- animate(mod.wearer, alpha = 255, time = 1.5 SECONDS)
-
/obj/item/mod/module/stealth/wraith/unstealth(datum/source)
. = ..()
if(mod.active)
- addtimer(CALLBACK(src, PROC_REF(on_suit_activation)), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(start_stealth)), 5 SECONDS)
/obj/item/mod/module/stealth/wraith/examine_more(mob/user)
. = ..()
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
index 9ddb0f9351c82..f65fbbffe90b4 100644
--- a/code/modules/mod/modules/modules_engineering.dm
+++ b/code/modules/mod/modules/modules_engineering.dm
@@ -12,13 +12,13 @@
overlay_state_inactive = "module_welding"
required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK)
-/obj/item/mod/module/welding/on_suit_activation()
+/obj/item/mod/module/welding/on_part_activation()
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
if(istype(head_cover))
//this is a screen that displays an image, so flash sensitives can use this to protect against flashes.
head_cover.flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE
-/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/welding/on_part_deactivation(deleting = FALSE)
if(deleting)
return
var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES)
@@ -244,13 +244,13 @@
target.AddComponent(/datum/component/tether, src, 7, "tether")
/datum/embed_data/tether_projectile
- embed_chance=65 // spiky
- fall_chance=2
- ignore_throwspeed_threshold=TRUE
- pain_stam_pct=0.4
- pain_mult=3
- jostle_pain_mult=2
- rip_time=1 SECONDS
+ embed_chance = 65 //spiky
+ fall_chance = 2
+ ignore_throwspeed_threshold = TRUE
+ pain_stam_pct = 0.4
+ pain_mult = 3
+ jostle_pain_mult = 2
+ rip_time = 1 SECONDS
///Radiation Protection - Protects the user from radiation, gives them a geiger counter and rad info in the panel.
/obj/item/mod/module/rad_protection
@@ -263,17 +263,18 @@
idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
incompatible_modules = list(/obj/item/mod/module/rad_protection)
tgui_id = "rad_counter"
+ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET)
/// Radiation threat level being perceived.
var/perceived_threat_level
-/obj/item/mod/module/rad_protection/on_suit_activation()
+/obj/item/mod/module/rad_protection/on_part_activation()
AddComponent(/datum/component/geiger_sound)
ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT)
RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation))
for(var/obj/item/part in mod.get_parts(all = TRUE))
ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT)
-/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/rad_protection/on_part_deactivation(deleting = FALSE)
qdel(GetComponent(/datum/component/geiger_sound))
REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT)
UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION)
@@ -309,10 +310,10 @@
cooldown_time = 11 SECONDS
required_slots = list(ITEM_SLOT_GLOVES)
-/obj/item/mod/module/constructor/on_suit_activation()
+/obj/item/mod/module/constructor/on_part_activation()
ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT)
-/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/constructor/on_part_deactivation(deleting = FALSE)
REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT)
/obj/item/mod/module/constructor/on_use()
@@ -332,10 +333,10 @@
incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/infiltrator)
required_slots = list(ITEM_SLOT_HEAD)
-/obj/item/mod/module/headprotector/on_suit_activation()
+/obj/item/mod/module/headprotector/on_part_activation()
ADD_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT)
-/obj/item/mod/module/headprotector/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/headprotector/on_part_deactivation(deleting = FALSE)
REMOVE_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT)
///Mister - Sprays water over an area.
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
index 4ebd0c177acaf..f8efae8ea24ad 100644
--- a/code/modules/mod/modules/modules_general.dm
+++ b/code/modules/mod/modules/modules_general.dm
@@ -297,10 +297,10 @@
if("display_dna")
display_dna = text2num(value)
-/obj/item/mod/module/status_readout/on_suit_activation()
+/obj/item/mod/module/status_readout/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_LIVING_DEATH, PROC_REF(death_sound))
-/obj/item/mod/module/status_readout/on_suit_deactivation(deleting)
+/obj/item/mod/module/status_readout/on_part_deactivation(deleting)
UnregisterSignal(mod.wearer, COMSIG_LIVING_DEATH)
/obj/item/mod/module/status_readout/proc/death_sound(mob/living/carbon/human/wearer)
@@ -387,10 +387,10 @@
including augmentations. However, it will take from the suit's power to do so."
complexity = 2
-/obj/item/mod/module/emp_shield/advanced/on_suit_activation()
+/obj/item/mod/module/emp_shield/advanced/on_part_activation()
mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
-/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/emp_shield/advanced/on_part_deactivation(deleting = FALSE)
mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
///Flashlight - Gives the suit a customizable flashlight.
@@ -524,10 +524,10 @@
incompatible_modules = list(/obj/item/mod/module/longfall)
required_slots = list(ITEM_SLOT_FEET)
-/obj/item/mod/module/longfall/on_suit_activation()
+/obj/item/mod/module/longfall/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react))
-/obj/item/mod/module/longfall/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/longfall/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT)
/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on)
@@ -694,19 +694,17 @@
required_slots = list(ITEM_SLOT_HEAD)
/*Intentionally left inheriting 0 complexity and removable = TRUE;
even though it comes inbuilt into the Magnate/Corporate MODS and spawns in maints, I like the idea of stealing them*/
- /// Currently "stored" hat. No armor or function will be inherited, only the icon and cover flags.
- var/obj/item/clothing/head/attached_hat
/// Original cover flags for the MOD helmet, before a hat is placed
var/former_flags
var/former_visor_flags
-/obj/item/mod/module/hat_stabilizer/on_suit_activation()
+/obj/item/mod/module/hat_stabilizer/on_part_activation()
var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD)
if(!istype(helmet))
return
helmet.AddComponent(/datum/component/hat_stabilizer)
-/obj/item/mod/module/hat_stabilizer/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/hat_stabilizer/on_part_deactivation(deleting = FALSE)
if(deleting)
return
var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD)
@@ -735,10 +733,10 @@
incompatible_modules = list(/obj/item/mod/module/signlang_radio)
required_slots = list(ITEM_SLOT_GLOVES)
-/obj/item/mod/module/signlang_radio/on_suit_activation()
+/obj/item/mod/module/signlang_radio/on_part_activation()
ADD_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT)
-/obj/item/mod/module/signlang_radio/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/signlang_radio/on_part_deactivation(deleting = FALSE)
REMOVE_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT)
///A module that recharges the suit by an itsy tiny bit whenever the user takes a step. Originally called "magneto module" but the videogame reference sounds cooler.
@@ -751,14 +749,14 @@
required_slots = list(ITEM_SLOT_FEET)
var/power_per_step = DEFAULT_CHARGE_DRAIN * 0.3
-/obj/item/mod/module/joint_torsion/on_suit_activation()
+/obj/item/mod/module/joint_torsion/on_part_activation()
if(!(mod.wearer.movement_type & (FLOATING|FLYING)))
RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
/// This way we don't even bother to call on_moved() while flying/floating
RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_movetype_flag_enabled))
RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_movetype_flag_disabled))
-/obj/item/mod/module/joint_torsion/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/joint_torsion/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVETYPE_FLAG_ENABLED, COMSIG_MOVETYPE_FLAG_DISABLED))
/obj/item/mod/module/joint_torsion/proc/on_movetype_flag_enabled(datum/source, flag, old_state)
@@ -984,7 +982,7 @@
qdel(gloves.GetComponent(/datum/component/profound_fisher))
return ..()
-/obj/item/mod/module/fishing_glove/on_suit_activation()
+/obj/item/mod/module/fishing_glove/on_part_activation()
var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES)
if(!gloves)
return
@@ -992,7 +990,7 @@
if(equipped)
gloves.AddComponent(/datum/component/profound_fisher, equipped)
-/obj/item/mod/module/fishing_glove/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/fishing_glove/on_part_deactivation(deleting = FALSE)
var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES)
if(gloves && !deleting)
qdel(gloves.GetComponent(/datum/component/adjust_fishing_difficulty))
@@ -1007,12 +1005,12 @@
incompatible_modules = list(/obj/item/mod/module/shock_absorber)
required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT)
-/obj/item/mod/module/shock_absorber/on_suit_activation()
+/obj/item/mod/module/shock_absorber/on_part_activation()
. = ..()
ADD_TRAIT(mod.wearer, TRAIT_BATON_RESISTANCE, REF(src))
RegisterSignal(mod.wearer, COMSIG_MOB_BATONED, PROC_REF(mob_batoned))
-/obj/item/mod/module/shock_absorber/on_suit_deactivation(deleting)
+/obj/item/mod/module/shock_absorber/on_part_deactivation(deleting)
. = ..()
REMOVE_TRAIT(mod.wearer, TRAIT_BATON_RESISTANCE, REF(src))
UnregisterSignal(mod.wearer, COMSIG_MOB_BATONED)
diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm
index d2f1ceaef74d3..24a0d2822f1b5 100644
--- a/code/modules/mod/modules/modules_maint.dm
+++ b/code/modules/mod/modules/modules_maint.dm
@@ -14,18 +14,19 @@
var/static/list/gas_connections = list(
COMSIG_TURF_EXPOSE = PROC_REF(on_wearer_exposed_gas),
)
+ var/step_change = 0.5
/obj/item/mod/module/springlock/on_install()
- mod.activation_step_time *= 0.5
+ mod.activation_step_time *= step_change
/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE)
- mod.activation_step_time *= 2
+ mod.activation_step_time /= step_change
-/obj/item/mod/module/springlock/on_suit_activation()
+/obj/item/mod/module/springlock/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed))
AddComponent(/datum/component/connect_loc_behalf, mod.wearer, gas_connections)
-/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/springlock/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS)
qdel(GetComponent(/datum/component/connect_loc_behalf))
diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm
index a0cf2408860d0..154717cbcc11c 100644
--- a/code/modules/mod/modules/modules_medical.dm
+++ b/code/modules/mod/modules/modules_medical.dm
@@ -75,12 +75,12 @@
required_slots = list(ITEM_SLOT_GLOVES)
var/quick_carry_trait = TRAIT_QUICK_CARRY
-/obj/item/mod/module/quick_carry/on_suit_activation()
+/obj/item/mod/module/quick_carry/on_part_activation()
. = ..()
ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT)
ADD_TRAIT(mod.wearer, quick_carry_trait, MOD_TRAIT)
-/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/quick_carry/on_part_deactivation(deleting = FALSE)
. = ..()
REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT)
REMOVE_TRAIT(mod.wearer, quick_carry_trait, MOD_TRAIT)
@@ -370,7 +370,7 @@
playsound(src, 'sound/items/zip/zip.ogg', 25, TRUE)
balloon_alert(mod.wearer, "clothing mended")
-/obj/item/mod/module/thread_ripper/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/thread_ripper/on_part_deactivation(deleting = FALSE)
if(!length(ripped_clothing))
return
for(var/obj/item/clothing as anything in ripped_clothing)
diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm
index bce377c71e935..c4e8962c4476d 100644
--- a/code/modules/mod/modules/modules_ninja.dm
+++ b/code/modules/mod/modules/modules_ninja.dm
@@ -13,7 +13,7 @@
use_energy_cost = DEFAULT_CHARGE_DRAIN * 10
incompatible_modules = list(/obj/item/mod/module/stealth)
cooldown_time = 5 SECONDS
- required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT)
+ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET)
/// Whether or not the cloak turns off on bumping.
var/bumpoff = TRUE
/// The alpha applied when the cloak is on.
@@ -92,11 +92,11 @@
overlay_state_inactive = null
required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK)
-/obj/item/mod/module/welding/camera_vision/on_suit_activation()
+/obj/item/mod/module/welding/camera_vision/on_part_activation()
. = ..()
RegisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track))
-/obj/item/mod/module/welding/camera_vision/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/welding/camera_vision/on_part_deactivation(deleting = FALSE)
. = ..()
UnregisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK)
@@ -131,10 +131,10 @@
/// How many times the module has been used to force open doors.
var/door_hack_counter = 0
-/obj/item/mod/module/hacker/on_suit_activation()
+/obj/item/mod/module/hacker/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(hack))
-/obj/item/mod/module/hacker/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/hacker/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK)
/obj/item/mod/module/hacker/proc/hack(mob/living/carbon/human/source, atom/target, proximity, modifiers)
@@ -172,10 +172,10 @@
/// The accepted typepath we can link to.
var/accepted_type = /obj/item/energy_katana
-/obj/item/mod/module/weapon_recall/on_suit_activation()
+/obj/item/mod/module/weapon_recall/on_part_activation()
mod.wearer.add_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), MOD_TRAIT)
-/obj/item/mod/module/weapon_recall/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/weapon_recall/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), MOD_TRAIT)
/obj/item/mod/module/weapon_recall/on_use()
@@ -312,7 +312,7 @@
/// List of all energy nets this module made.
var/list/energy_nets = list()
-/obj/item/mod/module/energy_net/on_suit_deactivation(deleting)
+/obj/item/mod/module/energy_net/on_part_deactivation(deleting)
for(var/obj/structure/energy_net/net as anything in energy_nets)
net.atom_destruction(ENERGY)
diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm
index 8edcaff7715f0..3d1430d6dc629 100644
--- a/code/modules/mod/modules/modules_security.dm
+++ b/code/modules/mod/modules/modules_security.dm
@@ -36,10 +36,10 @@
return
suit.allowed -= (guns_typecache - already_allowed_guns)
-/obj/item/mod/module/magnetic_harness/on_suit_activation()
+/obj/item/mod/module/magnetic_harness/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(check_dropped_item))
-/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/magnetic_harness/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM)
/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location)
@@ -74,10 +74,10 @@
overlay_state_use = "module_pepper_used"
required_slots = list(ITEM_SLOT_OCLOTHING)
-/obj/item/mod/module/pepper_shoulders/on_suit_activation()
+/obj/item/mod/module/pepper_shoulders/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_check_block))
-/obj/item/mod/module/pepper_shoulders/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/pepper_shoulders/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK)
/obj/item/mod/module/pepper_shoulders/on_use()
@@ -387,10 +387,10 @@
for(var/i in 1 to radar_slices)
sorted_creatures += list(list())
-/obj/item/mod/module/active_sonar/on_suit_activation()
+/obj/item/mod/module/active_sonar/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(sort_all_creatures))
-/obj/item/mod/module/active_sonar/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/active_sonar/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
/// Detects all living creatures within world.view, and returns the amount.
@@ -547,10 +547,10 @@
if(!.)
set_shooting_mode(SHOOTING_ASSISTANT_OFF)
-/obj/item/mod/module/shooting_assistant/on_suit_activation()
+/obj/item/mod/module/shooting_assistant/on_part_activation()
apply_mode_effects()
-/obj/item/mod/module/shooting_assistant/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/shooting_assistant/on_part_deactivation(deleting = FALSE)
remove_mode_effects()
/obj/item/mod/module/shooting_assistant/proc/stormtrooper_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values)
@@ -582,10 +582,10 @@
incompatible_modules = list(/obj/item/mod/module/shove_blocker)
required_slots = list(ITEM_SLOT_OCLOTHING)
-/obj/item/mod/module/shove_blocker/on_suit_activation()
+/obj/item/mod/module/shove_blocker/on_part_activation()
mod.wearer.add_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT)
-/obj/item/mod/module/shove_blocker/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/shove_blocker/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT)
/obj/item/mod/module/shove_blocker/locked
@@ -601,10 +601,10 @@
complexity = 0
required_slots = list(ITEM_SLOT_GLOVES)
-/obj/item/mod/module/quick_cuff/on_suit_activation()
+/obj/item/mod/module/quick_cuff/on_part_activation()
. = ..()
ADD_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT)
-/obj/item/mod/module/quick_cuff/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/quick_cuff/on_part_deactivation(deleting = FALSE)
. = ..()
REMOVE_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT)
diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm
index 4d2650585b1c0..79d2d3779e0ff 100644
--- a/code/modules/mod/modules/modules_service.dm
+++ b/code/modules/mod/modules/modules_service.dm
@@ -36,7 +36,7 @@
complexity = 1
use_energy_cost = DEFAULT_CHARGE_DRAIN * 5
incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organizer)
- cooldown_time = 10 SECONDS
+ cooldown_time = 4 SECONDS
required_slots = list(ITEM_SLOT_GLOVES)
/obj/item/mod/module/microwave_beam/on_select_use(atom/target)
@@ -76,7 +76,7 @@
incompatible_modules = list(/obj/item/mod/module/waddle)
required_slots = list(ITEM_SLOT_FEET)
-/obj/item/mod/module/waddle/on_suit_activation()
+/obj/item/mod/module/waddle/on_part_activation()
var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET)
if(shoes)
shoes.AddComponent(/datum/component/squeak, list('sound/effects/footstep/clownstep1.ogg'=1,'sound/effects/footstep/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please
@@ -84,7 +84,7 @@
if(is_clown_job(mod.wearer.mind?.assigned_role))
mod.wearer.add_mood_event("clownshoes", /datum/mood_event/clownshoes)
-/obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/waddle/on_part_deactivation(deleting = FALSE)
var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET)
if(shoes && !deleting)
qdel(shoes.GetComponent(/datum/component/squeak))
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
index 1ce0a2f316d49..8be66e0b3e38c 100644
--- a/code/modules/mod/modules/modules_supply.dm
+++ b/code/modules/mod/modules/modules_supply.dm
@@ -80,7 +80,7 @@
else
balloon_alert(mod.wearer, "invalid target!")
-/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/clamp/on_part_deactivation(deleting = FALSE)
if(deleting)
return
for(var/atom/movable/crate as anything in stored_crates)
@@ -275,10 +275,10 @@
. = ..()
disposal_tag = pick(GLOB.TAGGERLOCATIONS)
-/obj/item/mod/module/disposal_connector/on_suit_activation()
+/obj/item/mod/module/disposal_connector/on_part_activation()
RegisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposal_handling))
-/obj/item/mod/module/disposal_connector/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/disposal_connector/on_part_deactivation(deleting = FALSE)
UnregisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING)
/obj/item/mod/module/disposal_connector/get_configuration()
@@ -361,7 +361,7 @@
incompatible_modules = list(/obj/item/mod/module/ash_accretion)
overlay_state_inactive = "module_ash"
use_mod_colors = TRUE
- required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING)
+ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET)
/// How many tiles we can travel to max out the armor.
var/max_traveled_tiles = 10
/// How many tiles we traveled through.
@@ -406,11 +406,11 @@
/turf/open/water,
))
-/obj/item/mod/module/ash_accretion/on_suit_activation()
+/obj/item/mod/module/ash_accretion/on_part_activation()
mod.wearer.add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), MOD_TRAIT)
RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
-/obj/item/mod/module/ash_accretion/on_suit_deactivation(deleting = FALSE)
+/obj/item/mod/module/ash_accretion/on_part_deactivation(deleting = FALSE)
mod.wearer.remove_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), MOD_TRAIT)
UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
if(!traveled_tiles)
@@ -471,7 +471,7 @@
use_energy_cost = DEFAULT_CHARGE_DRAIN * 3
incompatible_modules = list(/obj/item/mod/module/sphere_transform)
cooldown_time = 1.25 SECONDS
- required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_HEAD|ITEM_SLOT_MASK)
+ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET)
/// Time it takes us to complete the animation.
var/animate_time = 0.25 SECONDS
/// List of traits to add/remove from our subject as needed.
diff --git a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm
index 66182437869e7..9cd92c5fe6d7f 100644
--- a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm
+++ b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm
@@ -59,6 +59,8 @@
if("PRG_speak")
if(!channel || isnull(active_channel))
return
+ if(src in channel.muted_clients) // Make sure we aren't muted
+ return
var/message = reject_bad_chattext(params["message"], MESSAGE_SIZE)
if(!message)
return
diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
index eacdb1323b368..746824f8d8bf7 100644
--- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm
+++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
@@ -559,6 +559,9 @@ GLOBAL_LIST_EMPTY(virtual_pets_list)
return TRUE
if(!isnull(trick_name))
pet.ai_controller.set_blackboard_key(BB_TRICK_NAME, trick_name)
+ for (var/trick_move in trick_sequence)
+ if (!length(GLOB.emote_list[LOWER_TEXT(trick_move)]))
+ trick_sequence -= trick_move
pet.ai_controller.override_blackboard_key(BB_TRICK_SEQUENCE, trick_sequence)
playsound(computer.loc, 'sound/mobs/non-humanoids/orbie/orbie_trick_learned.ogg', 50)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index 1d913f4a236b0..41c285d46a5d8 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -49,7 +49,7 @@
return ..()
/obj/item/paperplane/suicide_act(mob/living/user)
- var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES)
user.Stun(20 SECONDS)
user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!"))
user.adjust_eye_blur(12 SECONDS)
@@ -98,7 +98,7 @@
if(. || !ishuman(hit_atom)) //if the plane is caught or it hits a nonhuman
return
var/mob/living/carbon/human/hit_human = hit_atom
- var/obj/item/organ/internal/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES)
if(!prob(hit_probability))
return
if(hit_human.is_eyes_covered())
diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm
index ae7d9f78cb91a..683710bf128e4 100644
--- a/code/modules/point/point.dm
+++ b/code/modules/point/point.dm
@@ -114,8 +114,14 @@
/// possibly delayed verb that finishes the pointing process starting in [/mob/verb/pointed()].
/// either called immediately or in the tick after pointed() was called, as per the [DEFAULT_QUEUE_OR_CALL_VERB()] macro
/mob/proc/_pointed(atom/pointing_at)
- if(client && !(pointing_at in view(client.view, src)))
- return FALSE
+ if(client) //Clientless mobs can just go ahead and point
+ if(ismovable(pointing_at))
+ var/atom/movable/pointed_movable = pointing_at
+ if(pointed_movable.flags_1 & IS_ONTOP_1)
+ pointing_at = pointed_movable.loc
+
+ if(!(pointing_at in view(client.view, src)))
+ return FALSE
point_at(pointing_at, TRUE)
diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm
index 3b786cfd199c9..c156d8bb07003 100644
--- a/code/modules/power/apc/apc_attack.dm
+++ b/code/modules/power/apc/apc_attack.dm
@@ -13,7 +13,7 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/apc_interactor = user
- var/obj/item/organ/internal/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/maybe_ethereal_stomach = apc_interactor.get_organ_slot(ORGAN_SLOT_STOMACH)
if(!istype(maybe_ethereal_stomach))
togglelock(user)
else
@@ -27,14 +27,14 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/ethereal = user
- var/obj/item/organ/internal/stomach/maybe_stomach = ethereal.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/maybe_stomach = ethereal.get_organ_slot(ORGAN_SLOT_STOMACH)
// how long we wanna wait before we show the balloon alert. don't want it to be very long in case the ethereal wants to opt-out of doing that action, just long enough to where it doesn't collide with previously queued balloon alerts.
var/alert_timer_duration = 0.75 SECONDS
- if(!istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal))
+ if(!istype(maybe_stomach, /obj/item/organ/stomach/ethereal))
return
var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - ETHEREAL_APC_POWER_GAIN
- var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach
+ var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach
var/obj/item/stock_parts/power_store/stomach_cell = stomach.cell
if(!((stomach?.drain_time < world.time) && LAZYACCESS(modifiers, RIGHT_CLICK)))
return
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 7b9bcd4f22388..cc8d566c5c9da 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -425,15 +425,21 @@
playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50, FALSE)
update_appearance()
-/obj/machinery/power/apc/proc/disconnect_remote_access()
+/**
+ * Disconnects anyone using this APC via an APC control console and locks the interface.
+ * arguments:
+ * mute - whether the APC should announce the disconnection locally
+ */
+/obj/machinery/power/apc/proc/disconnect_remote_access(mute = FALSE)
// nothing to disconnect from
if(isnull(remote_control_user))
return
locked = TRUE
- say("Remote access canceled. Interface locked.")
to_chat(remote_control_user, span_danger("[icon2html(src, remote_control_user)] Disconnected from [src]."))
- playsound(src, 'sound/machines/terminal/terminal_off.ogg', 25, FALSE)
- playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50, FALSE)
+ if(!mute)
+ say("Remote access canceled. Interface locked.")
+ playsound(src, 'sound/machines/terminal/terminal_off.ogg', 25, FALSE)
+ playsound(src, 'sound/machines/terminal/terminal_alert.ogg', 50, FALSE)
update_appearance()
remote_control_user = null
diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm
index 9d7c008c6165c..3ff5a89f4aa05 100644
--- a/code/modules/power/apc/apc_tool_act.dm
+++ b/code/modules/power/apc/apc_tool_act.dm
@@ -379,11 +379,11 @@
if((machine_stat & BROKEN) || opened == APC_COVER_REMOVED)
new /obj/item/stack/sheet/iron(loc)
user.visible_message(span_notice("[user.name] cuts [src] apart with [welder]."))
- balloon_alert(user, "disassembled the broken frame")
+ user.balloon_alert(user, "disassembled the broken frame")
else
new /obj/item/wallframe/apc(loc)
user.visible_message(span_notice("[user.name] cuts [src] from the wall with [welder]."))
- balloon_alert(user, "cut the frame from the wall")
+ user.balloon_alert(user, "cut the frame from the wall")
qdel(src)
return TRUE
diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm
index 487b26dd31459..3657bb84db83a 100644
--- a/code/modules/power/lighting/light.dm
+++ b/code/modules/power/lighting/light.dm
@@ -548,9 +548,9 @@
var/protected = FALSE
if(istype(user))
- var/obj/item/organ/internal/stomach/maybe_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH)
- if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal))
- var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach
+ var/obj/item/organ/stomach/maybe_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH)
+ if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal))
+ var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach
if(stomach.drain_time > world.time)
return
to_chat(user, span_notice("You start channeling some power through the [fitting] into your body."))
diff --git a/code/modules/power/power_store.dm b/code/modules/power/power_store.dm
index 1be39dfbaa031..8756f052781df 100644
--- a/code/modules/power/power_store.dm
+++ b/code/modules/power/power_store.dm
@@ -290,12 +290,12 @@
/obj/item/stock_parts/power_store/attack_self(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/organ/internal/stomach/maybe_stomach = H.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/maybe_stomach = H.get_organ_slot(ORGAN_SLOT_STOMACH)
- if(istype(maybe_stomach, /obj/item/organ/internal/stomach/ethereal))
+ if(istype(maybe_stomach, /obj/item/organ/stomach/ethereal))
var/charge_limit = ETHEREAL_CHARGE_DANGEROUS - CELL_POWER_GAIN
- var/obj/item/organ/internal/stomach/ethereal/stomach = maybe_stomach
+ var/obj/item/organ/stomach/ethereal/stomach = maybe_stomach
var/obj/item/stock_parts/power_store/stomach_cell = stomach.cell
if((stomach.drain_time > world.time) || !stomach)
return
diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm
index c07ec7bbe89f7..3cb6c8fd82c3e 100644
--- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm
+++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm
@@ -95,7 +95,7 @@
var/mob/living/carbon/jedi = user
to_chat(jedi, span_userdanger("That was a really dense idea."))
jedi.ghostize()
- var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs
+ var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs
if(rip_u)
rip_u.Remove(jedi)
qdel(rip_u)
diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm
index 57c86303a0ad6..167ee7988b138 100644
--- a/code/modules/power/supermatter/supermatter_hit_procs.dm
+++ b/code/modules/power/supermatter/supermatter_hit_procs.dm
@@ -59,7 +59,7 @@
to_chat(jedi, span_userdanger("That was a really dense idea."))
jedi.investigate_log("had [jedi.p_their()] brain dusted by touching [src] with telekinesis.", INVESTIGATE_DEATHS)
jedi.ghostize()
- var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs
+ var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs
if(rip_u)
rip_u.Remove(jedi)
qdel(rip_u)
@@ -84,6 +84,10 @@
to_chat(user, span_warning("You fail to extract a sliver from \The [src]! \the [scalpel] isn't sharp enough anymore."))
return
+ if(istype(item, /obj/item/hemostat/supermatter))
+ to_chat(user, span_warning("You poke [src] with [item]'s hyper-noblium tips. Nothing happens."))
+ return
+
if(istype(item, /obj/item/destabilizing_crystal))
var/obj/item/destabilizing_crystal/destabilizing_crystal = item
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 5437ee0afd93c..2e2931c835c0d 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -163,7 +163,7 @@
return
var/mob/living/carbon/jedi = user
to_chat(jedi, span_userdanger("That was a shockingly dumb idea."))
- var/obj/item/organ/internal/brain/rip_u = locate(/obj/item/organ/internal/brain) in jedi.organs
+ var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in jedi.organs
jedi.ghostize(jedi)
if(rip_u)
qdel(rip_u)
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index d6fa14771dc7d..cc48d7acc6615 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -49,7 +49,10 @@
update_icon_state()
/obj/item/ammo_box/Destroy(force)
- QDEL_LIST(stored_ammo)
+ for (var/obj/item/ammo_casing/casing as anything in stored_ammo)
+ if (!ispath(casing))
+ qdel(casing)
+ stored_ammo = null
return ..()
/obj/item/ammo_box/Exited(atom/movable/gone, direction)
@@ -71,13 +74,22 @@
readout += "Up to [span_warning("[max_ammo] [caliber] [casing_phrasing]s")] can be found within this magazine. \
\nAccidentally discharging any of these projectiles may void your insurance contract."
- var/obj/item/ammo_casing/mag_ammo = get_round(TRUE)
+ var/obj/item/ammo_casing/mag_ammo = get_and_shuffle_round()
if(istype(mag_ammo))
readout += "\n[mag_ammo.add_notes_ammo()]"
return readout.Join("\n")
+///list of every bullet in the box
+///forces all bullets to lazyload
+/obj/item/ammo_box/proc/ammo_list()
+ for (var/i in 1 to length(stored_ammo))
+ if (ispath(stored_ammo[i]))
+ var/casing_type = stored_ammo[i]
+ stored_ammo[i] = new casing_type(src)
+ return stored_ammo.Copy()
+
/**
* top_off is used to refill the magazine to max, in case you want to increase the size of a magazine with VV then refill it at once
*
@@ -95,68 +107,84 @@
return
for(var/i in max(1, stored_ammo.len + 1) to max_ammo)
- stored_ammo += new round_check(src)
+ stored_ammo += starting ? round_check : new round_check(src)
update_appearance()
-///gets a round from the magazine, if keep is TRUE the round will be moved to the bottom of the list.
-/obj/item/ammo_box/proc/get_round(keep = FALSE)
+///gets a round from the magazine
+/obj/item/ammo_box/proc/get_round()
var/ammo_len = length(stored_ammo)
if (!ammo_len)
return null
var/casing = stored_ammo[ammo_len]
- if (keep)
- stored_ammo -= casing
- stored_ammo.Insert(1,casing)
+ if (ispath(casing))
+ casing = new casing(src)
+ stored_ammo[ammo_len] = casing
+ return casing
+
+/// Gets a round from the magazine and puts it back at the bottom of the ammo list
+/obj/item/ammo_box/proc/get_and_shuffle_round()
+ var/casing = get_round()
+ if (!casing)
+ return null
+ stored_ammo -= casing
+ stored_ammo.Insert(1, casing)
return casing
///puts a round into the magazine
-/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
+/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/new_round, replace_spent = 0)
// Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
- if(!R || !(caliber ? (caliber == R.caliber) : (ammo_type == R.type)))
+ if(!new_round || !(caliber ? (caliber == new_round.caliber) : (ammo_type == new_round.type)))
return FALSE
if (stored_ammo.len < max_ammo)
- stored_ammo += R
- R.forceMove(src)
+ stored_ammo += new_round
+ new_round.forceMove(src)
return TRUE
+ if(!replace_spent)
+ return FALSE
+
//for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
- else if(replace_spent)
- for(var/obj/item/ammo_casing/AC in stored_ammo)
- if(!AC.loaded_projectile)//found a spent ammo
- stored_ammo -= AC
- AC.forceMove(get_turf(src.loc))
-
- stored_ammo += R
- R.forceMove(src)
- return TRUE
+ for(var/obj/item/ammo_casing/casing as anything in stored_ammo)
+ if(ispath(casing) || casing.loaded_projectile)
+ continue
+ //found a spent ammo
+ stored_ammo -= casing
+ casing.forceMove(get_turf(src))
+
+ stored_ammo += new_round
+ new_round.forceMove(src)
+ return TRUE
return FALSE
///Whether or not the box can be loaded, used in overrides
/obj/item/ammo_box/proc/can_load(mob/user)
return TRUE
-/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
+/obj/item/ammo_box/attackby(obj/item/tool, mob/user, params, silent = FALSE, replace_spent = 0)
var/num_loaded = 0
if(!can_load(user))
return
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- var/did_load = give_round(AC, replace_spent)
+
+ if(istype(tool, /obj/item/ammo_box))
+ var/obj/item/ammo_box/other_box = tool
+ for(var/obj/item/ammo_casing/casing in other_box.ammo_list())
+ var/did_load = give_round(casing, replace_spent)
if(did_load)
- AM.stored_ammo -= AC
+ other_box.stored_ammo -= casing
num_loaded++
if(!did_load || !multiload)
break
+
if(num_loaded)
- AM.update_appearance()
- if(isammocasing(A))
- var/obj/item/ammo_casing/AC = A
- if(give_round(AC, replace_spent))
- user.transferItemToLoc(AC, src, TRUE)
+ other_box.update_appearance()
+
+ if(isammocasing(tool))
+ var/obj/item/ammo_casing/casing = tool
+ if(give_round(casing, replace_spent))
+ user.transferItemToLoc(casing, src, TRUE)
num_loaded++
- AC.update_appearance()
+ casing.update_appearance()
if(num_loaded)
if(!silent)
@@ -225,18 +253,15 @@
///Count of number of bullets in the magazine
/obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE)
var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in stored_ammo)
- if(bullet && (bullet.loaded_projectile || countempties))
+ for(var/obj/item/ammo_casing/bullet as anything in stored_ammo)
+ if(ispath(bullet) || bullet && (bullet.loaded_projectile || countempties))
boolets++
return boolets
-///list of every bullet in the magazine
-/obj/item/ammo_box/magazine/proc/ammo_list()
- return stored_ammo.Copy()
-
///drops the entire contents of the magazine on the floor
/obj/item/ammo_box/magazine/proc/empty_magazine()
- var/turf_mag = get_turf(src)
- for(var/obj/item/ammo in stored_ammo)
- ammo.forceMove(turf_mag)
- stored_ammo -= ammo
+ var/turf/turf_mag = get_turf(src)
+ var/obj/item/ammo_casing/casing = get_round()
+ while (casing)
+ casing.forceMove(turf_mag)
+ casing = get_round()
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
index a153c25107aa8..4f666e119b84d 100644
--- a/code/modules/projectiles/boxes_magazines/external/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -47,7 +47,7 @@
if(round_number == i) //only count odd numbers.
continue
var/obj/item/ammo_casing/foam_dart/boolet = stored_ammo[i]
- . += "c20r45-foam-[boolet.tip_color]-[round_number]"
+ . += "c20r45-foam-[boolet::tip_color]-[round_number]"
/obj/item/ammo_box/magazine/toy/smgm45/riot
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
index c60ec087c5108..28df0262352d1 100644
--- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -15,7 +15,14 @@
/obj/item/ammo_box/magazine/internal/cylinder/get_round()
rotate()
- return stored_ammo[1]
+ var/casing = stored_ammo[1]
+ if (ispath(casing))
+ casing = new casing(src)
+ stored_ammo[1] = casing
+ return casing
+
+/obj/item/ammo_box/magazine/internal/cylinder/get_and_shuffle_round()
+ return get_round()
/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
var/b = stored_ammo[1]
@@ -27,7 +34,7 @@
rotate()
/obj/item/ammo_box/magazine/internal/cylinder/ammo_list()
- var/list/no_nulls_ammo = stored_ammo.Copy()
+ var/list/no_nulls_ammo = ..()
list_clear_nulls(no_nulls_ammo)
return no_nulls_ammo
@@ -37,14 +44,15 @@
for(var/i in 1 to stored_ammo.len)
var/obj/item/ammo_casing/bullet = stored_ammo[i]
- if(!bullet || !bullet.loaded_projectile) // found a spent ammo
- stored_ammo[i] = R
- R.forceMove(src)
-
- if(bullet)
- bullet.forceMove(drop_location())
- return TRUE
+ if (istype(bullet) && bullet.loaded_projectile)
+ continue
+ // found a spent ammo
+ stored_ammo[i] = R
+ R.forceMove(src)
+ if(bullet)
+ bullet.forceMove(drop_location())
+ return TRUE
return FALSE
/obj/item/ammo_box/magazine/internal/cylinder/top_off(load_type, starting=FALSE)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 2222140c805a2..4a985507f499d 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -311,7 +311,7 @@
if (chambered || !magazine)
return
if (magazine.ammo_count())
- chambered = magazine.get_round((bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT)
+ chambered = (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT ? magazine.get_and_shuffle_round() : magazine.get_round()
if (bolt_type != BOLT_TYPE_OPEN && !(internal_magazine && bolt_type == BOLT_TYPE_NO_BOLT))
chambered.forceMove(src)
else
@@ -547,13 +547,13 @@
return
if(bolt_type == BOLT_TYPE_NO_BOLT)
var/num_unloaded = 0
- for(var/obj/item/ammo_casing/CB as anything in get_ammo_list(FALSE))
- CB.forceMove(drop_location())
- CB.bounce_away(FALSE, NONE)
+ for(var/obj/item/ammo_casing/casing as anything in get_ammo_list(FALSE))
+ casing.forceMove(drop_location())
+ casing.bounce_away(FALSE, NONE)
num_unloaded++
var/turf/T = get_turf(drop_location())
if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, casing.name)
if (num_unloaded)
balloon_alert(user, "[num_unloaded] [cartridge_wording]\s unloaded")
playsound(user, eject_sound, eject_sound_volume, eject_sound_vary)
@@ -612,7 +612,7 @@
#define BRAINS_BLOWN_THROW_SPEED 1
/obj/item/gun/ballistic/suicide_act(mob/living/user)
- var/obj/item/organ/internal/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/B = user.get_organ_slot(ORGAN_SLOT_BRAIN)
if (B && chambered && chambered.loaded_projectile && can_trigger_gun(user) && chambered.loaded_projectile.damage > 0)
user.visible_message(span_suicide("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!"))
sleep(2.5 SECONDS)
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 03c7f51b936be..6f31a2fa6ca44 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -93,7 +93,7 @@
. = ..()
if(!.)
return
- magazine.get_round(FALSE) //Hack to clear the mag after it's fired
+ magazine.get_round() //Hack to clear the mag after it's fired
/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user)
return //too difficult to remove the rocket with TK
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 1817e7374832d..bb589bc011a14 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -26,10 +26,13 @@
CRASH("revolver tried to chamber a round without a magazine!")
if(chambered)
UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED)
- if(spin_cylinder)
- chambered = magazine.get_round(TRUE)
+ if (spin_cylinder)
+ chambered = magazine.get_round()
else
chambered = magazine.stored_ammo[1]
+ if (ispath(chambered))
+ chambered = new chambered(src)
+ magazine.stored_ammo[1] = chambered
if(chambered)
RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered))
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 07f2f47ef2727..a94d7adabe104 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -764,7 +764,10 @@
if(fired_from)
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original)
if(firer)
+ RegisterSignal(firer, COMSIG_QDELETING, PROC_REF(firer_deleted))
SEND_SIGNAL(firer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, src, fired_from, original)
+ if (original)
+ RegisterSignal(original, COMSIG_QDELETING, PROC_REF(original_deleted))
if(!log_override && firer && original && !do_not_log)
log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]")
//note: mecha projectile logging is handled in /obj/item/mecha_parts/mecha_equipment/weapon/action(). try to keep these messages roughly the sameish just for consistency's sake.
@@ -814,6 +817,14 @@
store_hitscan_collision(point_cache)
return TRUE
+/obj/projectile/proc/firer_deleted(datum/source)
+ SIGNAL_HANDLER
+ firer = null
+
+/obj/projectile/proc/original_deleted(datum/source)
+ SIGNAL_HANDLER
+ original = null
+
/// Same as set_angle, but the reflection continues from the center of the object that reflects it instead of the side
/obj/projectile/proc/set_angle_centered(new_angle)
if(!nondirectional_sprite)
@@ -1064,6 +1075,8 @@
finalize_hitscan_and_generate_tracers()
STOP_PROCESSING(SSprojectiles, src)
cleanup_beam_segments()
+ firer = null
+ original = null
if(trajectory)
QDEL_NULL(trajectory)
return ..()
diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm
index 593bc6d471092..09d0554691b32 100644
--- a/code/modules/reagents/chemistry/holder/holder.dm
+++ b/code/modules/reagents/chemistry/holder/holder.dm
@@ -430,7 +430,7 @@
else
if(!ignore_stomach && (methods & INGEST) && iscarbon(target))
var/mob/living/carbon/eater = target
- var/obj/item/organ/internal/stomach/belly = eater.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = eater.get_organ_slot(ORGAN_SLOT_STOMACH)
if(!belly)
var/expel_amount = round(amount, CHEMICAL_QUANTISATION_LEVEL)
if(expel_amount > 0 )
@@ -779,7 +779,7 @@
*
* Arguments
* - Atom/target: What mob/turf/object is being exposed to reagents? This is your reaction target.
- * - Methods: What reaction type is the reagent itself going to call on the reaction target? Types are TOUCH, INGEST, VAPOR, PATCH, and INJECT.
+ * - Methods: What reaction type is the reagent itself going to call on the reaction target? Types are TOUCH, INGEST, VAPOR, PATCH, INJECT and INHALE.
* - Volume_modifier: What is the reagent volume multiplied by when exposed? Note that this is called on the volume of EVERY reagent in the base body, so factor in your Maximum_Volume if necessary!
* - Show_message: Whether to display anything to mobs when they are exposed.
* - list/datum/reagent/r_to_expose: list of reagents to expose. if null will expose the reagents present in this holder instead
diff --git a/code/modules/reagents/chemistry/holder/mob_life.dm b/code/modules/reagents/chemistry/holder/mob_life.dm
index 890797247716b..bbf12bf956861 100644
--- a/code/modules/reagents/chemistry/holder/mob_life.dm
+++ b/code/modules/reagents/chemistry/holder/mob_life.dm
@@ -19,8 +19,8 @@
expose_temperature(owner.bodytemperature, 0.25)
var/need_mob_update = FALSE
- var/obj/item/organ/internal/stomach/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH)
- var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/stomach/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER)
var/liver_tolerance = 0
var/liver_damage = 0
var/provide_pain_message
diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm
index e43d32c661bd9..73a03e2914bd1 100644
--- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm
@@ -214,7 +214,7 @@
var/result = 0
for(var/datum/reagent/reagent as anything in beaker1?.reagents.reagent_list)
var/datum/reagent/target = reagent
- if(!istype(reagent, /datum/reagent/inverse) && (reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem))
+ if(reagent.inverse_chem && reagent.inverse_chem_val > reagent.purity)
target = GLOB.chemical_reagents_list[reagent.inverse_chem]
if(!result)
@@ -258,17 +258,19 @@
return
for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list)
- //we don't deal chems that are so impure that they are about to become inverted
- if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)
- continue
+ var/datum/reagent/target = reagent
+
+ //inverted chems are dealt with diffrently
+ if(reagent.inverse_chem && reagent.inverse_chem_val > reagent.purity)
+ target = GLOB.chemical_reagents_list[reagent.inverse_chem]
//out of our selected range
- if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range)
+ if(target.mass < lower_mass_range || target.mass > upper_mass_range)
continue
//already at max purity
if((initial(reagent.purity) - reagent.purity) <= 0)
continue
///Roughly 10 - 30s?
- delay_time += (((reagent.mass * reagent.volume) + (reagent.mass * reagent.get_inverse_purity() * 0.1)) * 0.0035) + 10
+ delay_time += (((target.mass * reagent.volume) + (target.mass * reagent.get_inverse_purity() * 0.1)) * 0.0035) + 10
delay_time *= cms_coefficient
@@ -295,7 +297,7 @@
beaker1Data["maxVolume"] = beaker_1_reagents.maximum_volume
var/list/beakerContents = list()
for(var/datum/reagent/reagent as anything in beaker_1_reagents.reagent_list)
- var/log = ""
+ var/log = "Ready"
var/datum/reagent/target = reagent
var/purity = target.purity
var/is_inverse = FALSE
@@ -303,14 +305,11 @@
if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)
purity = target.get_inverse_purity()
target = GLOB.chemical_reagents_list[reagent.inverse_chem]
- log = "Too impure to use" //we don't bother about impure chems
is_inverse = TRUE
else
var/initial_purity = initial(reagent.purity)
if((initial_purity - reagent.purity) <= 0) //already at max purity
log = "Cannot purify above [round(initial_purity * 100)]%"
- else
- log = "Ready"
beakerContents += list(list(
"name" = target.name,
@@ -453,19 +452,31 @@
progress_time = 0
log.Cut()
+ var/datum/reagents/input_reagents = beaker1.reagents
+ var/datum/reagents/output_reagents = beaker2.reagents
for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list)
- //we don't deal chems that are so impure that they are about to become inverted
- if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem)
+ var/product_vol = reagent.volume
+
+ //purify inverted chems to their inverted purity
+ if(reagent.inverse_chem && reagent.inverse_chem_val > reagent.purity)
+ var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem]
+ if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range)
+ continue
+ input_reagents.remove_reagent(reagent.type, product_vol)
+ output_reagents.add_reagent(reagent.inverse_chem, product_vol, reagtemp = input_reagents.chem_temp, added_purity = reagent.get_inverse_purity(), added_ph = reagent.ph)
+ log[reagent.type] = "Purified to [reagent.get_inverse_purity() * 100]%"
continue
+
//out of our selected range
if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range)
continue
+
//already at max purity
var/delta_purity = initial(reagent.purity) - reagent.purity
if(delta_purity <= 0)
continue
+
//add the purified reagent. More impure reagents will yield smaller amounts
- var/product_vol = reagent.volume
beaker1.reagents.remove_reagent(reagent.type, product_vol)
beaker2.reagents.add_reagent(reagent.type, product_vol * (1 - delta_purity), reagtemp = beaker1.reagents.chem_temp, added_purity = initial(reagent.purity), added_ph = reagent.ph)
log[reagent.type] = "Purified to [initial(reagent.purity) * 100]%"
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 87c509bd0a1ed..4ed21b0e29871 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -279,7 +279,7 @@ Primarily used in reagents/reaction_agents
*/
/datum/reagent/proc/get_inverse_purity(purity)
if(!inverse_chem || !inverse_chem_val)
- return
+ return 0
if(!purity)
purity = src.purity
return min(1-inverse_chem_val + purity + 0.01, 1) //Gives inverse reactions a 1% purity threshold for being 100% pure to appease players with OCD.
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index a81dd522b595b..d9ca390f1f4f3 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -158,7 +158,7 @@
return UPDATE_MOB_HEALTH
/datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume)
- if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/internal/stomach)) )
+ if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/stomach)) )
return
A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05)
@@ -421,7 +421,7 @@
var/mob/living/carbon/C = A
if(trans_volume >= 0.4) //prevents cheesing with ultralow doses.
C.adjustToxLoss((-3 * min(2, trans_volume) * REM) * normalise_creation_purity(), required_biotype = affected_biotype) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/internal/liver/L = C.organs_slot[ORGAN_SLOT_LIVER]
+ var/obj/item/organ/liver/L = C.organs_slot[ORGAN_SLOT_LIVER]
if(!L || L.organ_flags & ORGAN_FAILING)
return
conversion_amount = (trans_volume * (min(100 -C.get_organ_loss(ORGAN_SLOT_LIVER), 80) / 100)*normalise_creation_purity()) //the more damaged the liver the worse we metabolize.
diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
index ff30e883f51a7..58bacc57bcfd3 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
@@ -75,7 +75,7 @@
// Volume, power, and server alcohol rate effect how quickly one gets drunk
drinker.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE * REM * seconds_per_tick)
if(boozepwr > 0)
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
var/heavy_drinker_multiplier = (HAS_TRAIT(drinker, TRAIT_HEAVY_DRINKER) ? 0.5 : 1)
if (istype(liver))
if(liver.apply_organ_damage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * heavy_drinker_multiplier * seconds_per_tick, 0))/150)))
@@ -97,19 +97,14 @@
/datum/reagent/consumable/ethanol/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with ethanol isn't quite as good as fuel.
. = ..()
- if(!(methods & (TOUCH|VAPOR|PATCH)))
- return
-
- exposed_mob.adjust_fire_stacks(reac_volume / 15)
-
- if(!iscarbon(exposed_mob))
- return
-
- var/mob/living/carbon/exposed_carbon = exposed_mob
- var/power_multiplier = boozepwr / 65 // Weak alcohol has less sterilizing power
+ if(methods & INGEST)
+ exposed_mob.check_allergic_reaction(ALCOHOL, chance = reac_volume * 5, histamine_add = min(10, reac_volume))
- for(var/datum/surgery/surgery as anything in exposed_carbon.surgeries)
- surgery.speed_modifier = max(0.1 * power_multiplier, surgery.speed_modifier)
+ if(methods & (TOUCH|VAPOR|PATCH))
+ exposed_mob.adjust_fire_stacks(reac_volume / 15)
+ var/power_multiplier = boozepwr / 65 // Weak alcohol has less sterilizing power
+ for(var/datum/surgery/surgery as anything in exposed_mob.surgeries)
+ surgery.speed_modifier = max(0.1 * power_multiplier, surgery.speed_modifier)
/datum/reagent/consumable/ethanol/beer
name = "Beer"
@@ -260,7 +255,7 @@
to_chat(drinker, span_notice("[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]"))
if(SPT_PROB(2.5, seconds_per_tick) && iscarbon(drinker))
- var/obj/item/organ/internal/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = drinker.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes && IS_ORGANIC_ORGAN(eyes)) // doesn't affect robotic eyes
if(drinker.is_blind())
eyes.Remove(drinker)
@@ -667,7 +662,7 @@
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM))
ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]")
if (HAS_TRAIT(drinker, TRAIT_IRRADIATED))
@@ -785,7 +780,7 @@
if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE))
metabolization_rate = 0.8
// if you don't have a liver, or your liver isn't an officer's liver
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
beepsky_hallucination = new()
drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE)
@@ -793,7 +788,7 @@
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired)
. = ..()
drinker.set_jitter_if_lower(4 SECONDS)
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
// if you have a liver and that liver is an officer's liver
if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
if(drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE, required_biotype = affected_biotype))
@@ -810,7 +805,7 @@
/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker)
. = ..()
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
// if you don't have a liver, or your liver isn't an officer's liver
if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
drinker.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC)
@@ -1301,7 +1296,7 @@
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(drinker))
if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE))
return UPDATE_MOB_HEALTH
@@ -1611,7 +1606,7 @@
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired)
. = ..()
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
if(drinker.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE))
return UPDATE_MOB_HEALTH
@@ -1628,7 +1623,7 @@
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired)
. = ..()
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG..
- var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
var/need_mob_update
need_mob_update = drinker.heal_bodypart_damage(2 * REM * seconds_per_tick, 2 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)
@@ -2658,7 +2653,7 @@
return
var/mob/living/carbon/exposed_carbon = exposed_mob
- var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.adjust_charge(reac_volume * 0.02 * ETHEREAL_CHARGE_NORMAL)
@@ -2678,7 +2673,7 @@
return
var/mob/living/carbon/exposed_carbon = exposed_mob
- var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.adjust_charge(reac_volume * 0.05 * ETHEREAL_CHARGE_NORMAL)
@@ -2705,7 +2700,7 @@
return
var/mob/living/carbon/exposed_carbon = exposed_mob
- var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.adjust_charge(reac_volume * 0.1 * ETHEREAL_CHARGE_NORMAL)
diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
index cb400e9ac7dae..f70ffb329d27d 100644
--- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm
@@ -113,7 +113,7 @@
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || is_simian(affected_mob))
if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE))
return UPDATE_MOB_HEALTH
@@ -181,7 +181,7 @@
/datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)))
if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype))
return UPDATE_MOB_HEALTH
@@ -513,7 +513,7 @@
/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER)
if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM))
affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high)
metabolization_rate *= 0.8
@@ -775,7 +775,7 @@
need_mob_update += affected_mob.adjustToxLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)
need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
if(affected_mob.nutrition && (affected_mob.nutrition - 2 > 0))
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM)))
// Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight!
affected_mob.adjust_nutrition(-2 * REM * seconds_per_tick)
@@ -1289,6 +1289,6 @@
return
var/mob/living/carbon/exposed_carbon = exposed_mob
- var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.adjust_charge(reac_volume * 0.02 * ETHEREAL_CHARGE_NORMAL)
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 904d09db7334b..61836a49163e0 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -333,7 +333,7 @@
/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM))
affected_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high)
metabolization_rate *= 0.8
@@ -380,7 +380,7 @@
return
var/mob/living/carbon/carbon_mob = affected_mob
- var/obj/item/organ/internal/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = carbon_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM))
carbon_mob.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high)
metabolization_rate *= 0.8
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index c41ab8ffca521..f17dbf7fe9e6c 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -302,6 +302,11 @@
. = ..()
affected_mob.adjust_drowsiness_up_to((5 SECONDS * REM * seconds_per_tick), 60 SECONDS)
+/datum/reagent/consumable/sugar/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
+ . = ..()
+ if(methods & INGEST)
+ exposed_mob.check_allergic_reaction(SUGAR, chance = reac_volume * 10, histamine_add = min(10, reac_volume * 2))
+
/datum/reagent/consumable/virus_food
name = "Virus Food"
description = "A mixture of water and milk. Virus cells can use this mixture to reproduce."
@@ -417,7 +422,7 @@
return
var/mob/living/carbon/victim = exposed_mob
- if(methods & (TOUCH|VAPOR))
+ if(methods & (TOUCH|VAPOR|INHALE))
//check for protection
//actually handle the pepperspray effects
if (!victim.is_pepper_proof()) // you need both eye and mouth protection
@@ -538,7 +543,7 @@
affected_mob.Paralyze(10)
affected_mob.set_jitter_if_lower(20 SECONDS)
else
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM))
if(SPT_PROB(10, seconds_per_tick)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate
if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE))
@@ -557,7 +562,7 @@
return
var/mob/living/carbon/victim = exposed_mob
- if(methods & (TOUCH | VAPOR))
+ if(methods & (TOUCH | VAPOR | INHALE))
var/tear_proof = victim.is_eyes_covered()
if (!tear_proof)
to_chat(exposed_mob, span_warning("Your eyes sting!"))
@@ -573,7 +578,7 @@
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM))
if(affected_mob.heal_bodypart_damage(brute = 1 * REM * seconds_per_tick, burn = 1 * REM * seconds_per_tick, updating_health = FALSE))
return UPDATE_MOB_HEALTH
@@ -943,11 +948,11 @@
/datum/reagent/consumable/liquidelectricity/enriched/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works.
. = ..()
- if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob))
+ if(!(methods & (INGEST|INJECT|PATCH|INHALE)) || !iscarbon(exposed_mob))
return
var/mob/living/carbon/exposed_carbon = exposed_mob
- var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(stomach))
stomach.adjust_charge(reac_volume * 0.03 * ETHEREAL_CHARGE_NORMAL)
@@ -1008,6 +1013,11 @@
reagent_state = SOLID
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
+/datum/reagent/consumable/caramel/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
+ . = ..()
+ if(methods & INGEST)
+ exposed_mob.check_allergic_reaction(SUGAR, chance = reac_volume * 10, histamine_add = min(10, reac_volume * 2))
+
/datum/reagent/consumable/char
name = "Char"
description = "Essence of the grill. Has strange properties when overdosed."
diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm
index 20cd80d9c5b0e..b9c0ee0522dfa 100644
--- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm
@@ -16,7 +16,7 @@
/datum/reagent/impurity/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
var/need_mob_update
if(liver)//Though, lets be safe
diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
index 3fd9188e8d4f0..b8a2250722534 100644
--- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
@@ -141,21 +141,21 @@ Basically, we fill the time between now and 2s from now with hands based off the
return
RegisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ))
RegisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ))
- var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
this_liver.alcohol_tolerance *= 2
/datum/reagent/inverse/libitoil/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/liver))
+ if(!istype(organ, /obj/item/organ/liver))
return
- var/obj/item/organ/internal/liver/this_liver = organ
+ var/obj/item/organ/liver/this_liver = organ
this_liver.alcohol_tolerance *= 2
/datum/reagent/inverse/libitoil/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/liver))
+ if(!istype(organ, /obj/item/organ/liver))
return
- var/obj/item/organ/internal/liver/this_liver = organ
+ var/obj/item/organ/liver/this_liver = organ
this_liver.alcohol_tolerance /= 2
/datum/reagent/inverse/libitoil/on_mob_delete(mob/living/affected_mob)
@@ -163,7 +163,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
var/mob/living/carbon/consumer = affected_mob
UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN)
UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN)
- var/obj/item/organ/internal/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/this_liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER)
if(!this_liver)
return
this_liver.alcohol_tolerance /= 2
@@ -213,35 +213,6 @@ Basically, we fill the time between now and 2s from now with hands based off the
. = ..()
affected_mob.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
-//failed
-/datum/reagent/inverse/ichiyuri
- name = "Ichiyuri"
- description = "Prolonged exposure to this chemical can cause an overwhelming urge to itch oneself."
- reagent_state = LIQUID
- color = "#C8A5DC"
- ph = 1.7
- addiction_types = list(/datum/addiction/medicine = 2.5)
- tox_damage = 0.1
- ///Probability of scratch - increases as a function of time
- var/resetting_probability = 0
- ///Prevents message spam
- var/spammer = 0
-
-//Just the removed itching mechanism - omage to its origins.
-/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
- . = ..()
- if(prob(resetting_probability) && !(HAS_TRAIT(affected_mob, TRAIT_RESTRAINED) || affected_mob.incapacitated))
- . = TRUE
- if(spammer < world.time)
- to_chat(affected_mob,span_warning("You can't help but itch yourself."))
- spammer = world.time + (10 SECONDS)
- var/scab = rand(1,7)
- if(affected_mob.adjustBruteLoss(scab*REM, updating_health = FALSE))
- . = UPDATE_MOB_HEALTH
- affected_mob.bleed(scab)
- resetting_probability = 0
- resetting_probability += (5*((current_cycle-1)/10) * seconds_per_tick) // 10 iterations = >51% to itch
-
//Aiuri
//inverse
/datum/reagent/inverse/aiuri
@@ -366,19 +337,19 @@ Basically, we fill the time between now and 2s from now with hands based off the
. = ..()
RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ))
RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ))
- var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
if(!lungs)
return
apply_lung_levels(lungs)
/datum/reagent/inverse/healing/convermol/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/lungs))
+ if(!istype(organ, /obj/item/organ/lungs))
return
- var/obj/item/organ/internal/lungs/lungs = organ
+ var/obj/item/organ/lungs/lungs = organ
apply_lung_levels(lungs)
-/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/internal/lungs/lungs)
+/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/lungs/lungs)
cached_heat_level_1 = lungs.heat_level_1_threshold
cached_heat_level_2 = lungs.heat_level_2_threshold
cached_heat_level_3 = lungs.heat_level_3_threshold
@@ -396,12 +367,12 @@ Basically, we fill the time between now and 2s from now with hands based off the
/datum/reagent/inverse/healing/convermol/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/lungs))
+ if(!istype(organ, /obj/item/organ/lungs))
return
- var/obj/item/organ/internal/lungs/lungs = organ
+ var/obj/item/organ/lungs/lungs = organ
restore_lung_levels(lungs)
-/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/internal/lungs/lungs)
+/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/lungs/lungs)
lungs.heat_level_1_threshold = cached_heat_level_1
lungs.heat_level_2_threshold = cached_heat_level_2
lungs.heat_level_3_threshold = cached_heat_level_3
@@ -413,7 +384,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
. = ..()
UnregisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN)
UnregisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN)
- var/obj/item/organ/internal/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
if(!lungs)
return
restore_lung_levels(lungs)
@@ -523,7 +494,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
/datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/affected_mob, seconds_per_tick)
. = ..()
- var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(!heart || heart.organ_flags & ORGAN_FAILING)
return
metabolization_rate = 0.2 * REM
@@ -557,7 +528,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium)
if(affected_mob.health < HEALTH_THRESHOLD_FULLCRIT)
affected_mob.add_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium)
- var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(!heart || heart.organ_flags & ORGAN_FAILING)
remove_buffs(affected_mob)
if(need_mob_update)
@@ -566,7 +537,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
/datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/affected_mob)
. = ..()
remove_buffs(affected_mob)
- var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(affected_mob.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500
explosion(affected_mob, light_impact_range = 1, explosion_cause = src)
qdel(heart)
@@ -576,7 +547,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
. = ..()
if(!back_from_the_dead)
return ..()
- var/obj/item/organ/internal/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(!heart) //No heart? No life!
REMOVE_TRAIT(affected_mob, TRAIT_NODEATH, type)
affected_mob.stat = DEAD
@@ -661,7 +632,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
/datum/brain_trauma/special/honorbound, // Designed to be chaplain exclusive
)
traumalist -= forbiddentraumas
- var/obj/item/organ/internal/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN)
traumalist = shuffle(traumalist)
for(var/trauma in traumalist)
if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC))
@@ -693,7 +664,7 @@ Basically, we fill the time between now and 2s from now with hands based off the
if(!iscarbon(affected_mob))
return
var/mob/living/carbon/carbon_mob = affected_mob
- var/obj/item/organ/internal/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/affected_heart = carbon_mob.get_organ_slot(ORGAN_SLOT_HEART)
if(isnull(affected_heart))
return
carbon_mob.AddComponent(/datum/component/manual_heart)
diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm
index 0872fa6658815..4e904dcf684d3 100644
--- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm
@@ -29,7 +29,7 @@
/datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes?.apply_organ_damage(0.5 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags))
return UPDATE_MOB_HEALTH
@@ -59,7 +59,7 @@
/datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, seconds_per_tick)
. = ..()
- var/obj/item/organ/internal/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = owner.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
if(SPT_PROB(4.0, seconds_per_tick))
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 64626883b3c47..87866b354e3f0 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -355,7 +355,7 @@
if(!iscarbon(exposed_mob) || (exposed_mob.stat == DEAD))
return
- if(methods & (INGEST|VAPOR|INJECT))
+ if(methods & (INGEST|VAPOR|INJECT|INHALE))
exposed_mob.adjust_nutrition(-5)
if(show_message)
to_chat(exposed_mob, span_warning("Your stomach feels empty and cramps!"))
@@ -559,7 +559,7 @@
var/need_mob_update
need_mob_update = affected_mob.adjustOxyLoss(-3 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
if(affected_mob.losebreath >= 4)
- var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type // use lungs' respiration type or mob_respiration_type if no lungs
if(our_respiration_type & affected_respiration_type)
affected_mob.losebreath -= 2 * REM * seconds_per_tick
@@ -698,33 +698,33 @@
return
RegisterSignal(affected_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ))
RegisterSignal(affected_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ))
- var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes)
return
improve_eyesight(affected_mob, eyes)
-/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/affected_mob, obj/item/organ/internal/eyes/eyes)
+/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/affected_mob, obj/item/organ/eyes/eyes)
delta_light = creation_purity*10
eyes.lighting_cutoff += delta_light
affected_mob.update_sight()
-/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/affected_mob, obj/item/organ/internal/eyes/eyes)
+/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/affected_mob, obj/item/organ/eyes/eyes)
eyes.lighting_cutoff -= delta_light
affected_mob.update_sight()
/datum/reagent/medicine/oculine/proc/on_gained_organ(mob/affected_mob, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/eyes))
+ if(!istype(organ, /obj/item/organ/eyes))
return
- var/obj/item/organ/internal/eyes/affected_eyes = organ
+ var/obj/item/organ/eyes/affected_eyes = organ
improve_eyesight(affected_mob, affected_eyes)
/datum/reagent/medicine/oculine/proc/on_removed_organ(mob/prev_affected_mob, obj/item/organ/organ)
SIGNAL_HANDLER
- if(!istype(organ, /obj/item/organ/internal/eyes))
+ if(!istype(organ, /obj/item/organ/eyes))
return
- var/obj/item/organ/internal/eyes/eyes = organ
+ var/obj/item/organ/eyes/eyes = organ
restore_eyesight(prev_affected_mob, eyes)
/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
@@ -732,7 +732,7 @@
var/normalized_purity = normalise_creation_purity()
affected_mob.adjust_temp_blindness(-4 SECONDS * REM * seconds_per_tick * normalized_purity)
affected_mob.adjust_eye_blur(-4 SECONDS * REM * seconds_per_tick * normalized_purity)
- var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
if(eyes)
// Healing eye damage will cure nearsightedness and blindness from ... eye damage
if(eyes.apply_organ_damage(-2 * REM * seconds_per_tick * normalise_creation_purity(), required_organ_flag = affected_organ_flags))
@@ -749,7 +749,7 @@
/datum/reagent/medicine/oculine/on_mob_delete(mob/living/affected_mob)
. = ..()
- var/obj/item/organ/internal/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = affected_mob.get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes)
return
restore_eyesight(affected_mob, eyes)
@@ -786,7 +786,7 @@
/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = affected_mob.get_organ_slot(ORGAN_SLOT_EARS)
if(!ears)
return
ears.adjustEarDamage(-4 * REM * seconds_per_tick * normalise_creation_purity(), -4 * REM * seconds_per_tick * normalise_creation_purity())
@@ -819,7 +819,7 @@
need_mob_update += affected_mob.adjustOxyLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
if(need_mob_update)
. = UPDATE_MOB_HEALTH
- var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type
if(our_respiration_type & affected_respiration_type)
affected_mob.losebreath = 0
@@ -859,7 +859,7 @@
need_mob_update += affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype)
need_mob_update += affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
if(affected_mob.losebreath >= 4)
- var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type
if(our_respiration_type & affected_respiration_type)
affected_mob.losebreath -= 2 * REM * seconds_per_tick
@@ -886,7 +886,7 @@
var/need_mob_update
need_mob_update = affected_mob.adjustStaminaLoss(2.5 * REM * seconds_per_tick, updating_stamina = FALSE)
need_mob_update += affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)
- var/obj/item/organ/internal/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/affected_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
var/our_respiration_type = affected_lungs ? affected_lungs.respiration_type : affected_mob.mob_respiration_type
if(our_respiration_type & affected_respiration_type)
affected_mob.losebreath++
@@ -954,7 +954,7 @@
exposed_mob.visible_message(span_warning("[exposed_mob]'s body does not react..."))
return
- if(iscarbon(exposed_mob) && !(methods & INGEST)) //simplemobs can still be splashed
+ if(iscarbon(exposed_mob) && !(methods & (INGEST|INHALE))) //simplemobs can still be splashed
return ..()
if(HAS_TRAIT(exposed_mob, TRAIT_HUSK))
@@ -1705,10 +1705,10 @@
affected_mob.adjustOxyLoss(rand(3, 4) * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
if(prob(50))
- var/obj/item/organ/internal/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/our_lungs = affected_mob.get_organ_slot(ORGAN_SLOT_LUNGS)
our_lungs.apply_organ_damage(1 * REM * seconds_per_tick)
else
- var/obj/item/organ/internal/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/our_heart = affected_mob.get_organ_slot(ORGAN_SLOT_HEART)
our_heart.apply_organ_damage(1 * REM * seconds_per_tick)
return UPDATE_MOB_HEALTH
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 14a592aa685f4..e434161b03d70 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -42,7 +42,7 @@
continue
exposed_mob.ForceContractDisease(strain)
- else if((methods & VAPOR) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ else if((methods & (VAPOR|INHALE)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
if(!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_LUNGS))
continue
@@ -51,7 +51,7 @@
exposed_mob.ContactContractDisease(strain)
if(data && data["resistances"])
- if(methods & (INGEST|INJECT)) //have to inject or ingest it. no curefoam/cheap curesprays
+ if(methods & (INGEST|INJECT|INHALE)) //have to inject, inhale or ingest it. no curefoam/cheap curesprays
for(var/stuff in exposed_mob.diseases)
var/datum/disease/infection = stuff
if(infection.GetDiseaseID() in data["resistances"])
@@ -1313,7 +1313,7 @@
/datum/reagent/fuel/on_mob_life(mob/living/carbon/victim, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = victim.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = victim.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM))
return
if(victim.adjustToxLoss(0.5 * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype))
@@ -1449,10 +1449,10 @@
/datum/reagent/cyborg_mutation_nanomachines/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0)
. = ..()
- var/obj/item/organ/internal/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = exposed_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM))
return
- if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
+ if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
exposed_mob.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE)
/datum/reagent/xenomicrobes
@@ -1464,7 +1464,7 @@
/datum/reagent/xenomicrobes/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0)
. = ..()
- if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
+ if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
exposed_mob.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE)
/datum/reagent/fungalspores
@@ -1477,7 +1477,7 @@
/datum/reagent/fungalspores/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0)
. = ..()
- if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
+ if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
exposed_mob.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE)
/datum/reagent/snail
@@ -1490,7 +1490,7 @@
/datum/reagent/snail/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0)
. = ..()
- if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
+ if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
exposed_mob.ForceContractDisease(new /datum/disease/gastrolosis(), FALSE, TRUE)
/datum/reagent/fluorosurfactant//foam precursor
@@ -1586,10 +1586,13 @@
/datum/reagent/nitrous_oxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
. = ..()
- if(methods & VAPOR)
+ if(methods & (VAPOR|INHALE))
// apply 2 seconds of drowsiness per unit applied, with a min duration of 4 seconds
var/drowsiness_to_apply = max(round(reac_volume, 1) * 2 SECONDS, 4 SECONDS)
exposed_mob.adjust_drowsiness(drowsiness_to_apply)
+ if(methods & INHALE)
+ exposed_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * reac_volume, required_organ_flag = affected_organ_flags)
+ exposed_mob.adjust_hallucinations(10 SECONDS * reac_volume)
/datum/reagent/nitrous_oxide/on_mob_metabolize(mob/living/affected_mob)
. = ..()
@@ -1945,7 +1948,7 @@
/datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
. = ..()
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver)
// Heads of staff and the captain have a "royal metabolism"
if(HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM))
@@ -2117,7 +2120,7 @@
name = "Acetone Oxide"
description = "Enslaved oxygen"
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#966199cb"
taste_description = "acid"
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
@@ -2164,7 +2167,7 @@
description = "Thoroughly sample the rainbow."
reagent_state = LIQUID
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
- color = "#C8A5DC"
+ color = COLOR_GRAY
taste_description = "rainbows"
var/can_colour_mobs = TRUE
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
@@ -2200,7 +2203,7 @@
description = "Has a high chance of making you look like a mad scientist."
reagent_state = LIQUID
var/list/potential_colors = list("#00aadd","#aa00ff","#ff7733","#dd1144","#dd1144","#00bb55","#00aadd","#ff7733","#ffcc22","#008844","#0055ee","#dd2222","#ffaa00") // fucking hair code
- color = "#C8A5DC"
+ color = COLOR_GRAY
taste_description = "sourness"
penetrates_skin = NONE
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
@@ -2436,7 +2439,7 @@
. = ..()
// Silently add the zombie infection organ to be activated upon death
if(!exposed_mob.get_organ_slot(ORGAN_SLOT_ZOMBIE))
- var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new()
+ var/obj/item/organ/zombie_infection/nodamage/ZI = new()
ZI.Insert(exposed_mob)
/datum/reagent/magillitis
@@ -2612,7 +2615,7 @@
/datum/reagent/gondola_mutation_toxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0)
. = ..()
- if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
+ if((methods & (PATCH|INGEST|INJECT|INHALE)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection))))
exposed_mob.ForceContractDisease(new gondola_disease, FALSE, TRUE)
@@ -2931,8 +2934,10 @@
/datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
. = ..()
- if(!iscarbon(exposed_mob) || (methods & (INGEST|INJECT)))
+ if(!iscarbon(exposed_mob))
return
+ if(methods & INGEST)
+ exposed_mob.check_allergic_reaction(BUGS, chance = reac_volume * 10, histamine_add = min(10, reac_volume))
if(methods & (PATCH|TOUCH|VAPOR))
amount_left = round(reac_volume,0.1)
exposed_mob.apply_status_effect(status_effect, amount_left)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 39b477a51a572..1c340cbc657a7 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -54,7 +54,7 @@
. = ..()
if(!exposed_mob.can_mutate())
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|PATCH|INJECT)))
+ if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|PATCH|INJECT|INHALE)))
exposed_mob.random_mutate_unique_identity()
exposed_mob.random_mutate_unique_features()
if(prob(98))
@@ -258,7 +258,7 @@
/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob)
. = ..()
holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type)
- if((data?["method"] & INGEST) && holder_mob.stat != DEAD)
+ if((data?["method"] & (INGEST|INHALE)) && holder_mob.stat != DEAD)
holder_mob.fakedeath(type)
/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/affected_mob)
@@ -268,10 +268,10 @@
/datum/reagent/toxin/zombiepowder/on_transfer(atom/target_atom, methods, trans_volume)
. = ..()
var/datum/reagent/zombiepowder = target_atom.reagents.has_reagent(/datum/reagent/toxin/zombiepowder)
- if(!zombiepowder || !(methods & INGEST))
+ if(!zombiepowder || !(methods & (INGEST|INHALE)))
return
LAZYINITLIST(zombiepowder.data)
- zombiepowder.data["method"] |= INGEST
+ zombiepowder.data["method"] |= (INGEST|INHALE)
/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired)
. = ..()
@@ -655,7 +655,7 @@
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
- var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice
if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) //it counteracts its own toxin damage.
return UPDATE_MOB_HEALTH
@@ -1085,11 +1085,11 @@
. = ..()
if(!istype(exposed_carbon))
return
- var/obj/item/organ/internal/liver/liver = exposed_carbon.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = exposed_carbon.get_organ_slot(ORGAN_SLOT_LIVER)
if(liver && HAS_TRAIT(liver, TRAIT_HUMAN_AI_METABOLISM))
return
reac_volume = round(reac_volume,0.1)
- if(methods & INGEST)
+ if(methods & (INGEST|INHALE))
exposed_carbon.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr), required_bodytype = affected_bodytype)
return
if(methods & INJECT)
@@ -1336,7 +1336,7 @@
if(SPT_PROB(20, seconds_per_tick))
affected_mob.set_jitter_if_lower(rand(2 SECONDS, 3 SECONDS) * REM * seconds_per_tick)
if(SPT_PROB(5, seconds_per_tick))
- var/obj/item/organ/internal/tongue/tongue = affected_mob.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = affected_mob.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
to_chat(affected_mob, span_warning("Your [tongue.name] feels numb..."))
affected_mob.set_slurring_if_lower(5 SECONDS * REM * seconds_per_tick)
diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm
index 8c093888028e9..b34461f99b449 100644
--- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm
+++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm
@@ -43,7 +43,7 @@
//This looks rediculous, but expose is usually called from the donor reagents datum - we want to edit the post exposure version present in the mob.
var/mob/living/carbon/carby = living_mob
//But because carbon mobs have stomachs we have to search in there because we're ingested
- var/obj/item/organ/internal/stomach/stomach = carby.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/stomach = carby.get_organ_slot(ORGAN_SLOT_STOMACH)
var/datum/reagent/eigenstate/eigen
if(stomach)
eigen = stomach.reagents.has_reagent(/datum/reagent/eigenstate)
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 4670aebdd6e0a..8816ec87dfb60 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -314,8 +314,8 @@
// Not quite the same if the reaction is in their stomach; they'll throw up
// from any explosion, but it'll only make them puke up everything in their
// stomach
- else if (istype(holder.my_atom, /obj/item/organ/internal/stomach))
- var/obj/item/organ/internal/stomach/indigestion = holder.my_atom
+ else if (istype(holder.my_atom, /obj/item/organ/stomach))
+ var/obj/item/organ/stomach/indigestion = holder.my_atom
if(power < 1)
return
indigestion.owner?.vomit(MOB_VOMIT_MESSAGE | MOB_VOMIT_FORCE, lost_nutrition = 150, distance = 5, purge_ratio = 1)
diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm
index 368d299fb406f..b4493eb2ae4ab 100644
--- a/code/modules/reagents/reagent_containers/cups/_cup.dm
+++ b/code/modules/reagents/reagent_containers/cups/_cup.dm
@@ -19,6 +19,10 @@
var/gulp_size = 5
///Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it.
var/isGlass = FALSE
+ ///What kind of chem transfer method does this cup use. Defaults to INGEST
+ var/reagent_consumption_method = INGEST
+ ///What sound does our consumption play on consuming from the container?
+ var/consumption_sound = 'sound/items/drink.ogg'
/obj/item/reagent_containers/cup/examine(mob/user)
. = ..()
@@ -86,9 +90,9 @@
SEND_SIGNAL(src, COMSIG_GLASS_DRANK, target_mob, user)
var/fraction = min(gulp_size/reagents.total_volume, 1)
- reagents.trans_to(target_mob, gulp_size, transferred_by = user, methods = INGEST)
+ reagents.trans_to(target_mob, gulp_size, transferred_by = user, methods = reagent_consumption_method)
checkLiked(fraction, target_mob)
- playsound(target_mob.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
+ playsound(target_mob.loc, consumption_sound, rand(10,50), TRUE)
if(!iscarbon(target_mob))
return
var/mob/living/carbon/carbon_drinker = target_mob
diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm
index 4c137786baed8..717e2248ddb01 100644
--- a/code/modules/reagents/reagent_containers/cups/drinks.dm
+++ b/code/modules/reagents/reagent_containers/cups/drinks.dm
@@ -264,11 +264,12 @@
cap_lost = TRUE
else
to_chat(user, span_notice("You remove the cap from [src]."))
- playsound(loc, 'sound/effects/can/can_open1.ogg', 50, TRUE)
+ playsound(loc, 'sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg', 50, TRUE)
else
cap_on = TRUE
spillable = FALSE
to_chat(user, span_notice("You put the cap on [src]."))
+ playsound(loc, 'sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg', 50, TRUE)
update_appearance()
return CLICK_ACTION_SUCCESS
diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm
index dcf56faec4c80..5712d383f0b57 100644
--- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm
+++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm
@@ -693,7 +693,7 @@
return
//The bonus to success chance that the user gets for being a command role
- var/obj/item/organ/internal/liver/liver = user.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/liver = user.get_organ_slot(ORGAN_SLOT_LIVER)
var/command_bonus = (!isnull(liver) && HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM)) ? 20 : 0
//The bonus to success chance that the user gets for having a sabrage skillchip installed/otherwise having the trait through other means
diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm
index 7772a64f60e3d..a23e9c323545b 100644
--- a/code/modules/reagents/reagent_containers/cups/soda.dm
+++ b/code/modules/reagents/reagent_containers/cups/soda.dm
@@ -118,7 +118,7 @@
if(iter_mob != target)
iter_mob.add_mood_event("observed_soda_spill", /datum/mood_event/observed_soda_spill, target, src)
- playsound(src, 'sound/effects/can/can_pop.ogg', 80, TRUE)
+ playsound(src, 'sound/items/can/can_pop.ogg', 80, TRUE)
if(!hide_message)
visible_message(span_danger("[src] spills over, fizzing its contents all over [target]!"))
spillable = TRUE
@@ -151,7 +151,7 @@
/obj/item/reagent_containers/cup/soda_cans/attack_self_secondary(mob/user)
if(!is_drainable())
- playsound(src, 'sound/effects/can/can_shake.ogg', 50, TRUE)
+ playsound(src, 'sound/items/can/can_shake.ogg', 50, TRUE)
user.visible_message(span_danger("[user] shakes [src]!"), span_danger("You shake up [src]!"), vision_distance=2)
fizziness += SODA_FIZZINESS_SHAKE
return
diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm
index 844c62956e555..66c1f573d773b 100644
--- a/code/modules/reagents/withdrawal/generic_addictions.dm
+++ b/code/modules/reagents/withdrawal/generic_addictions.dm
@@ -111,7 +111,7 @@
to_chat(affected_human, span_warning("Your chin itches."))
affected_human.set_facial_hairstyle("Beard (Full)", update = TRUE)
//Only like gross food
- var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
return
tongue.liked_foodtypes = GROSS
@@ -124,7 +124,7 @@
return
to_chat(affected_carbon, span_warning("You feel yourself adapt to the darkness."))
var/mob/living/carbon/human/affected_human = affected_carbon
- var/obj/item/organ/internal/eyes/empowered_eyes = affected_human.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/empowered_eyes = affected_human.get_organ_by_type(/obj/item/organ/eyes)
if(empowered_eyes)
ADD_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction")
empowered_eyes?.refresh()
@@ -146,7 +146,7 @@
. = ..()
affected_carbon.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type)
//restore tongue's tastes
- var/obj/item/organ/internal/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = affected_carbon.get_organ_slot(ORGAN_SLOT_TONGUE)
if(tongue)
tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
@@ -155,7 +155,7 @@
return
var/mob/living/carbon/human/affected_human = affected_carbon
REMOVE_TRAIT(affected_human, TRAIT_NIGHT_VISION, "maint_drug_addiction")
- var/obj/item/organ/internal/eyes/eyes = affected_human.get_organ_by_type(/obj/item/organ/internal/eyes)
+ var/obj/item/organ/eyes/eyes = affected_human.get_organ_by_type(/obj/item/organ/eyes)
eyes?.refresh()
///Makes you a hypochondriac - I'd like to call it hypochondria, but "I could use some hypochondria" doesn't work
@@ -195,7 +195,7 @@
if(!HAS_TRAIT(affected_carbon, TRAIT_RESISTCOLD))
possibilities += /datum/hallucination/fake_alert/cold
- var/obj/item/organ/internal/lungs/lungs = affected_carbon.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/lungs = affected_carbon.get_organ_slot(ORGAN_SLOT_LUNGS)
if(lungs)
if(lungs.safe_oxygen_min)
possibilities += /datum/hallucination/fake_alert/need_oxygen
diff --git a/code/modules/religion/burdened/burdened_trauma.dm b/code/modules/religion/burdened/burdened_trauma.dm
index 51e763dbcb570..ebdfcda656505 100644
--- a/code/modules/religion/burdened/burdened_trauma.dm
+++ b/code/modules/religion/burdened/burdened_trauma.dm
@@ -153,8 +153,8 @@
if(!(organ.slot in critical_slots))
return FALSE
- else if(istype(organ, /obj/item/organ/internal/eyes))
- var/obj/item/organ/internal/eyes/eyes = organ
+ else if(istype(organ, /obj/item/organ/eyes))
+ var/obj/item/organ/eyes/eyes = organ
if(eyes.tint < TINT_BLIND) //unless you were already blinded by them (flashlight eyes), this is adding burden!
return TRUE
return FALSE
diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm
index f111d04f93013..77cfcdaac2494 100644
--- a/code/modules/religion/burdened/psyker.dm
+++ b/code/modules/religion/burdened/psyker.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/brain/psyker
+/obj/item/organ/brain/psyker
name = "psyker brain"
desc = "This brain is blue, split into two hemispheres, and has immense psychic powers. What kind of monstrosity would use that?"
icon_state = "brain-psyker"
@@ -10,17 +10,17 @@
organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP, TRAIT_ANTIMAGIC_NO_SELFBLOCK)
w_class = WEIGHT_CLASS_NORMAL
-/obj/item/organ/internal/brain/psyker/on_mob_insert(mob/living/carbon/inserted_into)
+/obj/item/organ/brain/psyker/on_mob_insert(mob/living/carbon/inserted_into)
. = ..()
inserted_into.AddComponent(/datum/component/echolocation, blocking_trait = TRAIT_DUMB, echo_group = "psyker", echo_icon = "psyker", color_path = /datum/client_colour/psyker)
inserted_into.AddComponent(/datum/component/anti_magic, antimagic_flags = MAGIC_RESISTANCE_MIND)
-/obj/item/organ/internal/brain/psyker/on_mob_remove(mob/living/carbon/removed_from)
+/obj/item/organ/brain/psyker/on_mob_remove(mob/living/carbon/removed_from)
. = ..()
qdel(removed_from.GetComponent(/datum/component/echolocation))
qdel(removed_from.GetComponent(/datum/component/anti_magic))
-/obj/item/organ/internal/brain/psyker/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/brain/psyker/on_life(seconds_per_tick, times_fired)
. = ..()
var/obj/item/bodypart/head/psyker/psyker_head = owner.get_bodypart(zone)
if(istype(psyker_head))
@@ -72,15 +72,15 @@
/// Proc with no side effects that turns someone into a psyker. returns FALSE if it could not psykerize.
/mob/living/carbon/human/proc/psykerize()
var/obj/item/bodypart/head/old_head = get_bodypart(BODY_ZONE_HEAD)
- var/obj/item/organ/internal/brain/old_brain = get_organ_slot(ORGAN_SLOT_BRAIN)
- var/obj/item/organ/internal/old_eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/brain/old_brain = get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/old_eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(stat == DEAD || !old_head || !old_brain)
return FALSE
var/obj/item/bodypart/head/psyker/psyker_head = new()
if(!psyker_head.replace_limb(src, special = TRUE))
return FALSE
qdel(old_head)
- var/obj/item/organ/internal/brain/psyker/psyker_brain = new()
+ var/obj/item/organ/brain/psyker/psyker_brain = new()
old_brain.before_organ_replacement(psyker_brain)
old_brain.Remove(src, special = TRUE, movement_flags = NO_ID_TRANSFER)
qdel(old_brain)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index b1c055ec9bddb..58209cac74ae5 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -169,7 +169,7 @@
//first we determine if we can charge them
var/did_we_charge = FALSE
- var/obj/item/organ/internal/stomach/ethereal/eth_stomach = blessed.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/ethereal/eth_stomach = blessed.get_organ_slot(ORGAN_SLOT_STOMACH)
if(istype(eth_stomach))
eth_stomach.adjust_charge(0.06 * STANDARD_CELL_CHARGE)
did_we_charge = TRUE
diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm
index b54c4e09b2951..cd0fabba84974 100644
--- a/code/modules/religion/rites.dm
+++ b/code/modules/religion/rites.dm
@@ -132,31 +132,31 @@
list(
// Arms
list(
- /obj/item/organ/internal/cyberimp/arm/combat = 1,
- /obj/item/organ/internal/cyberimp/arm/surgery = 1000000,
- /obj/item/organ/internal/cyberimp/arm/toolset = 1500000,
+ /obj/item/organ/cyberimp/arm/combat = 1,
+ /obj/item/organ/cyberimp/arm/surgery = 1000000,
+ /obj/item/organ/cyberimp/arm/toolset = 1500000,
) = 15,
// Eyes
list(
- /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic = 1,
- /obj/item/organ/internal/cyberimp/eyes/hud/medical = 1,
- /obj/item/organ/internal/eyes/robotic/glow = 1,
- /obj/item/organ/internal/eyes/robotic/shield = 2,
+ /obj/item/organ/cyberimp/eyes/hud/diagnostic = 1,
+ /obj/item/organ/cyberimp/eyes/hud/medical = 1,
+ /obj/item/organ/eyes/robotic/glow = 1,
+ /obj/item/organ/eyes/robotic/shield = 2,
) = 15,
// Chest
list(
- /obj/item/organ/internal/cyberimp/chest/reviver = 1,
- /obj/item/organ/internal/cyberimp/chest/thrusters = 2,
+ /obj/item/organ/cyberimp/chest/reviver = 1,
+ /obj/item/organ/cyberimp/chest/thrusters = 2,
) = 9,
// Brain / Head
list(
- /obj/item/organ/internal/cyberimp/brain/anti_drop = 50,
- /obj/item/organ/internal/cyberimp/brain/connector = 50,
- /obj/item/organ/internal/cyberimp/brain/anti_stun = 10,
+ /obj/item/organ/cyberimp/brain/anti_drop = 50,
+ /obj/item/organ/cyberimp/brain/connector = 50,
+ /obj/item/organ/cyberimp/brain/anti_stun = 10,
) = 10,
// Misc
list(
- /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 1,
+ /obj/item/organ/cyberimp/mouth/breathing_tube = 1,
) = 5,
)
)
@@ -264,7 +264,7 @@
if(!HAS_TRAIT_FROM(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation"))
to_chat(user, span_warning("You need to adapt to maintenance first."))
return FALSE
- var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/adapted = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/night_vision/maintenance_adapted/adapted = user.get_organ_slot(ORGAN_SLOT_EYES)
if(adapted && istype(adapted))
to_chat(user, span_warning("Your eyes are already adapted!"))
return FALSE
@@ -272,12 +272,12 @@
/datum/religion_rites/adapted_eyes/invoke_effect(mob/living/carbon/human/user, atom/movable/religious_tool)
..()
- var/obj/item/organ/internal/eyes/oldeyes = user.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/oldeyes = user.get_organ_slot(ORGAN_SLOT_EYES)
to_chat(user, span_warning("You feel your eyes adapt to the darkness!"))
if(oldeyes)
oldeyes.Remove(user, special = TRUE)
qdel(oldeyes)//eh
- var/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/neweyes = new
+ var/obj/item/organ/eyes/night_vision/maintenance_adapted/neweyes = new
neweyes.Insert(user, special = TRUE)
/datum/religion_rites/adapted_food
diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm
index ef8c762acd7f4..53309d39c7dfd 100644
--- a/code/modules/research/designs/limbgrower_designs.dm
+++ b/code/modules/research/designs/limbgrower_designs.dm
@@ -41,7 +41,7 @@
id = "heart"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 30)
- build_path = /obj/item/organ/internal/heart
+ build_path = /obj/item/organ/heart
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/lungs
@@ -49,7 +49,7 @@
id = "lungs"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/internal/lungs
+ build_path = /obj/item/organ/lungs
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/liver
@@ -57,7 +57,7 @@
id = "liver"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/internal/liver
+ build_path = /obj/item/organ/liver
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/stomach
@@ -65,7 +65,7 @@
id = "stomach"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 15)
- build_path = /obj/item/organ/internal/stomach
+ build_path = /obj/item/organ/stomach
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/appendix
@@ -73,7 +73,7 @@
id = "appendix"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 5) //why would you need this
- build_path = /obj/item/organ/internal/appendix
+ build_path = /obj/item/organ/appendix
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/eyes
@@ -81,7 +81,7 @@
id = "eyes"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10)
- build_path = /obj/item/organ/internal/eyes
+ build_path = /obj/item/organ/eyes
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/ears
@@ -89,7 +89,7 @@
id = "ears"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10)
- build_path = /obj/item/organ/internal/ears
+ build_path = /obj/item/organ/ears
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
/datum/design/tongue
@@ -97,7 +97,7 @@
id = "tongue"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10)
- build_path = /obj/item/organ/internal/tongue
+ build_path = /obj/item/organ/tongue
category = list(SPECIES_HUMAN, RND_CATEGORY_INITIAL)
// Grows a fake lizard tail - not usable in lizard wine and other similar recipes.
@@ -106,7 +106,7 @@
id = "liztail"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/external/tail/lizard/fake
+ build_path = /obj/item/organ/tail/lizard/fake
category = list(SPECIES_LIZARD)
/datum/design/lizard_tongue
@@ -114,7 +114,7 @@
id = "liztongue"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/internal/tongue/lizard
+ build_path = /obj/item/organ/tongue/lizard
category = list(SPECIES_LIZARD)
/datum/design/monkey_tail
@@ -122,7 +122,7 @@
id = "monkeytail"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/external/tail/monkey
+ build_path = /obj/item/organ/tail/monkey
category = list(RND_CATEGORY_LIMBS_OTHER, RND_CATEGORY_INITIAL)
/datum/design/cat_tail
@@ -130,7 +130,7 @@
id = "cattail"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20)
- build_path = /obj/item/organ/external/tail/cat
+ build_path = /obj/item/organ/tail/cat
category = list(SPECIES_HUMAN)
/datum/design/cat_ears
@@ -138,7 +138,7 @@
id = "catears"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10)
- build_path = /obj/item/organ/internal/ears/cat
+ build_path = /obj/item/organ/ears/cat
category = list(SPECIES_HUMAN)
/datum/design/plasmaman_lungs
@@ -146,7 +146,7 @@
id = "plasmamanlungs"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20)
- build_path = /obj/item/organ/internal/lungs/plasmaman
+ build_path = /obj/item/organ/lungs/plasmaman
category = list(SPECIES_PLASMAMAN)
/datum/design/plasmaman_tongue
@@ -154,7 +154,7 @@
id = "plasmamantongue"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20)
- build_path = /obj/item/organ/internal/tongue/bone/plasmaman
+ build_path = /obj/item/organ/tongue/bone/plasmaman
category = list(SPECIES_PLASMAMAN)
/datum/design/plasmaman_liver
@@ -162,7 +162,7 @@
id = "plasmamanliver"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20)
- build_path = /obj/item/organ/internal/liver/bone/plasmaman
+ build_path = /obj/item/organ/liver/bone/plasmaman
category = list(SPECIES_PLASMAMAN)
/datum/design/plasmaman_stomach
@@ -170,7 +170,7 @@
id = "plasmamanstomach"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20)
- build_path = /obj/item/organ/internal/stomach/bone/plasmaman
+ build_path = /obj/item/organ/stomach/bone/plasmaman
category = list(SPECIES_PLASMAMAN)
/datum/design/ethereal_stomach
@@ -178,7 +178,7 @@
id = "etherealstomach"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20)
- build_path = /obj/item/organ/internal/stomach/ethereal
+ build_path = /obj/item/organ/stomach/ethereal
category = list(SPECIES_ETHEREAL)
/datum/design/ethereal_tongue
@@ -186,7 +186,7 @@
id = "etherealtongue"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20)
- build_path = /obj/item/organ/internal/tongue/ethereal
+ build_path = /obj/item/organ/tongue/ethereal
category = list(SPECIES_ETHEREAL)
/datum/design/ethereal_lungs
@@ -194,7 +194,7 @@
id = "ethereallungs"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20)
- build_path = /obj/item/organ/internal/lungs/ethereal
+ build_path = /obj/item/organ/lungs/ethereal
category = list(SPECIES_ETHEREAL)
// Intentionally not growable by normal means - for balance conerns.
@@ -203,7 +203,7 @@
id = "etherealheart"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20)
- build_path = /obj/item/organ/internal/heart/ethereal
+ build_path = /obj/item/organ/heart/ethereal
category = list(SPECIES_ETHEREAL)
/datum/design/armblade
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index c34411fff61cb..d55c1a6f24373 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -392,7 +392,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 3.5 SECONDS
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*2.5)
- build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube
+ build_path = /obj/item/organ/cyberimp/mouth/breathing_tube
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH
)
@@ -409,7 +409,7 @@
/datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5,
)
construction_time = 2 SECONDS
- build_path = /obj/item/organ/internal/cyberimp/arm/surgery
+ build_path = /obj/item/organ/cyberimp/arm/surgery
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -426,7 +426,7 @@
/datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5,
)
construction_time = 2 SECONDS
- build_path = /obj/item/organ/internal/cyberimp/arm/toolset
+ build_path = /obj/item/organ/cyberimp/arm/toolset
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -444,7 +444,7 @@
/datum/material/silver =SMALL_MATERIAL_AMOUNT*5,
/datum/material/gold =SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical
+ build_path = /obj/item/organ/cyberimp/eyes/hud/medical
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -462,7 +462,7 @@
/datum/material/silver = SMALL_MATERIAL_AMOUNT*7.5,
/datum/material/gold = SMALL_MATERIAL_AMOUNT*7.5,
)
- build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security
+ build_path = /obj/item/organ/cyberimp/eyes/hud/security
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -480,7 +480,7 @@
/datum/material/silver = SMALL_MATERIAL_AMOUNT*6,
/datum/material/gold = SMALL_MATERIAL_AMOUNT*6,
)
- build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic
+ build_path = /obj/item/organ/cyberimp/eyes/hud/diagnostic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -502,7 +502,7 @@
/datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT,
/datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT,
)
- build_path = /obj/item/organ/internal/eyes/robotic/xray
+ build_path = /obj/item/organ/eyes/robotic/xray
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT
)
@@ -511,7 +511,7 @@
/datum/design/cyberimp_xray/moth
name = "Moth X-ray Eyes"
id = "ci-xray-moth"
- build_path = /obj/item/organ/internal/eyes/robotic/xray/moth
+ build_path = /obj/item/organ/eyes/robotic/xray/moth
/datum/design/cyberimp_thermals
name = "Thermal Eyes"
@@ -527,7 +527,7 @@
/datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT,
/datum/material/diamond =SHEET_MATERIAL_AMOUNT,
)
- build_path = /obj/item/organ/internal/eyes/robotic/thermals
+ build_path = /obj/item/organ/eyes/robotic/thermals
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT
)
@@ -536,7 +536,7 @@
/datum/design/cyberimp_thermals/moth
name = "Moth Thermal Eyes"
id = "ci-thermals-moth"
- build_path = /obj/item/organ/internal/eyes/robotic/thermals/moth
+ build_path = /obj/item/organ/eyes/robotic/thermals/moth
/datum/design/cyberimp_antidrop
name = "Anti-Drop Implant"
@@ -550,7 +550,7 @@
/datum/material/silver = SMALL_MATERIAL_AMOUNT*4,
/datum/material/gold = SMALL_MATERIAL_AMOUNT*4,
)
- build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop
+ build_path = /obj/item/organ/cyberimp/brain/anti_drop
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT
)
@@ -568,7 +568,7 @@
/datum/material/silver =SMALL_MATERIAL_AMOUNT*5,
/datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT,
)
- build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun
+ build_path = /obj/item/organ/cyberimp/brain/anti_stun
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT
)
@@ -586,7 +586,7 @@
/datum/material/gold=SMALL_MATERIAL_AMOUNT*3,
/datum/material/diamond =SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/cyberimp/chest/spine
+ build_path = /obj/item/organ/cyberimp/chest/spine
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH
)
@@ -603,7 +603,7 @@
/datum/material/glass = SMALL_MATERIAL_AMOUNT*6,
/datum/material/titanium = SMALL_MATERIAL_AMOUNT*3,
)
- build_path = /obj/item/organ/internal/cyberimp/brain/connector
+ build_path = /obj/item/organ/cyberimp/brain/connector
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC
)
@@ -620,7 +620,7 @@
/datum/material/glass =SMALL_MATERIAL_AMOUNT*5,
/datum/material/gold =SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/cyberimp/chest/nutriment
+ build_path = /obj/item/organ/cyberimp/chest/nutriment
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH
)
@@ -638,7 +638,7 @@
/datum/material/gold =SMALL_MATERIAL_AMOUNT*5,
/datum/material/uranium = SMALL_MATERIAL_AMOUNT*7.5,
)
- build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus
+ build_path = /obj/item/organ/cyberimp/chest/nutriment/plus
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH
)
@@ -656,7 +656,7 @@
/datum/material/gold =SMALL_MATERIAL_AMOUNT * 3,
/datum/material/uranium =SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/cyberimp/chest/reviver
+ build_path = /obj/item/organ/cyberimp/chest/reviver
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH
)
@@ -674,7 +674,7 @@
/datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT,
/datum/material/diamond =HALF_SHEET_MATERIAL_AMOUNT,
)
- build_path = /obj/item/organ/internal/cyberimp/chest/thrusters
+ build_path = /obj/item/organ/cyberimp/chest/thrusters
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
)
@@ -789,7 +789,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/liver/cybernetic
+ build_path = /obj/item/organ/liver/cybernetic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -800,7 +800,7 @@
desc = "A cybernetic liver."
id = "cybernetic_liver_tier2"
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/liver/cybernetic/tier2
+ build_path = /obj/item/organ/liver/cybernetic/tier2
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -812,7 +812,7 @@
id = "cybernetic_liver_tier3"
construction_time = 5 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/liver/cybernetic/tier3
+ build_path = /obj/item/organ/liver/cybernetic/tier3
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -825,7 +825,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/heart/cybernetic
+ build_path = /obj/item/organ/heart/cybernetic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -836,7 +836,7 @@
desc = "A cybernetic heart."
id = "cybernetic_heart_tier2"
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/heart/cybernetic/tier2
+ build_path = /obj/item/organ/heart/cybernetic/tier2
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -848,7 +848,7 @@
id = "cybernetic_heart_tier3"
construction_time = 5 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver=SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/heart/cybernetic/tier3
+ build_path = /obj/item/organ/heart/cybernetic/tier3
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -865,7 +865,7 @@
/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5,
/datum/material/diamond = SHEET_MATERIAL_AMOUNT,
)
- build_path = /obj/item/organ/internal/heart/cybernetic/anomalock
+ build_path = /obj/item/organ/heart/cybernetic/anomalock
category = list(
RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE
)
@@ -878,7 +878,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/lungs/cybernetic
+ build_path = /obj/item/organ/lungs/cybernetic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -889,7 +889,7 @@
desc = "A pair of cybernetic lungs."
id = "cybernetic_lungs_tier2"
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/lungs/cybernetic/tier2
+ build_path = /obj/item/organ/lungs/cybernetic/tier2
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -901,7 +901,7 @@
id = "cybernetic_lungs_tier3"
construction_time = 5 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/lungs/cybernetic/tier3
+ build_path = /obj/item/organ/lungs/cybernetic/tier3
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -914,7 +914,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/stomach/cybernetic
+ build_path = /obj/item/organ/stomach/cybernetic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -925,7 +925,7 @@
desc = "A cybernetic stomach."
id = "cybernetic_stomach_tier2"
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/stomach/cybernetic/tier2
+ build_path = /obj/item/organ/stomach/cybernetic/tier2
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -937,7 +937,7 @@
id = "cybernetic_stomach_tier3"
construction_time = 5 SECONDS
materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5)
- build_path = /obj/item/organ/internal/stomach/cybernetic/tier3
+ build_path = /obj/item/organ/stomach/cybernetic/tier3
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -950,7 +950,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 3 SECONDS
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4)
- build_path = /obj/item/organ/internal/ears/cybernetic
+ build_path = /obj/item/organ/ears/cybernetic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -967,7 +967,7 @@
/datum/material/glass = SMALL_MATERIAL_AMOUNT*5,
/datum/material/silver = SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/ears/cybernetic/upgraded
+ build_path = /obj/item/organ/ears/cybernetic/upgraded
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -984,7 +984,7 @@
/datum/material/glass = SMALL_MATERIAL_AMOUNT*5,
/datum/material/silver = SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/ears/cybernetic/whisper
+ build_path = /obj/item/organ/ears/cybernetic/whisper
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -1001,7 +1001,7 @@
/datum/material/glass = SMALL_MATERIAL_AMOUNT*5,
/datum/material/silver = SMALL_MATERIAL_AMOUNT*5,
)
- build_path = /obj/item/organ/internal/ears/cybernetic/xray
+ build_path = /obj/item/organ/ears/cybernetic/xray
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -1014,7 +1014,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 3 SECONDS
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4)
- build_path = /obj/item/organ/internal/eyes/robotic/basic
+ build_path = /obj/item/organ/eyes/robotic/basic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1
)
@@ -1023,13 +1023,13 @@
/datum/design/cybernetic_eyes/moth
name = "Basic Cybernetic Moth Eyes"
id = "cybernetic_eyes_moth"
- build_path = /obj/item/organ/internal/eyes/robotic/basic/moth
+ build_path = /obj/item/organ/eyes/robotic/basic/moth
/datum/design/cybernetic_eyes/improved
name = "Cybernetic Eyes"
desc = "A pair of cybernetic eyes."
id = "cybernetic_eyes_improved"
- build_path = /obj/item/organ/internal/eyes/robotic
+ build_path = /obj/item/organ/eyes/robotic
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_2
)
@@ -1038,7 +1038,7 @@
/datum/design/cybernetic_eyes/improved/moth
name = "Cybernetic Moth Eyes"
id = "cybernetic_eyes_improved_moth"
- build_path = /obj/item/organ/internal/eyes/robotic/moth
+ build_path = /obj/item/organ/eyes/robotic/moth
/datum/design/cyberimp_welding
name = "Welding Shield Eyes"
@@ -1047,7 +1047,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4)
- build_path = /obj/item/organ/internal/eyes/robotic/shield
+ build_path = /obj/item/organ/eyes/robotic/shield
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -1056,7 +1056,7 @@
/datum/design/cyberimp_welding/moth
name = "Welding Shield Moth Eyes"
id = "ci-welding-moth"
- build_path = /obj/item/organ/internal/eyes/robotic/shield/moth
+ build_path = /obj/item/organ/eyes/robotic/shield/moth
/datum/design/cyberimp_gloweyes
name = "Luminescent Eyes"
@@ -1065,7 +1065,7 @@
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
construction_time = 4 SECONDS
materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT)
- build_path = /obj/item/organ/internal/eyes/robotic/glow
+ build_path = /obj/item/organ/eyes/robotic/glow
category = list(
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3
)
@@ -1074,7 +1074,7 @@
/datum/design/cyberimp_gloweyes/moth
name = "Luminescent Moth Eyes"
id = "ci-gloweyes-moth"
- build_path = /obj/item/organ/internal/eyes/robotic/glow/moth
+ build_path = /obj/item/organ/eyes/robotic/glow/moth
/////////////////////
///Surgery Designs///
diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
index 6cf8d2745ce6c..a2c5698fbb192 100644
--- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
@@ -75,7 +75,11 @@ Regenerative extracts:
var/obj/structure/closet/C = new /obj/structure/closet(target.loc)
C.name = "slimy closet"
C.desc = "Looking closer, it seems to be made of a sort of solid, opaque, metal-like goo."
- target.forceMove(C)
+ if(target.mob_size > C.max_mob_size) //Prevents capturing megafauna or other large mobs in the closets
+ C.bust_open()
+ C.visible_message(span_warning("[target] is too big, and immediately breaks \the [C.name] open!"))
+ else //This can't be allowed to actually happen to the too-big mobs or it breaks some actions
+ target.forceMove(C)
/obj/item/slimecross/regenerative/yellow
colour = SLIME_TYPE_YELLOW
@@ -151,6 +155,8 @@ Regenerative extracts:
old_location.visible_message(span_warning("[target] disappears in a shower of sparks!"))
to_chat(target, span_danger("The milky goo teleports you somewhere it remembers!"))
+ if(HAS_TRAIT(target, TRAIT_NO_TELEPORT))
+ old_location.visible_message(span_warning("[target] sparks briefly, but is prevented from teleporting!"))
/obj/item/slimecross/regenerative/bluespace/Initialize(mapload)
. = ..()
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index b72abea937ed6..221ad9b79cd93 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -50,7 +50,6 @@
active_overlay_icon_state = "bg_spell_border_active_red"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_PHASED
panel = "Spells"
- melee_cooldown_time = 0 SECONDS
/// The sound played on cast.
var/sound = null
diff --git a/code/modules/spells/spell_types/conjure/the_traps.dm b/code/modules/spells/spell_types/conjure/the_traps.dm
index e9717a1325329..bd25d163a56e1 100644
--- a/code/modules/spells/spell_types/conjure/the_traps.dm
+++ b/code/modules/spells/spell_types/conjure/the_traps.dm
@@ -18,6 +18,7 @@
)
summon_lifespan = 5 MINUTES
summon_amount = 5
+ summon_respects_density = TRUE
/// The amount of charges the traps spawn with.
var/trap_charges = 1
diff --git a/code/modules/spells/spell_types/self/lichdom.dm b/code/modules/spells/spell_types/self/lichdom.dm
index 19ad55d9eee45..8aa86d63a1b48 100644
--- a/code/modules/spells/spell_types/self/lichdom.dm
+++ b/code/modules/spells/spell_types/self/lichdom.dm
@@ -62,7 +62,7 @@
if(iscarbon(cast_on))
var/mob/living/carbon/carbon_cast_on = cast_on
- var/obj/item/organ/internal/brain/lich_brain = carbon_cast_on.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/lich_brain = carbon_cast_on.get_organ_slot(ORGAN_SLOT_BRAIN)
if(lich_brain) // This prevents MMIs being used to stop lich revives
lich_brain.organ_flags &= ~ORGAN_VITAL
lich_brain.decoy_override = TRUE
diff --git a/code/modules/station_goals/vault_mutation.dm b/code/modules/station_goals/vault_mutation.dm
index c5a77c62775ba..80e539472b343 100644
--- a/code/modules/station_goals/vault_mutation.dm
+++ b/code/modules/station_goals/vault_mutation.dm
@@ -109,7 +109,7 @@
/datum/mutation/human/plasmocile/on_acquiring(mob/living/carbon/human/acquirer)
. = ..()
- var/obj/item/organ/internal/lungs/improved_lungs = acquirer.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/improved_lungs = acquirer.get_organ_slot(ORGAN_SLOT_LUNGS)
ADD_TRAIT(owner, TRAIT_VIRUSIMMUNE, GENETIC_MUTATION)
if(improved_lungs)
apply_buff(improved_lungs)
@@ -118,7 +118,7 @@
/datum/mutation/human/plasmocile/on_losing(mob/living/carbon/human/owner)
. = ..()
- var/obj/item/organ/internal/lungs/improved_lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/improved_lungs = owner.get_organ_slot(ORGAN_SLOT_LUNGS)
REMOVE_TRAIT(owner, TRAIT_VIRUSIMMUNE, GENETIC_MUTATION)
UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN)
UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN)
@@ -128,20 +128,20 @@
/datum/mutation/human/plasmocile/proc/remove_modification(mob/source, obj/item/organ/old_organ)
SIGNAL_HANDLER
- if(istype(old_organ, /obj/item/organ/internal/lungs))
+ if(istype(old_organ, /obj/item/organ/lungs))
remove_buff(old_organ)
/datum/mutation/human/plasmocile/proc/reapply_modification(mob/source, obj/item/organ/new_organ)
SIGNAL_HANDLER
- if(istype(new_organ, /obj/item/organ/internal/lungs))
+ if(istype(new_organ, /obj/item/organ/lungs))
apply_buff(new_organ)
-/datum/mutation/human/plasmocile/proc/apply_buff(obj/item/organ/internal/lungs/our_lungs)
+/datum/mutation/human/plasmocile/proc/apply_buff(obj/item/organ/lungs/our_lungs)
our_lungs.plas_breath_dam_min *= 0
our_lungs.plas_breath_dam_max *= 0
-/datum/mutation/human/plasmocile/proc/remove_buff(obj/item/organ/internal/lungs/our_lungs)
+/datum/mutation/human/plasmocile/proc/remove_buff(obj/item/organ/lungs/our_lungs)
our_lungs.plas_breath_dam_min = initial(our_lungs.plas_breath_dam_min)
our_lungs.plas_breath_dam_max = initial(our_lungs.plas_breath_dam_max)
diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm
index 2e20f0906acdd..cd7d55f664c47 100644
--- a/code/modules/surgery/advanced/bioware/cortex_folding.dm
+++ b/code/modules/surgery/advanced/bioware/cortex_folding.dm
@@ -30,7 +30,7 @@
)
/datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
return ..()
diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm
index 27a75a261674d..4f65f305df36a 100644
--- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm
+++ b/code/modules/surgery/advanced/bioware/cortex_imprint.dm
@@ -31,7 +31,7 @@
)
/datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
return ..()
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 402a9aa73e19f..fe2af113f4d12 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -35,7 +35,7 @@
/datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
return TRUE
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index 5c528acae52fc..cd433d559819a 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -28,7 +28,7 @@
. = ..()
if(!.)
return FALSE
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
return TRUE
@@ -102,7 +102,7 @@
return ..()
/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(target_brain)
display_results(
user,
diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm
index 63350139e07bd..a4512e9378e42 100644
--- a/code/modules/surgery/advanced/necrotic_revival.dm
+++ b/code/modules/surgery/advanced/necrotic_revival.dm
@@ -13,7 +13,7 @@
/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target)
. = ..()
- var/obj/item/organ/internal/zombie_infection/z_infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE)
+ var/obj/item/organ/zombie_infection/z_infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE)
if(z_infection)
return FALSE
@@ -46,6 +46,6 @@
)
display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!")
if(!target.get_organ_slot(ORGAN_SLOT_ZOMBIE))
- var/obj/item/organ/internal/zombie_infection/z_infection = new()
+ var/obj/item/organ/zombie_infection/z_infection = new()
z_infection.Insert(target)
return ..()
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index 6c2d990cb9624..899bd6a436ce8 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -26,7 +26,7 @@
/datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target)
. = ..()
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm
index 21e34efc2d76d..a3931dd4e5e96 100644
--- a/code/modules/surgery/advanced/wingreconstruction.dm
+++ b/code/modules/surgery/advanced/wingreconstruction.dm
@@ -12,8 +12,8 @@
/datum/surgery/advanced/wing_reconstruction/can_start(mob/user, mob/living/carbon/target)
if(!istype(target))
return FALSE
- var/obj/item/organ/external/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
- if(!istype(wings, /obj/item/organ/external/wings/moth))
+ var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ if(!istype(wings, /obj/item/organ/wings/moth))
return FALSE
return ..() && wings?.burnt
@@ -48,11 +48,11 @@
span_notice("[user] completes the surgery on [target]'s wings."),
)
display_pain(target, "You can feel your wings again!")
- var/obj/item/organ/external/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
- if(istype(wings, /obj/item/organ/external/wings/moth)) //make sure we only heal moth wings.
+ var/obj/item/organ/wings/moth/wings = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ if(istype(wings, /obj/item/organ/wings/moth)) //make sure we only heal moth wings.
wings.heal_wings(user, ALL)
- var/obj/item/organ/external/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too
+ var/obj/item/organ/antennae/antennae = target.get_organ_slot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too
antennae?.heal_antennae(user, ALL)
human_target.update_body_parts()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 667e6f1e7be9c..d321c1154054f 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -251,6 +251,8 @@
owner = null
+ QDEL_LAZYLIST(scars)
+
for(var/atom/movable/movable in contents)
qdel(movable)
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index fd62d0292f35f..f4724db3b6968 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -70,7 +70,8 @@
if(org_zone != BODY_ZONE_CHEST)
continue
organ.Remove(chest_owner)
- organ.forceMove(chest_owner.loc)
+ if(chest_owner.loc)
+ organ.forceMove(chest_owner.loc)
. += organ
if(cavity_item)
@@ -192,14 +193,13 @@
/obj/item/bodypart/arm/drop_limb(special, dismembered, move_to_floor = TRUE)
var/mob/living/carbon/arm_owner = owner
-
if(special || !arm_owner)
return ..()
-
if(arm_owner.hand_bodyparts[held_index] == src)
// We only want to do this if the limb being removed is the active hand part.
// This catches situations where limbs are "hot-swapped" such as augmentations and roundstart prosthetics.
arm_owner.dropItemToGround(arm_owner.get_item_for_held_index(held_index), 1)
+ . = ..()
if(arm_owner.handcuffed)
arm_owner.handcuffed.forceMove(drop_location())
arm_owner.handcuffed.dropped(arm_owner)
@@ -208,21 +208,22 @@
if(arm_owner.hud_used)
var/atom/movable/screen/inventory/hand/associated_hand = arm_owner.hud_used.hand_slots["[held_index]"]
associated_hand?.update_appearance()
- . = ..()
if(arm_owner.num_hands == 0)
- arm_owner.dropItemToGround(arm_owner.gloves, TRUE)
+ arm_owner.dropItemToGround(arm_owner.gloves, force = TRUE)
arm_owner.update_worn_gloves() //to remove the bloody hands overlay
/obj/item/bodypart/leg/drop_limb(special, dismembered, move_to_floor = TRUE)
- if(owner && !special)
- if(owner.legcuffed)
- owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace
- owner.legcuffed.dropped(owner)
- owner.legcuffed = null
- owner.update_worn_legcuffs()
- if(owner.shoes)
- owner.dropItemToGround(owner.shoes, TRUE)
- return ..()
+ var/mob/living/carbon/leg_owner = owner
+ . = ..()
+ if(special || !leg_owner)
+ return
+ if(leg_owner.legcuffed)
+ leg_owner.legcuffed.forceMove(drop_location())
+ leg_owner.legcuffed.dropped(leg_owner)
+ leg_owner.legcuffed = null
+ leg_owner.update_worn_legcuffs()
+ if(leg_owner.shoes)
+ leg_owner.dropItemToGround(leg_owner.shoes, force = TRUE)
/obj/item/bodypart/head/drop_limb(special, dismembered, move_to_floor = TRUE)
if(!special)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 30c841147a708..0f1a5203ea5bf 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -113,7 +113,7 @@
/obj/item/bodypart/head/examine(mob/user)
. = ..()
if(show_organs_on_examine && IS_ORGANIC_LIMB(src))
- var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src
+ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in src
if(!brain)
. += span_info("The brain has been removed from [src].")
else if(brain.suicided || (brain.brainmob && HAS_TRAIT(brain.brainmob, TRAIT_SUICIDED)))
@@ -130,13 +130,13 @@
else
. += span_info("It's completely lifeless.")
- if(!(locate(/obj/item/organ/internal/eyes) in src))
+ if(!(locate(/obj/item/organ/eyes) in src))
. += span_info("[real_name]'s eyes have been removed.")
- if(!(locate(/obj/item/organ/internal/ears) in src))
+ if(!(locate(/obj/item/organ/ears) in src))
. += span_info("[real_name]'s ears have been removed.")
- if(!(locate(/obj/item/organ/internal/tongue) in src))
+ if(!(locate(/obj/item/organ/tongue) in src))
. += span_info("[real_name]'s tongue has been removed.")
/obj/item/bodypart/head/can_dismember(obj/item/item)
@@ -151,7 +151,7 @@
/obj/item/bodypart/head/drop_organs(mob/user, violent_removal)
if(user)
user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain."))
- var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src
+ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in src
if(brain && violent_removal && prob(90)) //ghetto surgery can damage the brain.
to_chat(user, span_warning("[brain] was damaged in the process!"))
brain.set_organ_damage(brain.maxHealth)
@@ -176,7 +176,7 @@
. += get_hair_and_lips_icon(dropped)
// We need to get the eyes if we are dropped (ugh)
if(dropped)
- var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in src
+ var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in src
// This is a bit of copy/paste code from eyes.dm:generate_body_overlay
if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES))
var/image/eye_left = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH)
diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
index 861076e184b7c..3dcd42d61c9fb 100644
--- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm
+++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm
@@ -37,12 +37,12 @@
else
show_eyeless = FALSE
else
- if(!hair_hidden && !(locate(/obj/item/organ/internal/brain) in src))
+ if(!hair_hidden && !(locate(/obj/item/organ/brain) in src))
show_debrained = TRUE
else
show_debrained = FALSE
- if(!(locate(/obj/item/organ/internal/eyes) in src))
+ if(!(locate(/obj/item/organ/eyes) in src))
show_eyeless = TRUE
else
show_eyeless = FALSE
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index c94bd0db701f4..25f66f40af9a8 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -35,7 +35,7 @@
/// Offset to apply to equipment worn on the neck
var/datum/worn_feature_offset/worn_neck_offset
/// Which functional (i.e. flightpotion) wing types (if any) does this bodypart support? If count is >1 a radial menu is used to choose between all icons in list
- var/list/wing_types = list(/obj/item/organ/external/wings/functional/angel)
+ var/list/wing_types = list(/obj/item/organ/wings/functional/angel)
/obj/item/bodypart/chest/forced_removal(dismembered, special, move_to_floor)
var/mob/living/carbon/old_owner = owner
@@ -74,7 +74,7 @@
if(!ishuman(owner))
return null
var/mob/living/carbon/human/human_owner = owner
- var/obj/item/organ/external/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(tail)
return tail.get_butt_sprite()
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 738b3ce97ac3b..d9e25302ad7c1 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -212,7 +212,7 @@
robotic_emp_paralyze_damage_percent_threshold = 0.6
- wing_types = list(/obj/item/organ/external/wings/functional/robotic)
+ wing_types = list(/obj/item/organ/wings/functional/robotic)
var/wired = FALSE
var/obj/item/stock_parts/power_store/cell = null
diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
index c5cc96c31377f..4d67622818f1b 100644
--- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
@@ -10,7 +10,7 @@
icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
is_dimorphic = TRUE
- wing_types = list(/obj/item/organ/external/wings/functional/dragon)
+ wing_types = list(/obj/item/organ/wings/functional/dragon)
/obj/item/bodypart/chest/lizard/get_butt_sprite()
return icon('icons/mob/butts.dmi', BUTT_SPRITE_LIZARD)
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 0422b4a77fb81..08b22373d32ae 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -96,7 +96,7 @@
is_dimorphic = TRUE
dmg_overlay_type = null
burn_modifier = 0.5 // = 1/2x generic burn damage
- wing_types = list(/obj/item/organ/external/wings/functional/slime)
+ wing_types = list(/obj/item/organ/wings/functional/slime)
/obj/item/bodypart/chest/jelly/get_butt_sprite()
return icon('icons/mob/butts.dmi', BUTT_SPRITE_SLIME)
@@ -260,7 +260,7 @@
limb_id = SPECIES_FLYPERSON
is_dimorphic = TRUE
should_draw_greyscale = FALSE
- wing_types = list(/obj/item/organ/external/wings/functional/fly)
+ wing_types = list(/obj/item/organ/wings/functional/fly)
bodypart_traits = list(TRAIT_TACKLING_FRAIL_ATTACKER)
/obj/item/bodypart/arm/left/fly
@@ -337,7 +337,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
bodypart_flags = BODYPART_UNHUSKABLE
- wing_types = list(/obj/item/organ/external/wings/functional/skeleton)
+ wing_types = list(/obj/item/organ/wings/functional/skeleton)
/obj/item/bodypart/arm/left/skeleton
biological_state = (BIO_BONE|BIO_JOINTED)
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index 6761fa6751a5d..080201c9fab9e 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -16,7 +16,7 @@
limb_id = SPECIES_MOTH
is_dimorphic = TRUE
should_draw_greyscale = FALSE
- wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra)
+ wing_types = list(/obj/item/organ/wings/functional/moth/megamoth, /obj/item/organ/wings/functional/moth/mothra)
bodypart_traits = list(TRAIT_TACKLING_WINGED_ATTACKER)
/obj/item/bodypart/chest/moth/get_butt_sprite()
diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index c2cc3f551acd2..1c5012d7580b9 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -26,7 +26,7 @@
)
/datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART)
if(isnull(target_heart) || target_heart.damage < 60 || target_heart.operated)
return FALSE
return ..()
@@ -134,7 +134,7 @@
/datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
target.setOrganLoss(ORGAN_SLOT_HEART, 60)
- var/obj/item/organ/internal/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/target_heart = target.get_organ_slot(ORGAN_SLOT_HEART)
if(target_heart) //slightly worrying if we lost our heart mid-operation, but that's life
target_heart.operated = TRUE
if(target_heart.organ_flags & ORGAN_EMP) //If our organ is failing due to an EMP, fix that
diff --git a/code/modules/surgery/ear_surgery.dm b/code/modules/surgery/ear_surgery.dm
index 4333b00913ba3..9e363e2ae9b23 100644
--- a/code/modules/surgery/ear_surgery.dm
+++ b/code/modules/surgery/ear_surgery.dm
@@ -36,7 +36,7 @@
display_pain(target, "You feel a dizzying pain in your head!")
/datum/surgery_step/fix_ears/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
- var/obj/item/organ/internal/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/target_ears = target.get_organ_slot(ORGAN_SLOT_EARS)
display_results(
user,
target,
@@ -50,7 +50,7 @@
return ..()
/datum/surgery_step/fix_ears/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(target.get_organ_by_type(/obj/item/organ/internal/brain))
+ if(target.get_organ_by_type(/obj/item/organ/brain))
display_results(
user,
target,
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index fb759baca8771..3a0f71400917b 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -34,7 +34,7 @@
display_pain(target, "You feel a stabbing pain in your eyes!")
/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
- var/obj/item/organ/internal/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/target_eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
user.visible_message(span_notice("[user] successfully fixes [target]'s eyes!"), span_notice("You succeed in fixing [target]'s eyes."))
display_results(
user,
@@ -50,7 +50,7 @@
return ..()
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(target.get_organ_by_type(/obj/item/organ/internal/brain))
+ if(target.get_organ_by_type(/obj/item/organ/brain))
display_results(
user,
target,
diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm
index b72e01d0ecf7d..d09933f303fed 100644
--- a/code/modules/surgery/gastrectomy.dm
+++ b/code/modules/surgery/gastrectomy.dm
@@ -27,7 +27,7 @@
)
/datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
if(isnull(target_stomach) || target_stomach.damage < 50 || target_stomach.operated)
return FALSE
return ..()
@@ -70,7 +70,7 @@
/datum/surgery_step/gastrectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
var/mob/living/carbon/human/target_human = target
- var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
target_human.setOrganLoss(ORGAN_SLOT_STOMACH, 20) // Stomachs have a threshold for being able to even digest food, so I might tweak this number
if(target_stomach)
target_stomach.operated = TRUE
diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm
index c0d94abb69a99..82921c3f2752e 100644
--- a/code/modules/surgery/hepatectomy.dm
+++ b/code/modules/surgery/hepatectomy.dm
@@ -26,7 +26,7 @@
)
/datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER)
if(isnull(target_liver) || target_liver.damage < 50 || target_liver.operated)
return FALSE
return ..()
@@ -69,7 +69,7 @@
/datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
var/mob/living/carbon/human/human_target = target
- var/obj/item/organ/internal/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/liver/target_liver = target.get_organ_slot(ORGAN_SLOT_LIVER)
human_target.setOrganLoss(ORGAN_SLOT_LIVER, 10) //not bad, not great
if(target_liver)
target_liver.operated = TRUE
diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm
index 85a963953c68e..e0988c8376c87 100644
--- a/code/modules/surgery/lobectomy.dm
+++ b/code/modules/surgery/lobectomy.dm
@@ -24,7 +24,7 @@
)
/datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS)
if(isnull(target_lungs) || target_lungs.damage < 60 || target_lungs.operated)
return FALSE
return ..()
@@ -67,7 +67,7 @@
/datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
if(ishuman(target))
var/mob/living/carbon/human/human_target = target
- var/obj/item/organ/internal/lungs/target_lungs = human_target.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/target_lungs = human_target.get_organ_slot(ORGAN_SLOT_LUNGS)
human_target.setOrganLoss(ORGAN_SLOT_LUNGS, 60)
if(target_lungs)
target_lungs.operated = TRUE
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 84edc783af7a9..a5f4a0505f6fd 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -305,7 +305,7 @@
///only operate on internal organs
/datum/surgery_step/manipulate_organs/internal/can_use_organ(mob/user, obj/item/organ/organ)
- return isinternalorgan(organ)
+ return !(organ.organ_flags & ORGAN_EXTERNAL)
///prosthetic surgery gives full effectiveness to crowbars (and hemostats)
/datum/surgery_step/manipulate_organs/internal/mechanic
@@ -319,7 +319,7 @@
///Only operate on external organs
/datum/surgery_step/manipulate_organs/external/can_use_organ(mob/user, obj/item/organ/organ)
- return isexternalorgan(organ)
+ return (organ.organ_flags & ORGAN_EXTERNAL)
///prosthetic surgery gives full effectiveness to crowbars (and hemostats)
/datum/surgery_step/manipulate_organs/external/mechanic
diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm
index 4d5114ad88a7e..e2f05a9ed5610 100644
--- a/code/modules/surgery/organs/_organ.dm
+++ b/code/modules/surgery/organs/_organ.dm
@@ -249,20 +249,20 @@ INITIALIZE_IMMEDIATE(/obj/item/organ)
set_heartattack(FALSE)
// Ears have aditional vаr "deaf", need to update it too
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(0, -INFINITY) // full heal ears deafness
return
// Default organ fixing handling
// May result in kinda cursed stuff for mobs which don't need these organs
- var/obj/item/organ/internal/lungs/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/lungs/lungs = get_organ_slot(ORGAN_SLOT_LUNGS)
if(!lungs)
lungs = new()
lungs.Insert(src)
lungs.set_organ_damage(0)
- var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/heart = get_organ_slot(ORGAN_SLOT_HEART)
if(heart)
set_heartattack(FALSE)
else
@@ -270,19 +270,19 @@ INITIALIZE_IMMEDIATE(/obj/item/organ)
heart.Insert(src)
heart.set_organ_damage(0)
- var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE)
if(!tongue)
tongue = new()
tongue.Insert(src)
tongue.set_organ_damage(0)
- var/obj/item/organ/internal/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = get_organ_slot(ORGAN_SLOT_EYES)
if(!eyes)
eyes = new()
eyes.Insert(src)
eyes.set_organ_damage(0)
- var/obj/item/organ/internal/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = get_organ_slot(ORGAN_SLOT_EARS)
if(!ears)
ears = new()
ears.Insert(src)
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index 59107666bfde5..296b40beea94a 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -140,7 +140,7 @@
name = "autosurgeon"
desc = "A single use autosurgeon that contains a medical heads-up display augment. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
- starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/medical
+ starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical
/obj/item/autosurgeon/syndicate
@@ -156,28 +156,28 @@
/obj/item/autosurgeon/syndicate/laser_arm
desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
- starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser
+ starting_organ = /obj/item/organ/cyberimp/arm/gun/laser
/obj/item/autosurgeon/syndicate/thermal_eyes
- starting_organ = /obj/item/organ/internal/eyes/robotic/thermals
+ starting_organ = /obj/item/organ/eyes/robotic/thermals
/obj/item/autosurgeon/syndicate/thermal_eyes/single_use
uses = 1
/obj/item/autosurgeon/syndicate/xray_eyes
- starting_organ = /obj/item/organ/internal/eyes/robotic/xray
+ starting_organ = /obj/item/organ/eyes/robotic/xray
/obj/item/autosurgeon/syndicate/xray_eyes/single_use
uses = 1
/obj/item/autosurgeon/syndicate/anti_stun
- starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun
+ starting_organ = /obj/item/organ/cyberimp/brain/anti_stun
/obj/item/autosurgeon/syndicate/anti_stun/single_use
uses = 1
/obj/item/autosurgeon/syndicate/reviver
- starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver
+ starting_organ = /obj/item/organ/cyberimp/chest/reviver
/obj/item/autosurgeon/syndicate/reviver/single_use
uses = 1
@@ -185,14 +185,14 @@
/obj/item/autosurgeon/syndicate/commsagent
desc = "A device that automatically - painfully - inserts an implant. It seems someone's specially \
modified this one to only insert... tongues. Horrifying."
- starting_organ = /obj/item/organ/internal/tongue
+ starting_organ = /obj/item/organ/tongue
/obj/item/autosurgeon/syndicate/commsagent/Initialize(mapload)
. = ..()
- organ_whitelist += /obj/item/organ/internal/tongue
+ organ_whitelist += /obj/item/organ/tongue
/obj/item/autosurgeon/syndicate/emaggedsurgerytoolset
- starting_organ = /obj/item/organ/internal/cyberimp/arm/surgery/emagged
+ starting_organ = /obj/item/organ/cyberimp/arm/surgery/emagged
/obj/item/autosurgeon/syndicate/emaggedsurgerytoolset/single_use
uses = 1
@@ -200,4 +200,4 @@
/obj/item/autosurgeon/syndicate/contraband_sechud
desc = "Contains a contraband SecHUD implant, undetectable by health scanners."
uses = 1
- starting_organ = /obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate
+ starting_organ = /obj/item/organ/cyberimp/eyes/hud/security/syndicate
diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm
index 024756b6e098a..0b01a174d096e 100644
--- a/code/modules/surgery/organs/external/_visual_organs.dm
+++ b/code/modules/surgery/organs/external/_visual_organs.dm
@@ -100,7 +100,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
. += bodypart_overlay.get_overlay(external_layer, bodypart_owner)
///The horns of a lizard!
-/obj/item/organ/external/horns
+/obj/item/organ/horns
name = "horns"
desc = "Why do lizards even have horns? Well, this one obviously doesn't."
icon_state = "horns"
@@ -114,9 +114,12 @@ Unlike normal organs, we're actually inside a persons limbs at all times
bodypart_overlay = /datum/bodypart_overlay/mutant/horns
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
/datum/bodypart_overlay/mutant/horns
layers = EXTERNAL_ADJACENT
feature_key = "horns"
+ dyable = TRUE
/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(mob/living/carbon/human/human)
if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR))
@@ -128,7 +131,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
return SSaccessories.horns_list
///The frills of a lizard (like weird fin ears)
-/obj/item/organ/external/frills
+/obj/item/organ/frills
name = "frills"
desc = "Ear-like external organs often seen on aquatic reptillians."
icon_state = "frills"
@@ -142,6 +145,8 @@ Unlike normal organs, we're actually inside a persons limbs at all times
bodypart_overlay = /datum/bodypart_overlay/mutant/frills
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
/datum/bodypart_overlay/mutant/frills
layers = EXTERNAL_ADJACENT
feature_key = "frills"
@@ -155,7 +160,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
return SSaccessories.frills_list
///Guess what part of the lizard this is?
-/obj/item/organ/external/snout
+/obj/item/organ/snout
name = "lizard snout"
desc = "Take a closer look at that snout!"
icon_state = "snout"
@@ -171,6 +176,8 @@ Unlike normal organs, we're actually inside a persons limbs at all times
bodypart_overlay = /datum/bodypart_overlay/mutant/snout
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
/datum/bodypart_overlay/mutant/snout
layers = EXTERNAL_ADJACENT
feature_key = "snout"
@@ -184,7 +191,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
return SSaccessories.snouts_list
///A moth's antennae
-/obj/item/organ/external/antennae
+/obj/item/organ/antennae
name = "moth antennae"
desc = "A moths antennae. What is it telling them? What are they sensing?"
icon_state = "antennae"
@@ -198,24 +205,26 @@ Unlike normal organs, we're actually inside a persons limbs at all times
bodypart_overlay = /datum/bodypart_overlay/mutant/antennae
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
///Are we burned?
var/burnt = FALSE
///Store our old datum here for if our antennae are healed
var/original_sprite_datum
-/obj/item/organ/external/antennae/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/antennae/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_antennae))
RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_antennae))
-/obj/item/organ/external/antennae/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/antennae/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL))
///check if our antennae can burn off ;_;
-/obj/item/organ/external/antennae/proc/try_burn_antennae(mob/living/carbon/human/human)
+/obj/item/organ/antennae/proc/try_burn_antennae(mob/living/carbon/human/human)
SIGNAL_HANDLER
if(!burnt && human.bodytemperature >= 800 && human.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
@@ -225,13 +234,13 @@ Unlike normal organs, we're actually inside a persons limbs at all times
human.update_body_parts()
///Burn our antennae off ;_;
-/obj/item/organ/external/antennae/proc/burn_antennae()
+/obj/item/organ/antennae/proc/burn_antennae()
var/datum/bodypart_overlay/mutant/antennae/antennae = bodypart_overlay
antennae.burnt = TRUE
burnt = TRUE
///heal our antennae back up!!
-/obj/item/organ/external/antennae/proc/heal_antennae(datum/source, heal_flags)
+/obj/item/organ/antennae/proc/heal_antennae(datum/source, heal_flags)
SIGNAL_HANDLER
if(!burnt)
@@ -246,6 +255,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
/datum/bodypart_overlay/mutant/antennae
layers = EXTERNAL_FRONT | EXTERNAL_BEHIND
feature_key = "moth_antennae"
+ dyable = TRUE
///Accessory datum of the burn sprite
var/datum/sprite_accessory/burn_datum = /datum/sprite_accessory/moth_antennae/burnt_off
///Are we burned? If so we draw differently
@@ -268,7 +278,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
return FALSE
///The leafy hair of a podperson
-/obj/item/organ/external/pod_hair
+/obj/item/organ/pod_hair
name = "podperson hair"
desc = "Base for many-o-salads."
@@ -283,10 +293,13 @@ Unlike normal organs, we're actually inside a persons limbs at all times
bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
///Podperson bodypart overlay, with special coloring functionality to render the flowers in the inverse color
/datum/bodypart_overlay/mutant/pod_hair
layers = EXTERNAL_FRONT|EXTERNAL_ADJACENT
feature_key = "pod_hair"
+ dyable = TRUE
///This layer will be colored differently than the rest of the organ. So we can get differently colored flowers or something
var/color_swapped_layer = EXTERNAL_FRONT
@@ -300,8 +313,9 @@ Unlike normal organs, we're actually inside a persons limbs at all times
if(draw_layer != bitflag_to_layer(color_swapped_layer))
return ..()
- if(draw_color) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING
- var/list/rgb_list = rgb2num(draw_color)
+ var/color_to_use = dye_color || draw_color
+ if(color_to_use) // can someone explain to me why draw_color is allowed to EVER BE AN EMPTY STRING
+ var/list/rgb_list = rgb2num(color_to_use)
overlay.color = rgb(color_inverse_base - rgb_list[1], color_inverse_base - rgb_list[2], color_inverse_base - rgb_list[3]) //inversa da color
else
overlay.color = null
diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm
index 214c58df09923..23c29358a0dfc 100644
--- a/code/modules/surgery/organs/external/spines.dm
+++ b/code/modules/surgery/organs/external/spines.dm
@@ -1,5 +1,5 @@
///A lizards spines (those things on their back), but also including tail spines (gasp)
-/obj/item/organ/external/spines
+/obj/item/organ/spines
name = "lizard spines"
desc = "Not an actual spine, obviously."
icon_state = "spines"
@@ -14,15 +14,17 @@
bodypart_overlay = /datum/bodypart_overlay/mutant/spines
-/obj/item/organ/external/spines/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
+/obj/item/organ/spines/mob_insert(mob/living/carbon/receiver, special, movement_flags)
// If we have a tail, attempt to add a tail spines overlay
- var/obj/item/organ/external/tail/our_tail = receiver.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/our_tail = receiver.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
our_tail?.try_insert_tail_spines(our_tail.bodypart_owner)
return ..()
-/obj/item/organ/external/spines/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/spines/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
// If we have a tail, remove any tail spines overlay
- var/obj/item/organ/external/tail/our_tail = organ_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ var/obj/item/organ/tail/our_tail = organ_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
our_tail?.remove_tail_spines(our_tail.bodypart_owner)
return ..()
@@ -30,6 +32,7 @@
/datum/bodypart_overlay/mutant/spines
layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND
feature_key = "spines"
+ dyable = TRUE
/datum/bodypart_overlay/mutant/spines/get_global_feature_list()
return SSaccessories.spines_list
@@ -38,3 +41,8 @@
. = ..()
if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT))
return FALSE
+
+/datum/bodypart_overlay/mutant/spines/set_dye_color(new_color, obj/item/organ/tail/organ)
+ var/obj/item/organ/tail/tail = organ?.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
+ tail?.tail_spines_overlay?.set_dye_color(new_color, organ)
+ return ..()
diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm
index 5c7b211db7695..8004f88a68052 100644
--- a/code/modules/surgery/organs/external/tails.dm
+++ b/code/modules/surgery/organs/external/tails.dm
@@ -1,5 +1,5 @@
///Tail parent, it doesn't do very much.
-/obj/item/organ/external/tail
+/obj/item/organ/tail
name = "tail"
desc = "A severed tail. What did you cut this off of?"
icon_state = "severedtail"
@@ -13,6 +13,8 @@
// defaults to cat, but the parent type shouldn't be created regardless
bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
///Does this tail have a wagging sprite, and is it currently wagging?
var/wag_flags = NONE
///The original owner of this tail
@@ -20,7 +22,7 @@
///The overlay for tail spines, if any
var/datum/bodypart_overlay/mutant/tail_spines/tail_spines_overlay
-/obj/item/organ/external/tail/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/tail/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
if(.)
receiver.clear_mood_event("tail_lost")
@@ -39,18 +41,18 @@
else
receiver.add_mood_event("tail_regained", /datum/mood_event/tail_regained_wrong)
-/obj/item/organ/external/tail/on_bodypart_insert(obj/item/bodypart/bodypart)
- var/obj/item/organ/external/spines/our_spines = bodypart.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES)
+/obj/item/organ/tail/on_bodypart_insert(obj/item/bodypart/bodypart)
+ var/obj/item/organ/spines/our_spines = bodypart.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES)
if(our_spines)
try_insert_tail_spines(bodypart)
return ..()
-/obj/item/organ/external/tail/on_bodypart_remove(obj/item/bodypart/bodypart)
+/obj/item/organ/tail/on_bodypart_remove(obj/item/bodypart/bodypart)
remove_tail_spines(bodypart)
return ..()
/// If the owner has spines and an appropriate overlay exists, add a tail spines overlay.
-/obj/item/organ/external/tail/proc/try_insert_tail_spines(obj/item/bodypart/bodypart)
+/obj/item/organ/tail/proc/try_insert_tail_spines(obj/item/bodypart/bodypart)
// Don't insert another overlay if there already is one.
if(tail_spines_overlay)
return
@@ -69,13 +71,13 @@
bodypart.add_bodypart_overlay(tail_spines_overlay)
/// If we have a tail spines overlay, delete it
-/obj/item/organ/external/tail/proc/remove_tail_spines(obj/item/bodypart/bodypart)
+/obj/item/organ/tail/proc/remove_tail_spines(obj/item/bodypart/bodypart)
if(!tail_spines_overlay)
return
bodypart.remove_bodypart_overlay(tail_spines_overlay)
QDEL_NULL(tail_spines_overlay)
-/obj/item/organ/external/tail/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/tail/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if(wag_flags & WAG_WAGGING)
@@ -90,7 +92,7 @@
///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later
///Accepts an optional timeout after which we remove the tail wagging
///Returns false if the wag worked, true otherwise
-/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY)
+/obj/item/organ/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY)
if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging
return FALSE
if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied
@@ -108,13 +110,13 @@
RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died))
return TRUE
-/obj/item/organ/external/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy
+/obj/item/organ/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy
SIGNAL_HANDLER
stop_wag(organ_owner)
///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later
///Returns false if the wag stopping worked, true otherwise
-/obj/item/organ/external/tail/proc/stop_wag(mob/living/carbon/organ_owner)
+/obj/item/organ/tail/proc/stop_wag(mob/living/carbon/organ_owner)
if(!(wag_flags & WAG_ABLE))
return FALSE
@@ -134,12 +136,13 @@
UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH)
return succeeded
-/obj/item/organ/external/tail/proc/get_butt_sprite()
+/obj/item/organ/tail/proc/get_butt_sprite()
return null
///Tail parent type, with wagging functionality
/datum/bodypart_overlay/mutant/tail
layers = EXTERNAL_FRONT|EXTERNAL_BEHIND
+ dyable = TRUE
var/wagging = FALSE
/datum/bodypart_overlay/mutant/tail/get_base_icon_state()
@@ -150,7 +153,7 @@
return FALSE
return TRUE
-/obj/item/organ/external/tail/cat
+/obj/item/organ/tail/cat
name = "tail"
preference = "feature_human_tail"
@@ -158,7 +161,7 @@
wag_flags = WAG_ABLE
-/obj/item/organ/external/tail/cat/get_butt_sprite()
+/obj/item/organ/tail/cat/get_butt_sprite()
return icon('icons/mob/butts.dmi', BUTT_SPRITE_CAT)
///Cat tail bodypart overlay
@@ -169,7 +172,7 @@
/datum/bodypart_overlay/mutant/tail/cat/get_global_feature_list()
return SSaccessories.tails_list_felinid
-/obj/item/organ/external/tail/monkey
+/obj/item/organ/tail/monkey
name = "monkey tail"
preference = "feature_monkey_tail"
@@ -185,7 +188,7 @@
/datum/bodypart_overlay/mutant/tail/monkey/get_global_feature_list()
return SSaccessories.tails_list_monkey
-/obj/item/organ/external/tail/lizard
+/obj/item/organ/tail/lizard
name = "lizard tail"
desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves."
preference = "feature_lizard_tail"
@@ -202,7 +205,7 @@
/datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list()
return SSaccessories.tails_list_lizard
-/obj/item/organ/external/tail/lizard/fake
+/obj/item/organ/tail/lizard/fake
name = "fabricated lizard tail"
desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine."
@@ -225,3 +228,6 @@
. = ..()
if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT))
return FALSE
+
+/datum/bodypart_overlay/mutant/tail_spines/set_dye_color(new_color, obj/item/organ/organ)
+ dye_color = new_color //no update_body_parts() call, tail/set_dye_color will do it.
diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm
index 2b48337204a1a..63759761548d9 100644
--- a/code/modules/surgery/organs/external/wings/functional_wings.dm
+++ b/code/modules/surgery/organs/external/wings/functional_wings.dm
@@ -10,12 +10,12 @@
/datum/action/innate/flight/Activate()
var/mob/living/carbon/human/human = owner
- var/obj/item/organ/external/wings/functional/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
+ var/obj/item/organ/wings/functional/wings = human.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
if(wings?.can_fly(human))
wings.toggle_flight(human)
///The true wings that you can use to fly and shit (you cant actually shit with them)
-/obj/item/organ/external/wings/functional
+/obj/item/organ/wings/functional
///The flight action object
var/datum/action/innate/flight/fly
@@ -29,29 +29,29 @@
// grind_results = list(/datum/reagent/flightpotion = 5)
food_reagents = list(/datum/reagent/flightpotion = 5)
-/obj/item/organ/external/wings/functional/Destroy()
+/obj/item/organ/wings/functional/Destroy()
QDEL_NULL(fly)
return ..()
-/obj/item/organ/external/wings/functional/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/wings/functional/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
if(QDELETED(fly))
fly = new
fly.Grant(receiver)
-/obj/item/organ/external/wings/functional/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/wings/functional/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
fly?.Remove(organ_owner)
if(wings_open)
toggle_flight(organ_owner)
-/obj/item/organ/external/wings/functional/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/wings/functional/on_life(seconds_per_tick, times_fired)
. = ..()
handle_flight(owner)
///Called on_life(). Handle flight code and check if we're still flying
-/obj/item/organ/external/wings/functional/proc/handle_flight(mob/living/carbon/human/human)
+/obj/item/organ/wings/functional/proc/handle_flight(mob/living/carbon/human/human)
if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT))
return FALSE
if(!can_fly(human))
@@ -61,7 +61,7 @@
///Check if we're still eligible for flight (wings covered, atmosphere too thin, etc)
-/obj/item/organ/external/wings/functional/proc/can_fly(mob/living/carbon/human/human)
+/obj/item/organ/wings/functional/proc/can_fly(mob/living/carbon/human/human)
if(human.stat || human.body_position == LYING_DOWN || isnull(human.client))
return FALSE
//Jumpsuits have tail holes, so it makes sense they have wing holes too
@@ -79,7 +79,7 @@
return TRUE
///Slipping but in the air?
-/obj/item/organ/external/wings/functional/proc/fly_slip(mob/living/carbon/human/human)
+/obj/item/organ/wings/functional/proc/fly_slip(mob/living/carbon/human/human)
var/obj/buckled_obj
if(human.buckled)
buckled_obj = human.buckled
@@ -102,7 +102,7 @@
return TRUE
///UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly
-/obj/item/organ/external/wings/functional/proc/toggle_flight(mob/living/carbon/human/human)
+/obj/item/organ/wings/functional/proc/toggle_flight(mob/living/carbon/human/human)
if(!HAS_TRAIT_FROM(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT))
human.physiology.stun_mod *= 2
human.add_traits(list(TRAIT_NO_FLOATING_ANIM, TRAIT_MOVE_FLOATING, TRAIT_IGNORING_GRAVITY, TRAIT_NOGRAV_ALWAYS_DRIFT), SPECIES_FLIGHT_TRAIT)
@@ -129,7 +129,7 @@
close_wings()
human.refresh_gravity()
-/obj/item/organ/external/wings/functional/proc/on_client_move(mob/source, list/move_args)
+/obj/item/organ/wings/functional/proc/on_client_move(mob/source, list/move_args)
SIGNAL_HANDLER
if (!can_fly(source))
@@ -139,7 +139,7 @@
source.newtonian_move(dir2angle(source.client.intended_direction), instant = TRUE, drift_force = FUNCTIONAL_WING_FORCE, controlled_cap = max_drift_force)
source.setDir(source.client.intended_direction)
-/obj/item/organ/external/wings/functional/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup)
+/obj/item/organ/wings/functional/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup)
SIGNAL_HANDLER
if (get_dir(source, backup) == movement_dir || source.loc == backup.loc)
@@ -150,7 +150,7 @@
return COMPONENT_PREVENT_SPACEMOVE_HALT
-/obj/item/organ/external/wings/functional/process(seconds_per_tick)
+/obj/item/organ/wings/functional/process(seconds_per_tick)
if (!owner || !can_fly(owner) || isnull(owner.drift_handler))
return
@@ -158,14 +158,14 @@
owner.drift_handler.stabilize_drift(owner.client.intended_direction ? dir2angle(owner.client.intended_direction) : null, owner.client.intended_direction ? max_drift_force : 0, FUNCTIONAL_WING_STABILIZATION * (seconds_per_tick * 1 SECONDS))
///SPREAD OUR WINGS AND FLLLLLYYYYYY
-/obj/item/organ/external/wings/functional/proc/open_wings()
+/obj/item/organ/wings/functional/proc/open_wings()
var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay
overlay.open_wings()
wings_open = TRUE
owner.update_body_parts()
///close our wings
-/obj/item/organ/external/wings/functional/proc/close_wings()
+/obj/item/organ/wings/functional/proc/close_wings()
var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay
wings_open = FALSE
overlay.close_wings()
@@ -205,7 +205,7 @@
. += wings_open ? "open" : "closed"
///angel wings, which relate to humans. comes with holiness.
-/obj/item/organ/external/wings/functional/angel
+/obj/item/organ/wings/functional/angel
name = "angel wings"
desc = "Holier-than-thou attitude not included."
sprite_accessory_override = /datum/sprite_accessory/wings_open/angel
@@ -213,47 +213,47 @@
organ_traits = list(TRAIT_HOLY)
///dragon wings, which relate to lizards.
-/obj/item/organ/external/wings/functional/dragon
+/obj/item/organ/wings/functional/dragon
name = "dragon wings"
desc = "Hey, HEY- NOT lizard wings. Dragon wings. Mighty dragon wings."
sprite_accessory_override = /datum/sprite_accessory/wings/dragon
///robotic wings, which relate to androids.
-/obj/item/organ/external/wings/functional/robotic
+/obj/item/organ/wings/functional/robotic
name = "robotic wings"
desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gathering enough of them, and you can lift impressively large things."
organ_flags = ORGAN_ROBOTIC
sprite_accessory_override = /datum/sprite_accessory/wings/robotic
///skeletal wings, which relate to skeletal races.
-/obj/item/organ/external/wings/functional/skeleton
+/obj/item/organ/wings/functional/skeleton
name = "skeletal wings"
desc = "Powered by pure edgy-teenager-notebook-scribblings. Just kidding. But seriously, how do these keep you flying?!"
sprite_accessory_override = /datum/sprite_accessory/wings/skeleton
-/obj/item/organ/external/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner)
+/obj/item/organ/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner)
playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE)
///mothra wings, which relate to moths.
-/obj/item/organ/external/wings/functional/moth/mothra
+/obj/item/organ/wings/functional/moth/mothra
name = "mothra wings"
desc = "Fly like the mighty mothra of legend once did."
sprite_accessory_override = /datum/sprite_accessory/wings/mothra
///megamoth wings, which relate to moths as an alternate choice. they're both pretty cool.
-/obj/item/organ/external/wings/functional/moth/megamoth
+/obj/item/organ/wings/functional/moth/megamoth
name = "megamoth wings"
desc = "Don't get murderous."
sprite_accessory_override = /datum/sprite_accessory/wings/megamoth
///fly wings, which relate to flies.
-/obj/item/organ/external/wings/functional/fly
+/obj/item/organ/wings/functional/fly
name = "fly wings"
desc = "Fly as a fly."
sprite_accessory_override = /datum/sprite_accessory/wings/fly
///slime wings, which relate to slimes.
-/obj/item/organ/external/wings/functional/slime
+/obj/item/organ/wings/functional/slime
name = "slime wings"
desc = "How does something so squishy even fly?"
sprite_accessory_override = /datum/sprite_accessory/wings/slime
diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm
index 266d777b4572c..2753c88f2c478 100644
--- a/code/modules/surgery/organs/external/wings/moth_wings.dm
+++ b/code/modules/surgery/organs/external/wings/moth_wings.dm
@@ -1,7 +1,7 @@
#define MOTH_WING_FORCE 1 NEWTONS
///Moth wings! They can flutter in low-grav and burn off in heat
-/obj/item/organ/external/wings/moth
+/obj/item/organ/wings/moth
name = "moth wings"
desc = "Spread your wings and FLOOOOAAAAAT!"
@@ -16,7 +16,7 @@
///Store our old datum here for if our burned wings are healed
var/original_sprite_datum
-/obj/item/organ/external/wings/moth/on_mob_insert(mob/living/carbon/receiver)
+/obj/item/organ/wings/moth/on_mob_insert(mob/living/carbon/receiver)
. = ..()
RegisterSignal(receiver, COMSIG_HUMAN_BURNING, PROC_REF(try_burn_wings))
RegisterSignal(receiver, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(heal_wings))
@@ -24,18 +24,18 @@
RegisterSignal(receiver, COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE, PROC_REF(on_pushoff))
START_PROCESSING(SSnewtonian_movement, src)
-/obj/item/organ/external/wings/moth/on_mob_remove(mob/living/carbon/organ_owner)
+/obj/item/organ/wings/moth/on_mob_remove(mob/living/carbon/organ_owner)
. = ..()
UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_CLIENT_MOVE_NOGRAV, COMSIG_MOB_ATTEMPT_HALT_SPACEMOVE))
STOP_PROCESSING(SSnewtonian_movement, src)
-/obj/item/organ/external/wings/moth/make_flap_sound(mob/living/carbon/wing_owner)
+/obj/item/organ/wings/moth/make_flap_sound(mob/living/carbon/wing_owner)
playsound(wing_owner, 'sound/mobs/humanoids/moth/moth_flutter.ogg', 50, TRUE)
-/obj/item/organ/external/wings/moth/can_soften_fall()
+/obj/item/organ/wings/moth/can_soften_fall()
return !burnt
-/obj/item/organ/external/wings/moth/proc/allow_flight()
+/obj/item/organ/wings/moth/proc/allow_flight()
if(!owner || !owner.client)
return FALSE
if(!isturf(owner.loc))
@@ -59,14 +59,14 @@
return TRUE
return FALSE
-/obj/item/organ/external/wings/moth/process(seconds_per_tick)
+/obj/item/organ/wings/moth/process(seconds_per_tick)
if (!owner || !allow_flight() || isnull(owner.drift_handler))
return
var/max_drift_force = (DEFAULT_INERTIA_SPEED / owner.cached_multiplicative_slowdown - 1) / INERTIA_SPEED_COEF + 1
owner.drift_handler.stabilize_drift(owner.client.intended_direction ? dir2angle(owner.client.intended_direction) : null, owner.client.intended_direction ? max_drift_force : 0, MOTH_WING_FORCE * (seconds_per_tick * 1 SECONDS))
-/obj/item/organ/external/wings/moth/proc/on_client_move(mob/source, list/move_args)
+/obj/item/organ/wings/moth/proc/on_client_move(mob/source, list/move_args)
SIGNAL_HANDLER
if (!allow_flight())
@@ -76,7 +76,7 @@
source.newtonian_move(dir2angle(source.client.intended_direction), instant = TRUE, drift_force = MOTH_WING_FORCE, controlled_cap = max_drift_force)
source.setDir(source.client.intended_direction)
-/obj/item/organ/external/wings/moth/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup)
+/obj/item/organ/wings/moth/proc/on_pushoff(mob/source, movement_dir, continuous_move, atom/backup)
SIGNAL_HANDLER
if (get_dir(source, backup) == movement_dir || source.loc == backup.loc)
@@ -88,7 +88,7 @@
return COMPONENT_PREVENT_SPACEMOVE_HALT
///check if our wings can burn off ;_;
-/obj/item/organ/external/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human)
+/obj/item/organ/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human)
SIGNAL_HANDLER
if(!burnt && human.bodytemperature >= 800 && human.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
@@ -99,13 +99,13 @@
human.update_body_parts()
///burn the wings off
-/obj/item/organ/external/wings/moth/proc/burn_wings()
+/obj/item/organ/wings/moth/proc/burn_wings()
var/datum/bodypart_overlay/mutant/wings/moth/wings = bodypart_overlay
wings.burnt = TRUE
burnt = TRUE
///heal our wings back up!!
-/obj/item/organ/external/wings/moth/proc/heal_wings(datum/source, heal_flags)
+/obj/item/organ/wings/moth/proc/heal_wings(datum/source, heal_flags)
SIGNAL_HANDLER
if(!burnt)
diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm
index 775ffebf54cdf..07171f67a015d 100644
--- a/code/modules/surgery/organs/external/wings/wings.dm
+++ b/code/modules/surgery/organs/external/wings/wings.dm
@@ -1,5 +1,5 @@
///Wing base type. doesn't really do anything
-/obj/item/organ/external/wings
+/obj/item/organ/wings
name = "wings"
desc = "Spread your wings and FLLLLLLLLYYYYY!"
@@ -9,12 +9,14 @@
use_mob_sprite_as_obj_sprite = TRUE
bodypart_overlay = /datum/bodypart_overlay/mutant/wings
+ organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL
+
///Checks if the wings can soften short falls
-/obj/item/organ/external/wings/proc/can_soften_fall()
+/obj/item/organ/wings/proc/can_soften_fall()
return TRUE
///Implement as needed to play a sound effect on *flap emote
-/obj/item/organ/external/wings/proc/make_flap_sound(mob/living/carbon/wing_owner)
+/obj/item/organ/wings/proc/make_flap_sound(mob/living/carbon/wing_owner)
return
///Bodypart overlay of default wings. Does not have any wing functionality
diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm
index 598d5146e58fa..bec23ed568920 100644
--- a/code/modules/surgery/organs/helpers.dm
+++ b/code/modules/surgery/organs/helpers.dm
@@ -5,6 +5,7 @@
* * typepath The typepath of the organ to get
*/
/mob/proc/get_organ_by_type(typepath)
+ RETURN_TYPE(/obj/item/organ)
return
/**
diff --git a/code/modules/surgery/organs/internal/_internal_organ.dm b/code/modules/surgery/organs/internal/_internal_organ.dm
index 8b7bd35493127..0527e6d79808f 100644
--- a/code/modules/surgery/organs/internal/_internal_organ.dm
+++ b/code/modules/surgery/organs/internal/_internal_organ.dm
@@ -1,11 +1,11 @@
-/obj/item/organ/internal
+/obj/item/organ
name = "organ"
-/obj/item/organ/internal/Initialize(mapload)
+/obj/item/organ/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
-/obj/item/organ/internal/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
// organs_slot must ALWAYS be ordered in the same way as organ_process_order
@@ -14,7 +14,7 @@
STOP_PROCESSING(SSobj, src)
-/obj/item/organ/internal/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE)
+/obj/item/organ/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE)
. = ..()
if((organ_flags & ORGAN_VITAL) && !special && !HAS_TRAIT(organ_owner, TRAIT_GODMODE))
@@ -24,10 +24,10 @@
START_PROCESSING(SSobj, src)
-/obj/item/organ/internal/process(seconds_per_tick, times_fired)
+/obj/item/organ/process(seconds_per_tick, times_fired)
on_death(seconds_per_tick, times_fired) //Kinda hate doing it like this, but I really don't want to call process directly.
-/obj/item/organ/internal/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person
+/obj/item/organ/on_death(seconds_per_tick, times_fired) //runs decay when outside of a person
if(organ_flags & (ORGAN_ROBOTIC | ORGAN_FROZEN))
return
@@ -45,7 +45,7 @@
/// NOTE: THIS IS VERY HOT. Be careful what you put in here
/// To give you some scale, if there's 100 carbons in the game, they each have maybe 9 organs
/// So that's 900 calls to this proc every life process. Please don't be dumb
-/obj/item/organ/internal/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing
+/obj/item/organ/on_life(seconds_per_tick, times_fired) //repair organ damage if the organ is not failing
if(organ_flags & ORGAN_FAILING)
handle_failing_organs(seconds_per_tick)
return
@@ -70,15 +70,15 @@
apply_organ_damage(-healing_amount * maxHealth * seconds_per_tick, damage) // pass curent damage incase we are over cap
///Used as callbacks by object pooling
-/obj/item/organ/internal/exit_wardrobe()
+/obj/item/organ/exit_wardrobe()
START_PROCESSING(SSobj, src)
//See above
-/obj/item/organ/internal/enter_wardrobe()
+/obj/item/organ/enter_wardrobe()
STOP_PROCESSING(SSobj, src)
///Organs don't die instantly, and neither should you when you get fucked up
-/obj/item/organ/internal/handle_failing_organs(seconds_per_tick)
+/obj/item/organ/handle_failing_organs(seconds_per_tick)
if(owner.stat == DEAD)
return
diff --git a/code/modules/surgery/organs/internal/appendix/_appendix.dm b/code/modules/surgery/organs/internal/appendix/_appendix.dm
index 420d4efc1185c..98e8a0f4ed116 100644
--- a/code/modules/surgery/organs/internal/appendix/_appendix.dm
+++ b/code/modules/surgery/organs/internal/appendix/_appendix.dm
@@ -2,7 +2,7 @@
#define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600)
#define INFLAMATION_ADVANCEMENT_PROB 2
-/obj/item/organ/internal/appendix
+/obj/item/organ/appendix
name = "appendix"
icon_state = "appendix"
base_icon_state = "appendix"
@@ -19,15 +19,15 @@
var/inflamation_stage = 0
-/obj/item/organ/internal/appendix/update_name()
+/obj/item/organ/appendix/update_name()
. = ..()
name = "[inflamation_stage ? "inflamed " : null][initial(name)]"
-/obj/item/organ/internal/appendix/update_icon_state()
+/obj/item/organ/appendix/update_icon_state()
icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]"
return ..()
-/obj/item/organ/internal/appendix/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/appendix/on_life(seconds_per_tick, times_fired)
. = ..()
if(!owner)
return
@@ -40,7 +40,7 @@
else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_TEMPORARY_BODY))
become_inflamed()
-/obj/item/organ/internal/appendix/proc/become_inflamed()
+/obj/item/organ/appendix/proc/become_inflamed()
inflamation_stage = 1
update_appearance()
if(owner)
@@ -52,7 +52,7 @@
header = "Whoa, Sick!",
)
-/obj/item/organ/internal/appendix/proc/inflamation(seconds_per_tick)
+/obj/item/organ/appendix/proc/inflamation(seconds_per_tick)
var/mob/living/carbon/organ_owner = owner
if(inflamation_stage < 3 && SPT_PROB(INFLAMATION_ADVANCEMENT_PROB, seconds_per_tick))
inflamation_stage += 1
@@ -73,21 +73,21 @@
organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15)
-/obj/item/organ/internal/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantappendix
-/obj/item/organ/internal/appendix/on_mob_remove(mob/living/carbon/organ_owner)
+/obj/item/organ/appendix/on_mob_remove(mob/living/carbon/organ_owner)
. = ..()
REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
organ_owner.med_hud_set_status()
-/obj/item/organ/internal/appendix/on_mob_insert(mob/living/carbon/organ_owner)
+/obj/item/organ/appendix/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
if(inflamation_stage)
ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
organ_owner.med_hud_set_status()
-/obj/item/organ/internal/appendix/get_status_text(advanced, add_tooltips)
+/obj/item/organ/appendix/get_status_text(advanced, add_tooltips)
if(!(organ_flags & ORGAN_FAILING) && inflamation_stage)
return conditional_tooltip("Inflamed", "Remove surgically.", add_tooltips)
return ..()
diff --git a/code/modules/surgery/organs/internal/appendix/appendix_golem.dm b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm
index 5510b4bf96796..08a53e28f8d9c 100644
--- a/code/modules/surgery/organs/internal/appendix/appendix_golem.dm
+++ b/code/modules/surgery/organs/internal/appendix/appendix_golem.dm
@@ -1,5 +1,5 @@
-/obj/item/organ/internal/appendix/golem
+/obj/item/organ/appendix/golem
name = "internal forge"
desc = "This expanded digestive chamber allows golems to smelt minerals, provided that they are immersed in lava."
icon_state = "ethereal_heart-off"
@@ -8,16 +8,16 @@
/// Action which performs smelting
var/datum/action/cooldown/internal_smelting/smelter
-/obj/item/organ/internal/appendix/golem/Initialize(mapload)
+/obj/item/organ/appendix/golem/Initialize(mapload)
. = ..()
smelter = new(src)
-/obj/item/organ/internal/appendix/golem/on_mob_insert(mob/living/carbon/organ_owner)
+/obj/item/organ/appendix/golem/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_for_lava))
/// Give the action while in lava
-/obj/item/organ/internal/appendix/golem/proc/check_for_lava(mob/living/owner)
+/obj/item/organ/appendix/golem/proc/check_for_lava(mob/living/owner)
SIGNAL_HANDLER
if (!islava(owner.loc))
smelter.Remove(owner)
@@ -25,12 +25,12 @@
if (smelter.owner != owner)
smelter.Grant(owner)
-/obj/item/organ/internal/appendix/golem/on_mob_remove(mob/living/carbon/organ_owner)
+/obj/item/organ/appendix/golem/on_mob_remove(mob/living/carbon/organ_owner)
UnregisterSignal(organ_owner, COMSIG_MOVABLE_MOVED)
smelter?.Remove(organ_owner) // Might have been deleted by Destroy already
return ..()
-/obj/item/organ/internal/appendix/golem/Destroy()
+/obj/item/organ/appendix/golem/Destroy()
QDEL_NULL(smelter)
return ..()
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
index 0946d1441039c..a07b8caed6c9f 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/cyberimp/arm
+/obj/item/organ/cyberimp/arm
name = "arm-mounted implant"
desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
zone = BODY_ZONE_R_ARM
@@ -22,7 +22,7 @@
/// Organ slot that the implant occupies for the left arm
var/left_arm_organ_slot = ORGAN_SLOT_LEFT_ARM_AUG
-/obj/item/organ/internal/cyberimp/arm/Initialize(mapload)
+/obj/item/organ/cyberimp/arm/Initialize(mapload)
. = ..()
if(ispath(active_item))
active_item = new active_item(src)
@@ -35,7 +35,7 @@
update_appearance()
SetSlotFromZone()
-/obj/item/organ/internal/cyberimp/arm/Destroy()
+/obj/item/organ/cyberimp/arm/Destroy()
hand = null
active_item = null
for(var/datum/weakref/ref in items_list)
@@ -49,7 +49,7 @@
/datum/action/item_action/organ_action/toggle/toolkit
desc = "You can also activate your empty hand or the tool in your hand to open the tools radial menu."
-/obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone()
+/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone()
switch(zone)
if(BODY_ZONE_L_ARM)
slot = left_arm_organ_slot
@@ -58,16 +58,16 @@
else
CRASH("Invalid zone for [type]")
-/obj/item/organ/internal/cyberimp/arm/update_icon()
+/obj/item/organ/cyberimp/arm/update_icon()
. = ..()
transform = (zone == BODY_ZONE_R_ARM) ? null : matrix(-1, 0, 0, 0, 1, 0)
-/obj/item/organ/internal/cyberimp/arm/examine(mob/user)
+/obj/item/organ/cyberimp/arm/examine(mob/user)
. = ..()
if(IS_ROBOTIC_ORGAN(src))
. += span_info("[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.")
-/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool)
+/obj/item/organ/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool)
. = ..()
if(.)
return TRUE
@@ -80,19 +80,19 @@
to_chat(user, span_notice("You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."))
update_appearance()
-/obj/item/organ/internal/cyberimp/arm/on_mob_insert(mob/living/carbon/arm_owner)
+/obj/item/organ/cyberimp/arm/on_mob_insert(mob/living/carbon/arm_owner)
. = ..()
RegisterSignal(arm_owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_limb_attached))
RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible.
on_limb_attached(arm_owner, arm_owner.hand_bodyparts[zone == BODY_ZONE_R_ARM ? RIGHT_HANDS : LEFT_HANDS])
-/obj/item/organ/internal/cyberimp/arm/on_mob_remove(mob/living/carbon/arm_owner)
+/obj/item/organ/cyberimp/arm/on_mob_remove(mob/living/carbon/arm_owner)
. = ..()
Retract()
UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN))
on_limb_detached(hand)
-/obj/item/organ/internal/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb)
+/obj/item/organ/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb)
SIGNAL_HANDLER
if(!limb || QDELETED(limb) || limb.body_zone != zone)
return
@@ -102,18 +102,18 @@
RegisterSignal(limb, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_detached))
hand = limb
-/obj/item/organ/internal/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source)
+/obj/item/organ/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source)
SIGNAL_HANDLER
if(source != hand || QDELETED(hand))
return
UnregisterSignal(hand, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_BODYPART_REMOVED))
hand = null
-/obj/item/organ/internal/cyberimp/arm/proc/on_item_attack_self()
+/obj/item/organ/cyberimp/arm/proc/on_item_attack_self()
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(ui_action_click))
-/obj/item/organ/internal/cyberimp/arm/emp_act(severity)
+/obj/item/organ/cyberimp/arm/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF || !IS_ROBOTIC_ORGAN(src))
return
@@ -129,7 +129,7 @@
* quick way to store implant items. In this case, we check to make sure the user has the correct arm
* selected, and that the item is actually owned by us, and then we'll hand off the rest to Retract()
**/
-/obj/item/organ/internal/cyberimp/arm/proc/dropkey(mob/living/carbon/host)
+/obj/item/organ/cyberimp/arm/proc/dropkey(mob/living/carbon/host)
SIGNAL_HANDLER
if(!host)
return //How did we even get here
@@ -138,7 +138,7 @@
if(Retract())
return COMSIG_KB_ACTIVATED
-/obj/item/organ/internal/cyberimp/arm/proc/Retract()
+/obj/item/organ/cyberimp/arm/proc/Retract()
if(!active_item || (active_item in src))
return FALSE
active_item.resistance_flags = active_item::resistance_flags
@@ -159,7 +159,7 @@
playsound(get_turf(owner), retract_sound, 50, TRUE)
return TRUE
-/obj/item/organ/internal/cyberimp/arm/proc/Extend(obj/item/augment)
+/obj/item/organ/cyberimp/arm/proc/Extend(obj/item/augment)
if(!(augment in src))
return
@@ -198,12 +198,12 @@
if(length(items_list) > 1)
RegisterSignals(active_item, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(swap_tools)) // secondary for welders
-/obj/item/organ/internal/cyberimp/arm/proc/swap_tools(active_item)
+/obj/item/organ/cyberimp/arm/proc/swap_tools(active_item)
SIGNAL_HANDLER
Retract(active_item)
INVOKE_ASYNC(src, PROC_REF(ui_action_click))
-/obj/item/organ/internal/cyberimp/arm/ui_action_click()
+/obj/item/organ/cyberimp/arm/ui_action_click()
if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len))
to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken..."))
return
@@ -228,7 +228,7 @@
Retract()
-/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
+/obj/item/organ/cyberimp/arm/gun/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -243,25 +243,25 @@
organ_flags |= ORGAN_FAILING
-/obj/item/organ/internal/cyberimp/arm/gun/laser
+/obj/item/organ/cyberimp/arm/gun/laser
name = "arm-mounted laser implant"
desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
icon_state = "arm_laser"
items_to_create = list(/obj/item/gun/energy/laser/mounted/augment)
-/obj/item/organ/internal/cyberimp/arm/gun/laser/l
+/obj/item/organ/cyberimp/arm/gun/laser/l
zone = BODY_ZONE_L_ARM
-/obj/item/organ/internal/cyberimp/arm/gun/taser
+/obj/item/organ/cyberimp/arm/gun/taser
name = "arm-mounted taser implant"
desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use."
icon_state = "arm_taser"
items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted)
-/obj/item/organ/internal/cyberimp/arm/gun/taser/l
+/obj/item/organ/cyberimp/arm/gun/taser/l
zone = BODY_ZONE_L_ARM
-/obj/item/organ/internal/cyberimp/arm/toolset
+/obj/item/organ/cyberimp/arm/toolset
name = "integrated toolset implant"
desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool."
icon_state = "toolkit_engineering"
@@ -275,10 +275,10 @@
/obj/item/multitool/cyborg,
)
-/obj/item/organ/internal/cyberimp/arm/toolset/l
+/obj/item/organ/cyberimp/arm/toolset/l
zone = BODY_ZONE_L_ARM
-/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card)
+/obj/item/organ/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card)
for(var/datum/weakref/created_item in items_list)
var/obj/potential_knife = created_item.resolve()
if(istype(/obj/item/knife/combat/cyborg, potential_knife))
@@ -288,23 +288,23 @@
items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src))
return TRUE
-/obj/item/organ/internal/cyberimp/arm/esword
+/obj/item/organ/cyberimp/arm/esword
name = "arm-mounted energy blade"
desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy."
items_to_create = list(/obj/item/melee/energy/blade/hardlight)
-/obj/item/organ/internal/cyberimp/arm/medibeam
+/obj/item/organ/cyberimp/arm/medibeam
name = "integrated medical beamgun"
desc = "A cybernetic implant that allows the user to project a healing beam from their hand."
items_to_create = list(/obj/item/gun/medbeam)
-/obj/item/organ/internal/cyberimp/arm/flash
+/obj/item/organ/cyberimp/arm/flash
name = "integrated high-intensity photon projector" //Why not
desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash."
items_to_create = list(/obj/item/assembly/flash/armimplant)
-/obj/item/organ/internal/cyberimp/arm/flash/Initialize(mapload)
+/obj/item/organ/cyberimp/arm/flash/Initialize(mapload)
. = ..()
for(var/datum/weakref/created_item in items_list)
var/obj/potential_flash = created_item.resolve()
@@ -313,22 +313,22 @@
var/obj/item/assembly/flash/armimplant/flash = potential_flash
flash.arm = WEAKREF(src)
-/obj/item/organ/internal/cyberimp/arm/flash/Extend()
+/obj/item/organ/cyberimp/arm/flash/Extend()
. = ..()
active_item.set_light_range(7)
active_item.set_light_on(TRUE)
-/obj/item/organ/internal/cyberimp/arm/flash/Retract()
+/obj/item/organ/cyberimp/arm/flash/Retract()
if(active_item)
active_item.set_light_on(FALSE)
return ..()
-/obj/item/organ/internal/cyberimp/arm/baton
+/obj/item/organ/cyberimp/arm/baton
name = "arm electrification implant"
desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm."
items_to_create = list(/obj/item/borg/stun)
-/obj/item/organ/internal/cyberimp/arm/combat
+/obj/item/organ/cyberimp/arm/combat
name = "combat cybernetics implant"
desc = "A powerful cybernetic implant that contains combat modules built into the user's arm."
items_to_create = list(
@@ -338,7 +338,7 @@
/obj/item/assembly/flash/armimplant,
)
-/obj/item/organ/internal/cyberimp/arm/combat/Initialize(mapload)
+/obj/item/organ/cyberimp/arm/combat/Initialize(mapload)
. = ..()
for(var/datum/weakref/created_item in items_list)
var/obj/potential_flash = created_item.resolve()
@@ -347,7 +347,7 @@
var/obj/item/assembly/flash/armimplant/flash = potential_flash
flash.arm = WEAKREF(src)
-/obj/item/organ/internal/cyberimp/arm/surgery
+/obj/item/organ/cyberimp/arm/surgery
name = "surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
icon_state = "toolkit_surgical"
@@ -362,7 +362,7 @@
/obj/item/surgical_drapes,
)
-/obj/item/organ/internal/cyberimp/arm/surgery/emagged
+/obj/item/organ/cyberimp/arm/surgery/emagged
name = "hacked surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm. This one seems to have been tampered with."
items_to_create = list(
@@ -376,7 +376,7 @@
/obj/item/knife/combat/cyborg,
)
-/obj/item/organ/internal/cyberimp/arm/strongarm
+/obj/item/organ/cyberimp/arm/strongarm
name = "\proper Strong-Arm empowered musculature implant"
desc = "When implanted, this cybernetic implant will enhance the muscles of the arm to deliver more power-per-action."
icon_state = "muscle_implant"
@@ -409,19 +409,19 @@
///Tracks how soon we can perform another slam attack
COOLDOWN_DECLARE(slam_cooldown)
-/obj/item/organ/internal/cyberimp/arm/strongarm/l
+/obj/item/organ/cyberimp/arm/strongarm/l
zone = BODY_ZONE_L_ARM
-/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_insert(mob/living/carbon/arm_owner)
+/obj/item/organ/cyberimp/arm/strongarm/on_mob_insert(mob/living/carbon/arm_owner)
. = ..()
if(ishuman(arm_owner)) //Sorry, only humans
RegisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand))
-/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_remove(mob/living/carbon/arm_owner)
+/obj/item/organ/cyberimp/arm/strongarm/on_mob_remove(mob/living/carbon/arm_owner)
. = ..()
UnregisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK)
-/obj/item/organ/internal/cyberimp/arm/strongarm/emp_act(severity)
+/obj/item/organ/cyberimp/arm/strongarm/emp_act(severity)
. = ..()
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
return
@@ -429,11 +429,11 @@
organ_flags |= ORGAN_FAILING
addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity)
-/obj/item/organ/internal/cyberimp/arm/strongarm/proc/reboot()
+/obj/item/organ/cyberimp/arm/strongarm/proc/reboot()
organ_flags &= ~ORGAN_FAILING
owner.balloon_alert(owner, "your arm stops spasming!")
-/obj/item/organ/internal/cyberimp/arm/strongarm/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers)
+/obj/item/organ/cyberimp/arm/strongarm/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers)
SIGNAL_HANDLER
if(source.get_active_hand() != hand || !proximity)
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm
index c9cbfbe445bdf..eae996502e4ab 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm
@@ -1,9 +1,9 @@
-/obj/item/organ/internal/cyberimp/chest
+/obj/item/organ/cyberimp/chest
name = "cybernetic torso implant"
desc = "Implants for the organs in your torso."
zone = BODY_ZONE_CHEST
-/obj/item/organ/internal/cyberimp/chest/nutriment
+/obj/item/organ/cyberimp/chest/nutriment
name = "nutriment pump implant"
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
icon_state = "nutriment_implant"
@@ -12,7 +12,7 @@
var/poison_amount = 5
slot = ORGAN_SLOT_STOMACH_AID
-/obj/item/organ/internal/cyberimp/chest/nutriment/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/cyberimp/chest/nutriment/on_life(seconds_per_tick, times_fired)
if(synthesizing)
return
@@ -22,10 +22,10 @@
owner.adjust_nutrition(25 * seconds_per_tick)
addtimer(CALLBACK(src, PROC_REF(synth_cool)), 5 SECONDS)
-/obj/item/organ/internal/cyberimp/chest/nutriment/proc/synth_cool()
+/obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool()
synthesizing = FALSE
-/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity)
+/obj/item/organ/cyberimp/chest/nutriment/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
@@ -33,14 +33,14 @@
to_chat(owner, span_warning("You feel like your insides are burning."))
-/obj/item/organ/internal/cyberimp/chest/nutriment/plus
+/obj/item/organ/cyberimp/chest/nutriment/plus
name = "nutriment pump implant PLUS"
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
icon_state = "adv_nutriment_implant"
hunger_threshold = NUTRITION_LEVEL_HUNGRY
poison_amount = 10
-/obj/item/organ/internal/cyberimp/chest/reviver
+/obj/item/organ/cyberimp/chest/reviver
name = "reviver implant"
desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!"
icon_state = "reviver_implant"
@@ -50,15 +50,15 @@
COOLDOWN_DECLARE(reviver_cooldown)
COOLDOWN_DECLARE(defib_cooldown)
-/obj/item/organ/internal/cyberimp/chest/reviver/on_death(seconds_per_tick, times_fired)
- if(isnull(owner)) // owner can be null, on_death() gets called by /obj/item/organ/internal/process() for decay
+/obj/item/organ/cyberimp/chest/reviver/on_death(seconds_per_tick, times_fired)
+ if(isnull(owner)) // owner can be null, on_death() gets called by /obj/item/organ/process() for decay
return
try_heal() // Allows implant to work even on dead people
-/obj/item/organ/internal/cyberimp/chest/reviver/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/cyberimp/chest/reviver/on_life(seconds_per_tick, times_fired)
try_heal()
-/obj/item/organ/internal/cyberimp/chest/reviver/proc/try_heal()
+/obj/item/organ/cyberimp/chest/reviver/proc/try_heal()
if(reviving)
if(owner.stat == CONSCIOUS)
COOLDOWN_START(src, reviver_cooldown, revive_cost)
@@ -78,7 +78,7 @@
COOLDOWN_START(src, defib_cooldown, 8 SECONDS) // 5 seconds after heal proc delay
-/obj/item/organ/internal/cyberimp/chest/reviver/proc/heal()
+/obj/item/organ/cyberimp/chest/reviver/proc/heal()
if(COOLDOWN_FINISHED(src, defib_cooldown))
revive_dead()
@@ -106,7 +106,7 @@
owner.visible_message(span_warning("[owner]'s body twitches a bit."), span_notice("You feel like something is patching your injured body."))
-/obj/item/organ/internal/cyberimp/chest/reviver/proc/revive_dead()
+/obj/item/organ/cyberimp/chest/reviver/proc/revive_dead()
if(!COOLDOWN_FINISHED(src, defib_cooldown) || owner.stat != DEAD || owner.can_defib() != DEFIB_POSSIBLE)
return
owner.notify_revival("You are being revived by [src]!")
@@ -126,7 +126,7 @@
log_game("[owner] been revived by [src]")
-/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity)
+/obj/item/organ/cyberimp/chest/reviver/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
@@ -143,7 +143,7 @@
to_chat(human_owner, span_userdanger("You feel a horrible agony in your chest!"))
addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), 600 / severity)
-/obj/item/organ/internal/cyberimp/chest/reviver/proc/undo_heart_attack()
+/obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack()
var/mob/living/carbon/human/human_owner = owner
if(!istype(human_owner))
return
@@ -152,7 +152,7 @@
to_chat(human_owner, span_notice("You feel your heart beating again!"))
-/obj/item/organ/internal/cyberimp/chest/thrusters
+/obj/item/organ/cyberimp/chest/thrusters
name = "implantable thrusters set"
desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \
Unlike regular jetpacks, this device has no stabilization system."
@@ -164,7 +164,7 @@
w_class = WEIGHT_CLASS_NORMAL
var/on = FALSE
-/obj/item/organ/internal/cyberimp/chest/thrusters/Initialize(mapload)
+/obj/item/organ/cyberimp/chest/thrusters/Initialize(mapload)
. = ..()
AddComponent( \
/datum/component/jetpack, \
@@ -178,21 +178,21 @@
/datum/effect_system/trail_follow/ion, \
)
-/obj/item/organ/internal/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special, movement_flags)
+/obj/item/organ/cyberimp/chest/thrusters/Remove(mob/living/carbon/thruster_owner, special, movement_flags)
if(on)
deactivate(silent = TRUE)
..()
-/obj/item/organ/internal/cyberimp/chest/thrusters/ui_action_click()
+/obj/item/organ/cyberimp/chest/thrusters/ui_action_click()
toggle()
-/obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle(silent = FALSE)
+/obj/item/organ/cyberimp/chest/thrusters/proc/toggle(silent = FALSE)
if(on)
deactivate()
else
activate()
-/obj/item/organ/internal/cyberimp/chest/thrusters/proc/activate(silent = FALSE)
+/obj/item/organ/cyberimp/chest/thrusters/proc/activate(silent = FALSE)
if(on)
return
if(organ_flags & ORGAN_FAILING)
@@ -208,7 +208,7 @@
to_chat(owner, span_notice("You turn your thrusters set on."))
update_appearance()
-/obj/item/organ/internal/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE)
+/obj/item/organ/cyberimp/chest/thrusters/proc/deactivate(silent = FALSE)
if(!on)
return
SEND_SIGNAL(src, COMSIG_THRUSTER_DEACTIVATED, owner)
@@ -218,11 +218,11 @@
on = FALSE
update_appearance()
-/obj/item/organ/internal/cyberimp/chest/thrusters/update_icon_state()
+/obj/item/organ/cyberimp/chest/thrusters/update_icon_state()
icon_state = "[base_icon_state][on ? "-on" : null]"
return ..()
-/obj/item/organ/internal/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE)
+/obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE)
if(!owner)
return FALSE
@@ -257,7 +257,7 @@
deactivate(silent = TRUE)
return FALSE
-/obj/item/organ/internal/cyberimp/chest/spine
+/obj/item/organ/cyberimp/chest/spine
name = "\improper Herculean gravitronic spinal implant"
desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \
Contains a slot which can be upgraded with a gravity anomaly core, improving its performance."
@@ -274,21 +274,21 @@
/// The overlay for our implant to indicate that, yes, this person has an implant inserted.
var/mutable_appearance/stone_overlay
-/obj/item/organ/internal/cyberimp/chest/spine/emp_act(severity)
+/obj/item/organ/cyberimp/chest/spine/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
to_chat(owner, span_warning("You feel sheering pain as your body is crushed like a soda can!"))
owner.apply_damage(20/severity, BRUTE, def_zone = BODY_ZONE_CHEST)
-/obj/item/organ/internal/cyberimp/chest/spine/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/cyberimp/chest/spine/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
stone_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "stone")
organ_owner.add_overlay(stone_overlay)
if(core_applied)
organ_owner.AddElement(/datum/element/forced_gravity, 1)
-/obj/item/organ/internal/cyberimp/chest/spine/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/cyberimp/chest/spine/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if(stone_overlay)
organ_owner.cut_overlay(stone_overlay)
@@ -296,7 +296,7 @@
if(core_applied)
organ_owner.RemoveElement(/datum/element/forced_gravity, 1)
-/obj/item/organ/internal/cyberimp/chest/spine/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+/obj/item/organ/cyberimp/chest/spine/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(core_applied)
user.balloon_alert(user, "core already installed!")
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm
index aa67fe0c08de8..d720953a24ca5 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_eyes.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/cyberimp/eyes
+/obj/item/organ/cyberimp/eyes
name = "cybernetic eye implant"
desc = "Implants for your eyes."
icon_state = "eye_implant"
@@ -7,7 +7,7 @@
w_class = WEIGHT_CLASS_TINY
// HUD implants
-/obj/item/organ/internal/cyberimp/eyes/hud
+/obj/item/organ/cyberimp/eyes/hud
name = "HUD implant"
desc = "These cybernetic eyes will display a HUD over everything you see. Maybe."
slot = ORGAN_SLOT_HUD
@@ -17,7 +17,7 @@
var/toggled_on = TRUE
-/obj/item/organ/internal/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner)
+/obj/item/organ/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner)
if(toggled_on)
toggled_on = FALSE
eye_owner.add_traits(HUD_traits, ORGAN_TRAIT)
@@ -27,36 +27,36 @@
eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT)
balloon_alert(eye_owner, "hud enabled")
-/obj/item/organ/internal/cyberimp/eyes/hud/mob_insert(mob/living/carbon/eye_owner, special = FALSE, movement_flags)
+/obj/item/organ/cyberimp/eyes/hud/mob_insert(mob/living/carbon/eye_owner, special = FALSE, movement_flags)
. = ..()
eye_owner.add_traits(HUD_traits, ORGAN_TRAIT)
toggled_on = TRUE
-/obj/item/organ/internal/cyberimp/eyes/hud/mob_remove(mob/living/carbon/eye_owner, special, movement_flags)
+/obj/item/organ/cyberimp/eyes/hud/mob_remove(mob/living/carbon/eye_owner, special, movement_flags)
. = ..()
eye_owner.remove_traits(HUD_traits, ORGAN_TRAIT)
toggled_on = FALSE
-/obj/item/organ/internal/cyberimp/eyes/hud/medical
+/obj/item/organ/cyberimp/eyes/hud/medical
name = "medical HUD implant"
desc = "These cybernetic eye implants will display a medical HUD over everything you see."
icon_state = "eye_implant_medical"
HUD_traits = list(TRAIT_MEDICAL_HUD)
-/obj/item/organ/internal/cyberimp/eyes/hud/security
+/obj/item/organ/cyberimp/eyes/hud/security
name = "security HUD implant"
desc = "These cybernetic eye implants will display a security HUD over everything you see."
icon_state = "eye_implant_security"
HUD_traits = list(TRAIT_SECURITY_HUD)
-/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic
+/obj/item/organ/cyberimp/eyes/hud/diagnostic
name = "diagnostic HUD implant"
desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see."
icon_state = "eye_implant_diagnostic"
HUD_traits = list(TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD)
-/obj/item/organ/internal/cyberimp/eyes/hud/security/syndicate
+/obj/item/organ/cyberimp/eyes/hud/security/syndicate
name = "contraband security HUD implant"
desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see."
icon_state = "eye_implant_syndicate"
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
index 334c8941f6b8f..42f0e5ac7b237 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
@@ -1,5 +1,5 @@
-/obj/item/organ/internal/cyberimp
+/obj/item/organ/cyberimp
name = "cybernetic implant"
desc = "A state-of-the-art implant that improves a baseline's functionality."
@@ -8,7 +8,7 @@
var/implant_color = COLOR_WHITE
var/implant_overlay
-/obj/item/organ/internal/cyberimp/New(mob/implanted_mob = null)
+/obj/item/organ/cyberimp/New(mob/implanted_mob = null)
if(iscarbon(implanted_mob))
src.Insert(implanted_mob)
if(implant_overlay)
@@ -19,13 +19,13 @@
//[[[[BRAIN]]]]
-/obj/item/organ/internal/cyberimp/brain
+/obj/item/organ/cyberimp/brain
name = "cybernetic brain implant"
desc = "Injectors of extra sub-routines for the brain."
zone = BODY_ZONE_HEAD
w_class = WEIGHT_CLASS_TINY
-/obj/item/organ/internal/cyberimp/brain/emp_act(severity)
+/obj/item/organ/cyberimp/brain/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
@@ -34,7 +34,7 @@
to_chat(owner, span_warning("Your body seizes up!"))
-/obj/item/organ/internal/cyberimp/brain/anti_drop
+/obj/item/organ/cyberimp/brain/anti_drop
name = "anti-drop implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
icon_state = "brain_implant_antidrop"
@@ -43,7 +43,7 @@
slot = ORGAN_SLOT_BRAIN_CEREBELLUM
actions_types = list(/datum/action/item_action/organ_action/toggle)
-/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click()
+/obj/item/organ/cyberimp/brain/anti_drop/ui_action_click()
active = !active
if(active)
var/list/hold_list = owner.get_empty_held_indexes()
@@ -63,7 +63,7 @@
to_chat(owner, span_notice("Your hands relax..."))
-/obj/item/organ/internal/cyberimp/brain/anti_drop/emp_act(severity)
+/obj/item/organ/cyberimp/brain/anti_drop/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
@@ -78,25 +78,25 @@
stored_items = list()
-/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items()
+/obj/item/organ/cyberimp/brain/anti_drop/proc/release_items()
for(var/obj/item/stored_item as anything in stored_items)
REMOVE_TRAIT(stored_item, TRAIT_NODROP, IMPLANT_TRAIT)
UnregisterSignal(stored_item, COMSIG_ITEM_DROPPED)
stored_items = list()
-/obj/item/organ/internal/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special, movement_flags)
+/obj/item/organ/cyberimp/brain/anti_drop/Remove(mob/living/carbon/implant_owner, special, movement_flags)
if(active)
ui_action_click()
..()
-/obj/item/organ/internal/cyberimp/brain/anti_drop/proc/on_held_item_dropped(obj/item/source, mob/user)
+/obj/item/organ/cyberimp/brain/anti_drop/proc/on_held_item_dropped(obj/item/source, mob/user)
SIGNAL_HANDLER
REMOVE_TRAIT(source, TRAIT_NODROP, IMPLANT_TRAIT)
UnregisterSignal(source, COMSIG_ITEM_DROPPED)
stored_items -= source
-/obj/item/organ/internal/cyberimp/brain/anti_stun
+/obj/item/organ/cyberimp/brain/anti_stun
name = "CNS rebooter implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
icon_state = "brain_implant_rebooter"
@@ -114,28 +114,28 @@
var/stun_resistance_time = 6 SECONDS
COOLDOWN_DECLARE(implant_cooldown)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner)
+/obj/item/organ/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner)
. = ..()
UnregisterSignal(implant_owner, signalCache)
UnregisterSignal(implant_owner, COMSIG_LIVING_ENTER_STAMCRIT)
remove_stun_buffs(implant_owner)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver)
+/obj/item/organ/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver)
. = ..()
RegisterSignals(receiver, signalCache, PROC_REF(on_signal))
RegisterSignal(receiver, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit))
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount)
+/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount)
SIGNAL_HANDLER
if(!(organ_flags & ORGAN_FAILING) && amount > 0)
addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_stamcrit(datum/source)
+/obj/item/organ/cyberimp/brain/anti_stun/proc/on_stamcrit(datum/source)
SIGNAL_HANDLER
if(!(organ_flags & ORGAN_FAILING))
addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns()
+/obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns()
if(isnull(owner) || (organ_flags & ORGAN_FAILING) || !COOLDOWN_FINISHED(src, implant_cooldown))
return
@@ -156,37 +156,37 @@
COOLDOWN_START(src, implant_cooldown, 60 SECONDS)
addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/implant_ready()
+/obj/item/organ/cyberimp/brain/anti_stun/proc/implant_ready()
if(owner)
to_chat(owner, span_purple("Your rebooter implant is ready."))
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner)
+/obj/item/organ/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner)
give_to.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src))
give_to.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner)
+/obj/item/organ/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner)
remove_from.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src))
remove_from.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity)
+/obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity)
. = ..()
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
return
organ_flags |= ORGAN_FAILING
addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity)
-/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/reboot()
+/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot()
organ_flags &= ~ORGAN_FAILING
implant_ready()
-/obj/item/organ/internal/cyberimp/brain/connector
+/obj/item/organ/cyberimp/brain/connector
name = "CNS skillchip connector implant"
desc = "This cybernetic adds a port to the back of your head, where you can remove or add skillchips at will."
icon_state = "brain_implant_connector"
slot = ORGAN_SLOT_BRAIN_CNS
actions_types = list(/datum/action/item_action/organ_action/use)
-/obj/item/organ/internal/cyberimp/brain/connector/ui_action_click()
+/obj/item/organ/cyberimp/brain/connector/ui_action_click()
to_chat(owner, span_warning("You start fiddling around with [src]..."))
playsound(owner, 'sound/items/taperecorder/tape_flip.ogg', 20, vary = TRUE) // asmr
@@ -208,12 +208,12 @@
else
to_chat(owner, span_warning("You try to insert [owner.get_active_held_item()] into [src], but it won't fit!")) // make it kill you if you shove a crayon inside or something
else // no inhand item, assume removal
- var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(/obj/item/organ/internal/brain)
+ var/obj/item/organ/brain/chippy_brain = owner.get_organ_by_type(/obj/item/organ/brain)
if(!chippy_brain)
CRASH("we using a brain implant wit no brain")
remove_skillchip(chippy_brain)
-/obj/item/organ/internal/cyberimp/brain/connector/proc/insert_skillchip(obj/item/skillchip/skillchip)
+/obj/item/organ/cyberimp/brain/connector/proc/insert_skillchip(obj/item/skillchip/skillchip)
var/fail_string = owner.implant_skillchip(skillchip, force = FALSE)
if(fail_string)
to_chat(owner, span_warning(fail_string))
@@ -229,7 +229,7 @@
// success!
playsound(owner, 'sound/machines/chime.ogg', 10, vary = TRUE)
-/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_skillchip(obj/item/organ/internal/brain/chippy_brain)
+/obj/item/organ/cyberimp/brain/connector/proc/remove_skillchip(obj/item/organ/brain/chippy_brain)
var/obj/item/skillchip/skillchip = show_radial_menu(owner, owner, chippy_brain.skillchips)
if(skillchip)
owner.remove_skillchip(skillchip, silent = FALSE)
@@ -241,7 +241,7 @@
to_chat(owner, span_warning("Your brain is empty!")) // heh
-/obj/item/organ/internal/cyberimp/brain/connector/emp_act(severity)
+/obj/item/organ/cyberimp/brain/connector/emp_act(severity)
. = ..()
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
return
@@ -253,7 +253,7 @@
// you either lose a chip or a bit of your brain
owner.visible_message(span_warning("Something falls to the ground from behind [owner]'s head."),\
span_boldwarning("You feel something fall off from behind your head."))
- var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/chippy_brain = owner.get_organ_by_type(ORGAN_SLOT_BRAIN)
var/obj/item/skillchip/skillchip = chippy_brain?.skillchips[1]
if(skillchip)
owner.remove_skillchip(skillchip, silent = TRUE)
@@ -263,7 +263,7 @@
remove_brain()
addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity)
-/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_brain(obj/item/organ/internal/brain/chippy_brain, severity = 1)
+/obj/item/organ/cyberimp/brain/connector/proc/remove_brain(obj/item/organ/brain/chippy_brain, severity = 1)
playsound(owner, 'sound/effects/meatslap.ogg', 25, TRUE)
if(!chippy_brain)
return
@@ -277,21 +277,21 @@
new /obj/effect/decal/cleanable/blood/gibs/up(get_turf(owner))
return FALSE
-/obj/item/organ/internal/cyberimp/brain/connector/proc/reboot()
+/obj/item/organ/cyberimp/brain/connector/proc/reboot()
organ_flags &= ~ORGAN_FAILING
//[[[[MOUTH]]]]
-/obj/item/organ/internal/cyberimp/mouth
+/obj/item/organ/cyberimp/mouth
zone = BODY_ZONE_PRECISE_MOUTH
-/obj/item/organ/internal/cyberimp/mouth/breathing_tube
+/obj/item/organ/cyberimp/mouth/breathing_tube
name = "breathing tube implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
icon_state = "implant_mask"
slot = ORGAN_SLOT_BREATHING_TUBE
w_class = WEIGHT_CLASS_TINY
-/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity)
+/obj/item/organ/cyberimp/mouth/breathing_tube/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
return
diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm
index bbc45b093998c..f565fc3b42cd4 100644
--- a/code/modules/surgery/organs/internal/ears/_ears.dm
+++ b/code/modules/surgery/organs/internal/ears/_ears.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/ears
+/obj/item/organ/ears
name = "ears"
icon_state = "ears"
desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible."
@@ -26,7 +26,7 @@
/// Multiplier for both long term and short term ear damage
var/damage_multiplier = 1
-/obj/item/organ/internal/ears/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/ears/on_life(seconds_per_tick, times_fired)
// only inform when things got worse, needs to happen before we heal
if((damage > low_threshold && prev_damage < low_threshold) || (damage > high_threshold && prev_damage < high_threshold))
to_chat(owner, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment."))
@@ -44,20 +44,20 @@
adjustEarDamage(0, 4)
SEND_SOUND(owner, sound('sound/items/weapons/flash_ring.ogg'))
-/obj/item/organ/internal/ears/apply_organ_damage(damage_amount, maximum, required_organ_flag)
+/obj/item/organ/ears/apply_organ_damage(damage_amount, maximum, required_organ_flag)
. = ..()
update_temp_deafness()
-/obj/item/organ/internal/ears/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/ears/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
update_temp_deafness()
-/obj/item/organ/internal/ears/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/ears/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_MOB_SAY)
REMOVE_TRAIT(organ_owner, TRAIT_DEAF, EAR_DAMAGE)
-/obj/item/organ/internal/ears/get_status_appendix(advanced, add_tooltips)
+/obj/item/organ/ears/get_status_appendix(advanced, add_tooltips)
if(owner.stat == DEAD || !HAS_TRAIT(owner, TRAIT_DEAF))
return
if(advanced)
@@ -69,7 +69,7 @@
return conditional_tooltip("Subject is [(organ_flags & ORGAN_FAILING) ? "permanently": "temporarily"] deaf from ear damage.", "Repair surgically, use medication such as [/datum/reagent/medicine/inacusiate::name], or protect ears with earmuffs.", add_tooltips)
return "Subject is deaf."
-/obj/item/organ/internal/ears/show_on_condensed_scans()
+/obj/item/organ/ears/show_on_condensed_scans()
// Always show if we have an appendix
return ..() || (owner.stat != DEAD && HAS_TRAIT(owner, TRAIT_DEAF))
@@ -79,7 +79,7 @@
* * ddmg: Handles normal organ damage
* * ddeaf: Handles temporary deafness, 1 ddeaf = 2 seconds of deafness, by default (with no multiplier)
*/
-/obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0)
+/obj/item/organ/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0)
if(HAS_TRAIT(owner, TRAIT_GODMODE))
update_temp_deafness()
return
@@ -93,7 +93,7 @@
update_temp_deafness()
/// Updates status of deafness
-/obj/item/organ/internal/ears/proc/update_temp_deafness()
+/obj/item/organ/ears/proc/update_temp_deafness()
// if we're failing we always have at least some deaf stacks (and thus deafness)
if(organ_flags & ORGAN_FAILING)
deaf = max(deaf, 1 * damage_multiplier)
@@ -113,7 +113,7 @@
UnregisterSignal(owner, COMSIG_MOB_SAY)
/// Being deafened by loud noises makes you shout
-/obj/item/organ/internal/ears/proc/adjust_speech(datum/source, list/speech_args)
+/obj/item/organ/ears/proc/adjust_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
if(HAS_TRAIT_NOT_FROM(source, TRAIT_DEAF, EAR_DAMAGE))
@@ -141,11 +141,11 @@
speech_args[SPEECH_MESSAGE] = message
return COMPONENT_UPPERCASE_SPEECH
-/obj/item/organ/internal/ears/invincible
+/obj/item/organ/ears/invincible
damage_multiplier = 0
-/obj/item/organ/internal/ears/cat
+/obj/item/organ/ears/cat
name = "cat ears"
icon = 'icons/obj/clothing/head/costume.dmi'
worn_icon = 'icons/mob/clothing/head/costume.dmi'
@@ -164,6 +164,7 @@
layers = EXTERNAL_FRONT | EXTERNAL_BEHIND
color_source = ORGAN_COLOR_HAIR
feature_key = "ears"
+ dyable = TRUE
/// Layer upon which we add the inner ears overlay
var/inner_layer = EXTERNAL_FRONT
@@ -192,21 +193,21 @@
base_ears.overlays += inner_ears
return base_ears
-/obj/item/organ/internal/ears/penguin
+/obj/item/organ/ears/penguin
name = "penguin ears"
desc = "The source of a penguin's happy feet."
-/obj/item/organ/internal/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner)
+/obj/item/organ/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner)
. = ..()
to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance."))
ear_owner.AddElementTrait(TRAIT_WADDLING, ORGAN_TRAIT, /datum/element/waddling)
-/obj/item/organ/internal/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner)
+/obj/item/organ/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner)
. = ..()
to_chat(ear_owner, span_notice("Your sense of balance comes back to you."))
REMOVE_TRAIT(ear_owner, TRAIT_WADDLING, ORGAN_TRAIT)
-/obj/item/organ/internal/ears/cybernetic
+/obj/item/organ/ears/cybernetic
name = "basic cybernetic ears"
icon_state = "ears-c"
desc = "A basic cybernetic organ designed to mimic the operation of ears."
@@ -214,13 +215,13 @@
organ_flags = ORGAN_ROBOTIC
failing_desc = "seems to be broken."
-/obj/item/organ/internal/ears/cybernetic/upgraded
+/obj/item/organ/ears/cybernetic/upgraded
name = "cybernetic ears"
icon_state = "ears-c-u"
desc = "An advanced cybernetic ear, surpassing the performance of organic ears."
damage_multiplier = 0.5
-/obj/item/organ/internal/ears/cybernetic/whisper
+/obj/item/organ/ears/cybernetic/whisper
name = "whisper-sensitive cybernetic ears"
icon_state = "ears-c-u"
desc = "Allows the user to more easily hear whispers. The user becomes extra vulnerable to loud noises, however"
@@ -229,31 +230,31 @@
// The original idea was to use signals to do this not traits. Unfortunately, the star effect used for whispers applies before any relevant signals
// This seems like the least invasive solution
-/obj/item/organ/internal/ears/cybernetic/whisper/on_mob_insert(mob/living/carbon/ear_owner)
+/obj/item/organ/ears/cybernetic/whisper/on_mob_insert(mob/living/carbon/ear_owner)
. = ..()
ADD_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT)
-/obj/item/organ/internal/ears/cybernetic/whisper/on_mob_remove(mob/living/carbon/ear_owner)
+/obj/item/organ/ears/cybernetic/whisper/on_mob_remove(mob/living/carbon/ear_owner)
. = ..()
REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT)
// "X-ray ears" that let you hear through walls
-/obj/item/organ/internal/ears/cybernetic/xray
+/obj/item/organ/ears/cybernetic/xray
name = "wall-penetrating cybernetic ears"
icon_state = "ears-c-u"
desc = "Throguh the power of modern engineering, allows the user to hear speech through walls. The user becomes extra vulnerable to loud noises, however"
// Same sensitivity as felinid ears
damage_multiplier = 2
-/obj/item/organ/internal/ears/cybernetic/xray/on_mob_insert(mob/living/carbon/ear_owner)
+/obj/item/organ/ears/cybernetic/xray/on_mob_insert(mob/living/carbon/ear_owner)
. = ..()
ADD_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT)
-/obj/item/organ/internal/ears/cybernetic/xray/on_mob_remove(mob/living/carbon/ear_owner)
+/obj/item/organ/ears/cybernetic/xray/on_mob_remove(mob/living/carbon/ear_owner)
. = ..()
REMOVE_TRAIT(ear_owner, TRAIT_XRAY_HEARING, ORGAN_TRAIT)
-/obj/item/organ/internal/ears/cybernetic/emp_act(severity)
+/obj/item/organ/ears/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm
index eba862bca8a18..4ba48b77e7121 100644
--- a/code/modules/surgery/organs/internal/eyes/_eyes.dm
+++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/eyes
+/obj/item/organ/eyes
name = BODY_ZONE_PRECISE_EYES
icon_state = "eyes"
desc = "I see you!"
@@ -54,7 +54,7 @@
/// Scarring on this organ
var/scarring = NONE
-/obj/item/organ/internal/eyes/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/eyes/mob_insert(mob/living/carbon/receiver, special, movement_flags)
// If we don't do this before everything else, heterochromia will be reset leading to eye_color_right no longer being accurate
if(ishuman(receiver))
var/mob/living/carbon/human/human_recipient = receiver
@@ -70,7 +70,7 @@
/// Refreshes the visuals of the eyes
/// If call_update is TRUE, we also will call update_body
-/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE)
+/obj/item/organ/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE)
owner.update_sight()
owner.update_tint()
@@ -94,7 +94,7 @@
if(call_update)
affected_human.update_body()
-/obj/item/organ/internal/eyes/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/eyes/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
if(ishuman(organ_owner))
@@ -122,7 +122,7 @@
organ_owner.update_sight()
UnregisterSignal(organ_owner, COMSIG_ATOM_BULLET_ACT)
-/obj/item/organ/internal/eyes/proc/on_bullet_act(datum/source, obj/projectile/proj, def_zone)
+/obj/item/organ/eyes/proc/on_bullet_act(datum/source, obj/projectile/proj, def_zone)
SIGNAL_HANDLER
// Once-a-dozen-rounds level of rare
@@ -149,7 +149,7 @@
#define OFFSET_Y 2
/// Similar to get_status_text, but appends the text after the damage report, for additional status info
-/obj/item/organ/internal/eyes/get_status_appendix(advanced, add_tooltips)
+/obj/item/organ/eyes/get_status_appendix(advanced, add_tooltips)
if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_KNOCKEDOUT))
return
if(owner.is_blind())
@@ -178,13 +178,13 @@
return "Subject is nearsighted."
return ""
-/obj/item/organ/internal/eyes/show_on_condensed_scans()
+/obj/item/organ/eyes/show_on_condensed_scans()
// Always show if we have an appendix
return ..() || (owner.stat != DEAD && !HAS_TRAIT(owner, TRAIT_KNOCKEDOUT) && (owner.is_blind() || owner.is_nearsighted()))
/// This proc generates a list of overlays that the eye should be displayed using for the given parent
-/obj/item/organ/internal/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent)
- if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/internal/eyes) != src)
+/obj/item/organ/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent)
+ if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/eyes) != src)
CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.")
if(isnull(eye_icon_state))
@@ -234,14 +234,14 @@
return overlays
-/obj/item/organ/internal/eyes/update_overlays()
+/obj/item/organ/eyes/update_overlays()
. = ..()
if (scarring & RIGHT_EYE_SCAR)
. += mutable_appearance('icons/obj/medical/organs/organs.dmi', "eye_scar_right")
if (scarring & LEFT_EYE_SCAR)
. += mutable_appearance('icons/obj/medical/organs/organs.dmi', "eye_scar_left")
-/obj/item/organ/internal/eyes/proc/apply_scar(side)
+/obj/item/organ/eyes/proc/apply_scar(side)
if (scarring & side)
return
scarring |= side
@@ -249,7 +249,7 @@
update_appearance()
apply_scarring_effects()
-/obj/item/organ/internal/eyes/proc/apply_scarring_effects()
+/obj/item/organ/eyes/proc/apply_scarring_effects()
if (!owner)
return
var/datum/status_effect/grouped/nearsighted/nearsightedness = owner.is_nearsighted()
@@ -265,7 +265,7 @@
owner.become_blind(EYE_SCARRING_TRAIT)
owner.update_body()
-/obj/item/organ/internal/eyes/proc/fix_scar(side)
+/obj/item/organ/eyes/proc/fix_scar(side)
if (!(scarring & side))
return
scarring &= ~side
@@ -277,35 +277,35 @@
owner.cure_blind(EYE_SCARRING_TRAIT)
owner.update_body()
-/obj/item/organ/internal/eyes/on_mob_insert(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/on_mob_insert(mob/living/carbon/eye_owner)
. = ..()
if (scarring)
apply_scarring_effects()
-/obj/item/organ/internal/eyes/on_mob_remove(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/on_mob_remove(mob/living/carbon/eye_owner)
. = ..()
if (scarring)
- owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR)
- owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR)
- owner.cure_blind(EYE_SCARRING_TRAIT)
+ eye_owner.cure_nearsighted(TRAIT_RIGHT_EYE_SCAR)
+ eye_owner.cure_nearsighted(TRAIT_LEFT_EYE_SCAR)
+ eye_owner.cure_blind(EYE_SCARRING_TRAIT)
#undef OFFSET_X
#undef OFFSET_Y
//Gotta reset the eye color, because that persists
-/obj/item/organ/internal/eyes/enter_wardrobe()
+/obj/item/organ/eyes/enter_wardrobe()
. = ..()
eye_color_left = initial(eye_color_left)
eye_color_right = initial(eye_color_right)
-/obj/item/organ/internal/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag)
+/obj/item/organ/eyes/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag)
. = ..()
if(!owner)
return FALSE
apply_damaged_eye_effects()
/// Applies effects to our owner based on how damaged our eyes are
-/obj/item/organ/internal/eyes/proc/apply_damaged_eye_effects()
+/obj/item/organ/eyes/proc/apply_damaged_eye_effects()
// we're in healthy threshold, either try to heal (if damaged) or do nothing
if(damage <= low_threshold)
if(damaged)
@@ -342,7 +342,7 @@
#define NIGHTVISION_LIGHT_MID 2
#define NIGHTVISION_LIGHT_HIG 3
-/obj/item/organ/internal/eyes/night_vision
+/obj/item/organ/eyes/night_vision
actions_types = list(/datum/action/item_action/organ_action/use)
// These lists are used as the color cutoff for the eye
@@ -352,16 +352,16 @@
var/list/high_light_cutoff
var/light_level = NIGHTVISION_LIGHT_OFF
-/obj/item/organ/internal/eyes/night_vision/Initialize(mapload)
+/obj/item/organ/eyes/night_vision/Initialize(mapload)
. = ..()
- if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/internal/eyes/night_vision)
+ if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/eyes/night_vision)
if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3)
stack_trace("[type] did not have fully filled out color cutoff lists")
if(low_light_cutoff)
color_cutoffs = low_light_cutoff.Copy()
light_level = NIGHTVISION_LIGHT_LOW
-/obj/item/organ/internal/eyes/night_vision/ui_action_click()
+/obj/item/organ/eyes/night_vision/ui_action_click()
sight_flags = initial(sight_flags)
switch(light_level)
if (NIGHTVISION_LIGHT_OFF)
@@ -383,25 +383,25 @@
#undef NIGHTVISION_LIGHT_MID
#undef NIGHTVISION_LIGHT_HIG
-/obj/item/organ/internal/eyes/night_vision/mushroom
+/obj/item/organ/eyes/night_vision/mushroom
name = "fung-eye"
desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced."
low_light_cutoff = list(0, 15, 20)
medium_light_cutoff = list(0, 20, 35)
high_light_cutoff = list(0, 40, 50)
-/obj/item/organ/internal/eyes/zombie
+/obj/item/organ/eyes/zombie
name = "undead eyes"
desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human."
color_cutoffs = list(25, 35, 5)
-/obj/item/organ/internal/eyes/alien
+/obj/item/organ/eyes/alien
name = "alien eyes"
desc = "It turned out they had them after all!"
sight_flags = SEE_MOBS
color_cutoffs = list(25, 5, 42)
-/obj/item/organ/internal/eyes/golem
+/obj/item/organ/eyes/golem
name = "resonating crystal"
icon_state = "adamantine_cords"
eye_icon_state = null
@@ -427,14 +427,14 @@
///Robotic
-/obj/item/organ/internal/eyes/robotic
+/obj/item/organ/eyes/robotic
name = "robotic eyes"
icon_state = "cybernetic_eyeballs"
desc = "Your vision is augmented."
organ_flags = ORGAN_ROBOTIC
failing_desc = "seems to be broken."
-/obj/item/organ/internal/eyes/robotic/emp_act(severity)
+/obj/item/organ/eyes/robotic/emp_act(severity)
. = ..()
if((. & EMP_PROTECT_SELF) || !owner)
return
@@ -443,14 +443,14 @@
to_chat(owner, span_warning("Static obfuscates your vision!"))
owner.flash_act(visual = 1)
-/obj/item/organ/internal/eyes/robotic/basic
+/obj/item/organ/eyes/robotic/basic
name = "basic robotic eyes"
desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light."
eye_color_left = "5500ff"
eye_color_right = "5500ff"
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/basic/emp_act(severity)
+/obj/item/organ/eyes/robotic/basic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -460,22 +460,22 @@
do_sparks(2, TRUE, owner)
owner.emote("scream")
-/obj/item/organ/internal/eyes/robotic/xray
+/obj/item/organ/eyes/robotic/xray
name = "\improper X-ray eyes"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
eye_color_left = "000"
eye_color_right = "000"
sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
-/obj/item/organ/internal/eyes/robotic/xray/on_mob_insert(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/robotic/xray/on_mob_insert(mob/living/carbon/eye_owner)
. = ..()
ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT)
-/obj/item/organ/internal/eyes/robotic/xray/on_mob_remove(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/robotic/xray/on_mob_remove(mob/living/carbon/eye_owner)
. = ..()
REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT)
-/obj/item/organ/internal/eyes/robotic/thermals
+/obj/item/organ/eyes/robotic/thermals
name = "thermal eyes"
desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included."
eye_color_left = "FC0"
@@ -485,7 +485,7 @@
sight_flags = SEE_MOBS
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/flashlight
+/obj/item/organ/eyes/robotic/flashlight
name = "flashlight eyes"
desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?"
eye_color_left ="fee5a3"
@@ -496,11 +496,11 @@
tint = INFINITY
var/obj/item/flashlight/eyelight/eye
-/obj/item/organ/internal/eyes/robotic/flashlight/Initialize(mapload)
+/obj/item/organ/eyes/robotic/flashlight/Initialize(mapload)
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_ALL)
-/obj/item/organ/internal/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim)
+/obj/item/organ/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim)
. = ..()
if(!eye)
eye = new /obj/item/flashlight/eyelight()
@@ -509,7 +509,7 @@
eye.update_brightness(victim)
victim.become_blind(FLASHLIGHT_EYES)
-/obj/item/organ/internal/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim)
+/obj/item/organ/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim)
. = ..()
eye.set_light_on(FALSE)
eye.update_brightness(victim)
@@ -517,12 +517,12 @@
victim.cure_blind(FLASHLIGHT_EYES)
// Welding shield implant
-/obj/item/organ/internal/eyes/robotic/shield
+/obj/item/organ/eyes/robotic/shield
name = "shielded robotic eyes"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
flash_protect = FLASH_PROTECTION_WELDER
-/obj/item/organ/internal/eyes/robotic/shield/Initialize(mapload)
+/obj/item/organ/eyes/robotic/shield/Initialize(mapload)
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_ALL)
@@ -532,7 +532,7 @@
#define UPDATE_EYES_LEFT 1
#define UPDATE_EYES_RIGHT 2
-/obj/item/organ/internal/eyes/robotic/glow
+/obj/item/organ/eyes/robotic/glow
name = "High Luminosity Eyes"
desc = "Special glowing eyes, used by snowflakes who want to be special."
eye_color_left = "000"
@@ -551,43 +551,43 @@
/// The custom selected eye color for the right eye. Defaults to the mob's natural eye color
var/right_eye_color_string
-/obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload)
+/obj/item/organ/eyes/robotic/glow/Initialize(mapload)
. = ..()
eye = new /obj/item/flashlight/eyelight/glow
-/obj/item/organ/internal/eyes/robotic/glow/Destroy()
+/obj/item/organ/eyes/robotic/glow/Destroy()
. = ..()
deactivate(close_ui = TRUE)
QDEL_NULL(eye)
-/obj/item/organ/internal/eyes/robotic/glow/emp_act(severity)
+/obj/item/organ/eyes/robotic/glow/emp_act(severity)
. = ..()
if(!eye.light_on || . & EMP_PROTECT_SELF)
return
deactivate(close_ui = TRUE)
/// Set the initial color of the eyes on insert to be the mob's previous eye color.
-/obj/item/organ/internal/eyes/robotic/glow/mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+/obj/item/organ/eyes/robotic/glow/mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags = DELETE_IF_REPLACED)
. = ..()
left_eye_color_string = old_eye_color_left
right_eye_color_string = old_eye_color_right
update_mob_eye_color(eye_recipient)
-/obj/item/organ/internal/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient)
+/obj/item/organ/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient)
. = ..()
deactivate(close_ui = TRUE)
eye.forceMove(eye_recipient)
-/obj/item/organ/internal/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner)
deactivate(eye_owner, close_ui = TRUE)
if(!QDELETED(eye))
eye.forceMove(src)
return ..()
-/obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user)
+/obj/item/organ/eyes/robotic/glow/ui_state(mob/user)
return GLOB.default_state
-/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state)
+/obj/item/organ/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state)
if(!QDELETED(owner))
if(owner == user)
return min(
@@ -597,14 +597,14 @@
else return UI_CLOSE
return ..()
-/obj/item/organ/internal/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui)
+/obj/item/organ/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "HighLuminosityEyesMenu")
ui.autoupdate = FALSE
ui.open()
-/obj/item/organ/internal/eyes/robotic/glow/ui_data(mob/user)
+/obj/item/organ/eyes/robotic/glow/ui_data(mob/user)
var/list/data = list()
data["eyeColor"] = list(
@@ -618,7 +618,7 @@
return data
-/obj/item/organ/internal/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui)
+/obj/item/organ/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui)
. = ..()
if(.)
return
@@ -652,7 +652,7 @@
toggle_eye_color_mode()
return TRUE
-/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(mob/user, action)
+/obj/item/organ/eyes/robotic/glow/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/organ_action/toggle))
toggle_active()
else if(istype(action, /datum/action/item_action/organ_action/use))
@@ -663,7 +663,7 @@
*
* Turns on the attached flashlight object, updates the mob overlay to be added.
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/activate()
+/obj/item/organ/eyes/robotic/glow/proc/activate()
if(eye.light_range)
eye.set_light_on(TRUE)
else
@@ -678,7 +678,7 @@
* * mob/living/carbon/eye_owner - the mob who the eyes belong to
* * close_ui - whether or not to close the ui
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE)
+/obj/item/organ/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE)
if(close_ui)
SStgui.close_uis(src)
eye.set_light_on(FALSE)
@@ -691,7 +691,7 @@
* Arguments:
* * to_update - whether we are setting the color for the light beam itself, or the individual eyes
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT)
+/obj/item/organ/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT)
var/new_color = "#"
for(var/i in 1 to 3)
new_color += num2hex(rand(0, 255), 2)
@@ -705,7 +705,7 @@
* Arguments:
* * new_range - the new range to set
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_range(new_range)
+/obj/item/organ/eyes/robotic/glow/proc/set_beam_range(new_range)
var/old_light_range = eye.light_range
if(old_light_range == 0 && new_range > 0 && eye.light_on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only)
eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work.
@@ -721,7 +721,7 @@
* * to_update - whether we are setting the color for the light beam itself, or the individual eyes
* * sanitize - whether the hex string should be sanitized
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE)
+/obj/item/organ/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE)
var/newcolor_string
if(sanitize)
newcolor_string = sanitize_hexcolor(newcolor)
@@ -741,7 +741,7 @@
/**
* Toggle the attached flashlight object on or off
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active()
+/obj/item/organ/eyes/robotic/glow/proc/toggle_active()
if(eye.light_on)
deactivate()
else
@@ -752,7 +752,7 @@
*
* Toggles the eye color mode on or off and then calls an update on the mob's eye color
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_eye_color_mode()
+/obj/item/organ/eyes/robotic/glow/proc/toggle_eye_color_mode()
eye_color_mode = !eye_color_mode
update_mob_eye_color()
@@ -763,7 +763,7 @@
* Arguments:
* * mob/living/carbon/eye_owner - the mob to update the eye color appearance of
*/
-/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner)
+/obj/item/organ/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner)
switch(eye_color_mode)
if(MATCH_LIGHT_COLOR)
eye_color_left = light_color_string
@@ -794,39 +794,39 @@
#undef UPDATE_EYES_LEFT
#undef UPDATE_EYES_RIGHT
-/obj/item/organ/internal/eyes/moth
+/obj/item/organ/eyes/moth
name = "moth eyes"
desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision."
eye_icon_state = "motheyes"
icon_state = "eyeballs-moth"
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/moth
+/obj/item/organ/eyes/robotic/moth
name = "robotic moth eyes"
eye_icon_state = "motheyes"
icon_state = "eyeballs-cybermoth"
desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights."
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/basic/moth
+/obj/item/organ/eyes/robotic/basic/moth
name = "basic robotic moth eyes"
eye_icon_state = "motheyes"
icon_state = "eyeballs-cybermoth"
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/xray/moth
+/obj/item/organ/eyes/robotic/xray/moth
name = "robotic eyes"
eye_icon_state = "motheyes"
icon_state = "eyeballs-cybermoth"
desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights."
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/shield/moth
+/obj/item/organ/eyes/robotic/shield/moth
name = "shielded robotic moth eyes"
eye_icon_state = "motheyes"
icon_state = "eyeballs-cybermoth"
-/obj/item/organ/internal/eyes/robotic/glow/moth
+/obj/item/organ/eyes/robotic/glow/moth
name = "High Luminosity Moth Eyes"
eye_icon_state = "motheyes"
base_eye_state = "eyes_mothglow"
@@ -834,24 +834,24 @@
desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights."
flash_protect = FLASH_PROTECTION_SENSITIVE
-/obj/item/organ/internal/eyes/robotic/thermals/moth //we inherit flash weakness from thermals
+/obj/item/organ/eyes/robotic/thermals/moth //we inherit flash weakness from thermals
name = "thermal moth eyes"
eye_icon_state = "motheyes"
icon_state = "eyeballs-cybermoth"
-/obj/item/organ/internal/eyes/snail
+/obj/item/organ/eyes/snail
name = "snail eyes"
desc = "These eyes seem to have a large range, but might be cumbersome with glasses."
eye_icon_state = "snail_eyes"
icon_state = "snail_eyeballs"
-/obj/item/organ/internal/eyes/jelly
+/obj/item/organ/eyes/jelly
name = "jelly eyes"
desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them."
eye_icon_state = "jelleyes"
icon_state = "eyeballs-jelly"
-/obj/item/organ/internal/eyes/night_vision/maintenance_adapted
+/obj/item/organ/eyes/night_vision/maintenance_adapted
name = "adapted eyes"
desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark."
flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE
@@ -864,11 +864,11 @@
medium_light_cutoff = list(15, 20, 30)
high_light_cutoff = list(30, 35, 50)
-/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner)
+/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner)
. = ..()
ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT)
-/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired)
if(!owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes
to_chat(owner, span_danger("Your eyes! They burn in the light!"))
apply_organ_damage(10) //blind quickly
@@ -877,6 +877,6 @@
apply_organ_damage(-10) //heal quickly
. = ..()
-/obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE)
+/obj/item/organ/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE)
REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT)
return ..()
diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm
index ce659792529bb..efc060967c611 100644
--- a/code/modules/surgery/organs/internal/heart/_heart.dm
+++ b/code/modules/surgery/organs/internal/heart/_heart.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart
+/obj/item/organ/heart
name = "heart"
desc = "I feel bad for the heartless bastard who lost this."
icon_state = "heart-on"
@@ -32,18 +32,18 @@
/// whether the heart's been operated on to fix some of its damages
var/operated = FALSE
-/obj/item/organ/internal/heart/update_icon_state()
+/obj/item/organ/heart/update_icon_state()
. = ..()
icon_state = "[base_icon_state]-[beating ? "on" : "off"]"
-/obj/item/organ/internal/heart/Remove(mob/living/carbon/heartless, special, movement_flags)
+/obj/item/organ/heart/Remove(mob/living/carbon/heartless, special, movement_flags)
. = ..()
if(!special)
addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 12 SECONDS)
beat = BEAT_NONE
owner?.stop_sound_channel(CHANNEL_HEARTBEAT)
-/obj/item/organ/internal/heart/proc/stop_if_unowned()
+/obj/item/organ/heart/proc/stop_if_unowned()
if(QDELETED(src))
return
if(IS_ROBOTIC_ORGAN(src))
@@ -51,7 +51,7 @@
if(isnull(owner))
Stop()
-/obj/item/organ/internal/heart/attack_self(mob/user)
+/obj/item/organ/heart/attack_self(mob/user)
. = ..()
if(.)
return
@@ -65,7 +65,7 @@
addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 8 SECONDS)
return TRUE
-/obj/item/organ/internal/heart/proc/Stop()
+/obj/item/organ/heart/proc/Stop()
if(!beating)
return FALSE
@@ -75,7 +75,7 @@
owner?.stop_sound_channel(CHANNEL_HEARTBEAT)
return TRUE
-/obj/item/organ/internal/heart/proc/Restart()
+/obj/item/organ/heart/proc/Restart()
if(beating)
return FALSE
@@ -83,25 +83,25 @@
update_appearance()
return TRUE
-/obj/item/organ/internal/heart/OnEatFrom(eater, feeder)
+/obj/item/organ/heart/OnEatFrom(eater, feeder)
. = ..()
Stop()
/// Checks if the heart is beating.
/// Can be overridden to add more conditions for more complex hearts.
-/obj/item/organ/internal/heart/proc/is_beating()
+/obj/item/organ/heart/proc/is_beating()
return beating
-/obj/item/organ/internal/heart/get_status_text(advanced, add_tooltips)
+/obj/item/organ/heart/get_status_text(advanced, add_tooltips)
if(!beating && !(organ_flags & ORGAN_FAILING) && owner.needs_heart() && owner.stat != DEAD)
return conditional_tooltip("Cardiac Arrest", "Apply defibrillation immediately. Similar electric shocks may work in emergencies.", add_tooltips)
return ..()
-/obj/item/organ/internal/heart/show_on_condensed_scans()
+/obj/item/organ/heart/show_on_condensed_scans()
// Always show if the guy needs a heart (so its status can be monitored)
return ..() || owner.needs_heart()
-/obj/item/organ/internal/heart/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/on_life(seconds_per_tick, times_fired)
..()
// If the owner doesn't need a heart, we don't need to do anything with it.
@@ -135,10 +135,10 @@
owner.stop_sound_channel(CHANNEL_HEARTBEAT)
beat = BEAT_NONE
-/obj/item/organ/internal/heart/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/heart/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantheart
-/obj/item/organ/internal/heart/cursed
+/obj/item/organ/heart/cursed
name = "cursed heart"
desc = "A heart that, when inserted, will force you to pump it manually."
icon_state = "cursedheart-off"
@@ -150,7 +150,7 @@
var/heal_burn = 0
var/heal_oxy = 0
-/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target)
+/obj/item/organ/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target)
if(accursed == user && istype(accursed))
playsound(user,'sound/effects/singlebeat.ogg',40,TRUE)
user.temporarilyRemoveItemFromInventory(src, TRUE)
@@ -158,17 +158,17 @@
else
return ..()
-/obj/item/organ/internal/heart/cursed/on_mob_insert(mob/living/carbon/accursed)
+/obj/item/organ/heart/cursed/on_mob_insert(mob/living/carbon/accursed)
. = ..()
accursed.AddComponent(/datum/component/manual_heart, pump_delay = pump_delay, blood_loss = blood_loss, heal_brute = heal_brute, heal_burn = heal_burn, heal_oxy = heal_oxy)
-/obj/item/organ/internal/heart/cursed/on_mob_remove(mob/living/carbon/accursed, special = FALSE)
+/obj/item/organ/heart/cursed/on_mob_remove(mob/living/carbon/accursed, special = FALSE)
. = ..()
qdel(accursed.GetComponent(/datum/component/manual_heart))
-/obj/item/organ/internal/heart/cybernetic
+/obj/item/organ/heart/cybernetic
name = "basic cybernetic heart"
desc = "A basic electronic device designed to mimic the functions of an organic human heart."
icon_state = "heart-c-on"
@@ -192,7 +192,7 @@
/// Chance of permanent effects if emp-ed.
var/emp_vulnerability = 80
-/obj/item/organ/internal/heart/cybernetic/emp_act(severity)
+/obj/item/organ/heart/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -214,7 +214,7 @@
span_userdanger("You feel a terrible pain in your chest, as if your heart has stopped!"),
)
-/obj/item/organ/internal/heart/cybernetic/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/cybernetic/on_life(seconds_per_tick, times_fired)
. = ..()
if(organ_flags & ORGAN_EMP)
@@ -238,7 +238,7 @@
if(bloodiest_wound)
bloodiest_wound.adjust_blood_flow(-1 * seconds_per_tick)
-/obj/item/organ/internal/heart/cybernetic/proc/stabilize_heart()
+/obj/item/organ/heart/cybernetic/proc/stabilize_heart()
ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT)
stabilization_available = FALSE
@@ -247,12 +247,12 @@
addtimer(VARSET_CALLBACK(src, stabilization_available, TRUE), 5 MINUTES, TIMER_DELETE_ME)
// Largely a sanity check
-/obj/item/organ/internal/heart/cybernetic/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE)
+/obj/item/organ/heart/cybernetic/on_mob_remove(mob/living/carbon/heart_owner, special = FALSE)
. = ..()
if(HAS_TRAIT_FROM(heart_owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT))
REMOVE_TRAIT(heart_owner, TRAIT_NOSOFTCRIT, ORGAN_TRAIT)
-/obj/item/organ/internal/heart/cybernetic/tier2
+/obj/item/organ/heart/cybernetic/tier2
name = "cybernetic heart"
desc = "An electronic device designed to mimic the functions of an organic human heart. In case of lacerations or haemorrhaging, the heart rapidly begins self-replicating \
artificial blood. However, this can cause toxins to build up in the bloodstream to the imperfect replication process."
@@ -262,7 +262,7 @@
bleed_prevention = TRUE
emp_vulnerability = 40
-/obj/item/organ/internal/heart/cybernetic/tier3
+/obj/item/organ/heart/cybernetic/tier3
name = "upgraded cybernetic heart"
desc = "An electronic device designed to mimic the functions of an organic human heart. In case of physical trauma, the heart has temporary failsafes to maintain patient stability \
and mobility for a brief moment. In addition, the heart is able to safely self-replicate blood without risk of toxin buildup."
@@ -273,7 +273,7 @@
toxification_probability = 0
emp_vulnerability = 20
-/obj/item/organ/internal/heart/cybernetic/surplus
+/obj/item/organ/heart/cybernetic/surplus
name = "surplus prosthetic heart"
desc = "A fragile mockery of a human heart that resembles a water pump more than an actual heart. \
Offers no protection against EMPs."
@@ -283,18 +283,18 @@
emp_vulnerability = 100
//surplus organs are so awful that they explode when removed, unless failing
-/obj/item/organ/internal/heart/cybernetic/surplus/Initialize(mapload)
+/obj/item/organ/heart/cybernetic/surplus/Initialize(mapload)
. = ..()
- AddElement(/datum/element/dangerous_surgical_removal)
+ AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE)
-/obj/item/organ/internal/heart/freedom
+/obj/item/organ/heart/freedom
name = "heart of freedom"
desc = "This heart pumps with the passion to give... something freedom."
organ_flags = ORGAN_ROBOTIC //the power of freedom prevents heart attacks
/// The cooldown until the next time this heart can give the host an adrenaline boost.
COOLDOWN_DECLARE(adrenaline_cooldown)
-/obj/item/organ/internal/heart/freedom/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/freedom/on_life(seconds_per_tick, times_fired)
. = ..()
if(owner.health < 5 && COOLDOWN_FINISHED(src, adrenaline_cooldown))
COOLDOWN_START(src, adrenaline_cooldown, rand(25 SECONDS, 1 MINUTES))
diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
index 31e9e64750c92..df60b8243ef72 100644
--- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
+++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
@@ -3,7 +3,7 @@
*/
#define DOAFTER_IMPLANTING_HEART "implanting"
-/obj/item/organ/internal/heart/cybernetic/anomalock
+/obj/item/organ/heart/cybernetic/anomalock
name = "voltaic combat cyberheart"
desc = "A cutting-edge cyberheart, originally designed for Nanotrasen killsquad usage but later declassified for normal research. Voltaic technology allows the heart to keep the body upright in dire circumstances, alongside redirecting anomalous flux energy to fully shield the user from shocks and electro-magnetic pulses. Requires a refined Flux core as a power source."
icon_state = "anomalock_heart"
@@ -28,7 +28,7 @@
///If the core is removable once socketed.
var/core_removable = TRUE
-/obj/item/organ/internal/heart/cybernetic/anomalock/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/heart/cybernetic/anomalock/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
if(!core)
return
@@ -39,7 +39,7 @@
RegisterSignal(organ_owner, SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), PROC_REF(activate_survival))
RegisterSignal(organ_owner, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act))
-/obj/item/organ/internal/heart/cybernetic/anomalock/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/heart/cybernetic/anomalock/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
if(!core)
return
@@ -49,7 +49,7 @@
tesla_zap(source = organ_owner, zap_range = 20, power = 2.5e5, cutoff = 1e3)
qdel(src)
-/obj/item/organ/internal/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, params)
+/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, params)
if(target_mob != user || !istype(target_mob) || !core)
return ..()
@@ -66,11 +66,11 @@
user.emote("scream")
return TRUE
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/on_emp_act(severity)
+/obj/item/organ/heart/cybernetic/anomalock/proc/on_emp_act(severity)
SIGNAL_HANDLER
add_lightning_overlay(10 SECONDS)
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/add_lightning_overlay(time_to_last = 10 SECONDS)
+/obj/item/organ/heart/cybernetic/anomalock/proc/add_lightning_overlay(time_to_last = 10 SECONDS)
if(lightning_overlay)
lightning_timer = addtimer(CALLBACK(src, PROC_REF(clear_lightning_overlay)), time_to_last, (TIMER_UNIQUE|TIMER_OVERRIDE))
return
@@ -78,11 +78,11 @@
owner.add_overlay(lightning_overlay)
lightning_timer = addtimer(CALLBACK(src, PROC_REF(clear_lightning_overlay)), time_to_last, (TIMER_UNIQUE|TIMER_OVERRIDE))
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/clear_lightning_overlay()
+/obj/item/organ/heart/cybernetic/anomalock/proc/clear_lightning_overlay()
owner.cut_overlay(lightning_overlay)
lightning_overlay = null
-/obj/item/organ/internal/heart/cybernetic/anomalock/attack_self(mob/user, modifiers)
+/obj/item/organ/heart/cybernetic/anomalock/attack_self(mob/user, modifiers)
. = ..()
if(.)
return
@@ -90,7 +90,7 @@
if(core)
return attack(user, user, modifiers)
-/obj/item/organ/internal/heart/cybernetic/anomalock/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/heart/cybernetic/anomalock/on_life(seconds_per_tick, times_fired)
. = ..()
if(owner.blood_volume <= BLOOD_VOLUME_NORMAL)
owner.blood_volume += 5 * seconds_per_tick
@@ -98,7 +98,7 @@
activate_survival(owner)
///Does a few things to try to help you live whatever you may be going through
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/activate_survival(mob/living/carbon/organ_owner)
+/obj/item/organ/heart/cybernetic/anomalock/proc/activate_survival(mob/living/carbon/organ_owner)
if(!COOLDOWN_FINISHED(src, survival_cooldown))
return
@@ -108,15 +108,15 @@
addtimer(CALLBACK(src, PROC_REF(notify_cooldown), organ_owner), COOLDOWN_TIMELEFT(src, survival_cooldown))
///Alerts our owner that the organ is ready to do its thing again
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/notify_cooldown(mob/living/carbon/organ_owner)
+/obj/item/organ/heart/cybernetic/anomalock/proc/notify_cooldown(mob/living/carbon/organ_owner)
balloon_alert(organ_owner, "your heart strenghtens")
playsound(organ_owner, 'sound/items/eshield_recharge.ogg', 40)
///Returns the mob we are implanted in so that the electricity effect doesn't runtime
-/obj/item/organ/internal/heart/cybernetic/anomalock/proc/get_held_mob()
+/obj/item/organ/heart/cybernetic/anomalock/proc/get_held_mob()
return owner
-/obj/item/organ/internal/heart/cybernetic/anomalock/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+/obj/item/organ/heart/cybernetic/anomalock/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(!istype(tool, required_anomaly))
return NONE
if(core)
@@ -131,7 +131,7 @@
update_icon_state()
return ITEM_INTERACT_SUCCESS
-/obj/item/organ/internal/heart/cybernetic/anomalock/screwdriver_act(mob/living/user, obj/item/tool)
+/obj/item/organ/heart/cybernetic/anomalock/screwdriver_act(mob/living/user, obj/item/tool)
. = ..()
if(!core)
balloon_alert(user, "no core!")
@@ -151,11 +151,11 @@
remove_organ_trait(TRAIT_SHOCKIMMUNE)
update_icon_state()
-/obj/item/organ/internal/heart/cybernetic/anomalock/update_icon_state()
+/obj/item/organ/heart/cybernetic/anomalock/update_icon_state()
. = ..()
icon_state = initial(icon_state) + (core ? "-core" : "")
-/obj/item/organ/internal/heart/cybernetic/anomalock/prebuilt/Initialize(mapload)
+/obj/item/organ/heart/cybernetic/anomalock/prebuilt/Initialize(mapload)
. = ..()
core = new /obj/item/assembly/signaler/anomaly/flux(src)
update_icon_state()
diff --git a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm
index 781df0dceb1f3..5c6602834cb07 100644
--- a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm
+++ b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/heart/ethereal
+/obj/item/organ/heart/ethereal
name = "crystal core"
icon_state = "ethereal_heart-on"
base_icon_state = "ethereal_heart"
@@ -16,38 +16,38 @@
///Color of the heart, is set by the species on gain
var/ethereal_color = "#9c3030"
-/obj/item/organ/internal/heart/ethereal/Initialize(mapload)
+/obj/item/organ/heart/ethereal/Initialize(mapload)
. = ..()
add_atom_colour(ethereal_color, FIXED_COLOUR_PRIORITY)
update_appearance()
-/obj/item/organ/internal/heart/ethereal/mob_insert(mob/living/carbon/heart_owner, special = FALSE, movement_flags)
+/obj/item/organ/heart/ethereal/mob_insert(mob/living/carbon/heart_owner, special = FALSE, movement_flags)
. = ..()
RegisterSignal(heart_owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change))
RegisterSignal(heart_owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_owner_fully_heal))
RegisterSignal(heart_owner, COMSIG_QDELETING, PROC_REF(owner_deleted))
-/obj/item/organ/internal/heart/ethereal/mob_remove(mob/living/carbon/heart_owner, special, movement_flags)
+/obj/item/organ/heart/ethereal/mob_remove(mob/living/carbon/heart_owner, special, movement_flags)
UnregisterSignal(heart_owner, list(COMSIG_MOB_STATCHANGE, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_QDELETING))
REMOVE_TRAIT(heart_owner, TRAIT_CORPSELOCKED, SPECIES_TRAIT)
stop_crystalization_process(heart_owner)
QDEL_NULL(current_crystal)
return ..()
-/obj/item/organ/internal/heart/ethereal/update_overlays()
+/obj/item/organ/heart/ethereal/update_overlays()
. = ..()
var/mutable_appearance/shine = mutable_appearance(icon, icon_state = "[base_icon_state]_overlay-[beating ? "on" : "off"]")
shine.appearance_flags = RESET_COLOR //No color on this, just pure white
. += shine
-/obj/item/organ/internal/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags)
+/obj/item/organ/heart/ethereal/proc/on_owner_fully_heal(mob/living/carbon/healed, heal_flags)
SIGNAL_HANDLER
QDEL_NULL(current_crystal) //Kicks out the ethereal
///Ran when examined while crystalizing, gives info about the amount of time left
-/obj/item/organ/internal/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list)
+/obj/item/organ/heart/ethereal/proc/on_examine(mob/living/carbon/human/examined_human, mob/user, list/examine_list)
SIGNAL_HANDLER
if(!crystalize_timer_id)
@@ -62,7 +62,7 @@
examine_list += span_notice("Some crystals are coming out of [examined_human]. ")
///On stat changes, if the victim is no longer dead but they're crystalizing, cancel it, if they become dead, start the crystalizing process if possible
-/obj/item/organ/internal/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat)
+/obj/item/organ/heart/ethereal/proc/on_stat_change(mob/living/victim, new_stat)
SIGNAL_HANDLER
if(new_stat != DEAD)
@@ -92,7 +92,7 @@
RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage))
///Ran when disarmed, prevents the ethereal from reviving
-/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone, obj/item/weapon)
+/obj/item/organ/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone, obj/item/weapon)
SIGNAL_HANDLER
defender.visible_message(
span_notice("The crystals on [defender] are gently broken off."),
@@ -102,7 +102,7 @@
crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), defender), CRYSTALIZE_DISARM_WAIT_TIME, TIMER_STOPPABLE) //Lets us restart the timer on disarm
///Actually spawns the crystal which puts the ethereal in it.
-/obj/item/organ/internal/heart/ethereal/proc/crystalize(mob/living/ethereal)
+/obj/item/organ/heart/ethereal/proc/crystalize(mob/living/ethereal)
var/location = ethereal.loc
@@ -118,7 +118,7 @@
stop_crystalization_process(ethereal, TRUE)
///Stop the crystalization process, unregistering any signals and resetting any variables.
-/obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE)
+/obj/item/organ/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE)
UnregisterSignal(ethereal, COMSIG_LIVING_DISARM_HIT)
UnregisterSignal(ethereal, COMSIG_ATOM_EXAMINE)
UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE)
@@ -133,14 +133,14 @@
deltimer(crystalize_timer_id)
crystalize_timer_id = null
-/obj/item/organ/internal/heart/ethereal/proc/owner_deleted(datum/source)
+/obj/item/organ/heart/ethereal/proc/owner_deleted(datum/source)
SIGNAL_HANDLER
stop_crystalization_process(owner)
return
///Lets you stop the process with enough brute damage
-/obj/item/organ/internal/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone, ...)
+/obj/item/organ/heart/ethereal/proc/on_take_damage(datum/source, damage, damagetype, def_zone, ...)
SIGNAL_HANDLER
if(damagetype != BRUTE)
return
@@ -170,7 +170,7 @@
density = TRUE
anchored = TRUE
///The organ this crystal belongs to
- var/obj/item/organ/internal/heart/ethereal/ethereal_heart
+ var/obj/item/organ/heart/ethereal/ethereal_heart
///Timer for the healing process. Stops if destroyed.
var/crystal_heal_timer
///Is the crystal still being built? True by default, gets changed after a timer.
@@ -179,7 +179,7 @@
/obj/structure/ethereal_crystal/relaymove()
return
-/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/internal/heart/ethereal/ethereal_heart)
+/obj/structure/ethereal_crystal/Initialize(mapload, obj/item/organ/heart/ethereal/ethereal_heart)
. = ..()
if(!ethereal_heart)
stack_trace("Our crystal has no related heart")
diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm
index d71e368bdd0ff..0464bfca993d7 100755
--- a/code/modules/surgery/organs/internal/liver/_liver.dm
+++ b/code/modules/surgery/organs/internal/liver/_liver.dm
@@ -2,7 +2,7 @@
#define LIVER_DEFAULT_TOX_RESISTANCE 1 //lower values lower how harmful toxins are to the liver
#define LIVER_FAILURE_STAGE_SECONDS 60 //amount of seconds before liver failure reaches a new stage
-/obj/item/organ/internal/liver
+/obj/item/organ/liver
name = "liver"
desc = "Pairing suggestion: chianti and fava beans."
icon_state = "liver"
@@ -27,7 +27,7 @@
var/filterToxins = TRUE //whether to filter toxins
var/operated = FALSE //whether the liver's been repaired with surgery and can be fixed again or not
-/obj/item/organ/internal/liver/Initialize(mapload)
+/obj/item/organ/liver/Initialize(mapload)
. = ..()
// If the liver handles foods like a clown, it honks like a bike horn
// Don't think about it too much.
@@ -43,7 +43,7 @@
* The removal of the component, if this liver loses that trait, is handled
* by the component itself.
*/
-/obj/item/organ/internal/liver/proc/on_add_comedy_metabolism()
+/obj/item/organ/liver/proc/on_add_comedy_metabolism()
SIGNAL_HANDLER
// Are clown "bike" horns made from the livers of ex-clowns?
@@ -54,18 +54,18 @@
*
* Basically just removes squeak component
*/
-/obj/item/organ/internal/liver/proc/on_remove_comedy_metabolism()
+/obj/item/organ/liver/proc/on_remove_comedy_metabolism()
SIGNAL_HANDLER
qdel(GetComponent(/datum/component/squeak))
/// Registers COMSIG_SPECIES_HANDLE_CHEMICAL from owner
-/obj/item/organ/internal/liver/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
RegisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL, PROC_REF(handle_chemical))
/// Unregisters COMSIG_SPECIES_HANDLE_CHEMICAL from owner
-/obj/item/organ/internal/liver/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/liver/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_SPECIES_HANDLE_CHEMICAL)
@@ -76,10 +76,10 @@
*
* NOTE: If you return COMSIG_MOB_STOP_REAGENT_CHECK, that reagent will not be removed like normal! You must handle it manually.
**/
-/obj/item/organ/internal/liver/proc/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
+/obj/item/organ/liver/proc/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
SIGNAL_HANDLER
-/obj/item/organ/internal/liver/examine(mob/user)
+/obj/item/organ/liver/examine(mob/user)
. = ..()
if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER) || isobserver(user))
@@ -108,7 +108,7 @@
else if(HAS_TRAIT(src, TRAIT_PRETENDER_ROYAL_METABOLISM))
. += span_info("A diet of imitation caviar, and signs of insomnia, implies that this is the liver of someone who wants to be a head of staff.")
-/obj/item/organ/internal/liver/before_organ_replacement(obj/item/organ/replacement)
+/obj/item/organ/liver/before_organ_replacement(obj/item/organ/replacement)
. = ..()
if(!istype(replacement, type))
return
@@ -123,7 +123,7 @@
continue
ADD_TRAIT(replacement, readded_trait, JOB_TRAIT)
-/obj/item/organ/internal/liver/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/liver/on_life(seconds_per_tick, times_fired)
. = ..()
//If your liver is failing, then we use the liverless version of metabolize
if((organ_flags & ORGAN_FAILING) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM))
@@ -133,12 +133,12 @@
owner.reagents?.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE)
-/obj/item/organ/internal/liver/handle_failing_organs(seconds_per_tick)
+/obj/item/organ/liver/handle_failing_organs(seconds_per_tick)
if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM))
return
return ..()
-/obj/item/organ/internal/liver/organ_failure(seconds_per_tick)
+/obj/item/organ/liver/organ_failure(seconds_per_tick)
switch(failure_time/LIVER_FAILURE_STAGE_SECONDS)
if(1)
to_chat(owner, span_userdanger("You feel stabbing pain in your abdomen!"))
@@ -188,7 +188,7 @@
if(SPT_PROB(3, seconds_per_tick))
owner.emote("drool")
-/obj/item/organ/internal/liver/on_owner_examine(datum/source, mob/user, list/examine_list)
+/obj/item/organ/liver/on_owner_examine(datum/source, mob/user, list/examine_list)
if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING))
return
@@ -203,18 +203,18 @@
if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY)
examine_list += span_danger("[owner]'s eyes are completely yellow and swelling with pus. [owner.p_They()] [owner.p_do()]n't look like [owner.p_they()] will be alive for much longer.")
-/obj/item/organ/internal/liver/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/liver/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantliver
// alien livers can ignore up to 15u of toxins, but they take x3 liver damage
-/obj/item/organ/internal/liver/alien
+/obj/item/organ/liver/alien
name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage
desc = "A liver that used to belong to a killer alien, who knows what it used to eat."
icon_state = "liver-x" // Same sprite as fly-person liver.
liver_resistance = 0.333 * LIVER_DEFAULT_TOX_RESISTANCE // -66%
toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful
-/obj/item/organ/internal/liver/cybernetic
+/obj/item/organ/liver/cybernetic
name = "basic cybernetic liver"
desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver."
failing_desc = "seems to be broken."
@@ -225,7 +225,7 @@
liver_resistance = 0.9 * LIVER_DEFAULT_TOX_RESISTANCE // -10%
var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed.
-/obj/item/organ/internal/liver/cybernetic/emp_act(severity)
+/obj/item/organ/liver/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -235,7 +235,7 @@
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon.
-/obj/item/organ/internal/liver/cybernetic/tier2
+/obj/item/organ/liver/cybernetic/tier2
name = "cybernetic liver"
desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver."
icon_state = "liver-c-u"
@@ -244,7 +244,7 @@
liver_resistance = 1.2 * LIVER_DEFAULT_TOX_RESISTANCE // +20%
emp_vulnerability = 40
-/obj/item/organ/internal/liver/cybernetic/tier3
+/obj/item/organ/liver/cybernetic/tier3
name = "upgraded cybernetic liver"
desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins."
icon_state = "liver-c-u2"
@@ -254,7 +254,7 @@
liver_resistance = 1.5 * LIVER_DEFAULT_TOX_RESISTANCE // +50%
emp_vulnerability = 20
-/obj/item/organ/internal/liver/cybernetic/surplus
+/obj/item/organ/liver/cybernetic/surplus
name = "surplus prosthetic liver"
desc = "A very cheap prosthetic liver, mass produced for low-functioning alcoholics... It looks more like a water filter than \
an actual liver. \
@@ -268,9 +268,9 @@
emp_vulnerability = 100
//surplus organs are so awful that they explode when removed, unless failing
-/obj/item/organ/internal/liver/cybernetic/surplus/Initialize(mapload)
+/obj/item/organ/liver/cybernetic/surplus/Initialize(mapload)
. = ..()
- AddElement(/datum/element/dangerous_surgical_removal)
+ AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE)
#undef LIVER_DEFAULT_TOX_TOLERANCE
#undef LIVER_DEFAULT_TOX_RESISTANCE
diff --git a/code/modules/surgery/organs/internal/liver/liver_golem.dm b/code/modules/surgery/organs/internal/liver/liver_golem.dm
index 1ab3eabcd9cc5..d9c3d4632cfec 100644
--- a/code/modules/surgery/organs/internal/liver/liver_golem.dm
+++ b/code/modules/surgery/organs/internal/liver/liver_golem.dm
@@ -3,16 +3,16 @@
* Basically only exists to remove the nutriment factor from consumables,
* so golems can only consume minerals even when injecting reagents.
*
- * Actually consuming golem food is handled by /obj/item/organ/internal/stomach/golem!
+ * Actually consuming golem food is handled by /obj/item/organ/stomach/golem!
**/
-/obj/item/organ/internal/liver/golem
+/obj/item/organ/liver/golem
name = "porous rock"
desc = "A spongy rock capable of absorbing chemicals."
icon_state = "liver-p"
organ_flags = ORGAN_MINERAL
color = COLOR_GOLEM_GRAY
-/obj/item/organ/internal/liver/golem/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
+/obj/item/organ/liver/golem/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
. = ..()
// parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing
if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING))
diff --git a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
index be21968d659b8..714916d183ea2 100644
--- a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
+++ b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm
@@ -2,7 +2,7 @@
* Plasmaman liver
* Makes plasma and hot ice heal wounds, also makes gunpowder a hallucinogen.
**/
-/obj/item/organ/internal/liver/bone/plasmaman
+/obj/item/organ/liver/bone/plasmaman
name = "reagent processing crystal"
desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen."
icon_state = "liver-p"
@@ -10,7 +10,7 @@
organ_traits = list(TRAIT_PLASMA_LOVER_METABOLISM)
milk_burn_healing = 0
-/obj/item/organ/internal/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
+/obj/item/organ/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
. = ..()
// parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing
if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING))
diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
index b57afd245f587..8ff1f0c3cf327 100644
--- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
+++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm
@@ -3,7 +3,7 @@
* Gives the owner liverless metabolism, makes them vulnerable to bone hurting juice and
* makes milk heal them through meme magic.
**/
-/obj/item/organ/internal/liver/bone
+/obj/item/organ/liver/bone
name = "mass of bones"
desc = "You have no idea what this strange ball of bones does."
icon_state = "liver-bone"
@@ -13,7 +13,7 @@
///Var for burn healing via milk
var/milk_burn_healing = 2.5
-/obj/item/organ/internal/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
+/obj/item/organ/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
. = ..()
// parent returned COMSIG_MOB_STOP_REAGENT_CHECK or we are failing
if((. & COMSIG_MOB_STOP_REAGENT_CHECK) || (organ_flags & ORGAN_FAILING))
diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm
index b2d85a26f8fdc..d20cb4968b2bb 100644
--- a/code/modules/surgery/organs/internal/lungs/_lungs.dm
+++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/lungs
+/obj/item/organ/lungs
name = "lungs"
icon_state = "lungs"
@@ -105,7 +105,7 @@
var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine
// assign the respiration_type
-/obj/item/organ/internal/lungs/Initialize(mapload)
+/obj/item/organ/lungs/Initialize(mapload)
. = ..()
breath_out = new(BREATH_VOLUME)
@@ -154,7 +154,7 @@
add_gas_reaction(/datum/gas/zauker, while_present = PROC_REF(too_much_zauker))
///Simply exists so that you don't keep any alerts from your previous lack of lungs.
-/obj/item/organ/internal/lungs/mob_insert(mob/living/carbon/receiver, special = FALSE, movement_flags)
+/obj/item/organ/lungs/mob_insert(mob/living/carbon/receiver, special = FALSE, movement_flags)
. = ..()
receiver.clear_alert(ALERT_NOT_ENOUGH_OXYGEN)
@@ -163,7 +163,7 @@
receiver.clear_alert(ALERT_NOT_ENOUGH_PLASMA)
receiver.clear_alert(ALERT_NOT_ENOUGH_N2O)
-/obj/item/organ/internal/lungs/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/lungs/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
// This is very "manual" I realize, but it's useful to ensure cleanup for gases we're removing happens
// Avoids stuck alerts and such
@@ -188,7 +188,7 @@
* while_present and always get the same arguments (mob/living/carbon/breather, datum/gas_mixture/breath, pp, old_pp)
* on_loss is almost exactly the same, except it doesn't pass in a current partial pressure, since one isn't avalible
*/
-/obj/item/organ/internal/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null)
+/obj/item/organ/lungs/proc/add_gas_reaction(gas_type, while_present = null, on_loss = null, always = null)
if(always)
breathe_always[gas_type] = always
@@ -208,7 +208,7 @@
* Takes the gas to check for as an argument, alongside the gas to convert and the multiplier to use
* These act in the order of insertion, use that how you will
*/
-/obj/item/organ/internal/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier)
+/obj/item/organ/lungs/proc/add_gas_relationship(gas_type, convert_to, multiplier)
if(isnull(gas_type) || isnull(convert_to) || multiplier == 0)
return
@@ -219,7 +219,7 @@
treat_as += list(add)
/// Clears away a gas relationship. Takes the same args as the initial addition
-/obj/item/organ/internal/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier)
+/obj/item/organ/lungs/proc/remove_gas_relationship(gas_type, convert_to, multiplier)
if(isnull(gas_type) || isnull(convert_to) || multiplier == 0)
return
@@ -234,7 +234,7 @@
return
/// Handles oxygen breathing. Always called by things that need o2, no matter what
-/obj/item/organ/internal/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
+/obj/item/organ/lungs/proc/breathe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
if(o2_pp < safe_oxygen_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING))
// Not safe to check the old pp because of can_breath_vacuum
breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy)
@@ -256,7 +256,7 @@
breather.adjustOxyLoss(-5)
/// Maximum Oxygen effects. "Too much O2!"
-/obj/item/organ/internal/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
+/obj/item/organ/lungs/proc/too_much_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, o2_pp, old_o2_pp)
// If too much Oxygen is poisonous.
if(o2_pp <= safe_oxygen_max)
if(old_o2_pp > safe_oxygen_max)
@@ -269,11 +269,11 @@
breather.throw_alert(ALERT_TOO_MUCH_OXYGEN, /atom/movable/screen/alert/too_much_oxy)
/// Handles NOT having too much o2. only relevant if safe_oxygen_max has a value
-/obj/item/organ/internal/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp)
+/obj/item/organ/lungs/proc/safe_oxygen(mob/living/carbon/breather, datum/gas_mixture/breath, old_o2_pp)
breather.clear_alert(ALERT_TOO_MUCH_OXYGEN)
/// Behaves like Oxygen with 8X efficacy, but metabolizes into a reagent.
-/obj/item/organ/internal/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp)
+/obj/item/organ/lungs/proc/consume_pluoxium(mob/living/carbon/breather, datum/gas_mixture/breath, pluoxium_pp, old_pluoxium_pp)
breathe_gas_volume(breath, /datum/gas/pluoxium)
// Metabolize to reagent.
if(pluoxium_pp > gas_stimulation_min)
@@ -281,7 +281,7 @@
breather.reagents.add_reagent(/datum/reagent/pluoxium, max(0, 1 - existing))
/// If the lungs need Nitrogen to breathe properly, N2 is exchanged with CO2.
-/obj/item/organ/internal/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp)
+/obj/item/organ/lungs/proc/breathe_nitro(mob/living/carbon/breather, datum/gas_mixture/breath, nitro_pp, old_nitro_pp)
if(nitro_pp < safe_nitro_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING))
// Suffocation side-effects.
// Not safe to check the old pp because of can_breath_vacuum
@@ -303,7 +303,7 @@
breather.adjustOxyLoss(-5)
/// Maximum CO2 effects. "Too much CO2!"
-/obj/item/organ/internal/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp)
+/obj/item/organ/lungs/proc/too_much_co2(mob/living/carbon/breather, datum/gas_mixture/breath, co2_pp, old_co2_pp)
if(co2_pp <= safe_co2_max)
if(old_co2_pp > safe_co2_max)
return BREATH_LOST
@@ -329,13 +329,13 @@
breather.apply_damage(8, co2_damage_type, spread_damage = TRUE)
/// Handles NOT having too much co2. only relevant if safe_co2_max has a value
-/obj/item/organ/internal/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp)
+/obj/item/organ/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp)
// Reset side-effects.
breather.co2overloadtime = 0
breather.clear_alert(ALERT_TOO_MUCH_CO2)
/// If the lungs need Plasma to breathe properly, Plasma is exchanged with CO2.
-/obj/item/organ/internal/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp)
+/obj/item/organ/lungs/proc/breathe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp)
// Suffocation side-effects.
if(plasma_pp < safe_plasma_min && !HAS_TRAIT(src, TRAIT_SPACEBREATHING))
// Could check old_plasma_pp but vacuum breathing hates me
@@ -357,7 +357,7 @@
breather.adjustOxyLoss(-5)
/// Maximum Plasma effects. "Too much Plasma!"
-/obj/item/organ/internal/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp)
+/obj/item/organ/lungs/proc/too_much_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, plasma_pp, old_plasma_pp)
if(plasma_pp <= safe_plasma_max)
if(old_plasma_pp > safe_plasma_max)
return BREATH_LOST
@@ -372,11 +372,11 @@
breather.apply_damage(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type, spread_damage = TRUE)
/// Resets plasma side effects
-/obj/item/organ/internal/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp)
+/obj/item/organ/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp)
breather.clear_alert(ALERT_TOO_MUCH_PLASMA)
/// Too much funny gas, time to get brain damage
-/obj/item/organ/internal/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp)
+/obj/item/organ/lungs/proc/too_much_bz(mob/living/carbon/breather, datum/gas_mixture/breath, bz_pp, old_bz_pp)
if(bz_pp > BZ_trip_balls_min)
breather.adjust_hallucinations(20 SECONDS)
breather.reagents.add_reagent(/datum/reagent/bz_metabolites, 5)
@@ -384,7 +384,7 @@
breather.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150, ORGAN_ORGANIC)
/// Breathing in refridgerator coolent, shit's caustic
-/obj/item/organ/internal/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp)
+/obj/item/organ/lungs/proc/too_much_freon(mob/living/carbon/breather, datum/gas_mixture/breath, freon_pp, old_freon_pp)
// Inhale Freon. Exhale nothing.
breathe_gas_volume(breath, /datum/gas/freon)
if (freon_pp > gas_stimulation_min)
@@ -401,7 +401,7 @@
breather.adjustFireLoss(freon_pp / 4)
/// Breathing in halon, convert it to a reagent
-/obj/item/organ/internal/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp)
+/obj/item/organ/lungs/proc/too_much_halon(mob/living/carbon/breather, datum/gas_mixture/breath, halon_pp, old_halon_pp)
// Inhale Halon. Exhale nothing.
breathe_gas_volume(breath, /datum/gas/halon)
// Metabolize to reagent.
@@ -410,7 +410,7 @@
breather.reagents.add_reagent(/datum/reagent/halon, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/halon)))
/// Sleeping gas with healing properties.
-/obj/item/organ/internal/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp)
+/obj/item/organ/lungs/proc/consume_healium(mob/living/carbon/breather, datum/gas_mixture/breath, healium_pp, old_healium_pp)
breathe_gas_volume(breath, /datum/gas/healium)
// Euphoria side-effect.
if(healium_pp > gas_stimulation_min)
@@ -428,11 +428,11 @@
breather.reagents.add_reagent(/datum/reagent/healium, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/healium)))
/// Lose healium side effects
-/obj/item/organ/internal/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp)
+/obj/item/organ/lungs/proc/lose_healium(mob/living/carbon/breather, datum/gas_mixture/breath, old_healium_pp)
healium_euphoria = EUPHORIA_INACTIVE
/// Activates helium speech when partial pressure gets high enough
-/obj/item/organ/internal/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp)
+/obj/item/organ/lungs/proc/consume_helium(mob/living/carbon/breather, datum/gas_mixture/breath, helium_pp, old_helium_pp)
breathe_gas_volume(breath, /datum/gas/helium)
if(helium_pp > helium_speech_min)
if(old_helium_pp <= helium_speech_min)
@@ -442,23 +442,23 @@
UnregisterSignal(breather, COMSIG_MOB_SAY)
/// Lose helium high pitched voice
-/obj/item/organ/internal/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp)
+/obj/item/organ/lungs/proc/lose_helium(mob/living/carbon/breather, datum/gas_mixture/breath, old_helium_pp)
UnregisterSignal(breather, COMSIG_MOB_SAY)
/// React to speach while hopped up on the high pitched voice juice
-/obj/item/organ/internal/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args)
+/obj/item/organ/lungs/proc/handle_helium_speech(mob/living/carbon/breather, list/speech_args)
SIGNAL_HANDLER
speech_args[SPEECH_SPANS] |= SPAN_SMALL_VOICE
/// Gain hypernob effects if we have enough of the stuff
-/obj/item/organ/internal/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp)
+/obj/item/organ/lungs/proc/consume_hypernoblium(mob/living/carbon/breather, datum/gas_mixture/breath, hypernob_pp, old_hypernob_pp)
breathe_gas_volume(breath, /datum/gas/hypernoblium)
if (hypernob_pp > gas_stimulation_min)
var/existing = breather.reagents.get_reagent_amount(/datum/reagent/hypernoblium)
breather.reagents.add_reagent(/datum/reagent/hypernoblium,max(0, 1 - existing))
/// Breathing in the stink gas
-/obj/item/organ/internal/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp)
+/obj/item/organ/lungs/proc/too_much_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, miasma_pp, old_miasma_pp)
// Inhale Miasma. Exhale nothing.
breathe_gas_volume(breath, /datum/gas/miasma)
// Miasma side effects
@@ -494,12 +494,12 @@
breather.adjust_disgust(0.1 * miasma_pp)
/// We're free from the stick, clear out its impacts
-/obj/item/organ/internal/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp)
+/obj/item/organ/lungs/proc/safe_miasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_miasma_pp)
// Clear out moods when immune to miasma, or if there's no miasma at all.
breather.clear_mood_event("smell")
/// Causes random euphoria and giggling. Large amounts knock you down
-/obj/item/organ/internal/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp)
+/obj/item/organ/lungs/proc/too_much_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, n2o_pp, old_n2o_pp)
if(n2o_pp < n2o_para_min)
// Small amount of N2O, small side-effects.
if(n2o_pp <= n2o_detect_min)
@@ -532,12 +532,12 @@
breather.Sleeping(min(breather.AmountSleeping() + 100, 200))
/// N2O side-effects. "Too much N2O!"
-/obj/item/organ/internal/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp)
+/obj/item/organ/lungs/proc/safe_n2o(mob/living/carbon/breather, datum/gas_mixture/breath, old_n2o_pp)
n2o_euphoria = EUPHORIA_INACTIVE
breather.clear_alert(ALERT_TOO_MUCH_N2O)
// Breathe in nitrium. It's helpful, but has nasty side effects
-/obj/item/organ/internal/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp)
+/obj/item/organ/lungs/proc/too_much_nitrium(mob/living/carbon/breather, datum/gas_mixture/breath, nitrium_pp, old_nitrium_pp)
breathe_gas_volume(breath, /datum/gas/nitrium)
if(prob(20))
@@ -557,7 +557,7 @@
breather.reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, max(0, 1 - existing))
/// Radioactive, green gas. Toxin damage, and a radiation chance
-/obj/item/organ/internal/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp)
+/obj/item/organ/lungs/proc/too_much_tritium(mob/living/carbon/breather, datum/gas_mixture/breath, trit_pp, old_trit_pp)
var/gas_breathed = breathe_gas_volume(breath, /datum/gas/tritium)
var/moles_visible = GLOB.meta_gas_info[/datum/gas/tritium][META_GAS_MOLES_VISIBLE] * BREATH_PERCENTAGE
// Tritium side-effects.
@@ -572,7 +572,7 @@
breather.AddComponent(/datum/component/irradiated)
/// Really toxic stuff, very much trying to kill you
-/obj/item/organ/internal/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp)
+/obj/item/organ/lungs/proc/too_much_zauker(mob/living/carbon/breather, datum/gas_mixture/breath, zauker_pp, old_zauker_pp)
breathe_gas_volume(breath, /datum/gas/zauker)
// Metabolize to reagent.
if(zauker_pp > gas_stimulation_min)
@@ -591,7 +591,7 @@
* * breath: A gas mixture to test, or null.
* * breather: A carbon mob that is using the lungs to breathe.
*/
-/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
+/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather)
if(HAS_TRAIT(breather, TRAIT_GODMODE))
breather.failed_last_breath = FALSE
breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN)
@@ -711,7 +711,7 @@
/// Remove gas from breath. If output_gas is given, transfers the removed gas to the lung's gas_mixture.
/// Removes 100% of the given gas type unless given a volume argument.
/// Returns the amount of gas theoretically removed.
-/obj/item/organ/internal/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY)
+/obj/item/organ/lungs/proc/breathe_gas_volume(datum/gas_mixture/breath, remove_id, exchange_id = null, volume = INFINITY)
var/list/breath_gases = breath.gases
volume = min(volume, breath_gases[remove_id][MOLES])
breath_gases[remove_id][MOLES] -= volume
@@ -722,7 +722,7 @@
/// Applies suffocation side-effects to a given Human, scaling based on ratio of required pressure VS "true" pressure.
/// If pressure is greater than 0, the return value will represent the amount of gas successfully breathed.
-/obj/item/organ/internal/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0)
+/obj/item/organ/lungs/proc/handle_suffocation(mob/living/carbon/human/suffocator = null, breath_pp = 0, safe_breath_min = 0, mole_count = 0)
. = 0
// Can't suffocate without a Human, or without minimum breath pressure.
if(!suffocator || !safe_breath_min)
@@ -752,7 +752,7 @@
suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
-/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures
+/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures
var/breath_temperature = breath.temperature
if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE
@@ -801,7 +801,7 @@
breath.temperature = breather.bodytemperature
/// Creates a particle effect off the mouth of the passed mob.
-/obj/item/organ/internal/lungs/proc/emit_breath_particle(mob/living/carbon/human/breather, particle_type)
+/obj/item/organ/lungs/proc/emit_breath_particle(mob/living/carbon/human/breather, particle_type)
ASSERT(ispath(particle_type, /particles))
var/obj/effect/abstract/particle_holder/holder = new(breather, particle_type)
@@ -836,7 +836,7 @@
QDEL_IN(holder, breath_particle.lifespan)
-/obj/item/organ/internal/lungs/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/lungs/on_life(seconds_per_tick, times_fired)
. = ..()
if(failed && !(organ_flags & ORGAN_FAILING))
failed = FALSE
@@ -849,13 +849,13 @@
owner.visible_message(span_danger("[owner] grabs [owner.p_their()] throat, struggling for breath!"), span_userdanger("You suddenly feel like you can't breathe!"))
failed = TRUE
-/obj/item/organ/internal/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/lungs/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantlungs
#define SMOKER_ORGAN_HEALTH (STANDARD_ORGAN_THRESHOLD * 0.75)
#define SMOKER_LUNG_HEALING (STANDARD_ORGAN_HEALING * 0.75)
-/obj/item/organ/internal/lungs/plasmaman
+/obj/item/organ/lungs/plasmaman
name = "plasma filter"
desc = "A spongy rib-shaped mass for filtering plasma from the air."
icon_state = "lungs-plasma"
@@ -865,7 +865,7 @@
safe_plasma_min = 4 //We breathe THIS!
safe_plasma_max = 0
-/obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker
+/obj/item/organ/lungs/plasmaman/plasmaman_smoker
name = "smoker plasma filter"
desc = "A plasma filter that look discolored, a result from smoking a lot."
icon_state = "lungs_plasma_smoker"
@@ -873,19 +873,19 @@
maxHealth = SMOKER_ORGAN_HEALTH
healing_factor = SMOKER_LUNG_HEALING
-/obj/item/organ/internal/lungs/slime
+/obj/item/organ/lungs/slime
name = "vacuole"
desc = "A large organelle designed to store oxygen and other important gasses."
safe_plasma_max = 0 //We breathe this to gain POWER.
-/obj/item/organ/internal/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime)
+/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather_slime)
. = ..()
if (breath?.gases[/datum/gas/plasma])
var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma][MOLES])
breather_slime.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
-/obj/item/organ/internal/lungs/smoker_lungs
+/obj/item/organ/lungs/smoker_lungs
name = "smoker lungs"
desc = "A pair of lungs that look sickly, a result from smoking a lot."
icon_state = "lungs_smoker"
@@ -893,7 +893,7 @@
maxHealth = SMOKER_ORGAN_HEALTH
healing_factor = SMOKER_LUNG_HEALING
-/obj/item/organ/internal/lungs/cybernetic
+/obj/item/organ/lungs/cybernetic
name = "basic cybernetic lungs"
desc = "A basic cybernetic version of the lungs found in traditional humanoid entities."
failing_desc = "seems to be broken."
@@ -902,7 +902,7 @@
maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5
var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed.
-/obj/item/organ/internal/lungs/cybernetic/emp_act(severity)
+/obj/item/organ/lungs/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -912,7 +912,7 @@
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon.
-/obj/item/organ/internal/lungs/cybernetic/tier2
+/obj/item/organ/lungs/cybernetic/tier2
name = "cybernetic lungs"
desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure."
icon_state = "lungs-c-u"
@@ -920,7 +920,7 @@
safe_oxygen_min = 13
emp_vulnerability = 40
-/obj/item/organ/internal/lungs/cybernetic/tier3
+/obj/item/organ/lungs/cybernetic/tier3
name = "upgraded cybernetic lungs"
desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out lower levels of plasma and carbon dioxide."
icon_state = "lungs-c-u2"
@@ -934,7 +934,7 @@
cold_level_2_threshold = 140
cold_level_3_threshold = 100
-/obj/item/organ/internal/lungs/cybernetic/surplus
+/obj/item/organ/lungs/cybernetic/surplus
name = "surplus prosthetic lungs"
desc = "Two fragile, inflatable sacks of air that only barely mimic the function of human lungs. \
Offer no protection against EMPs."
@@ -943,11 +943,11 @@
emp_vulnerability = 100
//surplus organs are so awful that they explode when removed, unless failing
-/obj/item/organ/internal/lungs/cybernetic/surplus/Initialize(mapload)
+/obj/item/organ/lungs/cybernetic/surplus/Initialize(mapload)
. = ..()
- AddElement(/datum/element/dangerous_surgical_removal)
+ AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE)
-/obj/item/organ/internal/lungs/lavaland
+/obj/item/organ/lungs/lavaland
name = "blackened frilled lungs" // blackened from necropolis exposure
desc = "Exposure to the necropolis has mutated these lungs to breathe the air of Indecipheres, the lava-covered moon."
icon_state = "lungs-ashwalker"
@@ -956,7 +956,7 @@
// to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules.
#define GAS_TOLERANCE 5
-/obj/item/organ/internal/lungs/lavaland/Initialize(mapload)
+/obj/item/organ/lungs/lavaland/Initialize(mapload)
var/datum/gas_mixture/immutable/planetary/mix = SSair.planetary[LAVALAND_DEFAULT_ATMOS]
if(!mix?.total_moles()) // this typically means we didn't load lavaland, like if we're using the LOWMEMORYMODE define
@@ -1007,7 +1007,7 @@
#undef GAS_TOLERANCE
-/obj/item/organ/internal/lungs/ethereal
+/obj/item/organ/lungs/ethereal
name = "aeration reticulum"
desc = "These exotic lungs seem crunchier than most."
icon_state = "lungs_ethereal"
@@ -1015,7 +1015,7 @@
heat_level_2_threshold = 473
heat_level_3_threshold = 1073
-/obj/item/organ/internal/lungs/ethereal/ethereal_smoker
+/obj/item/organ/lungs/ethereal/ethereal_smoker
name = "smoker aeration reticulum"
desc = "A pair of exotic lungs that look pale and sickly, a result from smoking a lot."
icon_state = "lungs_ethereal_smoker"
@@ -1023,12 +1023,12 @@
maxHealth = SMOKER_ORGAN_HEALTH
healing_factor = SMOKER_LUNG_HEALING
-/obj/item/organ/internal/lungs/ethereal/Initialize(mapload)
+/obj/item/organ/lungs/ethereal/Initialize(mapload)
. = ..()
add_gas_reaction(/datum/gas/water_vapor, while_present = PROC_REF(consume_water))
/// H2O electrolysis
-/obj/item/organ/internal/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp)
+/obj/item/organ/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp)
var/gas_breathed = breath.gases[/datum/gas/water_vapor][MOLES]
breath.gases[/datum/gas/water_vapor][MOLES] -= gas_breathed
breath_out.assert_gases(/datum/gas/oxygen, /datum/gas/hydrogen)
diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm
index 7e7a864f0a04c..d57ea9680bf1a 100644
--- a/code/modules/surgery/organs/internal/stomach/_stomach.dm
+++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm
@@ -1,7 +1,7 @@
//The contant in the rate of reagent transfer on life ticks
#define STOMACH_METABOLISM_CONSTANT 0.25
-/obj/item/organ/internal/stomach
+/obj/item/organ/stomach
name = "stomach"
desc = "Onaka ga suite imasu."
icon_state = "stomach"
@@ -35,7 +35,7 @@
var/operated = FALSE //whether the stomach's been repaired with surgery and can be fixed again or not
-/obj/item/organ/internal/stomach/Initialize(mapload)
+/obj/item/organ/stomach/Initialize(mapload)
. = ..()
//None edible organs do not get a reagent holder by default
if(!reagents)
@@ -43,7 +43,7 @@
else
reagents.flags |= REAGENT_HOLDER_ALIVE
-/obj/item/organ/internal/stomach/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/stomach/on_life(seconds_per_tick, times_fired)
. = ..()
//Manage species digestion
@@ -119,7 +119,7 @@
body.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = damage)
to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!"))
-/obj/item/organ/internal/stomach/proc/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired)
+/obj/item/organ/stomach/proc/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired)
if(HAS_TRAIT(human, TRAIT_NOHUNGER))
return //hunger is for BABIES
@@ -185,21 +185,21 @@
handle_hunger_slowdown(human)
///for when mood is disabled and hunger should handle slowdowns
-/obj/item/organ/internal/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human)
+/obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human)
var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80
if(hungry >= 70)
human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50))
else
human.remove_movespeed_modifier(/datum/movespeed_modifier/hunger)
-/obj/item/organ/internal/stomach/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/stomach/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantstomach
///This gets called after the owner takes a bite of food
-/obj/item/organ/internal/stomach/proc/after_eat(atom/edible)
+/obj/item/organ/stomach/proc/after_eat(atom/edible)
return
-/obj/item/organ/internal/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, seconds_per_tick, times_fired)
+/obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, seconds_per_tick, times_fired)
var/old_disgust = disgusted.old_disgust
var/disgust = disgusted.disgust
@@ -246,11 +246,11 @@
disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/disgusted)
disgusted.add_mood_event("disgust", /datum/mood_event/disgusted)
-/obj/item/organ/internal/stomach/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/stomach/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
receiver.hud_used?.hunger?.update_appearance()
-/obj/item/organ/internal/stomach/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags)
+/obj/item/organ/stomach/mob_remove(mob/living/carbon/stomach_owner, special, movement_flags)
if(ishuman(stomach_owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.clear_alert(ALERT_DISGUST)
@@ -258,21 +258,21 @@
stomach_owner.hud_used?.hunger?.update_appearance()
return ..()
-/obj/item/organ/internal/stomach/bone
+/obj/item/organ/stomach/bone
name = "mass of bones"
desc = "You have no idea what this strange ball of bones does."
icon_state = "stomach-bone"
metabolism_efficiency = 0.025 //very bad
organ_traits = list(TRAIT_NOHUNGER)
-/obj/item/organ/internal/stomach/bone/plasmaman
+/obj/item/organ/stomach/bone/plasmaman
name = "digestive crystal"
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
icon_state = "stomach-p"
metabolism_efficiency = 0.06
organ_traits = null
-/obj/item/organ/internal/stomach/cybernetic
+/obj/item/organ/stomach/cybernetic
name = "basic cybernetic stomach"
desc = "A basic device designed to mimic the functions of a human stomach"
failing_desc = "seems to be broken."
@@ -282,7 +282,7 @@
metabolism_efficiency = 0.035 // not as good at digestion
var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed.
-/obj/item/organ/internal/stomach/cybernetic/emp_act(severity)
+/obj/item/organ/stomach/cybernetic/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
@@ -292,7 +292,7 @@
if(prob(emp_vulnerability/severity)) //Chance of permanent effects
organ_flags |= ORGAN_EMP //Starts organ faliure - gonna need replacing soon.
-/obj/item/organ/internal/stomach/cybernetic/tier2
+/obj/item/organ/stomach/cybernetic/tier2
name = "cybernetic stomach"
desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better."
icon_state = "stomach-c-u"
@@ -301,7 +301,7 @@
emp_vulnerability = 40
metabolism_efficiency = 0.07
-/obj/item/organ/internal/stomach/cybernetic/tier3
+/obj/item/organ/stomach/cybernetic/tier3
name = "upgraded cybernetic stomach"
desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well."
icon_state = "stomach-c-u2"
@@ -310,7 +310,7 @@
emp_vulnerability = 20
metabolism_efficiency = 0.1
-/obj/item/organ/internal/stomach/cybernetic/surplus
+/obj/item/organ/stomach/cybernetic/surplus
name = "surplus prosthetic stomach"
desc = "A mechanical plastic oval that utilizes sulfuric acid instead of stomach acid. \
Very fragile, with painfully slow metabolism.\
@@ -321,8 +321,8 @@
metabolism_efficiency = 0.025
//surplus organs are so awful that they explode when removed, unless failing
-/obj/item/organ/internal/stomach/cybernetic/surplus/Initialize(mapload)
+/obj/item/organ/stomach/cybernetic/surplus/Initialize(mapload)
. = ..()
- AddElement(/datum/element/dangerous_surgical_removal)
+ AddElement(/datum/element/dangerous_organ_removal, /*surgical = */ TRUE)
#undef STOMACH_METABOLISM_CONSTANT
diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
index d340edbecea64..80082cf47a595 100644
--- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
+++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/stomach/ethereal
+/obj/item/organ/stomach/ethereal
name = "biological battery"
icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy.
desc = "A crystal-like organ that stores the electric charge of ethereals."
@@ -8,25 +8,25 @@
///used to keep ethereals from spam draining power sources
var/drain_time = 0
-/obj/item/organ/internal/stomach/ethereal/Initialize(mapload)
+/obj/item/organ/stomach/ethereal/Initialize(mapload)
. = ..()
cell = new /obj/item/stock_parts/power_store/cell/ethereal(src)
-/obj/item/organ/internal/stomach/ethereal/Destroy()
+/obj/item/organ/stomach/ethereal/Destroy()
QDEL_NULL(cell)
return ..()
-/obj/item/organ/internal/stomach/ethereal/on_life(seconds_per_tick, times_fired)
+/obj/item/organ/stomach/ethereal/on_life(seconds_per_tick, times_fired)
. = ..()
adjust_charge(-ETHEREAL_DISCHARGE_RATE * seconds_per_tick)
handle_charge(owner, seconds_per_tick, times_fired)
-/obj/item/organ/internal/stomach/ethereal/on_mob_insert(mob/living/carbon/stomach_owner)
+/obj/item/organ/stomach/ethereal/on_mob_insert(mob/living/carbon/stomach_owner)
. = ..()
RegisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge))
RegisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute))
-/obj/item/organ/internal/stomach/ethereal/on_mob_remove(mob/living/carbon/stomach_owner)
+/obj/item/organ/stomach/ethereal/on_mob_remove(mob/living/carbon/stomach_owner)
. = ..()
UnregisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)
UnregisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT)
@@ -34,15 +34,15 @@
stomach_owner.clear_alert(ALERT_ETHEREAL_CHARGE)
stomach_owner.clear_alert(ALERT_ETHEREAL_OVERCHARGE)
-/obj/item/organ/internal/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human)
+/obj/item/organ/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human)
human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - cell.charge() / 100)))
-/obj/item/organ/internal/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick)
+/obj/item/organ/stomach/ethereal/proc/charge(datum/source, datum/callback/charge_cell, seconds_per_tick)
SIGNAL_HANDLER
charge_cell.Invoke(cell, seconds_per_tick / 3.5) // Ethereals don't have NT designed charging ports, so they charge slower.
-/obj/item/organ/internal/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, flags = NONE)
+/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, shock_source, siemens_coeff = 1, flags = NONE)
SIGNAL_HANDLER
if(flags & SHOCK_ILLUSION)
return
@@ -54,11 +54,11 @@
* - amount: The change of the energy, in joules.
* Returns: The amount of energy that actually got changed in joules.
**/
-/obj/item/organ/internal/stomach/ethereal/proc/adjust_charge(amount)
+/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount)
var/amount_changed = clamp(amount, ETHEREAL_CHARGE_NONE - cell.charge(), ETHEREAL_CHARGE_DANGEROUS - cell.charge())
return cell.change(amount_changed)
-/obj/item/organ/internal/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired)
+/obj/item/organ/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired)
switch(cell.charge())
if(-INFINITY to ETHEREAL_CHARGE_NONE)
carbon.add_mood_event("charge", /datum/mood_event/decharged)
@@ -90,7 +90,7 @@
carbon.clear_alert(ALERT_ETHEREAL_CHARGE)
carbon.clear_alert(ALERT_ETHEREAL_OVERCHARGE)
-/obj/item/organ/internal/stomach/ethereal/proc/discharge_process(mob/living/carbon/carbon)
+/obj/item/organ/stomach/ethereal/proc/discharge_process(mob/living/carbon/carbon)
to_chat(carbon, span_warning("You begin to lose control over your charge!"))
carbon.visible_message(span_danger("[carbon] begins to spark violently!"))
diff --git a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm
index a1f5ce6c70ea8..c4fa888f6cb6d 100644
--- a/code/modules/surgery/organs/internal/stomach/stomach_golem.dm
+++ b/code/modules/surgery/organs/internal/stomach/stomach_golem.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/stomach/golem
+/obj/item/organ/stomach/golem
name = "silicate grinder"
icon_state = "stomach-p"
desc = "A rocklike organ which grinds and processes nutrition from minerals."
@@ -11,18 +11,18 @@
/// How slow are you if you have absolutely nothing in the tank?
var/max_hunger_slowdown = 4
-/obj/item/organ/internal/stomach/golem/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/stomach/golem/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
RegisterSignal(owner, COMSIG_CARBON_ATTEMPT_EAT, PROC_REF(try_eating))
-/obj/item/organ/internal/stomach/golem/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/stomach/golem/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_CARBON_ATTEMPT_EAT)
organ_owner.remove_movespeed_modifier(/datum/movespeed_modifier/golem_hunger)
organ_owner.remove_status_effect(/datum/status_effect/golem_statued)
/// Reject food, rocks only
-/obj/item/organ/internal/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating)
+/obj/item/organ/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating)
SIGNAL_HANDLER
if(istype(eating, /obj/item/food/golem_food))
return
@@ -30,7 +30,7 @@
return COMSIG_CARBON_BLOCK_EAT
/// Golem stomach cannot process nutriment except from minerals
-/obj/item/organ/internal/stomach/golem/on_life(delta_time, times_fired)
+/obj/item/organ/stomach/golem/on_life(delta_time, times_fired)
for(var/datum/reagent/consumable/food in reagents.reagent_list)
if (istype(food, /datum/reagent/consumable/nutriment/mineral))
continue
@@ -38,7 +38,7 @@
return ..()
/// Slow down based on how full you are
-/obj/item/organ/internal/stomach/golem/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired)
+/obj/item/organ/stomach/golem/handle_hunger(mob/living/carbon/human/human, delta_time, times_fired)
// the effects are all negative, so just don't run them if you have the trait
. = ..()
if(HAS_TRAIT(human, TRAIT_NOHUNGER))
diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm
index 9486389aa516a..b94d434a18601 100644
--- a/code/modules/surgery/organs/internal/tongue/_tongue.dm
+++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/tongue
+/obj/item/organ/tongue
name = "tongue"
desc = "A fleshy muscle mostly used for lying."
icon_state = "tongue"
@@ -14,7 +14,7 @@
* Relates to a mob's ability to speak a language - a mob must be able to speak the language
* and have a tongue able to speak the language (or omnitongue) in order to actually speak said language
*
- * To modify this list for subtypes, see [/obj/item/organ/internal/tongue/proc/get_possible_languages]. Do not modify directly.
+ * To modify this list for subtypes, see [/obj/item/organ/tongue/proc/get_possible_languages]. Do not modify directly.
*/
VAR_PRIVATE/list/languages_possible
/**
@@ -44,7 +44,7 @@
/// Whether this tongue modifies speech via signal
var/modifies_speech = FALSE
-/obj/item/organ/internal/tongue/Initialize(mapload)
+/obj/item/organ/tongue/Initialize(mapload)
. = ..()
// Setup the possible languages list
// - get_possible_languages gives us a list of language paths
@@ -52,7 +52,7 @@
// this results in tongues with identical possible languages sharing a cached list instance
languages_possible = string_list(get_possible_languages())
-/obj/item/organ/internal/tongue/examine(mob/user)
+/obj/item/organ/tongue/examine(mob/user)
. = ..()
if(HAS_MIND_TRAIT(user, TRAIT_ENTRAILS_READER)|| isobserver(user))
if(liked_foodtypes)
@@ -71,7 +71,7 @@
* While a user may be theoretically capable of speaking a language, they cannot physically speak it
* UNLESS they have a tongue with that language possible, UNLESS UNLESS they have omnitongue enabled.
*/
-/obj/item/organ/internal/tongue/proc/get_possible_languages()
+/obj/item/organ/tongue/proc/get_possible_languages()
RETURN_TYPE(/list)
// This is the default list of languages most humans should be capable of speaking
return list(
@@ -91,20 +91,20 @@
/datum/language/nekomimetic,
)
-/obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
if(should_modify_speech(source, speech_args))
modify_speech(source, speech_args)
-/obj/item/organ/internal/tongue/proc/should_modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/proc/should_modify_speech(datum/source, list/speech_args)
if(speech_args[SPEECH_LANGUAGE] in languages_native) // Speaking a native language?
return FALSE // Don't modify speech
if(HAS_TRAIT(source, TRAIT_SIGN_LANG)) // No modifiers for signers - I hate this but I simply cannot get these to combine into one statement
return FALSE // Don't modify speech
return TRUE
-/obj/item/organ/internal/tongue/proc/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/proc/modify_speech(datum/source, list/speech_args)
return speech_args[SPEECH_MESSAGE]
/**
@@ -114,7 +114,7 @@
* Can be overriden by subtypes for more complex behavior.
* Does not get called if the owner has ageusia.
**/
-/obj/item/organ/internal/tongue/proc/get_food_taste_reaction(obj/item/food, foodtypes = NONE)
+/obj/item/organ/tongue/proc/get_food_taste_reaction(obj/item/food, foodtypes = NONE)
var/food_taste_reaction
if(foodtypes & toxic_foodtypes)
food_taste_reaction = FOOD_TOXIC
@@ -124,7 +124,7 @@
food_taste_reaction = FOOD_LIKED
return food_taste_reaction
-/obj/item/organ/internal/tongue/mob_insert(mob/living/carbon/receiver, special, movement_flags)
+/obj/item/organ/tongue/mob_insert(mob/living/carbon/receiver, special, movement_flags)
. = ..()
if(modifies_speech)
@@ -138,7 +138,7 @@
REMOVE_TRAIT(receiver, TRAIT_AGEUSIA, NO_TONGUE_TRAIT)
apply_tongue_effects()
-/obj/item/organ/internal/tongue/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+/obj/item/organ/tongue/mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
temp_say_mod = ""
@@ -149,14 +149,14 @@
ADD_TRAIT(organ_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT)
organ_owner.voice_filter = initial(organ_owner.voice_filter)
-/obj/item/organ/internal/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag)
+/obj/item/organ/tongue/apply_organ_damage(damage_amount, maximum = maxHealth, required_organ_flag)
. = ..()
if(!owner)
return FALSE
apply_tongue_effects()
/// Applies effects to our owner based on how damaged our tongue is
-/obj/item/organ/internal/tongue/proc/apply_tongue_effects()
+/obj/item/organ/tongue/proc/apply_tongue_effects()
if(sense_of_taste)
//tongues can't taste food when they are failing
if(organ_flags & ORGAN_FAILING)
@@ -171,13 +171,13 @@
else
ADD_TRAIT(owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE)
-/obj/item/organ/internal/tongue/could_speak_language(datum/language/language_path)
+/obj/item/organ/tongue/could_speak_language(datum/language/language_path)
return (language_path in languages_possible)
-/obj/item/organ/internal/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob)
+/obj/item/organ/tongue/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutanttongue
-/obj/item/organ/internal/tongue/lizard
+/obj/item/organ/tongue/lizard
name = "forked tongue"
desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose."
icon_state = "tonguelizard"
@@ -197,11 +197,11 @@
new /regex(@"\bX([\-|r|R]|\b)", "g") = "ECKS$1",
)
-/obj/item/organ/internal/tongue/lizard/New(class, timer, datum/mutation/human/copymut)
+/obj/item/organ/tongue/lizard/New(class, timer, datum/mutation/human/copymut)
. = ..()
AddComponent(/datum/component/speechmod, replacements = speech_replacements, should_modify_speech = CALLBACK(src, PROC_REF(should_modify_speech)))
-/obj/item/organ/internal/tongue/lizard/silver
+/obj/item/organ/tongue/lizard/silver
name = "silver tongue"
desc = "A genetic branch of the high society Silver Scales that gives them their silverizing properties. To them, it is everything, and society traitors have their tongue forcibly revoked. Oddly enough, it itself is just blue."
icon_state = "silvertongue"
@@ -221,7 +221,7 @@
/datum/action/cooldown/turn_to_statue/New(Target)
. = ..()
- if(!istype(Target, /obj/item/organ/internal/tongue/lizard/silver))
+ if(!istype(Target, /obj/item/organ/tongue/lizard/silver))
stack_trace("Non-silverscale tongue initialized a turn to statue action.")
qdel(src)
return
@@ -239,7 +239,7 @@
if(!isliving(owner))
return FALSE
- var/obj/item/organ/internal/tongue/lizard/silver/tongue_target = target
+ var/obj/item/organ/tongue/lizard/silver/tongue_target = target
if(tongue_target.owner != owner)
return FALSE
@@ -350,7 +350,7 @@
bomb = 50
fire = 100
-/obj/item/organ/internal/tongue/abductor
+/obj/item/organ/tongue/abductor
name = "superlingual matrix"
desc = "A mysterious structure that allows for instant communication between users. Pretty impressive until you need to eat something."
icon_state = "tongueayylmao"
@@ -359,11 +359,11 @@
modifies_speech = TRUE
var/mothership
-/obj/item/organ/internal/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder)
+/obj/item/organ/tongue/abductor/attack_self(mob/living/carbon/human/tongue_holder)
if(!istype(tongue_holder))
return
- var/obj/item/organ/internal/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/abductor/tongue = tongue_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!istype(tongue))
return
@@ -375,7 +375,7 @@
to_chat(tongue_holder, span_notice("You attune [src] to your own channel."))
mothership = tongue.mothership
-/obj/item/organ/internal/tongue/abductor/examine(mob/examining_mob)
+/obj/item/organ/tongue/abductor/examine(mob/examining_mob)
. = ..()
if(HAS_MIND_TRAIT(examining_mob, TRAIT_ABDUCTOR_TRAINING) || isobserver(examining_mob))
. += span_notice("It can be attuned to a different channel by using it inhand.")
@@ -384,14 +384,14 @@
else
. += span_notice("It is attuned to [mothership].")
-/obj/item/organ/internal/tongue/abductor/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/abductor/modify_speech(datum/source, list/speech_args)
//Hacks
var/message = speech_args[SPEECH_MESSAGE]
var/mob/living/carbon/human/user = source
var/rendered = span_abductor("[user.real_name]: [message]")
user.log_talk(message, LOG_SAY, tag=SPECIES_ABDUCTOR)
for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list)
- var/obj/item/organ/internal/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/abductor/tongue = living_mob.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!istype(tongue))
continue
if(mothership == tongue.mothership)
@@ -403,7 +403,7 @@
speech_args[SPEECH_MESSAGE] = ""
-/obj/item/organ/internal/tongue/zombie
+/obj/item/organ/tongue/zombie
name = "rotting tongue"
desc = "Between the decay and the fact that it's just lying there you doubt a tongue has ever seemed less sexy."
icon_state = "tonguezombie"
@@ -416,14 +416,14 @@
// List of english words that translate to zombie phrases
GLOBAL_LIST_INIT(english_to_zombie, list())
-/obj/item/organ/internal/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word)
+/obj/item/organ/tongue/zombie/proc/add_word_to_translations(english_word, zombie_word)
GLOB.english_to_zombie[english_word] = zombie_word
// zombies don't care about grammar (any tense or form is all translated to the same word)
GLOB.english_to_zombie[english_word + plural_s(english_word)] = zombie_word
GLOB.english_to_zombie[english_word + "ing"] = zombie_word
GLOB.english_to_zombie[english_word + "ed"] = zombie_word
-/obj/item/organ/internal/tongue/zombie/proc/load_zombie_translations()
+/obj/item/organ/tongue/zombie/proc/load_zombie_translations()
var/list/zombie_translation = strings("zombie_replacement.json", "zombie")
for(var/zombie_word in zombie_translation)
// since zombie words are a reverse list, we gotta do this backwards
@@ -432,7 +432,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
add_word_to_translations(english_word, zombie_word)
GLOB.english_to_zombie = sort_list(GLOB.english_to_zombie) // Alphabetizes the list (for debugging)
-/obj/item/organ/internal/tongue/zombie/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/zombie/modify_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(message[1] != "*")
// setup the global list for translation if it hasn't already been done
@@ -470,7 +470,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
message = capitalize(message)
speech_args[SPEECH_MESSAGE] = message
-/obj/item/organ/internal/tongue/alien
+/obj/item/organ/tongue/alien
name = "alien tongue"
desc = "According to leading xenobiologists the evolutionary benefit of having a second mouth in your mouth is \"that it looks badass\"."
icon_state = "tonguexeno"
@@ -479,7 +479,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
modifies_speech = TRUE // not really, they just hiss
voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.8,aresample=%SAMPLE_RATE%,atempo=1/0.8,aformat=channel_layouts=mono [p0]; [out2] asetrate=%SAMPLE_RATE%*1.2,aresample=%SAMPLE_RATE%,atempo=1/1.2,aformat=channel_layouts=mono[p2]; [p0][0][p2] amix=inputs=3"}
// Aliens can only speak alien and a few other languages.
-/obj/item/organ/internal/tongue/alien/get_possible_languages()
+/obj/item/organ/tongue/alien/get_possible_languages()
return list(
/datum/language/xenocommon,
/datum/language/common,
@@ -488,14 +488,14 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
/datum/language/monkey,
)
-/obj/item/organ/internal/tongue/alien/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/alien/modify_speech(datum/source, list/speech_args)
var/datum/saymode/xeno/hivemind = speech_args[SPEECH_SAYMODE]
if(hivemind)
return
playsound(owner, SFX_HISS, 25, TRUE, TRUE)
-/obj/item/organ/internal/tongue/bone
+/obj/item/organ/tongue/bone
name = "bone \"tongue\""
desc = "Apparently skeletons alter the sounds they produce through oscillation of their teeth, hence their characteristic rattling."
icon_state = "tonguebone"
@@ -510,15 +510,15 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
var/phomeme_type = "sans"
var/list/phomeme_types = list("sans", "papyrus")
-/obj/item/organ/internal/tongue/bone/Initialize(mapload)
+/obj/item/organ/tongue/bone/Initialize(mapload)
. = ..()
phomeme_type = pick(phomeme_types)
// Bone tongues can speak all default + calcic
-/obj/item/organ/internal/tongue/bone/get_possible_languages()
+/obj/item/organ/tongue/bone/get_possible_languages()
return ..() + /datum/language/calcic
-/obj/item/organ/internal/tongue/bone/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/bone/modify_speech(datum/source, list/speech_args)
if (chattering)
chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source)
switch(phomeme_type)
@@ -527,7 +527,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
if("papyrus")
speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS
-/obj/item/organ/internal/tongue/bone/plasmaman
+/obj/item/organ/tongue/bone/plasmaman
name = "plasma bone \"tongue\""
desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech."
icon_state = "tongueplasma"
@@ -535,7 +535,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
liked_foodtypes = VEGETABLES
disliked_foodtypes = FRUIT | CLOTH
-/obj/item/organ/internal/tongue/robot
+/obj/item/organ/tongue/robot
name = "robotic voicebox"
desc = "A voice synthesizer that can interface with organic lifeforms."
failing_desc = "seems to be broken."
@@ -549,20 +549,20 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
organ_traits = list(TRAIT_SILICON_EMOTES_ALLOWED)
voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000"
-/obj/item/organ/internal/tongue/robot/could_speak_language(datum/language/language_path)
+/obj/item/organ/tongue/robot/could_speak_language(datum/language/language_path)
return TRUE // THE MAGIC OF ELECTRONICS
-/obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/robot/modify_speech(datum/source, list/speech_args)
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
-/obj/item/organ/internal/tongue/snail
+/obj/item/organ/tongue/snail
name = "radula"
desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY."
color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue
modifies_speech = TRUE
voice_filter = "atempo=0.5" // makes them talk really slow
-/obj/item/organ/internal/tongue/snail/modify_speech(datum/source, list/speech_args)
+/obj/item/organ/tongue/snail/modify_speech(datum/source, list/speech_args)
var/new_message
var/message = speech_args[SPEECH_MESSAGE]
for(var/i in 1 to length(message))
@@ -572,7 +572,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
new_message += message[i]
speech_args[SPEECH_MESSAGE] = new_message
-/obj/item/organ/internal/tongue/ethereal
+/obj/item/organ/tongue/ethereal
name = "electric discharger"
desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge."
icon_state = "electrotongue"
@@ -586,10 +586,10 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.99,aresample=%SAMPLE_RATE%,volume=0.3 [p0]; [p0][out2] amix=inputs=2"}
// Ethereal tongues can speak all default + voltaic
-/obj/item/organ/internal/tongue/ethereal/get_possible_languages()
+/obj/item/organ/tongue/ethereal/get_possible_languages()
return ..() + /datum/language/voltaic
-/obj/item/organ/internal/tongue/cat
+/obj/item/organ/tongue/cat
name = "felinid tongue"
desc = "A fleshy muscle mostly used for meowing."
say_mod = "meows"
@@ -597,7 +597,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
disliked_foodtypes = GROSS | CLOTH | RAW
organ_traits = list(TRAIT_WOUND_LICKER, TRAIT_FISH_EATER)
-/obj/item/organ/internal/tongue/jelly
+/obj/item/organ/tongue/jelly
name = "jelly tongue"
desc = "Ah... That's not the sound I expected it to make. Sounds like a Space Autumn Bird."
say_mod = "chirps"
@@ -605,20 +605,20 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
disliked_foodtypes = GROSS
toxic_foodtypes = NONE
-/obj/item/organ/internal/tongue/jelly/get_food_taste_reaction(obj/item/food, foodtypes = NONE)
+/obj/item/organ/tongue/jelly/get_food_taste_reaction(obj/item/food, foodtypes = NONE)
// a silver slime created this? what a delicacy!
if(HAS_TRAIT(food, TRAIT_FOOD_SILVER))
return FOOD_LIKED
return ..()
-/obj/item/organ/internal/tongue/monkey
+/obj/item/organ/tongue/monkey
name = "primitive tongue"
desc = "For aggressively chimpering. And consuming bananas."
say_mod = "chimpers"
liked_foodtypes = MEAT | FRUIT | BUGS
disliked_foodtypes = CLOTH
-/obj/item/organ/internal/tongue/moth
+/obj/item/organ/tongue/moth
name = "moth tongue"
desc = "Moths don't have tongues. Someone get god on the phone, tell them I'm not happy."
say_mod = "flutters"
@@ -626,26 +626,26 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
disliked_foodtypes = FRUIT | GROSS | BUGS | GORE
toxic_foodtypes = MEAT | RAW | SEAFOOD
-/obj/item/organ/internal/tongue/zombie
+/obj/item/organ/tongue/zombie
name = "rotting tongue"
desc = "Makes you speak like you're at the dentist and you just absolutely refuse to spit because you forgot to mention you were allergic to space shellfish."
say_mod = "moans"
-/obj/item/organ/internal/tongue/mush
+/obj/item/organ/tongue/mush
name = "mush-tongue-room"
desc = "You poof with this. Got it?"
icon = 'icons/obj/service/hydroponics/seeds.dmi'
icon_state = "mycelium-angel"
say_mod = "poofs"
-/obj/item/organ/internal/tongue/pod
+/obj/item/organ/tongue/pod
name = "pod tongue"
desc = "A plant-like organ used for speaking and eating."
say_mod = "whistles"
liked_foodtypes = VEGETABLES | FRUIT | GRAIN
disliked_foodtypes = GORE | MEAT | DAIRY | SEAFOOD | BUGS
-/obj/item/organ/internal/tongue/golem
+/obj/item/organ/tongue/golem
name = "golem tongue"
desc = "This silicate plate doesn't seem particularly mobile, but golems use it to form sounds."
color = COLOR_WEBSAFE_DARK_GRAY
diff --git a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm
index f6fed86a90d60..8dfee79693736 100644
--- a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm
+++ b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel
+/obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel
name = "vocal cords"
icon_state = "appendix"
zone = BODY_ZONE_PRECISE_MOUTH
@@ -8,17 +8,17 @@
healing_factor = 0
var/list/spans = null
-/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
+/obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
return TRUE
-/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does
+/obj/item/organ/vocal_cords/proc/speak_with(message) //do what the organ does
return
-/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //actually say the message
+/obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message
owner.say(message, spans = spans, sanitize = FALSE)
//Colossus drop, forces the listeners to obey certain commands
-/obj/item/organ/internal/vocal_cords/colossus
+/obj/item/organ/vocal_cords/colossus
name = "divine vocal cords"
desc = "They carry the voice of an ancient god."
icon_state = "voice_of_god"
@@ -30,7 +30,7 @@
/datum/action/item_action/organ_action/colossus
name = "Voice of God"
- var/obj/item/organ/internal/vocal_cords/colossus/cords = null
+ var/obj/item/organ/vocal_cords/colossus/cords = null
/datum/action/item_action/organ_action/colossus/New()
..()
@@ -67,7 +67,7 @@
return
owner.say(".x[command]")
-/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
+/obj/item/organ/vocal_cords/colossus/can_speak_with()
if(!owner)
return FALSE
@@ -77,22 +77,22 @@
return owner.can_speak()
-/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message)
+/obj/item/organ/vocal_cords/colossus/handle_speech(message)
playsound(get_turf(owner), 'sound/effects/magic/clockwork/invoke_general.ogg', 300, TRUE, 5)
return //voice of god speaks for us
-/obj/item/organ/internal/vocal_cords/colossus/speak_with(message)
+/obj/item/organ/vocal_cords/colossus/speak_with(message)
var/cooldown = voice_of_god(uppertext(message), owner, spans, base_multiplier)
next_command = world.time + (cooldown * cooldown_mod)
-/obj/item/organ/internal/adamantine_resonator
+/obj/item/organ/adamantine_resonator
name = "adamantine resonator"
desc = "Fragments of adamantine exist in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders."
zone = BODY_ZONE_HEAD
slot = ORGAN_SLOT_ADAMANTINE_RESONATOR
icon_state = "adamantine_resonator"
-/obj/item/organ/internal/vocal_cords/adamantine
+/obj/item/organ/vocal_cords/adamantine
name = "adamantine vocal cords"
desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Golems containing these formations use this to broadcast messages to nearby golems."
actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords)
@@ -108,7 +108,7 @@
return
owner.say(".x[message]")
-/obj/item/organ/internal/vocal_cords/adamantine/handle_speech(message)
+/obj/item/organ/vocal_cords/adamantine/handle_speech(message)
var/msg = span_resonate("[span_name("[owner.real_name]")] resonates, \"[message]\"")
for(var/player in GLOB.player_list)
if(iscarbon(player))
diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm
index 76689032fb6a4..65c8116769d0f 100644
--- a/code/modules/surgery/revival.dm
+++ b/code/modules/surgery/revival.dm
@@ -147,7 +147,7 @@
surgery_flags = parent_type::surgery_flags | SURGERY_REQUIRE_LIMB
/datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient)
- var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN)
return !isnull(target_brain)
/datum/surgery_step/revive/carbon
diff --git a/code/modules/surgery/sleeper_protocol.dm b/code/modules/surgery/sleeper_protocol.dm
index 23b02aeda801d..fd697240eed1e 100644
--- a/code/modules/surgery/sleeper_protocol.dm
+++ b/code/modules/surgery/sleeper_protocol.dm
@@ -37,7 +37,7 @@
. = ..()
if(!.)
return FALSE
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!target_brain)
return FALSE
return TRUE
diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm
index 4880f9329646f..47f25074c3acd 100644
--- a/code/modules/surgery/stomachpump.dm
+++ b/code/modules/surgery/stomachpump.dm
@@ -23,7 +23,7 @@
)
/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/target_stomach = target.get_organ_slot(ORGAN_SLOT_STOMACH)
if(HAS_TRAIT(target, TRAIT_HUSK))
return FALSE
if(!target_stomach)
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index fc6480e923908..753979c3feb73 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -536,7 +536,7 @@
return
var/candidate_name
- var/obj/item/organ/external/tail_snip_candidate
+ var/obj/item/organ/tail_snip_candidate
var/obj/item/bodypart/limb_snip_candidate
if(user.zone_selected == BODY_ZONE_PRECISE_GROIN)
diff --git a/code/modules/unit_tests/blindness.dm b/code/modules/unit_tests/blindness.dm
index 88f5eece5758b..1d1093b7581a7 100644
--- a/code/modules/unit_tests/blindness.dm
+++ b/code/modules/unit_tests/blindness.dm
@@ -105,7 +105,7 @@
/datum/unit_test/eye_damage/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
- var/obj/item/organ/internal/eyes/eyes = dummy.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/eyes/eyes = dummy.get_organ_slot(ORGAN_SLOT_EYES)
TEST_ASSERT_NOTNULL(eyes, "Eye damage unit test spawned a dummy without eyes!")
// Test blindness due to eye damage
diff --git a/code/modules/unit_tests/closets.dm b/code/modules/unit_tests/closets.dm
index e1afb47f55397..0427f355ff4e7 100644
--- a/code/modules/unit_tests/closets.dm
+++ b/code/modules/unit_tests/closets.dm
@@ -6,6 +6,8 @@
var/list/all_closets = subtypesof(/obj/structure/closet)
//Supply pods. They are sent, crashed, opened and never closed again. They also cause exceptions in nullspace.
all_closets -= typesof(/obj/structure/closet/supplypod)
+ /// these bitches spawn specially crafted humans with gear and moving organs being shuffled around through the whole process
+ all_closets -= typesof(/obj/structure/closet/body_bag/lost_crew/with_body)
for(var/closet_type in all_closets)
var/obj/structure/closet/closet = allocate(closet_type)
diff --git a/code/modules/unit_tests/dismemberment.dm b/code/modules/unit_tests/dismemberment.dm
index d8ce43b960eda..06c8707af203d 100644
--- a/code/modules/unit_tests/dismemberment.dm
+++ b/code/modules/unit_tests/dismemberment.dm
@@ -14,7 +14,7 @@
// Abnormal situation: We're holding an undroppable item and get dismembered.
ADD_TRAIT(testing_item, TRAIT_NODROP, TRAIT_GENERIC)
- test_item(dummy, testing_item, status_text = "after applying TRAIT_NODROP to the testing item")
+ test_item(dummy, testing_item, status_text = " after applying TRAIT_NODROP to the testing item")
/datum/unit_test/dismemberment/proc/test_item(mob/living/carbon/human/dummy, obj/item/testing_item, status_text = "")
@@ -31,7 +31,7 @@
var/obj/item/held_item = dummy.get_item_for_held_index(dismembered_limb.held_index)
dismembered_limb.dismember()
- TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered [status_text].")
+ TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered[status_text].")
// Clean up after ourselves
qdel(dismembered_limb)
dummy.fully_heal(HEAL_ALL)
diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm
index 8ed2b999e7ffb..e21b3fec4c041 100644
--- a/code/modules/unit_tests/fish_unit_tests.dm
+++ b/code/modules/unit_tests/fish_unit_tests.dm
@@ -455,7 +455,7 @@
TEST_ASSERT_EQUAL(fish.status, FISH_DEAD, "The fish is not dead, despite having sustained enough damage that it should. health: [fish.health]")
- var/obj/item/organ/internal/stomach/belly = gourmet.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = gourmet.get_organ_slot(ORGAN_SLOT_STOMACH)
belly.reagents.clear_reagents()
fish.set_status(FISH_ALIVE)
diff --git a/code/modules/unit_tests/full_heal.dm b/code/modules/unit_tests/full_heal.dm
index f5d247d7a10e6..7449d2aeb4cc4 100644
--- a/code/modules/unit_tests/full_heal.dm
+++ b/code/modules/unit_tests/full_heal.dm
@@ -4,12 +4,12 @@
/datum/unit_test/full_heal_heals_organs/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
- for(var/obj/item/organ/internal/organ in dummy.organs)
+ for(var/obj/item/organ/organ in dummy.organs)
organ.apply_organ_damage(50)
dummy.fully_heal(HEAL_ORGANS)
- for(var/obj/item/organ/internal/organ in dummy.organs)
+ for(var/obj/item/organ/organ in dummy.organs)
if(organ.damage <= 0)
continue
TEST_FAIL("Organ [organ] did not get healed by fullyheal flag HEAL_ORGANS.")
@@ -22,7 +22,7 @@
var/list/we_started_with = list()
- for(var/obj/item/organ/internal/organ in dummy.organs)
+ for(var/obj/item/organ/organ in dummy.organs)
if(organ.organ_flags & ORGAN_VITAL) // leave this for now
continue
we_started_with += organ.type
diff --git a/code/modules/unit_tests/ling_decap.dm b/code/modules/unit_tests/ling_decap.dm
index 4c8c7e4e03124..d6c8d244a8d18 100644
--- a/code/modules/unit_tests/ling_decap.dm
+++ b/code/modules/unit_tests/ling_decap.dm
@@ -9,12 +9,12 @@
var/obj/item/bodypart/head/noggin = ling.get_bodypart(BODY_ZONE_HEAD)
noggin.dismember()
TEST_ASSERT_NULL(ling.get_bodypart(BODY_ZONE_HEAD), "Changeling failed to be decapitated.")
- var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin
+ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in noggin
TEST_ASSERT_NULL(brain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation, but it should have remained in their body.")
- var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin
+ var/obj/item/organ/brain/oldbrain = locate(/obj/item/organ/brain) in noggin
noggin.drop_organs()
- TEST_ASSERT_NULL(locate(/obj/item/organ/internal/brain) in noggin, "Changeling's head failed to drop its brain.")
+ TEST_ASSERT_NULL(locate(/obj/item/organ/brain) in noggin, "Changeling's head failed to drop its brain.")
TEST_ASSERT_NULL(oldbrain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation and organ dropping, but it should have remained in their body.")
TEST_ASSERT_EQUAL(ling.stat, CONSCIOUS, "Changeling was not conscious after losing their head.")
@@ -34,10 +34,10 @@
var/obj/item/bodypart/head/noggin = normal_guy.get_bodypart(BODY_ZONE_HEAD)
noggin.dismember()
- var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin
+ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in noggin
TEST_ASSERT_EQUAL(brain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after decapitation.")
- var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin
+ var/obj/item/organ/brain/oldbrain = locate(/obj/item/organ/brain) in noggin
noggin.drop_organs()
TEST_ASSERT_EQUAL(oldbrain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after being removed from their head.")
diff --git a/code/modules/unit_tests/liver.dm b/code/modules/unit_tests/liver.dm
index 80c3ecf35b9a2..f2f5dcfd00f7a 100644
--- a/code/modules/unit_tests/liver.dm
+++ b/code/modules/unit_tests/liver.dm
@@ -12,7 +12,7 @@
var/datum/reagent/toxin/bonehurtingjuice/bonehurting = /datum/reagent/toxin/bonehurtingjuice
var/datum/reagent/consumable/milk/calcium = /datum/reagent/consumable/milk
- TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone)), "Skeleton does not have a bone liver")
+ TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/liver/bone)), "Skeleton does not have a bone liver")
TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/toxin/bonehurtingjuice), FALSE, "Skeleton somehow has bone hurting juice before drinking")
TEST_ASSERT_EQUAL(mrbones.has_reagent(/datum/reagent/consumable/milk), FALSE, "Skeleton somehow has milk before drinking")
@@ -67,7 +67,7 @@
// Testing plasma/hot ice healing on wounds
- TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/internal/liver/bone/plasmaman)), "Plasmaman does not have a plasmaman bone liver")
+ TEST_ASSERT(!isnull(mrbones.get_organ_by_type(/obj/item/organ/liver/bone/plasmaman)), "Plasmaman does not have a plasmaman bone liver")
TEST_ASSERT_EQUAL(mrbones.has_reagent(plasma), FALSE, "Plasmaman somehow has plasma before drinking")
TEST_ASSERT_EQUAL(mrbones.has_reagent(hot_ice), FALSE, "Plasmaman somehow has hot ice before drinking")
diff --git a/code/modules/unit_tests/lungs.dm b/code/modules/unit_tests/lungs.dm
index 4f9b7ceb44296..c8338b6dec889 100644
--- a/code/modules/unit_tests/lungs.dm
+++ b/code/modules/unit_tests/lungs.dm
@@ -13,27 +13,27 @@
// 2500 Litres of O2/N2 gas mix, ideal for life.
var/datum/gas_mixture/test_mix = create_standard_mix()
var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent)
- var/obj/item/organ/internal/lungs/test_lungs = allocate(/obj/item/organ/internal/lungs)
+ var/obj/item/organ/lungs/test_lungs = allocate(/obj/item/organ/lungs)
// Test one breath of O2/N2 mix.
lungs_test_check_breath("standard gas mixture", lab_rat, test_lungs, test_mix)
// Suffocation with an empty gas mix.
var/datum/gas_mixture/empty_test_mix = allocate(/datum/gas_mixture)
lab_rat = allocate(/mob/living/carbon/human/consistent)
- test_lungs = allocate(/obj/item/organ/internal/lungs)
+ test_lungs = allocate(/obj/item/organ/lungs)
// Test one breath of nothing. Suffocate due to the breath being empty.
lungs_test_check_breath("empty gas mixture", lab_rat, test_lungs, empty_test_mix, expect_failure = TRUE)
// Suffocation with null. This does indeed happen normally.
lab_rat = allocate(/mob/living/carbon/human/consistent)
- test_lungs = allocate(/obj/item/organ/internal/lungs)
+ test_lungs = allocate(/obj/item/organ/lungs)
// Test one breath of nothing. Suffocate due to the breath being null.
lungs_test_check_breath("null", lab_rat, test_lungs, null, expect_failure = TRUE)
// Suffocation with Nitrogen.
var/datum/gas_mixture/nitro_test_mix = create_nitrogen_mix()
lab_rat = allocate(/mob/living/carbon/human/consistent)
- test_lungs = allocate(/obj/item/organ/internal/lungs)
+ test_lungs = allocate(/obj/item/organ/lungs)
// Test one breath of Nitrogen. Suffocate due to the breath being 100% N2.
lungs_test_check_breath("pure Nitrogen", lab_rat, test_lungs, nitro_test_mix, expect_failure = TRUE)
@@ -44,14 +44,14 @@
// 2500 Litres of pure Plasma.
var/datum/gas_mixture/plasma_test_mix = create_plasma_mix()
var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent)
- var/obj/item/organ/internal/lungs/plasmaman/test_lungs = allocate(/obj/item/organ/internal/lungs/plasmaman)
+ var/obj/item/organ/lungs/plasmaman/test_lungs = allocate(/obj/item/organ/lungs/plasmaman)
// Test one breath of Plasma on Plasmaman lungs.
lungs_test_check_breath("pure Plasma", lab_rat, test_lungs, plasma_test_mix)
// Tests suffocation with Nitrogen.
var/datum/gas_mixture/nitro_test_mix = create_nitrogen_mix()
lab_rat = allocate(/mob/living/carbon/human/consistent)
- test_lungs = allocate(/obj/item/organ/internal/lungs/plasmaman)
+ test_lungs = allocate(/obj/item/organ/lungs/plasmaman)
// Test one breath of Nitrogen on Plasmaman lungs.
lungs_test_check_breath("pure Nitrogen", lab_rat, test_lungs, nitro_test_mix, expect_failure = TRUE)
@@ -62,15 +62,15 @@
/datum/unit_test/lungs/lungs_sanity_ashwalker/Run()
// Gas mix resembling one cell of lavaland's atmosphere.
var/datum/gas_mixture/lavaland_test_mix = create_lavaland_mix()
- var/obj/item/organ/internal/lungs/lavaland/test_lungs = allocate(/obj/item/organ/internal/lungs/lavaland)
+ var/obj/item/organ/lungs/lavaland/test_lungs = allocate(/obj/item/organ/lungs/lavaland)
var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent)
// Test one breath of Lavaland gas mix on Ashwalker lungs.
lungs_test_check_breath("Lavaland air mixture", lab_rat, test_lungs, lavaland_test_mix)
-/// Comprehensive unit test for [/obj/item/organ/internal/lungs/proc/check_breath()]
+/// Comprehensive unit test for [/obj/item/organ/lungs/proc/check_breath()]
/// If "expect_failure" is set to TRUE, the test ensures the given Human suffocated.
/// A "test_name" string is required to contextualize test logs. Describe the gas you're testing.
-/datum/unit_test/lungs/proc/lungs_test_check_breath(test_name, mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, datum/gas_mixture/test_mix, expect_failure = FALSE)
+/datum/unit_test/lungs/proc/lungs_test_check_breath(test_name, mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, datum/gas_mixture/test_mix, expect_failure = FALSE)
// Setup a small volume of gas which represents one "breath" from test_mix.
var/datum/gas_mixture/test_breath
@@ -155,14 +155,14 @@
TEST_ASSERT(molar_cmp_equals(GET_MOLES(test_breath, /datum/gas/carbon_dioxide), expected_co2), TEST_CHECK_BREATH_MESSAGE(test_lungs, "should convert Plasma into an equivalent volume of CO2."))
/// Tests minimum gas alerts by comparing gas pressure.
-/datum/unit_test/lungs/proc/lungs_test_alert_min(mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, alert_name, min_pressure, pressure)
+/datum/unit_test/lungs/proc/lungs_test_alert_min(mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, alert_name, min_pressure, pressure)
var/alert_thrown = lab_rat.has_alert(alert_name)
var/pressure_safe = (pressure >= min_pressure) || (min_pressure == 0)
TEST_ASSERT(!pressure_safe && alert_thrown || pressure_safe, TEST_ALERT_THROW_MESSAGE(test_lungs, alert_name))
TEST_ASSERT(pressure_safe && !alert_thrown || !pressure_safe, TEST_ALERT_INHIBIT_MESSAGE(test_lungs, alert_name))
/// Tests maximum gas alerts by comparing gas pressure.
-/datum/unit_test/lungs/proc/lungs_test_alert_max(mob/living/carbon/human/lab_rat, obj/item/organ/internal/lungs/test_lungs, alert_name, max_pressure, pressure)
+/datum/unit_test/lungs/proc/lungs_test_alert_max(mob/living/carbon/human/lab_rat, obj/item/organ/lungs/test_lungs, alert_name, max_pressure, pressure)
var/alert_thrown = lab_rat.has_alert(alert_name)
var/pressure_safe = (pressure <= max_pressure) || (max_pressure == 0)
TEST_ASSERT(!pressure_safe && alert_thrown || pressure_safe, TEST_ALERT_THROW_MESSAGE(test_lungs, alert_name))
diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm
index 53250def309f7..53bd3277dc485 100644
--- a/code/modules/unit_tests/metabolizing.dm
+++ b/code/modules/unit_tests/metabolizing.dm
@@ -80,7 +80,7 @@
pill.attack(pill_user, pill_user)
// Set the metabolism efficiency to 1.0 so it transfers all reagents to the body in one go.
- var/obj/item/organ/internal/stomach/pill_belly = pill_user.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/pill_belly = pill_user.get_organ_slot(ORGAN_SLOT_STOMACH)
pill_belly.metabolism_efficiency = 1
pill_user.Life()
diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm
index 1da3808ba3908..8f05a28405898 100644
--- a/code/modules/unit_tests/organs.dm
+++ b/code/modules/unit_tests/organs.dm
@@ -8,20 +8,20 @@
// List of organ typepaths which cause species change.
// Species change swaps out all the organs, making test_organ un-usable after insertion.
var/static/list/species_changing_organs = typecacheof(list(
- /obj/item/organ/internal/brain/shadow/nightmare,
+ /obj/item/organ/brain/shadow/nightmare,
))
// List of organ typepaths which are not test-able, such as certain class prototypes.
var/static/list/test_organ_blacklist = typecacheof(list(
- /obj/item/organ/internal,
- /obj/item/organ/external,
- /obj/item/organ/external/wings,
- /obj/item/organ/internal/cyberimp,
- /obj/item/organ/internal/cyberimp/brain,
- /obj/item/organ/internal/cyberimp/mouth,
- /obj/item/organ/internal/cyberimp/arm,
- /obj/item/organ/internal/cyberimp/chest,
- /obj/item/organ/internal/cyberimp/eyes,
- /obj/item/organ/internal/alien,
+ /obj/item/organ,
+ /obj/item/organ,
+ /obj/item/organ/wings,
+ /obj/item/organ/cyberimp,
+ /obj/item/organ/cyberimp/brain,
+ /obj/item/organ/cyberimp/mouth,
+ /obj/item/organ/cyberimp/arm,
+ /obj/item/organ/cyberimp/chest,
+ /obj/item/organ/cyberimp/eyes,
+ /obj/item/organ/alien,
))
/datum/unit_test/organ_sanity/Run()
@@ -85,10 +85,10 @@
/datum/unit_test/organ_damage/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
- for(var/obj/item/organ/internal/organ_to_test in dummy.organs)
+ for(var/obj/item/organ/organ_to_test in dummy.organs)
test_organ(dummy, organ_to_test)
-/datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/internal/test_organ)
+/datum/unit_test/organ_damage/proc/test_organ(mob/living/carbon/human/dummy, obj/item/organ/test_organ)
var/slot_to_use = test_organ.slot
// Tests [mob/living/proc/adjustOrganLoss]
diff --git a/code/modules/unit_tests/reagent_mob_expose.dm b/code/modules/unit_tests/reagent_mob_expose.dm
index 844b863c0374b..d6ed81292a97d 100644
--- a/code/modules/unit_tests/reagent_mob_expose.dm
+++ b/code/modules/unit_tests/reagent_mob_expose.dm
@@ -58,6 +58,13 @@
syringe.melee_attack_chain(human, human)
TEST_ASSERT_EQUAL(human.health, 80, "Human health did not update after injection from syringe")
+ // INHALE
+ TEST_ASSERT_NULL(human.has_status_effect(/datum/status_effect/hallucination), "Human is drowsy at the start of testing")
+ drink.reagents.clear_reagents()
+ drink.reagents.add_reagent(/datum/reagent/nitrous_oxide, 10)
+ drink.reagents.trans_to(human, 10, methods = INHALE)
+ TEST_ASSERT_NOTNULL(human.has_status_effect(/datum/status_effect/hallucination), "Human is not drowsy after exposure to vapors")
+
/datum/unit_test/reagent_mob_expose/Destroy()
SSmobs.ignite()
return ..()
diff --git a/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm b/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm
index 1e2c10c2f2952..85c557b18108a 100644
--- a/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm
+++ b/code/modules/unit_tests/screenshot_high_luminosity_eyes.dm
@@ -4,7 +4,7 @@
/// Tests to make sure no punks have broken high luminosity eyes
/datum/unit_test/screenshot_high_luminosity_eyes
var/mob/living/carbon/human/test_subject
- var/obj/item/organ/internal/eyes/robotic/glow/test_eyes
+ var/obj/item/organ/eyes/robotic/glow/test_eyes
/datum/unit_test/screenshot_high_luminosity_eyes/Run()
// Create a mob with red and blue eyes. This is to test that high luminosity eyes properly default to the old eye color.
@@ -14,7 +14,7 @@
test_subject.eye_color_right = COLOR_BLUE
// Create our eyes, and insert them into the mob
- test_eyes = allocate(/obj/item/organ/internal/eyes/robotic/glow)
+ test_eyes = allocate(/obj/item/organ/eyes/robotic/glow)
test_eyes.Insert(test_subject)
// This should be 4, but just in case it ever changes in the future
diff --git a/code/modules/unit_tests/species_change_organs.dm b/code/modules/unit_tests/species_change_organs.dm
index 41d55047f0346..96ade09bf626f 100644
--- a/code/modules/unit_tests/species_change_organs.dm
+++ b/code/modules/unit_tests/species_change_organs.dm
@@ -11,10 +11,10 @@
// Give a trauma
dummy.gain_trauma(/datum/brain_trauma/severe/blindness)
// Give a cyber heart
- var/obj/item/organ/internal/heart/cybernetic/cyber_heart = allocate(/obj/item/organ/internal/heart/cybernetic)
+ var/obj/item/organ/heart/cybernetic/cyber_heart = allocate(/obj/item/organ/heart/cybernetic)
cyber_heart.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED)
// Give one of their organs a bit of damage
- var/obj/item/organ/internal/appendix/existing_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX)
+ var/obj/item/organ/appendix/existing_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX)
existing_appendix.set_organ_damage(25)
// Changing species should
@@ -36,7 +36,7 @@
// Grab the lizard's appendix for comparison later
// They should've been given a new one, but our damage should also have transferred over
- var/obj/item/organ/internal/appendix/lizard_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX)
+ var/obj/item/organ/appendix/lizard_appendix = dummy.get_organ_slot(ORGAN_SLOT_APPENDIX)
// They should have the trauma still
TEST_ASSERT(dummy.has_trauma_type(/datum/brain_trauma/severe/blindness), "Dummy, upon changing species, did not carry over their brain trauma!")
diff --git a/code/modules/unit_tests/stomach.dm b/code/modules/unit_tests/stomach.dm
index 782e74788a6ab..5d2b948e82b36 100644
--- a/code/modules/unit_tests/stomach.dm
+++ b/code/modules/unit_tests/stomach.dm
@@ -5,7 +5,7 @@
var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent)
var/obj/item/food/hotdog/debug/fooditem = allocate(/obj/item/food/hotdog/debug)
- var/obj/item/organ/internal/stomach/belly = human.get_organ_slot(ORGAN_SLOT_STOMACH)
+ var/obj/item/organ/stomach/belly = human.get_organ_slot(ORGAN_SLOT_STOMACH)
var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill)
var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine
diff --git a/code/modules/unit_tests/tail_wag.dm b/code/modules/unit_tests/tail_wag.dm
index cd82dfdfd50c9..595e31895210b 100644
--- a/code/modules/unit_tests/tail_wag.dm
+++ b/code/modules/unit_tests/tail_wag.dm
@@ -5,7 +5,7 @@
/datum/unit_test/tail_wag/Run()
var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
- var/obj/item/organ/external/tail/cat/dummy_tail = allocate(/obj/item/organ/external/tail/cat)
+ var/obj/item/organ/tail/cat/dummy_tail = allocate(/obj/item/organ/tail/cat)
dummy_tail.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED)
// SANITY TEST
diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm
index b8b2b542f1881..a7af7b168e2cb 100644
--- a/code/modules/unit_tests/unit_test.dm
+++ b/code/modules/unit_tests/unit_test.dm
@@ -253,9 +253,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests())
/obj/merge_conflict_marker,
//briefcase launchpads erroring
/obj/machinery/launchpad/briefcase,
- //Both are abstract types meant to scream bloody murder if spawned in raw
- /obj/item/organ/external,
- /obj/item/organ/external/wings,
+ //Wings abstract path
+ /obj/item/organ/wings,
//Not meant to spawn without the machine wand
/obj/effect/bug_moving,
)
diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm
index 287c9e3cf0e20..b29c5501a7959 100644
--- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm
+++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm
@@ -211,7 +211,7 @@
to_chat(M, "HONK")
M.SetSleeping(0)
M.adjust_stutter(40 SECONDS)
- var/obj/item/organ/internal/ears/ears = M.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/ears/ears = M.get_organ_slot(ORGAN_SLOT_EARS)
if(ears)
ears.adjustEarDamage(0, 30)
M.Paralyze(60)
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 3d8a1f6cf60e2..1c8560f65dc8c 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -241,7 +241,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE)
contraband = list(
/obj/item/clothing/under/costume/mech_suit = 2,
/obj/item/clothing/suit/hooded/techpriest = 2,
- /obj/item/organ/internal/tongue/robot = 2,
+ /obj/item/organ/tongue/robot = 2,
)
refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe
extra_price = PAYCHECK_COMMAND * 1.2
diff --git a/code/modules/wiremod/components/action/equpiment_action.dm b/code/modules/wiremod/components/action/equpiment_action.dm
index 641722c595b60..f313d1f487064 100644
--- a/code/modules/wiremod/components/action/equpiment_action.dm
+++ b/code/modules/wiremod/components/action/equpiment_action.dm
@@ -1,7 +1,7 @@
/obj/item/circuit_component/equipment_action
display_name = "Equipment Action"
desc = "Represents an action the user can take when using supported shells."
- required_shells = list(/obj/item/organ/internal/cyberimp/bci, /obj/item/mod/module/circuit)
+ required_shells = list(/obj/item/organ/cyberimp/bci, /obj/item/mod/module/circuit)
/// The icon of the button
var/datum/port/input/option/icon_options
diff --git a/code/modules/wiremod/components/atom/remotecam.dm b/code/modules/wiremod/components/atom/remotecam.dm
index d5a8506c5cf04..bbbab6043affc 100644
--- a/code/modules/wiremod/components/atom/remotecam.dm
+++ b/code/modules/wiremod/components/atom/remotecam.dm
@@ -281,7 +281,7 @@
desc = "Digitizes user's sight for surveillance-on-the-go. User must have fully functional eyes for digitizer to work. Camera range input is either 0 (near) or 1 (far). Network field is used for camera network."
category = "BCI"
camera_prefix = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
/// BCIs are organs, and thus the signal must be assigned ONLY when the shell has been installed in a mob - otherwise the camera will never update position
camera_signal_move_override = TRUE
@@ -314,13 +314,13 @@
/obj/item/circuit_component/remotecam/bci/register_shell(atom/movable/shell)
. = ..()
- if(!istype(shell_parent, /obj/item/organ/internal/cyberimp/bci))
+ if(!istype(shell_parent, /obj/item/organ/cyberimp/bci))
return
shell_camera = new /obj/machinery/camera (shell_parent)
init_camera()
RegisterSignal(shell_parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_implanted))
RegisterSignal(shell_parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed))
- var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent
+ var/obj/item/organ/cyberimp/bci/bci = shell_parent
if(bci.owner) //If somehow the camera was added while shell is already installed inside a mob, assign signals
if(bciuser) //This should never happen... But if it does, unassign move signal from old mob
UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location))
@@ -388,7 +388,7 @@
if (current_camera_emp)
close_camera()
return
- var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent
+ var/obj/item/organ/cyberimp/bci/bci = shell_parent
//If shell is not currently inside a head, or user is currently blind, or user is dead
if(!bci.owner || bci.owner.is_blind() || bci.owner.stat >= UNCONSCIOUS)
close_camera()
diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm
index a0f83b6f72eff..aaf70826f4bb0 100644
--- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm
+++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm
@@ -10,7 +10,7 @@
desc = "A component that shows an three digit counter. Requires a BCI shell."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/input/counter_number
@@ -19,7 +19,7 @@
var/datum/port/input/signal_update
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
var/list/numbers = list()
var/datum/weakref/counter_appearance
@@ -32,7 +32,7 @@
image_pixel_y = add_input_port("Y-Axis Shift", PORT_TYPE_NUMBER)
/obj/item/circuit_component/counter_overlay/register_shell(atom/movable/shell)
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed))
diff --git a/code/modules/wiremod/components/bci/hud/object_overlay.dm b/code/modules/wiremod/components/bci/hud/object_overlay.dm
index 07e0f76761e55..4f09a4d9fab3b 100644
--- a/code/modules/wiremod/components/bci/hud/object_overlay.dm
+++ b/code/modules/wiremod/components/bci/hud/object_overlay.dm
@@ -12,7 +12,7 @@
desc = "Requires a BCI shell. A component that shows an overlay on top of an object."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/input/option/object_overlay_options
@@ -28,7 +28,7 @@
var/datum/port/input/signal_off
/// Reference to the BCI we're implanted inside
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
/// Assoc list of REF to the target atom to the overlay alt appearance it is using
var/list/active_overlays = list()
@@ -66,7 +66,7 @@
options_map = component_options
/obj/item/circuit_component/object_overlay/register_shell(atom/movable/shell)
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed))
diff --git a/code/modules/wiremod/components/bci/hud/target_intercept.dm b/code/modules/wiremod/components/bci/hud/target_intercept.dm
index 2ee37e8ff4f3d..016f677f10e78 100644
--- a/code/modules/wiremod/components/bci/hud/target_intercept.dm
+++ b/code/modules/wiremod/components/bci/hud/target_intercept.dm
@@ -10,11 +10,11 @@
desc = "Requires a BCI shell. When activated, this component will allow user to target an object using their brain and will output the reference to said object."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/output/clicked_atom
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
var/intercept_cooldown = 1 SECONDS
/obj/item/circuit_component/target_intercept/populate_ports()
@@ -23,7 +23,7 @@
clicked_atom = add_output_port("Targeted Object", PORT_TYPE_ATOM)
/obj/item/circuit_component/target_intercept/register_shell(atom/movable/shell)
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed))
diff --git a/code/modules/wiremod/components/bci/install_detector.dm b/code/modules/wiremod/components/bci/install_detector.dm
index 0d39e01214e67..123ff9d516294 100644
--- a/code/modules/wiremod/components/bci/install_detector.dm
+++ b/code/modules/wiremod/components/bci/install_detector.dm
@@ -10,13 +10,13 @@
desc = "A component that detects when a BCI is installed or removed from its user."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/output/implanted
var/datum/port/output/removed
var/datum/port/output/current_state
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
/obj/item/circuit_component/install_detector/populate_ports()
. = ..()
@@ -26,7 +26,7 @@
/obj/item/circuit_component/install_detector/register_shell(atom/movable/shell)
. = ..()
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
RegisterSignal(shell, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_implanted))
RegisterSignal(shell, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed))
diff --git a/code/modules/wiremod/components/bci/reagent_injector.dm b/code/modules/wiremod/components/bci/reagent_injector.dm
index ef9188d7bdc8b..73b685a39dbf8 100644
--- a/code/modules/wiremod/components/bci/reagent_injector.dm
+++ b/code/modules/wiremod/components/bci/reagent_injector.dm
@@ -11,12 +11,12 @@
category = "BCI"
circuit_flags = CIRCUIT_NO_DUPLICATES
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/input/inject
var/datum/port/output/injected
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
/obj/item/circuit_component/reagent_injector/Initialize(mapload)
. = ..()
@@ -41,7 +41,7 @@
/obj/item/circuit_component/reagent_injector/register_shell(atom/movable/shell)
. = ..()
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
bci.create_reagents(15, OPENCONTAINER)
if(reagents.total_volume)
diff --git a/code/modules/wiremod/components/bci/thought_listener.dm b/code/modules/wiremod/components/bci/thought_listener.dm
index ed6226a4e491f..f76f53b6ba202 100644
--- a/code/modules/wiremod/components/bci/thought_listener.dm
+++ b/code/modules/wiremod/components/bci/thought_listener.dm
@@ -10,7 +10,7 @@
desc = "A component that allows the user to input a string using their mind. Requires a BCI shell."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/input/input_name
var/datum/port/input/input_desc
@@ -20,7 +20,7 @@
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
var/ready = TRUE
/obj/item/circuit_component/thought_listener/populate_ports()
@@ -31,7 +31,7 @@
failure = add_output_port("On Failure", PORT_TYPE_SIGNAL)
/obj/item/circuit_component/thought_listener/register_shell(atom/movable/shell)
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
/obj/item/circuit_component/thought_listener/unregister_shell(atom/movable/shell)
diff --git a/code/modules/wiremod/components/bci/vox.dm b/code/modules/wiremod/components/bci/vox.dm
index 420140a7fdedb..8749d1b72b667 100644
--- a/code/modules/wiremod/components/bci/vox.dm
+++ b/code/modules/wiremod/components/bci/vox.dm
@@ -10,7 +10,7 @@
desc = "A component that plays a local VOX Announcement for the user. Requires a BCI shell."
category = "BCI"
- required_shells = list(/obj/item/organ/internal/cyberimp/bci)
+ required_shells = list(/obj/item/organ/cyberimp/bci)
var/datum/port/input/option/type_option
var/current_type
@@ -19,7 +19,7 @@
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
/obj/item/circuit_component/vox/populate_options()
type_option = add_option_port("VOX Type", list(PORT_TYPE_LIST(PORT_TYPE_STRING), PORT_TYPE_STRING))
@@ -28,7 +28,7 @@
word_list = add_input_port("Word List", PORT_TYPE_LIST(PORT_TYPE_STRING))
/obj/item/circuit_component/vox/register_shell(atom/movable/shell)
- if(istype(shell, /obj/item/organ/internal/cyberimp/bci))
+ if(istype(shell, /obj/item/organ/cyberimp/bci))
bci = shell
/obj/item/circuit_component/vox/unregister_shell(atom/movable/shell)
diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm
index e3ddf54135af8..29147aefa9458 100644
--- a/code/modules/wiremod/shell/brain_computer_interface.dm
+++ b/code/modules/wiremod/shell/brain_computer_interface.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/cyberimp/bci
+/obj/item/organ/cyberimp/bci
name = "brain-computer interface"
desc = "An implant that can be placed in a user's head to control circuits using their brain."
icon = 'icons/obj/science/circuits.dmi'
@@ -6,7 +6,7 @@
zone = BODY_ZONE_HEAD
w_class = WEIGHT_CLASS_TINY
-/obj/item/organ/internal/cyberimp/bci/Initialize(mapload)
+/obj/item/organ/cyberimp/bci/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_CIRCUIT_ACTION_COMPONENT_REGISTERED, PROC_REF(action_comp_registered))
@@ -19,7 +19,7 @@
new /obj/item/circuit_component/bci_core,
), SHELL_CAPACITY_SMALL, starting_circuit = circuit)
-/obj/item/organ/internal/cyberimp/bci/say(
+/obj/item/organ/cyberimp/bci/say(
message,
bubble_type,
list/spans = list(),
@@ -43,11 +43,11 @@
return ..()
-/obj/item/organ/internal/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
+/obj/item/organ/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
SIGNAL_HANDLER
LAZYADD(actions, new/datum/action/innate/bci_action(src, action_comp))
-/obj/item/organ/internal/cyberimp/bci/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
+/obj/item/organ/cyberimp/bci/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
SIGNAL_HANDLER
var/datum/action/innate/bci_action/action = action_comp.granted_to[REF(src)]
if(!istype(action))
@@ -61,10 +61,10 @@
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "bci_power"
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
var/obj/item/circuit_component/equipment_action/circuit_component
-/datum/action/innate/bci_action/New(obj/item/organ/internal/cyberimp/bci/_bci, obj/item/circuit_component/equipment_action/circuit_component)
+/datum/action/innate/bci_action/New(obj/item/organ/cyberimp/bci/_bci, obj/item/circuit_component/equipment_action/circuit_component)
..()
bci = _bci
circuit_component.granted_to[REF(_bci)] = src
@@ -95,7 +95,7 @@
var/datum/weakref/user
- var/obj/item/organ/internal/cyberimp/bci/bci
+ var/obj/item/organ/cyberimp/bci/bci
/obj/item/circuit_component/bci_core/populate_ports()
@@ -290,7 +290,7 @@
var/busy_icon_state
var/locked = FALSE
- var/obj/item/organ/internal/cyberimp/bci/bci_to_implant
+ var/obj/item/organ/cyberimp/bci/bci_to_implant
COOLDOWN_DECLARE(message_cooldown)
@@ -365,13 +365,13 @@
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, params)
- var/obj/item/organ/internal/cyberimp/bci/new_bci = weapon
+ var/obj/item/organ/cyberimp/bci/new_bci = weapon
if (istype(new_bci))
if (!(locate(/obj/item/integrated_circuit) in new_bci))
balloon_alert(user, "bci has no circuit!")
return
- var/obj/item/organ/internal/cyberimp/bci/previous_bci_to_implant = bci_to_implant
+ var/obj/item/organ/cyberimp/bci/previous_bci_to_implant = bci_to_implant
user.transferItemToLoc(weapon, src)
bci_to_implant = weapon
@@ -428,7 +428,7 @@
playsound(loc, 'sound/machines/ping.ogg', 30, FALSE)
- var/obj/item/organ/internal/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/internal/cyberimp/bci)
+ var/obj/item/organ/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/cyberimp/bci)
if (bci_organ)
bci_organ.Remove(carbon_occupant)
@@ -460,7 +460,7 @@
var/mob/living/carbon/carbon_occupant = occupant
if (istype(occupant))
- var/obj/item/organ/internal/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/internal/cyberimp/bci)
+ var/obj/item/organ/cyberimp/bci/bci_organ = carbon_occupant.get_organ_by_type(/obj/item/organ/cyberimp/bci)
if (isnull(bci_organ) && isnull(bci_to_implant))
say("No brain-computer interface inserted, and occupant does not have one. Insert a BCI to implant one.")
playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 30, TRUE)
diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm
index bad787033f967..0db08ab7bb815 100644
--- a/code/modules/wiremod/shell/shell_items.dm
+++ b/code/modules/wiremod/shell/shell_items.dm
@@ -63,7 +63,7 @@
/obj/item/shell/bci
name = "brain-computer interface assembly"
icon_state = "bci-open"
- shell_to_spawn = /obj/item/organ/internal/cyberimp/bci
+ shell_to_spawn = /obj/item/organ/cyberimp/bci
w_class = WEIGHT_CLASS_TINY
/obj/item/shell/scanner_gate
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 894eeeeeb2183..db7257dc957a4 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -51,7 +51,7 @@
if(limb_armor > limb_damage)
return
- var/obj/item/organ/internal/zombie_infection/infection
+ var/obj/item/organ/zombie_infection/infection
infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE)
if(!infection)
infection = new()
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index bd8646ccb780d..f6f21b7e1eed1 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -1,4 +1,4 @@
-/obj/item/organ/internal/zombie_infection
+/obj/item/organ/zombie_infection
name = "festering ooze"
desc = "A black web of pus and viscera."
zone = BODY_ZONE_HEAD
@@ -13,22 +13,22 @@
var/revive_time_max = 700
var/timer_id
-/obj/item/organ/internal/zombie_infection/Initialize(mapload)
+/obj/item/organ/zombie_infection/Initialize(mapload)
. = ..()
if(iscarbon(loc))
Insert(loc)
GLOB.zombie_infection_list += src
-/obj/item/organ/internal/zombie_infection/Destroy()
+/obj/item/organ/zombie_infection/Destroy()
GLOB.zombie_infection_list -= src
. = ..()
-/obj/item/organ/internal/zombie_infection/on_mob_insert(mob/living/carbon/M, special = FALSE, movement_flags)
+/obj/item/organ/zombie_infection/on_mob_insert(mob/living/carbon/M, special = FALSE, movement_flags)
. = ..()
START_PROCESSING(SSobj, src)
-/obj/item/organ/internal/zombie_infection/on_mob_remove(mob/living/carbon/M, special = FALSE)
+/obj/item/organ/zombie_infection/on_mob_remove(mob/living/carbon/M, special = FALSE)
. = ..()
STOP_PROCESSING(SSobj, src)
if(iszombie(M) && old_species && !special)
@@ -36,25 +36,25 @@
if(timer_id)
deltimer(timer_id)
-/obj/item/organ/internal/zombie_infection/on_mob_insert(mob/living/carbon/organ_owner, special)
+/obj/item/organ/zombie_infection/on_mob_insert(mob/living/carbon/organ_owner, special)
. = ..()
RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(organ_owner_died))
-/obj/item/organ/internal/zombie_infection/on_mob_remove(mob/living/carbon/organ_owner, special)
+/obj/item/organ/zombie_infection/on_mob_remove(mob/living/carbon/organ_owner, special)
. = ..()
UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH)
-/obj/item/organ/internal/zombie_infection/proc/organ_owner_died(mob/living/carbon/source, gibbed)
+/obj/item/organ/zombie_infection/proc/organ_owner_died(mob/living/carbon/source, gibbed)
SIGNAL_HANDLER
if(iszombie(source))
qdel(src) // Congrats you somehow died so hard you stopped being a zombie
-/obj/item/organ/internal/zombie_infection/on_find(mob/living/finder)
+/obj/item/organ/zombie_infection/on_find(mob/living/finder)
to_chat(finder, span_warning("Inside the head is a disgusting black \
web of pus and viscera, bound tightly around the brain like some \
biological harness."))
-/obj/item/organ/internal/zombie_infection/process(seconds_per_tick, times_fired)
+/obj/item/organ/zombie_infection/process(seconds_per_tick, times_fired)
if(!owner)
return
if(!(src in owner.organs))
@@ -65,7 +65,7 @@
owner.adjustToxLoss(0.5 * seconds_per_tick)
if (SPT_PROB(5, seconds_per_tick))
to_chat(owner, span_danger("You feel sick..."))
- if(timer_id || HAS_TRAIT(owner, TRAIT_SUICIDED) || !owner.get_organ_by_type(/obj/item/organ/internal/brain))
+ if(timer_id || HAS_TRAIT(owner, TRAIT_SUICIDED) || !owner.get_organ_by_type(/obj/item/organ/brain))
return
if(owner.stat != DEAD && !converts_living)
return
@@ -77,7 +77,7 @@
var/flags = TIMER_STOPPABLE
timer_id = addtimer(CALLBACK(src, PROC_REF(zombify), owner), revive_time, flags)
-/obj/item/organ/internal/zombie_infection/proc/zombify(mob/living/carbon/target)
+/obj/item/organ/zombie_infection/proc/zombify(mob/living/carbon/target)
timer_id = null
if(!converts_living && owner.stat != DEAD)
@@ -99,5 +99,5 @@
target.do_jitter_animation(living_transformation_time)
target.Stun(living_transformation_time)
-/obj/item/organ/internal/zombie_infection/nodamage
+/obj/item/organ/zombie_infection/nodamage
causes_damage = FALSE
diff --git a/config/game_options.txt b/config/game_options.txt
index 6e4ab55ec3db5..6793a5a5e5094 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -127,7 +127,8 @@ PROTECT_ROLES_FROM_ANTAGONIST
## "HUMAN_WHITELIST": all heads-of-staff jobs will be able to be played by non-humans, unless that job incorporates the "human only" flag (Which can be configured via a variable or the job config txt).
## "NON_HUMAN_WHITELIST": non-humans will not be able to play as heads of staff, unless that job incorporates the "allow non-humans" flag (Which can be configured via a variable or the job config txt).
## "ENFORCED": non-humans cannot be heads of staff, only humans can. the "allow non-humans" setting will be ignored.
-HUMAN_AUTHORITY HUMAN_WHITELIST
+## Uncomment to enable a human authority mode of your choice.
+#HUMAN_AUTHORITY HUMAN_WHITELIST
## If late-joining players have a chance to become a traitor/changeling
ALLOW_LATEJOIN_ANTAGONISTS
diff --git a/html/changelogs/AutoChangeLog-pr-87231.yml b/html/changelogs/AutoChangeLog-pr-87231.yml
deleted file mode 100644
index 3b5a7657054db..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-87231.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "WebcomicArtist"
-delete-after: True
-changes:
- - bugfix: "Un-breaks etherial apc charging and charge from ethereal wine."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87232.yml b/html/changelogs/AutoChangeLog-pr-87232.yml
deleted file mode 100644
index 941d66ddf52eb..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-87232.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MelokGleb and KREKS"
-delete-after: True
-changes:
- - rscadd: "very hard wiz-only sm sword craft"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87289.yml b/html/changelogs/AutoChangeLog-pr-87289.yml
deleted file mode 100644
index 46b0cab527be4..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-87289.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - balance: "Shock touch is now less-than-lethal, dealing a decent amount of stamina damage at the cost of lethal damage. Lower cooldown. Power chromosome makes it force a stagger rather than cause a chain lightning effect (this used to do like only 5 damage so...)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87424.yml b/html/changelogs/AutoChangeLog-pr-87424.yml
deleted file mode 100644
index 4974aa7d4d64d..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-87424.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "grungussuss"
-delete-after: True
-changes:
- - sound: "radio noise will no longer play on the common channel"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87516.yml b/html/changelogs/AutoChangeLog-pr-87516.yml
new file mode 100644
index 0000000000000..f6bb666aa7a9f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87516.yml
@@ -0,0 +1,5 @@
+author: "Jewelry-x"
+delete-after: True
+changes:
+ - code_imp: "removed two one letter variables"
+ - admin: "clearing the pod bay will not remove the light emitters."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87524.yml b/html/changelogs/AutoChangeLog-pr-87524.yml
new file mode 100644
index 0000000000000..b83e1687bfee5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87524.yml
@@ -0,0 +1,4 @@
+author: "SyncIt21"
+delete-after: True
+changes:
+ - bugfix: "HPLC can purify inverted chems."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87557.yml b/html/changelogs/AutoChangeLog-pr-87557.yml
new file mode 100644
index 0000000000000..b454fc7d8dd5a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87557.yml
@@ -0,0 +1,4 @@
+author: "Jewelry-x"
+delete-after: True
+changes:
+ - admin: "doing a latejoin injection no longer causes a midround one as well"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87562.yml b/html/changelogs/AutoChangeLog-pr-87562.yml
new file mode 100644
index 0000000000000..705b8de3258eb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87562.yml
@@ -0,0 +1,4 @@
+author: "Ben10Omintrix"
+delete-after: True
+changes:
+ - bugfix: "monkeys can now pick up and eat nearby food"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87577.yml b/html/changelogs/AutoChangeLog-pr-87577.yml
new file mode 100644
index 0000000000000..f94eaa73cab02
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87577.yml
@@ -0,0 +1,4 @@
+author: "carlarctg"
+delete-after: True
+changes:
+ - qol: "syndicate (and all) climbing hooks are small-sized"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87578.yml b/html/changelogs/AutoChangeLog-pr-87578.yml
new file mode 100644
index 0000000000000..29ab4d19c1122
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87578.yml
@@ -0,0 +1,4 @@
+author: "13spacemen"
+delete-after: True
+changes:
+ - bugfix: "alert polls work past roundend"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87585.yml b/html/changelogs/AutoChangeLog-pr-87585.yml
new file mode 100644
index 0000000000000..257cc929a9793
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87585.yml
@@ -0,0 +1,4 @@
+author: "mc-oofert"
+delete-after: True
+changes:
+ - bugfix: "fixes cyborg apc frame attachment"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87594.yml b/html/changelogs/AutoChangeLog-pr-87594.yml
new file mode 100644
index 0000000000000..24f885a61cad8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87594.yml
@@ -0,0 +1,4 @@
+author: "carlarctg"
+delete-after: True
+changes:
+ - bugfix: "Fixed being unable to aghost while corpselocked"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87597.yml b/html/changelogs/AutoChangeLog-pr-87597.yml
new file mode 100644
index 0000000000000..4f75daff59fb3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87597.yml
@@ -0,0 +1,4 @@
+author: "Sealed101"
+delete-after: True
+changes:
+ - bugfix: "fixed Make Cyborg admin verb and player panel Make AI not putting the ghosted player in control if they weren't an observer"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87599.yml b/html/changelogs/AutoChangeLog-pr-87599.yml
new file mode 100644
index 0000000000000..7e6616e2ffb36
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87599.yml
@@ -0,0 +1,5 @@
+author: "carlarctg"
+delete-after: True
+changes:
+ - refactor: "Actions will no longer by default apply a melee cooldown equal to action cooldown."
+ - bugfix: "Fixed various abilities causing melee jank, most noticeably venus man eaters"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87601.yml b/html/changelogs/AutoChangeLog-pr-87601.yml
new file mode 100644
index 0000000000000..6c910d4a04b08
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87601.yml
@@ -0,0 +1,4 @@
+author: "carlarctg"
+delete-after: True
+changes:
+ - code_imp: "acetone oxide is blue!!!"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87602.yml b/html/changelogs/AutoChangeLog-pr-87602.yml
new file mode 100644
index 0000000000000..ad474063a05ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87602.yml
@@ -0,0 +1,4 @@
+author: "Aliceee2ch"
+delete-after: True
+changes:
+ - bugfix: "you can now place material iron tiles in space like regular iron tiles"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87604.yml b/html/changelogs/AutoChangeLog-pr-87604.yml
new file mode 100644
index 0000000000000..8bc49ff206c9e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87604.yml
@@ -0,0 +1,5 @@
+author: "Sealed101"
+delete-after: True
+changes:
+ - bugfix: "the Derelict vault doors are once again unhackable"
+ - qol: "the Derelict vault doors provide chat feedback when you try to hack them so you can stop poking them with your tools"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87605.yml b/html/changelogs/AutoChangeLog-pr-87605.yml
new file mode 100644
index 0000000000000..aa5c008ec8835
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87605.yml
@@ -0,0 +1,4 @@
+author: "Sealed101"
+delete-after: True
+changes:
+ - bugfix: "sanity dropping below zero should now properly slowly recover back to zero instead of dropping even further"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-87606.yml b/html/changelogs/AutoChangeLog-pr-87606.yml
new file mode 100644
index 0000000000000..1a8a262c3deb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-87606.yml
@@ -0,0 +1,4 @@
+author: "00-Steven"
+delete-after: True
+changes:
+ - bugfix: "NTNRC muting actually works again."
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml
index 317e679e0b44d..98288b92f991f 100644
--- a/html/changelogs/archive/2024-10.yml
+++ b/html/changelogs/archive/2024-10.yml
@@ -781,3 +781,140 @@
zxaber:
- rscadd: Borgs now get the job title of someone sending them a message through
SiliConnect.
+2024-10-26:
+ Ghommie:
+ - bugfix: Fixed a small botherance with special fish infusions. You no longer need
+ to infuse squids and pufferfish last to reap their special organs.
+ Melbert:
+ - rscadd: Drinking any ethanol (beer, wine, etc) will trigger alcohol allergies
+ - rscadd: Drinking ants will trigger Bug allergies
+ - rscadd: Getting stung by a bee, or bitten by a (giant) ant or (giant) spider,
+ will trigger bug allergies
+ - rscadd: Drinking plain sugar or caramel will trigger sugar allergies
+ - qol: Ethanol can speed up the surgeries of any mob type applied to, rather than
+ solely humans.
+ MelokGleb and KREKS:
+ - rscadd: very hard wiz-only sm sword craft
+ WebcomicArtist:
+ - bugfix: Un-breaks etherial apc charging and charge from ethereal wine.
+ carlarctg:
+ - bugfix: Hitting an SM with extraction tongs won't dust them anymore
+ grungussuss:
+ - bugfix: fixed plastic flaps losing atmos qualities when anchored
+ - sound: radio noise will no longer play on the common channel
+ necromanceranne:
+ - balance: Shock touch is now less-than-lethal, dealing a decent amount of stamina
+ damage at the cost of lethal damage. Lower cooldown. Power chromosome makes
+ it force a stagger rather than cause a chain lightning effect (this used to
+ do like only 5 damage so...)
+2024-10-27:
+ Absolucy:
+ - rscadd: GPSes now show the general direction of cross-linked z-levels.
+ CliffracerX:
+ - config: altered coded defaults for human authority, no impact on TG
+ Jewelry-x:
+ - admin: make sparks optional when sending a supply pod
+ KazooBard:
+ - balance: Knock path's grasp now stuns the previous mech occupant when ejecting
+ them and unlocks BOTH the ID and DNA lock, allowing the heretic to freely board
+ the vehicle.
+ SmArtKar:
+ - bugfix: Fixed hat stabilizer component not cancelling the attack chain
+ Time-Green, 00-Steven:
+ - rscadd: 'Adds Lost Crew as an orderable cargo package by medical! Fix and revive
+ them to bring new players back into the game and make some money for medical!
+
+ admin:'
+ Vekter:
+ - bugfix: Changed the color of entertainment radio to be darker
+ carlarctg:
+ - bugfix: spray-on insulated gloves are chunky once more. does not affect regular
+ ones
+ - rscadd: Modernizes polymorph types by adding mob types that never entered the
+ wabbajack list.
+ - balance: Updated a few species' changesource flags
+ grungussuss:
+ - qol: you can now turn off the volume on an entertainment monitor
+ - sound: fan loop sounds have been improved
+ grungussuss and redemptionarc:
+ - sound: sigh sounds have been improved
+ tontyGH:
+ - bugfix: pointing at stuff on-top of plates, griddles, stoves and ovens will point
+ at the plate and no longer just do nothing
+2024-10-28:
+ DATA-xPUNGED:
+ - bugfix: The parrot from the Corsair Cove will no longer be immediatelly shanked
+ by the pirates upon loading of the domain.
+ Pepsilawn:
+ - bugfix: You will now receive the advertised amount of credits for selling spacecash
+ bills through cargo
+ SmArtKar:
+ - bugfix: Fixed deathsquad commandos not getting their berets
+ - bugfix: Changelings no longer have a soul when examined if their brain is missing
+ - bugfix: MODules don't create visual overlays when their required part isn't deployed
+ Time-Green:
+ - bugfix: Randomly generated female bodies/humans no longer have a 50% to get a
+ male name
+ carlarctg:
+ - rscadd: adds big pointer to chipped quirk
+ grungussuss:
+ - bugfix: signers can sign past muzzles
+ - sound: bags now have handling and equip sounds
+ - sound: shoes have handling and equip sounds
+ - bugfix: it is now possible to succumb without speaking
+ necromanceranne:
+ - bugfix: Fixes a runtime when trying to remove someones scarred eyes. Now you can
+ remove them!
+2024-10-29:
+ Aliceee2ch:
+ - qol: replaced old engineer borg "tile stacker" on crippled RTD
+ Fikou:
+ - rscadd: The Bridge Assistant's no item wielding disability was replaced with a
+ duty-sworn axe protection brain trauma.
+ - balance: you need something spaceproof to cover your legs (or feet) and arms (or
+ hands) to be spaceproof, not only head and chest
+ - balance: magboots and atmos gloves now have pressure protection
+ Ghommie:
+ - bugfix: Throw impact sounds won't play if the item has been caught.
+ Jackal-boop:
+ - bugfix: fixes the toy larva hugger getting shredded
+ r3dj4ck0424:
+ - bugfix: certain office chairs are now properly labelled
+2024-10-30:
+ JackEnoff:
+ - spellcheck: spellchecks "maintainance glass airlock"
+ SmArtKar:
+ - bugfix: Fixed harddels caused by certain projectiles
+ - code_imp: Magazines now lazyload their contents in order to save on gun init times.
+ Please report any broken/non-functional guns!
+ - qol: Detailed examine descriptions are prettier now.
+ carlarctg:
+ - bugfix: The Traps won't spawn traps on walls anymore
+2024-10-31:
+ Ben10Omintrix:
+ - bugfix: penguins now correctly hunt for food
+ Ghommie:
+ - code_imp: Removed internal/external pathing from organs in favor of a bit flag.
+ Hopefully this shouldn't break anything about organs.
+ - bugfix: Fixed invisible fox ears.
+ - bugfix: Fixed mushpeople caps not being colored red by default.
+ - rscadd: You can now dye most tails, podpeople hair, mushpeople caps etc. with
+ a hair dye spray.
+ OrionTheFox:
+ - qol: added fail feedback to xenobio Regenerative Metal/Bluespace Extracts
+ - bugfix: fixed Regenerative Metal Extract not checking for mob size when moving
+ them into the spawned closet
+ Sealed101:
+ - bugfix: fixed APC control console found in CE office only accessing APCs on its
+ z-level
+ - bugfix: fixed restoring an emagged APC control console potentially leaving the
+ console in a forever state of restoring
+ SmArtKar:
+ - bugfix: Fixed green raptor corpses being able to mine rocks
+ larentoun:
+ - bugfix: 'Bitrunning: falling into chasms and other ways of destroying your virtual
+ body instead of killing it, WILL now return you to your body'
+ necromanceranne:
+ - code_imp: Introduces a INHALE method for reagent transfer. Cigarettes and smoke
+ reactions use this new method.
+ - balance: Nitrous oxide now brain damage if you inhale it. So don't do that.
diff --git a/html/changelogs/archive/2024-11.yml b/html/changelogs/archive/2024-11.yml
new file mode 100644
index 0000000000000..bf642e1840a3d
--- /dev/null
+++ b/html/changelogs/archive/2024-11.yml
@@ -0,0 +1,24 @@
+2024-11-01:
+ 00-Steven:
+ - bugfix: NTNRC "rename channel" button is now grayed out when unusable.
+ - bugfix: Genetics console "create advanced injector" button is now grayed out when
+ unusable.
+ Fikou:
+ - bugfix: fixes some issues with separate modsuit part activation
+ - bugfix: rad protection, miner and stealth modsuit modules require the full suit
+ out
+ - bugfix: armor booster now applies slowdown removal per part instead of to the
+ control unit
+ SmArtKar:
+ - bugfix: Fixed some guns runtiming when attempting to reload
+ - bugfix: Fixed HTML injections via pet tricks
+ TealSeer:
+ - bugfix: The gene recipes for cindikinesis and pyrokinesis should now work properly.
+ TheVekter:
+ - bugfix: Clarifies mayhem-in-a-bottle's effects and makes the text much, much more
+ obvious.
+ carlarctg:
+ - image: adds some placeholder and not sprites for various fish sources
+ - code_imp: added debug portal with all fish locations
+ - qol: Modsuit actions no longer go on cooldown when selected
+ - balance: microwave beam module is on a 4s cooldown not 10s
diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi
index 071db6ba93ca8..815983f7094e6 100644
Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ
diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi
index 5c433defa0755..3c68a87d5491d 100644
Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and b/icons/mob/clothing/modsuit/mod_modules.dmi differ
diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi
index 3739113f824ae..53dd33a4544f6 100644
Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ
diff --git a/icons/mob/human/species/misc/bodypart_overlay_simple.dmi b/icons/mob/human/species/misc/bodypart_overlay_simple.dmi
index 84dd6c4a39e2b..2076bd32be110 100644
Binary files a/icons/mob/human/species/misc/bodypart_overlay_simple.dmi and b/icons/mob/human/species/misc/bodypart_overlay_simple.dmi differ
diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi
index dc0e65fac5898..36344d15e019c 100644
Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ
diff --git a/icons/obj/medical/bodybag.dmi b/icons/obj/medical/bodybag.dmi
index 7b7200efc10a0..0ac7fdc2115ef 100644
Binary files a/icons/obj/medical/bodybag.dmi and b/icons/obj/medical/bodybag.dmi differ
diff --git a/sound/effects/can/can_open1.ogg b/sound/items/can/can_open1.ogg
similarity index 100%
rename from sound/effects/can/can_open1.ogg
rename to sound/items/can/can_open1.ogg
diff --git a/sound/effects/can/can_open2.ogg b/sound/items/can/can_open2.ogg
similarity index 100%
rename from sound/effects/can/can_open2.ogg
rename to sound/items/can/can_open2.ogg
diff --git a/sound/effects/can/can_open3.ogg b/sound/items/can/can_open3.ogg
similarity index 100%
rename from sound/effects/can/can_open3.ogg
rename to sound/items/can/can_open3.ogg
diff --git a/sound/effects/can/can_pop.ogg b/sound/items/can/can_pop.ogg
similarity index 100%
rename from sound/effects/can/can_pop.ogg
rename to sound/items/can/can_pop.ogg
diff --git a/sound/effects/can/can_shake.ogg b/sound/items/can/can_shake.ogg
similarity index 100%
rename from sound/effects/can/can_shake.ogg
rename to sound/items/can/can_shake.ogg
diff --git a/sound/items/equip/attribution.txt b/sound/items/equip/attribution.txt
new file mode 100644
index 0000000000000..d0380ef39345b
--- /dev/null
+++ b/sound/items/equip/attribution.txt
@@ -0,0 +1,2 @@
+sneakers equip1 made by sadboysuss
+license: CC-BY-SA 3.0
diff --git a/sound/items/equip/backpack_equip.ogg b/sound/items/equip/backpack_equip.ogg
new file mode 100644
index 0000000000000..d04dfca2af272
Binary files /dev/null and b/sound/items/equip/backpack_equip.ogg differ
diff --git a/sound/items/equip/sneakers_equip1.ogg b/sound/items/equip/sneakers_equip1.ogg
new file mode 100644
index 0000000000000..a9ca5bed9a8ca
Binary files /dev/null and b/sound/items/equip/sneakers_equip1.ogg differ
diff --git a/sound/items/handling/backpack/attribution.txt b/sound/items/handling/backpack/attribution.txt
new file mode 100644
index 0000000000000..15c1754e1c984
--- /dev/null
+++ b/sound/items/handling/backpack/attribution.txt
@@ -0,0 +1,2 @@
+backpack sounds made by sadboysuss
+license: CC-BY-SA 3.0
\ No newline at end of file
diff --git a/sound/items/handling/backpack/backpack_drop1.ogg b/sound/items/handling/backpack/backpack_drop1.ogg
new file mode 100644
index 0000000000000..96f90d46d0a11
Binary files /dev/null and b/sound/items/handling/backpack/backpack_drop1.ogg differ
diff --git a/sound/items/handling/backpack/backpack_pickup1.ogg b/sound/items/handling/backpack/backpack_pickup1.ogg
new file mode 100644
index 0000000000000..854f00767ba98
Binary files /dev/null and b/sound/items/handling/backpack/backpack_pickup1.ogg differ
diff --git a/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt b/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt
index dd3b21b412e39..719d3306d5ef2 100644
--- a/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt
+++ b/sound/items/handling/reagent_containers/plastic_bottle/attribution.txt
@@ -1,2 +1,5 @@
plastic_bottle_liquid_slosh:
liquid in bottle shaking by mrrap4food -- https://freesound.org/s/470606/ -- License: Creative Commons 0
+
+bottle cap:
+made by sadboysuss: license: cc-by-sa
\ No newline at end of file
diff --git a/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg
new file mode 100644
index 0000000000000..cc07387f557ac
Binary files /dev/null and b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_close.ogg differ
diff --git a/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg
new file mode 100644
index 0000000000000..fb376707f4984
Binary files /dev/null and b/sound/items/handling/reagent_containers/plastic_bottle/bottle_cap_open.ogg differ
diff --git a/sound/items/handling/shoes/attribution.txt b/sound/items/handling/shoes/attribution.txt
new file mode 100644
index 0000000000000..66bd3511fa71d
--- /dev/null
+++ b/sound/items/handling/shoes/attribution.txt
@@ -0,0 +1,2 @@
+sneakers pickup and drop made by sadboysuss
+license: CC-BY-SA 3.0
diff --git a/sound/items/handling/shoes/sneakers_drop1.ogg b/sound/items/handling/shoes/sneakers_drop1.ogg
new file mode 100644
index 0000000000000..4420e98448197
Binary files /dev/null and b/sound/items/handling/shoes/sneakers_drop1.ogg differ
diff --git a/sound/items/handling/shoes/sneakers_pickup1.ogg b/sound/items/handling/shoes/sneakers_pickup1.ogg
new file mode 100644
index 0000000000000..9670ec324e372
Binary files /dev/null and b/sound/items/handling/shoes/sneakers_pickup1.ogg differ
diff --git a/sound/machines/fan/fan_break.ogg b/sound/machines/fan/fan_break.ogg
index 10a87442a3798..a122b3c8ea515 100644
Binary files a/sound/machines/fan/fan_break.ogg and b/sound/machines/fan/fan_break.ogg differ
diff --git a/sound/machines/fan/fan_loop.ogg b/sound/machines/fan/fan_loop.ogg
index 4efa72c1b5b0f..8588f1c9ab4ea 100644
Binary files a/sound/machines/fan/fan_loop.ogg and b/sound/machines/fan/fan_loop.ogg differ
diff --git a/sound/machines/fan/fan_start.ogg b/sound/machines/fan/fan_start.ogg
index 9d9f72f3191ec..008c249f20b24 100644
Binary files a/sound/machines/fan/fan_start.ogg and b/sound/machines/fan/fan_start.ogg differ
diff --git a/sound/machines/fan/fan_stop.ogg b/sound/machines/fan/fan_stop.ogg
index dc170b550a7f0..beebbacb66646 100644
Binary files a/sound/machines/fan/fan_stop.ogg and b/sound/machines/fan/fan_stop.ogg differ
diff --git a/sound/mobs/humanoids/human/attribution.txt b/sound/mobs/humanoids/human/attribution.txt
index 254e7a7b3aede..20b8c14889a06 100644
--- a/sound/mobs/humanoids/human/attribution.txt
+++ b/sound/mobs/humanoids/human/attribution.txt
@@ -2,7 +2,5 @@ The male sharp gasps are from https://freesound.org/people/bacruz666/sounds/3419
{
male_sniff.ogg - https://freesound.org/people/Fluffayfish/sounds/327799/ , License: CC BY-NC 3.0
-male_sigh.ogg - https://freesound.org/people/giddster/sounds/336540/ , License: CC0
female_sniff.ogg - https://freesound.org/people/SpliceSound/sounds/218307/ , License: CC0
-female_sigh.ogg - https://freesound.org/people/biawinter/sounds/408090/ , License: CC BY-NC 4.0
} modified by grungussuss
diff --git a/sound/mobs/humanoids/human/sigh/attribution.txt b/sound/mobs/humanoids/human/sigh/attribution.txt
new file mode 100644
index 0000000000000..c25e9bfa4057f
--- /dev/null
+++ b/sound/mobs/humanoids/human/sigh/attribution.txt
@@ -0,0 +1,2 @@
+male sighs voiced by sadboysuss, license: CC-BY-SA 3.0
+female sighs voiced by redemptionarc, license: CC-BY-SA 3.0
diff --git a/sound/mobs/humanoids/human/sigh/female_sigh.ogg b/sound/mobs/humanoids/human/sigh/female_sigh.ogg
deleted file mode 100644
index b122a1895bc4d..0000000000000
Binary files a/sound/mobs/humanoids/human/sigh/female_sigh.ogg and /dev/null differ
diff --git a/sound/mobs/humanoids/human/sigh/female_sigh1.ogg b/sound/mobs/humanoids/human/sigh/female_sigh1.ogg
new file mode 100644
index 0000000000000..a2eee87932f53
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/female_sigh1.ogg differ
diff --git a/sound/mobs/humanoids/human/sigh/female_sigh2.ogg b/sound/mobs/humanoids/human/sigh/female_sigh2.ogg
new file mode 100644
index 0000000000000..14462bca91479
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/female_sigh2.ogg differ
diff --git a/sound/mobs/humanoids/human/sigh/female_sigh3.ogg b/sound/mobs/humanoids/human/sigh/female_sigh3.ogg
new file mode 100644
index 0000000000000..590b1cb49e7ce
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/female_sigh3.ogg differ
diff --git a/sound/mobs/humanoids/human/sigh/male_sigh.ogg b/sound/mobs/humanoids/human/sigh/male_sigh.ogg
deleted file mode 100644
index 6e4baaf04f567..0000000000000
Binary files a/sound/mobs/humanoids/human/sigh/male_sigh.ogg and /dev/null differ
diff --git a/sound/mobs/humanoids/human/sigh/male_sigh1.ogg b/sound/mobs/humanoids/human/sigh/male_sigh1.ogg
new file mode 100644
index 0000000000000..7cd64cff81a4b
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/male_sigh1.ogg differ
diff --git a/sound/mobs/humanoids/human/sigh/male_sigh2.ogg b/sound/mobs/humanoids/human/sigh/male_sigh2.ogg
new file mode 100644
index 0000000000000..5125ff8af9843
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/male_sigh2.ogg differ
diff --git a/sound/mobs/humanoids/human/sigh/male_sigh3.ogg b/sound/mobs/humanoids/human/sigh/male_sigh3.ogg
new file mode 100644
index 0000000000000..1139003d22e71
Binary files /dev/null and b/sound/mobs/humanoids/human/sigh/male_sigh3.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index f2fc8af67b876..3191d5980063b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1128,6 +1128,7 @@
#include "code\datums\components\gas_leaker.dm"
#include "code\datums\components\geiger_sound.dm"
#include "code\datums\components\ghost_direct_control.dm"
+#include "code\datums\components\ghostrole_on_revive.dm"
#include "code\datums\components\glass_passer.dm"
#include "code\datums\components\gps.dm"
#include "code\datums\components\grillable.dm"
@@ -1427,6 +1428,7 @@
#include "code\datums\elements\attack_zone_randomiser.dm"
#include "code\datums\elements\backblast.dm"
#include "code\datums\elements\bane.dm"
+#include "code\datums\elements\basic_allergenic_attack.dm"
#include "code\datums\elements\basic_eating.dm"
#include "code\datums\elements\basic_health_examine.dm"
#include "code\datums\elements\beauty.dm"
@@ -1692,6 +1694,7 @@
#include "code\datums\mocking\client.dm"
#include "code\datums\mood_events\_mood_event.dm"
#include "code\datums\mood_events\area_events.dm"
+#include "code\datums\mood_events\axe_events.dm"
#include "code\datums\mood_events\beauty_events.dm"
#include "code\datums\mood_events\dna_infuser_events.dm"
#include "code\datums\mood_events\drink_events.dm"
@@ -4576,6 +4579,18 @@
#include "code\modules\lootpanel\search_object.dm"
#include "code\modules\lootpanel\ss_looting.dm"
#include "code\modules\lootpanel\ui.dm"
+#include "code\modules\lost_crew\body_bags.dm"
+#include "code\modules\lost_crew\lost_crew_manager.dm"
+#include "code\modules\lost_crew\recovered_crew.dm"
+#include "code\modules\lost_crew\character\_assignment.dm"
+#include "code\modules\lost_crew\character\_character.dm"
+#include "code\modules\lost_crew\character\job_datums.dm"
+#include "code\modules\lost_crew\damages\_damages.dm"
+#include "code\modules\lost_crew\damages\accident.dm"
+#include "code\modules\lost_crew\damages\decay.dm"
+#include "code\modules\lost_crew\damages\melee.dm"
+#include "code\modules\lost_crew\damages\post_mortem.dm"
+#include "code\modules\lost_crew\damages\scenarios.dm"
#include "code\modules\mafia\_defines.dm"
#include "code\modules\mafia\controller.dm"
#include "code\modules\mafia\controller_ui.dm"
diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md
index 3e085d72084ec..dd57bf8047fee 100644
--- a/tgui/docs/component-reference.md
+++ b/tgui/docs/component-reference.md
@@ -256,6 +256,7 @@ commit, while escape cancels.
- See inherited props: [Box](#box)
- `fluid`: fill available horizontal space
+- `disabled: boolean` - Disables and greys out the button.
- `onCommit: (e, value) => void`: function that is called after the user
defocuses the input or presses enter
- `currentValue: string`: default string to display when the input is shown
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index abfdc4d739290..f7316b5e6733e 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -374,7 +374,7 @@ em {
}
.enteradio {
- color: #00ff99;
+ color: #79c5a8;
}
.redteamradio {
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index c3b15f19e6d8c..d6ecb23b400e1 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -391,7 +391,7 @@ em {
}
.enteradio {
- color: #00d680;
+ color: #5c8a87;
}
.redteamradio {
diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss
index a6b492247187b..c7a7de452d54f 100644
--- a/tgui/packages/tgui-say/styles/colors.scss
+++ b/tgui/packages/tgui-say/styles/colors.scss
@@ -18,7 +18,7 @@ $_channel_map: (
'Me': #5975da,
'Med': #57b8f0,
'OOC': #cca300,
- 'Ent': #00ff99,
+ 'Ent': #5c8a87,
'Radio': #1ecc43,
'Say': #a4bad6,
'Sci': #c68cfa,
diff --git a/tgui/packages/tgui/components/Button.tsx b/tgui/packages/tgui/components/Button.tsx
index 82493ce6edf59..86e9e26cc4830 100644
--- a/tgui/packages/tgui/components/Button.tsx
+++ b/tgui/packages/tgui/components/Button.tsx
@@ -315,10 +315,15 @@ const ButtonInput = (props: InputProps) => {
className={classes([
'Button',
fluid && 'Button--fluid',
+ disabled && 'Button--disabled',
'Button--color--' + color,
])}
{...rest}
- onClick={() => setInInput(true)}
+ onClick={() => {
+ if (!disabled) {
+ setInInput(true);
+ }
+ }}
>
{icon &&