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 && }
{toDisplay}
diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts b/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts index 5c8d0f127e051..597f9f59e5f23 100644 --- a/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts @@ -241,6 +241,16 @@ export const EFFECTS_NORMAL: PodEffect[] = [ ]; export const EFFECTS_HARM: PodEffect[] = [ + { + act: 'create_sparks', + choiceNumber: 1, + icon: 'certificate', + selected: 'create_sparks', + title: 'Create sparks; May cause fires if there is plasma in the air', + }, + { + divider: true, + }, { act: 'explosionCustom', choiceNumber: 1, diff --git a/tgui/packages/tgui/interfaces/NtosNetChat.jsx b/tgui/packages/tgui/interfaces/NtosNetChat.jsx index aab73f826a102..650520dd3a5e6 100644 --- a/tgui/packages/tgui/interfaces/NtosNetChat.jsx +++ b/tgui/packages/tgui/interfaces/NtosNetChat.jsx @@ -179,6 +179,7 @@ export const NtosNetChat = (props) => { 'Message ' + title } fluid + disabled={this_client && this_client.muted} selfClear mt={1} onEnter={(e, value) => diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/base.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/base.ts index a91b6af878133..a2a786342452d 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/base.ts +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/base.ts @@ -20,6 +20,7 @@ export type Antagonist = { // the antag_flag, made lowercase, and with non-alphanumerics removed. + // or from non_ruleset_antagonists key: string; name: string; diff --git a/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt b/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt new file mode 100644 index 0000000000000..153f7dff82c03 --- /dev/null +++ b/tools/UpdatePaths/Scripts/87434_internal_external_organ_death.txt @@ -0,0 +1,2 @@ +/obj/item/organ/internal/@SUBTYPES : /obj/item/organ/@SUBTYPES{@OLD} +/obj/item/organ/external/@SUBTYPES : /obj/item/organ/@SUBTYPES{@OLD}