From 4a7c3cb5dc897cf79d88190d071b0922eee2af5a Mon Sep 17 00:00:00 2001 From: mystery3525 <30960302+mystery3525@users.noreply.github.com> Date: Tue, 3 Oct 2023 13:27:32 -0400 Subject: [PATCH] This mothroach fixes turned into a basic mobs port (#9428) * Apply https://github.com/tgstation/tgstation/pull/55725 and https://github.com/tgstation/tgstation/pull/59008 * Apply https://github.com/tgstation/tgstation/pull/60694 * Apply https://github.com/tgstation/tgstation/pull/58912 * Apply https://github.com/tgstation/tgstation/pull/61455 * converts the mothroach to basic mob * grammar adjustments * repaths the cockroach because I forgot * prevent cables and disposals from crushing cockroaches * fix missing COMSIG_LIVING_DEATH signal send * Partial Apply of https://github.com/tgstation/tgstation/pull/70728 to fix cockroach hunting behavior * hurr mothroach uhhh web eating also deathgasp fix * refactors this into the pet_bonus instead of every attacK_hand * set this 518 compat inside the comment * removes squish_chance from carlos. I'm sorry but I can't make carlos unsquishable with basic mobs * projectile * basic * give meta their cockroach back * decrease again --- .../10x10/sk_rdm033_deltalibrary.dmm | 2 +- .../5x3/sk_rdm042_deltaclutter2.dmm | 2 +- .../5x4/sk_rdm034_deltadetective.dmm | 2 +- .../RandomRooms/5x4/sk_rdm041_deltagamble.dmm | 2 +- .../lavaland_surface_animal_hospital.dmm | 42 +- _maps/map_files/BoxStation/BoxStation.dmm | 34 +- .../map_files/Deltastation/DeltaStation2.dmm | 724 +++++++++--------- _maps/map_files/FlandStation/FlandStation.dmm | 406 +++++----- _maps/map_files/MetaStation/MetaStation.dmm | 604 +++++++-------- _maps/map_files/RadStation/RadStation.dmm | 714 ++++++++--------- beestation.dme | 27 +- code/__DEFINES/ai.dm | 1 + code/__DEFINES/basic_mobs.dm | 4 + code/__DEFINES/dcs/signals/signals_atom.dm | 3 + .../dcs/signals/signals_mob/signals_living.dm | 6 + code/__DEFINES/mobs.dm | 7 + code/__DEFINES/movespeed_modification.dm | 1 + code/__HELPERS/mobs.dm | 10 +- code/__HELPERS/type_processing.dm | 1 + code/_onclick/item_attack.dm | 6 + code/_onclick/other_mobs.dm | 4 + code/datums/ai/_ai_controller.dm | 14 +- .../ai/basic_mobs/base_basic_controller.dm | 26 + .../basic_ai_behaviors/basic_attacking.dm | 67 ++ .../basic_ai_behaviors/targetting.dm | 46 ++ .../basic_subtrees/simple_attack_target.dm | 22 + .../basic_subtrees/simple_find_target.dm | 9 + .../basic_subtrees/speech_subtree.dm | 43 ++ .../basic_targetting_datum.dm | 56 ++ code/datums/ai/dog/dog_behaviors.dm | 2 +- code/datums/ai/dog/dog_controller.dm | 25 +- .../ai/hunting_behavior/hunting_behaviors.dm | 133 ++++ .../ai/hunting_behavior/hunting_vermin.dm | 11 + .../ai/idle_behaviors/_idle_behavior.dm | 4 + code/datums/ai/idle_behaviors/idle_dog.dm | 26 + code/datums/ai/idle_behaviors/idle_monkey.dm | 10 + .../ai/idle_behaviors/idle_random_walk.dm | 11 + code/datums/ai/monkey/monkey_controller.dm | 11 +- code/datums/ai/movement/_ai_movement.dm | 4 +- code/datums/components/squashable.dm | 77 ++ .../diseases/advance/symptoms/cockroach.dm | 4 +- code/datums/elements/atmos_requirements.dm | 69 ++ .../elements/basic_body_temp_sensitive.dm | 65 ++ code/datums/elements/death_drops.dm | 34 + code/datums/elements/pet_bonus.dm | 43 ++ code/datums/elements/ranged_attacks.dm | 52 ++ code/datums/emotes.dm | 4 +- code/game/objects/items.dm | 5 + code/game/objects/items/weaponry.dm | 2 +- code/game/objects/obj_defense.dm | 12 + code/modules/cargo/packs.dm | 2 +- code/modules/mob/living/basic/basic.dm | 164 ++++ .../modules/mob/living/basic/basic_defense.dm | 195 +++++ .../mob/living/basic/health_adjustment.dm | 56 ++ .../mob/living/basic/vermin/cockroach.dm | 58 ++ .../mob/living/basic/vermin/mothroach.dm | 61 ++ code/modules/mob/living/carbon/human/emote.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 14 + code/modules/mob/living/death.dm | 2 + code/modules/mob/living/emote.dm | 2 +- code/modules/mob/living/life.dm | 2 + code/modules/mob/living/living_defense.dm | 20 + .../living/simple_animal/animal_defense.dm | 5 + .../mob/living/simple_animal/bot/cleanbot.dm | 6 +- .../simple_animal/friendly/cockroach.dm | 64 -- .../living/simple_animal/friendly/lizard.dm | 2 +- .../simple_animal/friendly/mothroach.dm | 41 - .../hostile/megafauna/colossus.dm | 2 +- code/modules/reagents/chemistry/recipes.dm | 10 +- code/modules/religion/rites.dm | 4 +- .../xenobiology/crossbreeding/burning.dm | 6 +- .../research/xenobiology/xenobiology.dm | 14 +- 72 files changed, 2775 insertions(+), 1448 deletions(-) create mode 100644 code/__DEFINES/basic_mobs.dm create mode 100644 code/datums/ai/basic_mobs/base_basic_controller.dm create mode 100644 code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm create mode 100644 code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm create mode 100644 code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm create mode 100644 code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm create mode 100644 code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm create mode 100644 code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm create mode 100644 code/datums/ai/hunting_behavior/hunting_behaviors.dm create mode 100644 code/datums/ai/hunting_behavior/hunting_vermin.dm create mode 100644 code/datums/ai/idle_behaviors/_idle_behavior.dm create mode 100644 code/datums/ai/idle_behaviors/idle_dog.dm create mode 100644 code/datums/ai/idle_behaviors/idle_monkey.dm create mode 100644 code/datums/ai/idle_behaviors/idle_random_walk.dm create mode 100644 code/datums/components/squashable.dm create mode 100644 code/datums/elements/atmos_requirements.dm create mode 100644 code/datums/elements/basic_body_temp_sensitive.dm create mode 100644 code/datums/elements/death_drops.dm create mode 100644 code/datums/elements/pet_bonus.dm create mode 100644 code/datums/elements/ranged_attacks.dm create mode 100644 code/modules/mob/living/basic/basic.dm create mode 100644 code/modules/mob/living/basic/basic_defense.dm create mode 100644 code/modules/mob/living/basic/health_adjustment.dm create mode 100644 code/modules/mob/living/basic/vermin/cockroach.dm create mode 100644 code/modules/mob/living/basic/vermin/mothroach.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/cockroach.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/mothroach.dm diff --git a/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm b/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm index 3b068ffc4b534..f878c364a35e4 100644 --- a/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm +++ b/_maps/RandomRooms/10x10/sk_rdm033_deltalibrary.dmm @@ -188,7 +188,7 @@ /turf/open/floor/plasteel/dark, /area/template_noop) "I" = ( -/mob/living/simple_animal/cockroach, +/mob/living/basic/cockroach, /turf/open/floor/wood, /area/template_noop) "J" = ( diff --git a/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm b/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm index 3b05724c7a235..4eaa526653506 100644 --- a/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm +++ b/_maps/RandomRooms/5x3/sk_rdm042_deltaclutter2.dmm @@ -42,7 +42,7 @@ }, /area/template_noop) "g" = ( -/mob/living/simple_animal/cockroach, +/mob/living/basic/cockroach, /turf/open/floor/wood, /area/template_noop) "h" = ( diff --git a/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm b/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm index d490235863c62..e918fc029d8ea 100644 --- a/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm034_deltadetective.dmm @@ -14,7 +14,7 @@ /turf/open/floor/wood, /area/template_noop) "d" = ( -/mob/living/simple_animal/cockroach, +/mob/living/basic/cockroach, /turf/open/floor/wood, /area/template_noop) "f" = ( diff --git a/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm b/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm index 4a5014cc128d0..87c2cab996dce 100644 --- a/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm +++ b/_maps/RandomRooms/5x4/sk_rdm041_deltagamble.dmm @@ -69,7 +69,7 @@ /area/template_noop) "n" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, +/mob/living/basic/cockroach, /turf/open/floor/wood{ icon_state = "wood-broken5" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index a3016008a4569..4d1743636ddd0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -58,17 +58,6 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) -"ax" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/storage/bag/trash, -/obj/item/trash/cheesie, -/obj/item/reagent_containers/syringe/antiviral, -/obj/item/bodybag, -/obj/item/reagent_containers/food/drinks/bottle/vodka, -/turf/open/floor/grass{ - initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" - }, -/area/lavaland/surface/outdoors) "aA" = ( /obj/structure/closet/secure_closet/medical2, /turf/open/floor/plasteel/white, @@ -750,6 +739,17 @@ }, /turf/open/floor/plasteel, /area/ruin/powered/animal_hospital) +"xK" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/storage/bag/trash, +/obj/item/trash/cheesie, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/bodybag, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/grass{ + initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" + }, +/area/lavaland/surface/outdoors) "yl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -1007,14 +1007,6 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) -"Mf" = ( -/mob/living/simple_animal/cockroach, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/powered/animal_hospital) "Ms" = ( /obj/machinery/smartfridge/chemistry/preloaded, /turf/open/floor/plasteel/white, @@ -1071,6 +1063,14 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) +"Qm" = ( +/mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered/animal_hospital) "QL" = ( /obj/structure/chair/office{ dir = 1 @@ -1413,7 +1413,7 @@ aa aa ab cp -ax +xK ac aJ ac @@ -1480,7 +1480,7 @@ Nl zK dC oj -Mf +Qm zK Nl Ik diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index e87735ce70704..791d742920628 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -10512,11 +10512,6 @@ /obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"bDM" = ( -/obj/machinery/camera/autoname, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "bDO" = ( /obj/structure/bodycontainer/morgue{ dir = 2 @@ -33619,10 +33614,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) -"jLP" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/wood, -/area/vacant_room/office) "jLS" = ( /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -43654,6 +43645,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"ozX" = ( +/mob/living/basic/cockroach, +/turf/open/floor/wood, +/area/vacant_room/office) "oAj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -47162,11 +47157,6 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"qva" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/carpet, -/area/vacant_room/office) "qve" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -53218,6 +53208,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"tfE" = ( +/obj/machinery/camera/autoname, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "tfI" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -60281,6 +60276,11 @@ }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"wVH" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/carpet, +/area/vacant_room/office) "wVL" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -76796,7 +76796,7 @@ ayl czK vsd fLl -jLP +ozX sdS lNE czK @@ -77825,7 +77825,7 @@ czK sSD dUJ pSb -qva +wVH enh czK dMm @@ -93782,7 +93782,7 @@ xTN hKs aJq cBD -bDM +tfE bFi vNj dRs diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 58a127973808f..646e542f4f02c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1218,10 +1218,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aiE" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aiF" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -2082,10 +2078,6 @@ "anc" = ( /turf/open/floor/wood, /area/vacant_room/office) -"and" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/wood, -/area/vacant_room/office) "ane" = ( /obj/structure/table/wood, /obj/item/paicard, @@ -2325,10 +2317,6 @@ /obj/structure/chair/office, /turf/open/floor/plasteel/grimy, /area/vacant_room/office) -"apa" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plasteel/grimy, -/area/vacant_room/office) "apb" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -10186,10 +10174,6 @@ }, /turf/open/floor/engine/o2, /area/engine/atmos) -"bdo" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/port/fore) "bdq" = ( /obj/structure/reagent_dispensers/watertank, /obj/structure/window/reinforced, @@ -26132,6 +26116,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/library) +"cGf" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/westleft{ + dir = 4; + name = "First-Aid Supplies"; + req_access_txt = "5" + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/belt/medical, +/obj/item/clothing/neck/stethoscope, +/obj/item/storage/belt/medical, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/structure/window/reinforced{ + layer = 2.9 + }, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/medical/storage) "cGg" = ( /obj/machinery/status_display/ai{ pixel_y = -32 @@ -26874,16 +26887,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cJb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/reagent_containers/blood/random, -/obj/item/rollerbed, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/aft) "cJc" = ( /obj/structure/table, /obj/item/storage/box/bodybags, @@ -27377,10 +27380,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/science/lab) -"cMU" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/port) "cMW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -29659,6 +29658,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"dbu" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/wrench, +/obj/item/rollerbed, +/turf/open/floor/plating, +/area/maintenance/department/medical/central) "dbA" = ( /obj/machinery/nanite_chamber, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -31165,35 +31173,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/robotics/mechbay) -"dnQ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/westleft{ - dir = 4; - name = "First-Aid Supplies"; - req_access_txt = "5" - }, -/obj/structure/table/glass, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/belt/medical, -/obj/item/clothing/neck/stethoscope, -/obj/item/storage/belt/medical, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/structure/window/reinforced{ - layer = 2.9 - }, -/obj/effect/loot_jobscale/medical/first_aid_kit, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/medical/storage) "dnR" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -38390,6 +38369,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"eCn" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/vending/medical, +/obj/machinery/light_switch{ + pixel_y = 22 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/medical/storage) "eCD" = ( /obj/machinery/light/small{ dir = 4 @@ -38430,6 +38420,41 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"eCY" = ( +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_y = 5 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/box/syringes{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/virology) "eDD" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -39732,21 +39757,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port) -"fdD" = ( -/obj/machinery/rnd/production/techfab/department/medical, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Medbay Storage"; - name = "Medbay Storage RC"; - pixel_y = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/storage) "fdE" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -40598,6 +40608,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"frR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/reagent_containers/blood/random, +/obj/item/rollerbed, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) "fsd" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -40711,19 +40731,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"fua" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/machinery/power/apc/auto_name/west{ - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/medical/storage) "fue" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -40848,20 +40855,6 @@ }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) -"fws" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/under/color/white, -/obj/structure/closet/secure_closet{ - anchored = 1; - name = "patient's closet"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel, -/area/medical/patients_rooms) "fwv" = ( /obj/structure/sign/poster/official/help_others{ pixel_x = -32 @@ -44638,6 +44631,19 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating, /area/maintenance/department/medical/central) +"gMg" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/medical/storage) "gNm" = ( /obj/machinery/light, /obj/machinery/firealarm/directional/south, @@ -45284,20 +45290,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"gWx" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/structure/closet/secure_closet{ - anchored = 1; - name = "patient's closet"; - req_access_txt = "5" - }, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/under/color/white, -/turf/open/floor/plasteel, -/area/medical/patients_rooms) "gWE" = ( /obj/structure/closet/l3closet/virology, /obj/effect/turf_decal/box, @@ -47875,6 +47867,27 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) +"hQF" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Whatever it is, it reeks of foul, putrid froth."; + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); + name = "Delta-Down"; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/crew_quarters/dorms) "hQV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -48361,41 +48374,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/research) -"iaP" = ( -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 7; - pixel_y = 13 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 1; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_y = 5 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/storage/box/syringes{ - pixel_x = 6; - pixel_y = 11 - }, -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = -5; - pixel_y = 3 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/virology) "iaQ" = ( /obj/item/kirbyplants/random, /obj/machinery/turretid{ @@ -49134,15 +49112,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) -"ipd" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/rollerbed, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) "ipD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -50910,6 +50879,23 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"iYj" = ( +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/folder/red, +/obj/item/toy/gun, +/obj/item/clothing/head/beret/sec{ + armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0,"stamina"=0); + desc = "A replica beret resembling that of a special operations officer under Nanotrasen."; + name = "replica officer's beret" + }, +/obj/item/radio/intercom{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/grimy, +/area/bridge/showroom/corporate) "iYy" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 @@ -51025,6 +51011,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/storage/primary) +"jbu" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/rollerbed, +/obj/item/reagent_containers/blood, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) "jbK" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -52073,6 +52068,24 @@ }, /turf/open/floor/plasteel, /area/medical/chemistry) +"jvp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/rollerbed{ + pixel_x = -2 + }, +/obj/item/rollerbed{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/rollerbed{ + pixel_x = 5; + pixel_y = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "jvs" = ( /obj/structure/cable/yellow{ icon_state = "0-8" @@ -52352,6 +52365,21 @@ }, /turf/open/floor/engine, /area/science/explab) +"jAE" = ( +/obj/machinery/rnd/production/techfab/department/medical, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Medbay Storage"; + name = "Medbay Storage RC"; + pixel_y = 28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/storage) "jAF" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -52397,6 +52425,20 @@ }, /turf/open/floor/plasteel, /area/maintenance/solars/port/fore) +"jAT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/item/clothing/shoes/sneakers/white, +/obj/item/clothing/under/color/white, +/obj/structure/closet/secure_closet{ + anchored = 1; + name = "patient's closet"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel, +/area/medical/patients_rooms) "jBh" = ( /obj/structure/chair/office{ dir = 8 @@ -54056,6 +54098,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/storage/tech) +"kea" = ( +/mob/living/basic/cockroach, +/turf/open/floor/wood, +/area/vacant_room/office) "kej" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -54342,6 +54388,30 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"khZ" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/grown/tomato/blood{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/machinery/vending/wallmed{ + contraband = list(/obj/item/reagent_containers/glass/bottle/chloralhydrate=1,/obj/item/storage/box/hug/medical=1,/obj/item/reagent_containers/glass/bottle/random_virus=1); + name = "Upgraded NanoMed"; + pixel_x = -1; + pixel_y = -32; + premium = list(/obj/item/storage/firstaid/regular=3,/obj/item/storage/belt/medical=3,/obj/item/sensor_device=2,/obj/item/pinpointer/crew=2,/obj/item/healthanalyzer=2,/obj/item/wrench/medical=1); + products = list(/obj/item/reagent_containers/syringe=12,/obj/item/reagent_containers/dropper=3,/obj/item/reagent_containers/medspray=6,/obj/item/storage/pill_bottle=6,/obj/item/reagent_containers/glass/bottle=10,/obj/item/reagent_containers/spray/cleaner=1,/obj/item/stack/medical/gauze=8,/obj/item/reagent_containers/hypospray/medipen=8,/obj/item/reagent_containers/hypospray/medipen/dexalin=8,/obj/item/reagent_containers/glass/bottle/epinephrine=4,/obj/item/reagent_containers/glass/bottle/charcoal=4,/obj/item/reagent_containers/glass/bottle/salglu_solution=4,/obj/item/reagent_containers/glass/bottle/tricordrazine=1,/obj/item/reagent_containers/glass/bottle/spaceacillin=1,/obj/item/reagent_containers/glass/bottle/morphine=2,/obj/item/reagent_containers/glass/bottle/toxin=4,/obj/item/reagent_containers/medspray/sterilizine=4) + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 2; + pixel_y = -5 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/virology) "kia" = ( /obj/item/storage/toolbox/mechanical, /obj/item/flashlight, @@ -59600,24 +59670,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) -"lTF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/mapping_helpers/dead_body_placer, -/turf/open/floor/plasteel, -/area/medical/morgue) -"lTJ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/vending/medical, -/obj/machinery/light_switch{ - pixel_y = 22 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/medical/storage) "lTK" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -64636,6 +64688,17 @@ dir = 1 }, /area/hallway/secondary/entry) +"nBl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nBn" = ( /obj/structure/table/reinforced, /obj/structure/cable/yellow{ @@ -64950,17 +65013,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/shuttledock) -"nGl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/mob/living/simple_animal/cockroach, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/maintenance/port/fore) "nGw" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable/yellow{ @@ -66134,16 +66186,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/aisat) -"obr" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/medical/morgue) "obs" = ( /obj/machinery/status_display/evac{ pixel_y = 32 @@ -68498,6 +68540,10 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/prison) +"oSN" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plasteel/grimy, +/area/vacant_room/office) "oSO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -68853,15 +68899,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/crew_quarters/bar/atrium) -"oZZ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/rollerbed, -/obj/item/reagent_containers/blood, -/turf/open/floor/plasteel, -/area/maintenance/starboard/aft) "pae" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /obj/structure/cable/yellow{ @@ -69069,6 +69106,10 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"peN" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/port) "peV" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -79526,6 +79567,10 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) +"sIW" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/aft) "sJt" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -81924,24 +81969,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"tBT" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/rollerbed{ - pixel_x = -2 - }, -/obj/item/rollerbed{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/rollerbed{ - pixel_x = 5; - pixel_y = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "tBV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, @@ -82611,27 +82638,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"tQw" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -3; - pixel_y = 15 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/beer{ - desc = "Whatever it is, it reeks of foul, putrid froth."; - list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 15); - name = "Delta-Down"; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/crew_quarters/dorms) "tQz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -82881,26 +82887,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"tWg" = ( -/obj/structure/table/wood, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/folder/blue, -/obj/item/clothing/under/rank/centcom/commander{ - desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command."; - name = "Replica CentCom officer's jumpsuit" - }, -/obj/item/clothing/head/centhat{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "stamina" = 0); - desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'"; - name = "Replica CentCom hat" - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/grimy, -/area/bridge/showroom/corporate) "tWh" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -82918,6 +82904,16 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"tWy" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light/small, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/medical/morgue) "tWH" = ( /obj/structure/sign/poster/official/help_others{ pixel_x = 32 @@ -83703,19 +83699,6 @@ }, /turf/open/floor/plating, /area/medical/medbay/lobby) -"ujf" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/mob/living/simple_animal/cockroach, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "ukl" = ( /obj/machinery/light/small, /obj/machinery/holopad, @@ -84772,6 +84755,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"uEJ" = ( +/mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/aft) "uEK" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/cable/yellow{ @@ -87035,6 +87028,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/science/xenobiology) +"vse" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "vsf" = ( /obj/effect/turf_decal/tile/green/fourcorners/contrasted, /obj/machinery/door/firedoor, @@ -87666,6 +87672,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/security/execution/education) +"vCe" = ( +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/folder/blue, +/obj/item/clothing/under/rank/centcom/commander{ + desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command."; + name = "Replica CentCom officer's jumpsuit" + }, +/obj/item/clothing/head/centhat{ + armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0,"stamina"=0); + desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'"; + name = "Replica CentCom hat" + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/bridge/showroom/corporate) "vCv" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -87925,23 +87951,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/bridge) -"vHX" = ( -/obj/structure/table/wood, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/folder/red, -/obj/item/toy/gun, -/obj/item/clothing/head/beret/sec{ - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "stamina" = 0); - desc = "A replica beret resembling that of a special operations officer under Nanotrasen."; - name = "replica officer's beret" - }, -/obj/item/radio/intercom{ - pixel_x = 26 - }, -/turf/open/floor/plasteel/grimy, -/area/bridge/showroom/corporate) "vHZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -88621,16 +88630,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/hydroponics) -"vTj" = ( -/mob/living/simple_animal/cockroach, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard/aft) "vTs" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 8 @@ -89141,30 +89140,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"wad" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/grown/tomato/blood{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/machinery/vending/wallmed{ - contraband = list(/obj/item/reagent_containers/glass/bottle/chloralhydrate = 1, /obj/item/storage/box/hug/medical = 1, /obj/item/reagent_containers/glass/bottle/random_virus = 1); - name = "Upgraded NanoMed"; - pixel_x = -1; - pixel_y = -32; - premium = list(/obj/item/storage/firstaid/regular = 3, /obj/item/storage/belt/medical = 3, /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/healthanalyzer = 2, /obj/item/wrench/medical = 1); - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/reagent_containers/medspray = 6, /obj/item/storage/pill_bottle = 6, /obj/item/reagent_containers/glass/bottle = 10, /obj/item/reagent_containers/spray/cleaner = 1, /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/hypospray/medipen = 8, /obj/item/reagent_containers/hypospray/medipen/dexalin = 8, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 4, /obj/item/reagent_containers/glass/bottle/tricordrazine = 1, /obj/item/reagent_containers/glass/bottle/spaceacillin = 1, /obj/item/reagent_containers/glass/bottle/morphine = 2, /obj/item/reagent_containers/glass/bottle/toxin = 4, /obj/item/reagent_containers/medspray/sterilizine = 4) - }, -/obj/item/reagent_containers/dropper{ - pixel_x = 2; - pixel_y = -5 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/virology) "way" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -89700,6 +89675,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"wkh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel, +/area/medical/morgue) "wkj" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -92112,6 +92094,20 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"wVj" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/closet/secure_closet{ + anchored = 1; + name = "patient's closet"; + req_access_txt = "5" + }, +/obj/item/clothing/shoes/sneakers/white, +/obj/item/clothing/under/color/white, +/turf/open/floor/plasteel, +/area/medical/patients_rooms) "wVq" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -92305,6 +92301,10 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"wYY" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/port/fore) "wZk" = ( /obj/structure/closet/crate/critter, /obj/effect/turf_decal/tile/purple, @@ -93860,6 +93860,10 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"xBm" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "xBx" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -95749,10 +95753,6 @@ }, /turf/open/floor/plasteel/white, /area/maintenance/aft) -"yfb" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/aft) "yfd" = ( /obj/structure/cable{ icon_state = "1-8" @@ -121450,7 +121450,7 @@ vLV kmU qrY tDJ -cMU +peN lUX cMY cMY @@ -126280,7 +126280,7 @@ alf ayT ban arB -bdo +wYY arB jUr jUr @@ -129856,7 +129856,7 @@ vyO gIq xeU xeU -nGl +nBl jAi vag qNf @@ -130105,7 +130105,7 @@ all ama anb aoa -apa +oSN aqc aky rZH @@ -130742,7 +130742,7 @@ dfm dfm dfm dfm -ujf +vse sKr dTA ehA @@ -131131,7 +131131,7 @@ xSF vql alp anc -and +kea pVa apb aqg @@ -133781,7 +133781,7 @@ czY cBo cCU cEK -tWg +vCe cHM fQi qHr @@ -135858,7 +135858,7 @@ pKl uDp pKl cRd -ipd +dbu pIp dvc wZR @@ -136351,7 +136351,7 @@ czY cBw cDe cER -vHX +iYj cHM cIS qHr @@ -136362,7 +136362,7 @@ gRy mka oPY wft -tBT +jvp gmR xMT wfd @@ -136386,7 +136386,7 @@ dCy rcf paK lbk -lTF +wkh lLr dCy maQ @@ -137415,7 +137415,7 @@ laY jVd jce geg -obr +tWy dCy pRu wuY @@ -138576,7 +138576,7 @@ kgm eql abi lhu -aiE +xBm aiC ajj apw @@ -140488,8 +140488,8 @@ uvU qkY xml cRe -dnQ -fua +cGf +gMg gLm wMI cRe @@ -141002,7 +141002,7 @@ qkY ubW qkY cRe -fdD +jAE fmM psZ mFW @@ -141259,7 +141259,7 @@ dOx whB qen cRe -lTJ +eCn fmM ngR xJL @@ -141768,10 +141768,10 @@ frm hUj hUj hUj -gWx -fws -fws -fws +wVj +jAT +jAT +jAT cRe drp bHm @@ -141785,7 +141785,7 @@ dPq kgG pJI mFc -iaP +eCY bpd pTk arZ @@ -142304,7 +142304,7 @@ fuX wFZ hLr bkC -wad +khZ dPq pkR vQJ @@ -143840,7 +143840,7 @@ mie dma pOZ xkY -yfb +sIW dNS rDi rDi @@ -144063,7 +144063,7 @@ fUd cFp kvh cqd -cJb +frR wYb xPI jrz @@ -145622,7 +145622,7 @@ xMt fBI cHW mIs -oZZ +jbu cIX ddl dDB @@ -145881,7 +145881,7 @@ lgJ lgJ oqn vxk -vTj +uEJ sJW vxk iyt @@ -146888,7 +146888,7 @@ cAx cCd cDD cFx -tQw +hQF cAw fTG mfR diff --git a/_maps/map_files/FlandStation/FlandStation.dmm b/_maps/map_files/FlandStation/FlandStation.dmm index e4868b67e3722..092dad1370f59 100644 --- a/_maps/map_files/FlandStation/FlandStation.dmm +++ b/_maps/map_files/FlandStation/FlandStation.dmm @@ -1140,16 +1140,6 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/entry) -"apO" = ( -/mob/living/simple_animal/cockroach, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate{ - opened = 1 - }, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating, -/area/maintenance/port/central) "apQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -1620,10 +1610,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"avk" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/port/central) "avq" = ( /obj/structure/chair/fancy/sofa/old, /turf/open/floor/carpet/grimy, @@ -1708,13 +1694,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/techmaint, /area/maintenance/department/science) -"awo" = ( -/mob/living/simple_animal/cockroach, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/department/science) "awu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -3813,10 +3792,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/central) -"aST" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/aft) "aSV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -6537,18 +6512,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel, /area/hallway/primary/port) -"bDu" = ( -/mob/living/simple_animal/cockroach{ - desc = "carlos."; - maxHealth = 2; - name = "carlos"; - squish_chance = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) "bDv" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 @@ -8215,14 +8178,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/primary/aft) -"cdI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/port/central) "ceq" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -9472,6 +9427,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"cwR" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "cxh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -9742,11 +9702,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel/dark, /area/engine/engine_room) -"cAF" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/port/aft) "cAH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/window, @@ -12532,6 +12487,13 @@ }, /turf/open/floor/plasteel/checker, /area/quartermaster/storage) +"dnu" = ( +/mob/living/basic/cockroach, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/department/science) "dnD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -13212,6 +13174,18 @@ }, /turf/open/floor/plasteel/techmaint, /area/maintenance/department/security/brig) +"dxK" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/backpack/duffelbag/med, +/obj/item/flashlight/pen, +/obj/item/rollerbed, +/obj/item/crowbar, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical) "dxM" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister, @@ -15088,6 +15062,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"dWP" = ( +/mob/living/basic/cockroach, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/plating, +/area/maintenance/department/science) "dWT" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -16087,12 +16066,6 @@ }, /turf/open/floor/plasteel/techmaint, /area/crew_quarters/heads/hop) -"enh" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/aft) "enm" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -16594,6 +16567,13 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/vault, /area/crew_quarters/heads/hor) +"evi" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/starboard/aft) "evu" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -19577,6 +19557,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"fec" = ( +/mob/living/basic/cockroach, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate{ + opened = 1 + }, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/port/central) "fei" = ( /turf/closed/wall/r_wall, /area/drydock/security) @@ -26110,6 +26100,10 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"gNA" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/aft) "gNB" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -26871,15 +26865,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/medical/medbay/central) -"gYs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/port/central) "gYE" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 1 @@ -27062,6 +27047,10 @@ /obj/effect/spawner/lootdrop/glowstick/lit, /turf/open/floor/plating, /area/maintenance/central) +"haD" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "haF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -31413,6 +31402,14 @@ }, /turf/open/floor/plasteel/grid/steel, /area/medical/apothecary) +"ijh" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel/techmaint, +/area/medical/morgue) "ijw" = ( /obj/structure/sign/warning/docking, /turf/closed/wall/r_wall, @@ -31568,6 +31565,12 @@ }, /turf/open/floor/carpet/red, /area/library) +"ilD" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/port) "ilR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/effect/turf_decal/guideline/guideline_in/red{ @@ -35107,6 +35110,10 @@ }, /turf/open/floor/plasteel/freezer, /area/medical/surgery) +"jjB" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/port/central) "jjG" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -37907,6 +37914,11 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plasteel/techmaint, /area/security/execution/transfer) +"jWO" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jWW" = ( /obj/structure/lattice/catwalk/over, /turf/open/floor/plating{ @@ -38061,6 +38073,20 @@ }, /turf/open/floor/plasteel/dark/side, /area/hallway/primary/fore) +"jYo" = ( +/mob/living/basic/cockroach, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/starboard/aft) "jYp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -41286,6 +41312,13 @@ }, /turf/open/floor/wood, /area/vacant_room/office) +"kRD" = ( +/mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/vacant_room/office) "kRI" = ( /obj/structure/chair/fancy/sofa/old/right{ dir = 4 @@ -41599,6 +41632,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"kWn" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/techmaint, +/area/medical/morgue) "kWo" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering locker room"; @@ -44620,18 +44667,6 @@ /obj/effect/spawner/structure/window/plasma/reinforced, /turf/open/floor/engine, /area/science/mixing/chamber) -"lGw" = ( -/obj/structure/rack, -/obj/item/crowbar, -/obj/item/storage/pill_bottle, -/obj/item/rollerbed, -/obj/item/clothing/glasses/eyepatch, -/obj/item/wrench, -/obj/machinery/airalarm{ - pixel_y = 22 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) "lGz" = ( /obj/effect/turf_decal/trimline/red/warning, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -47945,11 +47980,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/techmaint, /area/vacant_room/office) -"mAa" = ( -/mob/living/simple_animal/cockroach, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/plating, -/area/maintenance/department/science) "mAd" = ( /obj/effect/turf_decal/stripes/closeup, /obj/machinery/door/airlock/maintenance_hatch{ @@ -49332,13 +49362,6 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/plasteel/white, /area/science/lobby) -"mRK" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) "mRL" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, @@ -49829,11 +49852,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) -"mXT" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "mXU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -51908,18 +51926,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/escape) -"nzb" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/flashlight/pen, -/obj/item/rollerbed, -/obj/item/crowbar, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/medical) "nzd" = ( /obj/structure/table, /obj/item/paper_bin, @@ -52456,13 +52462,6 @@ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, /area/docking/arrival) -"nET" = ( -/mob/living/simple_animal/cockroach, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/vacant_room/office) "nFb" = ( /obj/structure/table/wood, /obj/item/storage/photo_album{ @@ -60737,6 +60736,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/port) +"pOF" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate{ + name = "disposal supplies" + }, +/obj/item/bodybag, +/obj/item/bodybag, +/obj/item/shovel, +/obj/item/stack/sheet/mineral/copper{ + amount = 5 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/starboard/aft) "pON" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -62293,6 +62307,12 @@ dir = 4 }, /area/janitor) +"qhV" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/aft) "qhY" = ( /obj/machinery/light, /obj/structure/table, @@ -68259,10 +68279,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) -"rCv" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "rCG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -72898,6 +72914,18 @@ "sJa" = ( /turf/closed/wall/r_wall, /area/science/robotics/mechbay) +"sJe" = ( +/mob/living/basic/cockroach{ + desc = "carlos."; + maxHealth = 2; + name = "carlos"; + + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) "sJf" = ( /obj/machinery/door/airlock/maintenance{ name = "Teleporter Maintenance"; @@ -75695,12 +75723,6 @@ /obj/effect/turf_decal/tile/red/fourcorners/contrasted, /turf/open/floor/plasteel/techmaint, /area/security/prison) -"ttb" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/port) "ttd" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ @@ -78874,6 +78896,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) +"uiy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/central) "uiz" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 8 @@ -79283,20 +79313,6 @@ dir = 4 }, /area/maintenance/department/engine) -"unb" = ( -/mob/living/simple_animal/cockroach, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet{ - pixel_x = -26 - }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/aft) "une" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -79699,11 +79715,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark/side, /area/teleporter) -"usw" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "usA" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/under/misc/assistantformal, @@ -80641,6 +80652,11 @@ }, /turf/open/floor/plasteel/dark, /area/security/checkpoint) +"uCf" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "uCg" = ( /obj/effect/turf_decal/guideline/guideline_in/red, /turf/open/floor/plasteel/dark/side{ @@ -81065,6 +81081,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) +"uIc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/port/central) "uId" = ( /turf/closed/wall, /area/maintenance/port/aft) @@ -84598,6 +84623,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/dark, /area/library/lounge) +"vvb" = ( +/obj/structure/rack, +/obj/item/crowbar, +/obj/item/storage/pill_bottle, +/obj/item/rollerbed, +/obj/item/clothing/glasses/eyepatch, +/obj/item/wrench, +/obj/machinery/airalarm{ + pixel_y = 22 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical) "vvh" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 6 @@ -88919,14 +88956,6 @@ /obj/structure/lattice/catwalk/over, /turf/open/floor/plating, /area/security/range) -"wun" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/plasteel/techmaint, -/area/medical/morgue) "wuq" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/delivery, @@ -89693,20 +89722,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"wEt" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/techmaint, -/area/medical/morgue) "wEv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -91590,21 +91605,6 @@ "wYw" = ( /turf/closed/wall/r_wall, /area/security/prison) -"wYz" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - name = "disposal supplies" - }, -/obj/item/bodybag, -/obj/item/bodybag, -/obj/item/shovel, -/obj/item/stack/sheet/mineral/copper{ - amount = 5 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) "wYE" = ( /obj/structure/table/wood, /obj/structure/showcase/machinery/tv{ @@ -113251,7 +113251,7 @@ wxd wxd ivb ogy -ttb +ilD wxd ojA tqw @@ -116532,7 +116532,7 @@ vNZ glf yfU dOr -bDu +sJe eoJ yfU hSD @@ -120984,7 +120984,7 @@ xqm bOO uId gOd -cAF +jWO szF oWu uOg @@ -124232,12 +124232,12 @@ lLM lLM dlt rSH -wun +ijh vRQ vRQ vRQ kFY -wEt +kWn rMc bJt kXS @@ -124251,7 +124251,7 @@ kTT eDs xLS rZN -nzb +dxK ygM tZK oAX @@ -124742,7 +124742,7 @@ lLM lLM lLM dlt -apO +fec aeJ aeJ aeJ @@ -124988,7 +124988,7 @@ kHH jID lHA ahc -avk +jjB hmp dGc lLM @@ -129621,7 +129621,7 @@ qzt lLM jID dGT -cdI +uiy veE mQu fvR @@ -130432,7 +130432,7 @@ qTd yio eGs yio -lGw +vvb mJM fHr bdu @@ -130515,7 +130515,7 @@ lXa xip huh ygj -mAa +dWP lIP kQv dgL @@ -134372,7 +134372,7 @@ oDs fqT xav xav -awo +dnu ygj xEK rHU @@ -137105,7 +137105,7 @@ nRs nKl ghy nRs -gYs +uIc nRs wUO nRs @@ -138720,7 +138720,7 @@ uUs lzB uUs ydi -aST +gNA vKD ylR hfo @@ -139764,7 +139764,7 @@ jcO qQK vXB vLs -enh +qhV ylJ qNd ylJ @@ -142259,7 +142259,7 @@ dOe nxE sZW iQn -nET +kRD nSC yhP oCx @@ -143575,7 +143575,7 @@ qsh wtw qTw tnS -usw +uCf rFa dTQ fbu @@ -146915,7 +146915,7 @@ yfs wDO yhB wCr -mRK +evi pSb wWM nMK @@ -149456,7 +149456,7 @@ joS mVq qlJ vFX -mXT +cwR opT oKz kGA @@ -150224,7 +150224,7 @@ ppB ifd ipT joS -mXT +cwR qlJ nKS joS @@ -152569,7 +152569,7 @@ vPF lrE yhB wCr -rCv +haD wWM xUO xUO @@ -153100,7 +153100,7 @@ yhB yhB rvS yhB -rCv +haD yhB rvS yhB @@ -153610,7 +153610,7 @@ cGp cGp cGp mpL -wYz +pOF sIe tLq dHH @@ -153876,7 +153876,7 @@ sIe sIe byb wnw -unb +jYo rTh mTi uZb diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 41dcc8d616d1d..3f68a8ff432b8 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4741,6 +4741,27 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"axP" = ( +/obj/structure/safe, +/obj/item/storage/secure/briefcase{ + contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/ballistic/automatic/pistol,/obj/item/suppressor,/obj/item/melee/classic_baton/police/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen) + }, +/obj/item/storage/backpack/duffelbag/syndie/hitman, +/obj/item/card/id/silver/reaper, +/obj/item/lazarus_injector, +/obj/item/gun/energy/disabler, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/a357, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/plasteel/dark, +/area/security/nuke_storage) "axT" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -7130,21 +7151,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"aIo" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;4;5;6;29" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) "aIv" = ( /obj/machinery/light{ dir = 8 @@ -24178,11 +24184,6 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/aft) -"cwl" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/mapping_helpers/dead_body_placer, -/turf/open/floor/plasteel, -/area/medical/morgue) "cwA" = ( /turf/open/floor/plasteel/white, /area/medical/genetics) @@ -24832,27 +24833,6 @@ }, /turf/open/floor/plating/airless, /area/science/test_area) -"cCL" = ( -/obj/structure/safe, -/obj/item/storage/secure/briefcase{ - contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/ballistic/automatic/pistol,/obj/item/suppressor,/obj/item/melee/classic_baton/police/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen) - }, -/obj/item/storage/backpack/duffelbag/syndie/hitman, -/obj/item/card/id/silver/reaper, -/obj/item/lazarus_injector, -/obj/item/gun/energy/disabler, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, -/obj/item/clothing/neck/stethoscope, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/plasteel/dark, -/area/security/nuke_storage) "cDa" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -27629,6 +27609,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) +"deH" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "deI" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -28658,6 +28642,25 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/central) +"djh" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/camera/autoname{ + dir = 6; + network = list("ss13","medbay") + }, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/medical/storage) "djj" = ( /obj/machinery/light/small{ dir = 4 @@ -30753,6 +30756,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"dVa" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/vending/medical, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "dVK" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -31035,6 +31048,25 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"edV" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/rack, +/obj/item/rollerbed{ + pixel_x = -2 + }, +/obj/item/rollerbed{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/rollerbed{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "eed" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/effect/mapping_helpers/airlock/abandoned, @@ -33222,18 +33254,6 @@ "feW" = ( /turf/open/floor/plasteel, /area/maintenance/department/medical/central) -"ffb" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;4;5;39;6" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "ffd" = ( /obj/machinery/atmospherics/pipe/layer_manifold/visible{ dir = 4 @@ -35425,6 +35445,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/secondary/command) +"fTz" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel, +/area/medical/morgue) "fTD" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /obj/machinery/camera/autoname{ @@ -39181,6 +39206,16 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"hFY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/mob/living/basic/cockroach{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/aft) "hGb" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -39578,18 +39613,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"hNP" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/siding/dark, -/obj/structure/closet/secure_closet{ - anchored = 1; - name = "patient's closet"; - req_access_txt = "5" - }, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/under/color/white, -/turf/open/floor/plasteel, -/area/medical/patients_rooms) "hOi" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43550,21 +43573,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"jwb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27;37;29;5;6;4" - }, -/turf/open/floor/plating, -/area/maintenance/aft) "jwy" = ( /turf/open/floor/plasteel/stairs{ dir = 1 @@ -43775,30 +43783,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) -"jzN" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/grown/tomato/blood{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/machinery/vending/wallmed{ - contraband = list(/obj/item/reagent_containers/glass/bottle/chloralhydrate = 1, /obj/item/storage/box/hug/medical = 1, /obj/item/reagent_containers/glass/bottle/random_virus = 1); - name = "Upgraded NanoMed"; - pixel_x = -1; - pixel_y = -32; - premium = list(/obj/item/storage/firstaid/regular = 3, /obj/item/storage/belt/medical = 3, /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/healthanalyzer = 2, /obj/item/wrench/medical = 1); - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/reagent_containers/medspray = 6, /obj/item/storage/pill_bottle = 6, /obj/item/reagent_containers/glass/bottle = 10, /obj/item/reagent_containers/spray/cleaner = 1, /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/hypospray/medipen = 8, /obj/item/reagent_containers/hypospray/medipen/dexalin = 8, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 4, /obj/item/reagent_containers/glass/bottle/tricordrazine = 1, /obj/item/reagent_containers/glass/bottle/spaceacillin = 1, /obj/item/reagent_containers/glass/bottle/morphine = 2, /obj/item/reagent_containers/glass/bottle/toxin = 4, /obj/item/reagent_containers/medspray/sterilizine = 4) - }, -/obj/item/reagent_containers/dropper{ - pixel_x = 2; - pixel_y = -5 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/virology) "jzU" = ( /obj/effect/turf_decal/plaque{ icon_state = "L9" @@ -47272,16 +47256,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"kTC" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/mapping_helpers/dead_body_placer, -/turf/open/floor/plasteel, -/area/medical/morgue) "kTE" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -48265,6 +48239,37 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"lpP" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/glass, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/neck/stethoscope, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/door/window/westleft{ + dir = 2; + name = "First-Aid Supplies"; + req_access_txt = "5" + }, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 + }, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/medical/storage) "lqg" = ( /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/lavendergrass, @@ -49398,6 +49403,21 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/hallway/primary/port) +"lPy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37;29;5;6;4" + }, +/turf/open/floor/plating, +/area/maintenance/aft) "lQb" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 @@ -53026,6 +53046,41 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) +"npX" = ( +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_y = 5 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/reagent_containers/syringe/antiviral{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/box/syringes{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = -6; + pixel_y = 3 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/virology) "nqE" = ( /obj/structure/rack, /obj/item/stock_parts/matter_bin, @@ -53255,6 +53310,18 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) +"nxm" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;4;5;39;6" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "nxo" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -53478,15 +53545,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/shuttledock) -"nBW" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/mapping_helpers/dead_body_placer, -/turf/open/floor/plasteel, -/area/medical/morgue) "nCe" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -54078,6 +54136,21 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/central) +"nNG" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;4;5;6;29" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/aft) "nNY" = ( /obj/machinery/light/small{ dir = 8 @@ -54107,16 +54180,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/gateway) -"nOu" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/machinery/vending/medical, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "nOA" = ( /obj/machinery/power/apc{ areastring = "/area/security/execution/education"; @@ -54238,37 +54301,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"nQu" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/line, -/obj/structure/table/glass, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/neck/stethoscope, -/obj/item/storage/belt/medical, -/obj/item/storage/belt/medical, -/obj/item/clothing/glasses/hud/health, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/clothing/glasses/hud/health, -/obj/machinery/door/window/westleft{ - dir = 2; - name = "First-Aid Supplies"; - req_access_txt = "5" - }, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/obj/effect/loot_jobscale/medical/first_aid_kit, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/medical/storage) "nQH" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -55302,41 +55334,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"omR" = ( -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 7; - pixel_y = 13 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = 1; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_y = 5 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/reagent_containers/syringe/antiviral{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/storage/box/syringes{ - pixel_x = 6; - pixel_y = 11 - }, -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = -6; - pixel_y = 3 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/virology) "onc" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -58597,10 +58594,6 @@ /obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/plating, /area/maintenance/aft) -"pKG" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/aft) "pKQ" = ( /obj/machinery/light_switch{ pixel_x = 28 @@ -61535,25 +61528,6 @@ }, /turf/open/floor/plasteel/freezer, /area/medical/genetics) -"qRV" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/rack, -/obj/item/rollerbed{ - pixel_x = -2 - }, -/obj/item/rollerbed{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/rollerbed{ - pixel_x = 5; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "qRY" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -62737,6 +62711,10 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) +"ruj" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/aft) "ruC" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/corner{ @@ -63519,19 +63497,6 @@ /mob/living/carbon/monkey, /turf/open/floor/plasteel/grid/steel, /area/medical/virology) -"rOI" = ( -/obj/machinery/rnd/production/techfab/department/medical, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_x = 21 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel/grid/steel, -/area/medical/storage) "rOP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -65865,6 +65830,18 @@ }, /turf/open/floor/engine, /area/maintenance/department/science/xenobiology) +"sMS" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/dark, +/obj/structure/closet/secure_closet{ + anchored = 1; + name = "patient's closet"; + req_access_txt = "5" + }, +/obj/item/clothing/shoes/sneakers/white, +/obj/item/clothing/under/color/white, +/turf/open/floor/plasteel, +/area/medical/patients_rooms) "sNf" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -68260,16 +68237,6 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/medical/medbay/aft) -"tPG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/mob/living/simple_animal/cockroach{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/aft) "tQf" = ( /obj/machinery/light, /obj/machinery/camera{ @@ -70726,6 +70693,15 @@ }, /turf/open/floor/plasteel, /area/medical/genetics) +"uVF" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel, +/area/medical/morgue) "uVT" = ( /obj/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -71268,25 +71244,6 @@ /obj/item/xenoartifact_labeler, /turf/open/floor/plasteel/dark, /area/science/explab) -"vht" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/north{ - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/machinery/camera/autoname{ - dir = 6; - network = list("ss13","medbay") - }, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/medical/storage) "vhy" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -71795,6 +71752,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"vsi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel, +/area/medical/morgue) "vsC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plasteel, @@ -72172,10 +72139,6 @@ }, /turf/open/floor/plasteel, /area/storage/primary) -"vBp" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "vBz" = ( /turf/open/floor/plasteel, /area/medical/break_room) @@ -72438,6 +72401,19 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) +"vHE" = ( +/obj/machinery/rnd/production/techfab/department/medical, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_x = 21 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/storage) "vHF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -73485,18 +73461,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"wdX" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/power/apc/auto_name/west{ - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bed/roller, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "wee" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -74634,6 +74598,18 @@ }, /turf/open/floor/plasteel/cafeteria_red, /area/crew_quarters/bar) +"wzJ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "wzV" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -77367,6 +77343,30 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) +"xBh" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/grown/tomato/blood{ + pixel_x = 7; + pixel_y = 8 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/machinery/vending/wallmed{ + contraband = list(/obj/item/reagent_containers/glass/bottle/chloralhydrate=1,/obj/item/storage/box/hug/medical=1,/obj/item/reagent_containers/glass/bottle/random_virus=1); + name = "Upgraded NanoMed"; + pixel_x = -1; + pixel_y = -32; + premium = list(/obj/item/storage/firstaid/regular=3,/obj/item/storage/belt/medical=3,/obj/item/sensor_device=2,/obj/item/pinpointer/crew=2,/obj/item/healthanalyzer=2,/obj/item/wrench/medical=1); + products = list(/obj/item/reagent_containers/syringe=12,/obj/item/reagent_containers/dropper=3,/obj/item/reagent_containers/medspray=6,/obj/item/storage/pill_bottle=6,/obj/item/reagent_containers/glass/bottle=10,/obj/item/reagent_containers/spray/cleaner=1,/obj/item/stack/medical/gauze=8,/obj/item/reagent_containers/hypospray/medipen=8,/obj/item/reagent_containers/hypospray/medipen/dexalin=8,/obj/item/reagent_containers/glass/bottle/epinephrine=4,/obj/item/reagent_containers/glass/bottle/charcoal=4,/obj/item/reagent_containers/glass/bottle/salglu_solution=4,/obj/item/reagent_containers/glass/bottle/tricordrazine=1,/obj/item/reagent_containers/glass/bottle/spaceacillin=1,/obj/item/reagent_containers/glass/bottle/morphine=2,/obj/item/reagent_containers/glass/bottle/toxin=4,/obj/item/reagent_containers/medspray/sterilizine=4) + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 2; + pixel_y = -5 + }, +/turf/open/floor/plasteel/grid/steel, +/area/medical/virology) "xBv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -95699,7 +95699,7 @@ wrk geN tqB avr -pKG +ruj gyd avr avr @@ -96224,7 +96224,7 @@ avr avr avr bTs -tPG +hFY xoL gpX dBO @@ -98525,7 +98525,7 @@ cDL tDh dle wEb -omR +npX rEg xNp osp @@ -99044,7 +99044,7 @@ dQx mnd coa lzI -jzN +xBh cDL avr avr @@ -100583,7 +100583,7 @@ doj dvk xYM cCe -wdX +wzJ vGw goI oyE @@ -100843,7 +100843,7 @@ cCe wCy jrs fPi -cwl +fTz eLp uqu cCe @@ -101082,7 +101082,7 @@ tQy vUv wLJ mdY -vht +djh gmr cjV hpp @@ -101279,7 +101279,7 @@ awW xcx geM trC -cCL +axP awW aaa aFT @@ -101339,10 +101339,10 @@ aJo vRu iKg bXK -nQu +lpP krk -rOI -nOu +vHE +dVa hJd xPR nvp @@ -101355,9 +101355,9 @@ rxV jfN pWx nyc -nBW +uVF nyc -kTC +vsi hwG fTD cCe @@ -101608,7 +101608,7 @@ qdC cCe xze ojz -vBp +deH cLY vwX oAf @@ -101858,7 +101858,7 @@ bPK vdv bhX uBe -hNP +sMS nvp wuJ fGD @@ -101876,7 +101876,7 @@ cCe cCe cCe bTs -jwb +lPy cLa cLa cMI @@ -102115,7 +102115,7 @@ saq cts cqd xaq -hNP +sMS nvp nTo qdC @@ -102372,7 +102372,7 @@ bPK qLH lfv waW -hNP +sMS nvp ktf nYh @@ -102629,7 +102629,7 @@ jKl cts ngT ttF -hNP +sMS izO fMs qdC @@ -103899,7 +103899,7 @@ aZa jfB bSS bSS -qRV +edV iqK tDc vXT @@ -104190,7 +104190,7 @@ lTT cPb cPb cPb -ffb +nxm cPb cMR mLH @@ -106242,7 +106242,7 @@ erP ctB ctD ctB -aIo +nNG cPb cPb qrx diff --git a/_maps/map_files/RadStation/RadStation.dmm b/_maps/map_files/RadStation/RadStation.dmm index f620c692b18cf..116d14209f4a7 100644 --- a/_maps/map_files/RadStation/RadStation.dmm +++ b/_maps/map_files/RadStation/RadStation.dmm @@ -2927,15 +2927,6 @@ /obj/effect/turf_decal/guideline/guideline_in/purple, /turf/open/floor/plasteel, /area/science/shuttledock) -"aUl" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse, -/turf/open/floor/plasteel, -/area/engine/atmos) "aUt" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -3764,6 +3755,20 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"bib" = ( +/obj/structure/lattice/catwalk/over, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/central) "bin" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -4324,15 +4329,6 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"bsS" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/conveyor{ - dir = 9; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "bsT" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/techmaint, @@ -5890,6 +5886,25 @@ /obj/item/pipe_dispenser, /turf/open/floor/plasteel, /area/engine/engine_room) +"bRf" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/mob/living/basic/mothroach{ + density = 0; + desc = "A festive mothroach"; + name = "Erster" + }, +/obj/effect/turf_decal/box, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics) "bRg" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 @@ -6511,6 +6526,12 @@ }, /turf/open/floor/plasteel/dark/side, /area/hallway/secondary/exit/departure_lounge) +"cdH" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/turf/open/floor/plasteel, +/area/maintenance/department/engine) "cdL" = ( /obj/structure/window/reinforced{ dir = 4 @@ -8282,20 +8303,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/vacant_room/commissary/commissary2) -"cEj" = ( -/obj/structure/sign/poster/official/moth2{ - pixel_y = 32 - }, -/obj/structure/sign/poster/official/moth4{ - pixel_x = 32 - }, -/obj/machinery/conveyor{ - dir = 6; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "cEE" = ( /obj/machinery/light/small{ dir = 4 @@ -8303,6 +8310,11 @@ /obj/machinery/field/generator, /turf/open/floor/plasteel/tech/grid, /area/engine/engineering) +"cEF" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/mob/living/basic/cockroach, +/turf/open/floor/plasteel/cafeteria, +/area/maintenance/port/aft) "cEU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -9390,6 +9402,10 @@ /obj/structure/lattice/catwalk/over, /turf/open/floor/plating, /area/maintenance/port/aft) +"cXE" = ( +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cXH" = ( /obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/stripes/line, @@ -11593,15 +11609,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plasteel, /area/hallway/primary/port) -"dHb" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/eight, -/turf/open/floor/plasteel, -/area/maintenance/department/science) "dHh" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -11728,6 +11735,23 @@ }, /turf/open/floor/plasteel/tech, /area/engine/engine_room) +"dIZ" = ( +/obj/effect/turf_decal/guideline/guideline_out_arrow/brown{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/lattice/catwalk/over, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/hallway/secondary/service) "dJh" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -12737,6 +12761,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/engine/atmos) +"dWQ" = ( +/obj/structure/flora/ausbushes/fullgrass, +/mob/living/basic/mothroach, +/turf/open/floor/grass, +/area/hallway/primary/central) "dWR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13580,6 +13609,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/vacant_room/office) +"ely" = ( +/mob/living/basic/mothroach, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/conveyor{ + dir = 9; + id = "HB" + }, +/turf/open/floor/plating, +/area/security/prison) "elG" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ alpha = 180; @@ -14907,21 +14945,6 @@ }, /turf/open/space/basic, /area/solar/port/fore) -"eEl" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/sign/poster/official/moth1{ - pixel_y = 32 - }, -/obj/structure/sign/poster/official/moth3{ - pixel_x = -32 - }, -/obj/machinery/conveyor{ - dir = 5; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "eED" = ( /obj/structure/bodycontainer/morgue, /obj/machinery/camera/autoname{ @@ -15584,33 +15607,6 @@ }, /turf/open/floor/plasteel, /area/science/shuttledock) -"eOo" = ( -/obj/structure/table/reinforced, -/obj/item/security_barricade{ - pixel_x = 8; - pixel_y = 12 - }, -/obj/item/security_barricade{ - pixel_x = 8; - pixel_y = 7 - }, -/obj/item/security_barricade{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/storage/box/trackimp{ - pixel_x = -6; - pixel_y = 9 - }, -/obj/item/security_barricade{ - pixel_y = 10 - }, -/obj/item/security_barricade{ - pixel_y = 5 - }, -/obj/item/storage/lockbox/loyalty, -/turf/open/floor/plasteel, -/area/ai_monitored/security/armory) "eOD" = ( /obj/machinery/biogenerator, /turf/open/floor/grass, @@ -16199,6 +16195,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"eWg" = ( +/mob/living/basic/cockroach, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/eight, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "eWn" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 1; @@ -18265,11 +18271,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/medical/genetics/cloning) -"fzD" = ( -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/cockroach, -/turf/open/floor/wood, -/area/vacant_room/office) "fzS" = ( /turf/closed/wall/r_wall/rust, /area/teleporter) @@ -18850,6 +18851,10 @@ "fKo" = ( /turf/open/floor/plasteel, /area/science/mixing) +"fKp" = ( +/mob/living/basic/cockroach, +/turf/open/floor/carpet/royalblack, +/area/maintenance/port/aft) "fKs" = ( /obj/machinery/door/airlock/grunge{ id_tag = "Cabin_1"; @@ -19318,6 +19323,14 @@ "fRc" = ( /turf/open/floor/plating, /area/maintenance/port/central) +"fRl" = ( +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "fRu" = ( /obj/machinery/shieldgen, /turf/open/floor/plasteel/tech/grid, @@ -19603,11 +19616,6 @@ /obj/effect/spawner/room/fivexfour, /turf/open/floor/plating, /area/maintenance/central) -"fVO" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plasteel, -/area/maintenance/department/science) "fVQ" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -19700,25 +19708,6 @@ "fXJ" = ( /turf/closed/wall/r_wall/rust, /area/engine/engine_room) -"fXR" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/mob/living/simple_animal/mothroach{ - density = 0; - desc = "A festive mothroach"; - name = "Erster" - }, -/obj/effect/turf_decal/box, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics) "fYm" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/guideline/guideline_edge/purple{ @@ -20256,11 +20245,6 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) -"gew" = ( -/obj/structure/flora/ausbushes/fullgrass, -/mob/living/simple_animal/mothroach, -/turf/open/floor/grass, -/area/hallway/primary/central) "geH" = ( /obj/effect/turf_decal/bot, /obj/machinery/firealarm/directional/west, @@ -20865,14 +20849,6 @@ }, /turf/open/floor/plasteel/dark, /area/quartermaster/miningdock) -"gnr" = ( -/obj/effect/turf_decal/bot, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "gnv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -21346,20 +21322,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"gvc" = ( -/obj/structure/lattice/catwalk/over, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/central) "gvz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -24297,6 +24259,18 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"hrp" = ( +/mob/living/basic/mothroach, +/obj/effect/decal/remains/human, +/obj/item/flashlight/lantern/heirloom_moth{ + on = 1 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "HB" + }, +/turf/open/floor/plating, +/area/security/prison) "hrt" = ( /obj/item/radio/intercom{ pixel_y = 24 @@ -25226,10 +25200,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) -"hEO" = ( -/obj/item/rollerbed, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "hES" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 22 @@ -27373,6 +27343,19 @@ /obj/item/storage/box/evidence, /turf/open/floor/plasteel, /area/security/brig) +"iqZ" = ( +/mob/living/basic/cockroach, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/structure/lattice/catwalk/over, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/engine) "ira" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -28181,6 +28164,20 @@ }, /turf/open/floor/plating, /area/medical/virology) +"iHr" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/mob/living/basic/cockroach, +/obj/machinery/disposal/deliveryChute{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "iHF" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 10 @@ -29221,6 +29218,10 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"jap" = ( +/mob/living/basic/cockroach, +/turf/open/floor/wood, +/area/vacant_room/office) "jaC" = ( /obj/structure/chair/office/light{ dir = 1 @@ -29427,21 +29428,6 @@ dir = 8 }, /area/hallway/secondary/exit/departure_lounge) -"jdx" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/flashlight/lantern/heirloom_moth{ - on = 1 - }, -/obj/structure/sign/poster/official/moth9{ - pixel_x = -32 - }, -/obj/machinery/conveyor{ - dir = 1; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "jdy" = ( /obj/structure/sink{ dir = 8; @@ -30832,6 +30818,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/engine/atmos) +"jAx" = ( +/obj/item/ammo_casing/c46x30mm, +/obj/item/ammo_casing/c46x30mm, +/obj/item/ammo_casing/c46x30mm, +/obj/item/ammo_casing/c46x30mm, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/department/security) "jAD" = ( /obj/structure/railing{ dir = 4 @@ -31002,10 +30996,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/kitchen) -"jDC" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "jDF" = ( /obj/machinery/door/poddoor/preopen{ id = "bridgewindows"; @@ -31099,6 +31089,25 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating/airless, /area/science/test_area) +"jFg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/cockroach, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/lattice/catwalk/over, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jFh" = ( /obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 8 @@ -31802,6 +31811,18 @@ /obj/item/wrench, /turf/open/space/basic, /area/space/nearstation) +"jPX" = ( +/mob/living/basic/mothroach, +/obj/effect/decal/cleanable/blood/old, +/obj/item/flashlight/lantern/heirloom_moth{ + on = 1 + }, +/obj/machinery/conveyor{ + id = "HB" + }, +/obj/effect/decal/remains/human, +/turf/open/floor/plating, +/area/security/prison) "jPZ" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/carpet/royalblack, @@ -34464,10 +34485,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"kIV" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/carpet/royalblack, -/area/maintenance/port/aft) "kIX" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 @@ -38975,6 +38992,17 @@ }, /turf/open/floor/plasteel/tech, /area/engine/engine_room) +"mhz" = ( +/mob/living/basic/mothroach, +/obj/effect/decal/cleanable/blood/old, +/obj/item/flashlight/lantern/heirloom_moth{ + on = 1 + }, +/obj/machinery/conveyor{ + id = "HB" + }, +/turf/open/floor/plating, +/area/security/prison) "mhA" = ( /obj/structure/lattice, /obj/structure/railing, @@ -39779,6 +39807,11 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/plasteel, /area/hallway/primary/port) +"muZ" = ( +/obj/effect/spawner/lootdrop/glowstick/lit, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "mvj" = ( /obj/machinery/door/airlock/maintenance{ name = "Genetics Maintenance"; @@ -40014,14 +40047,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"myC" = ( -/obj/item/ammo_casing/c46x30mm, -/obj/item/ammo_casing/c46x30mm, -/obj/item/ammo_casing/c46x30mm, -/obj/item/ammo_casing/c46x30mm, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/department/security) "myN" = ( /obj/machinery/disposal/bin, /obj/machinery/power/apc/auto_name/north{ @@ -40959,17 +40984,6 @@ dir = 8 }, /area/hallway/secondary/exit/departure_lounge) -"mJu" = ( -/obj/structure/sign/poster/official/moth5{ - pixel_x = 32 - }, -/obj/machinery/conveyor{ - dir = 10; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "mJx" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -42538,6 +42552,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"niE" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/maintenance/department/science) "niG" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -42873,6 +42891,17 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/lobby) +"nnt" = ( +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nnB" = ( /turf/closed/wall, /area/science/robotics) @@ -44075,12 +44104,6 @@ }, /turf/closed/wall/r_wall, /area/engine/supermatter) -"nFB" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plasteel, -/area/maintenance/department/engine) "nFD" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -46072,23 +46095,6 @@ }, /turf/open/space/basic, /area/solar/starboard/aft) -"onr" = ( -/obj/effect/turf_decal/guideline/guideline_out_arrow/brown{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/lattice/catwalk/over, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/hallway/secondary/service) "onv" = ( /obj/structure/window/reinforced{ dir = 8; @@ -49067,10 +49073,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/science/misc_lab/range) -"pmr" = ( -/mob/living/simple_animal/cockroach, -/turf/open/floor/wood, -/area/vacant_room/office) "pmu" = ( /obj/machinery/button/door{ id = "commissarydoor1"; @@ -49538,11 +49540,6 @@ }, /turf/open/floor/plasteel/tech, /area/engine/atmos) -"psU" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plasteel/cafeteria, -/area/maintenance/port/aft) "psX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -50204,6 +50201,33 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) +"pEP" = ( +/obj/structure/table/reinforced, +/obj/item/security_barricade{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/security_barricade{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/security_barricade{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/storage/box/trackimp{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/security_barricade{ + pixel_y = 10 + }, +/obj/item/security_barricade{ + pixel_y = 5 + }, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/plasteel, +/area/ai_monitored/security/armory) "pET" = ( /obj/structure/table/wood, /obj/item/reagent_containers/syringe{ @@ -52282,25 +52306,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"qkG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/lattice/catwalk/over, -/mob/living/simple_animal/cockroach, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "qkH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -53301,18 +53306,6 @@ }, /turf/open/floor/carpet/royalblack, /area/lawoffice) -"qBe" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/obj/item/flashlight/lantern/heirloom_moth{ - on = 1 - }, -/obj/machinery/conveyor{ - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "qBp" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/yellow/fourcorners/contrasted{ @@ -54537,19 +54530,6 @@ /obj/effect/turf_decal/siding/wideplating/dark, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"qVp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment{ - dir = 1 - }, -/mob/living/simple_animal/cockroach, -/obj/structure/lattice/catwalk/over, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/engine) "qVB" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/plating, @@ -55035,19 +55015,6 @@ /area/security/main{ name = "Security Viewing Hall" }) -"rcN" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/disposal/deliveryChute{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/department/science) "rcU" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom{ @@ -55902,11 +55869,6 @@ icon_state = "wood-broken7" }, /area/vacant_room/office) -"rso" = ( -/obj/effect/turf_decal/bot, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "rsT" = ( /obj/structure/lattice, /obj/structure/railing{ @@ -56763,17 +56725,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/storage) -"rHU" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/flashlight/lantern/heirloom_moth{ - on = 1 - }, -/obj/machinery/conveyor{ - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "rIi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57805,17 +57756,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"sbX" = ( -/obj/effect/turf_decal/bot, -/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, -/obj/machinery/power/apc/auto_name/north{ - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "scb" = ( /turf/closed/wall/r_wall, /area/storage/tech) @@ -58578,6 +58518,21 @@ /obj/structure/flora/rock, /turf/open/floor/grass, /area/hallway/primary/central) +"spI" = ( +/mob/living/basic/mothroach, +/obj/item/flashlight/lantern/heirloom_moth{ + on = 1 + }, +/obj/structure/sign/poster/official/moth9{ + pixel_x = -32 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "HB" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/security/prison) "sqG" = ( /obj/structure/weightmachine/stacklifter, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -60280,11 +60235,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"sSI" = ( -/obj/effect/spawner/lootdrop/glowstick/lit, -/mob/living/simple_animal/cockroach, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "sSU" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance/two, @@ -60613,18 +60563,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/plasteel, /area/medical/cryo) -"sYX" = ( -/obj/effect/decal/remains/human, -/obj/item/flashlight/lantern/heirloom_moth{ - on = 1 - }, -/obj/machinery/conveyor{ - dir = 1; - id = "HB" - }, -/mob/living/simple_animal/mothroach, -/turf/open/floor/plating, -/area/security/prison) "sYY" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -61679,6 +61617,10 @@ }, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) +"tnB" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/department/science) "tnC" = ( /obj/effect/turf_decal/guideline/guideline_in/red{ dir = 4 @@ -63691,6 +63633,17 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"tUj" = ( +/mob/living/basic/mothroach, +/obj/structure/sign/poster/official/moth5{ + pixel_x = 32 + }, +/obj/machinery/conveyor{ + dir = 10; + id = "HB" + }, +/turf/open/floor/plating, +/area/security/prison) "tUl" = ( /turf/open/floor/plasteel/sepia, /area/quartermaster/warehouse) @@ -63875,6 +63828,20 @@ }, /turf/open/floor/wood, /area/library) +"tXN" = ( +/mob/living/basic/mothroach, +/obj/structure/sign/poster/official/moth2{ + pixel_y = 32 + }, +/obj/structure/sign/poster/official/moth4{ + pixel_x = 32 + }, +/obj/machinery/conveyor{ + dir = 6; + id = "HB" + }, +/turf/open/floor/plating, +/area/security/prison) "tYb" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -64981,6 +64948,10 @@ }, /turf/open/floor/plating, /area/security/courtroom) +"uog" = ( +/obj/item/rollerbed, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "uoh" = ( /obj/structure/curtain, /turf/open/floor/noslip/standard, @@ -68290,6 +68261,21 @@ }, /turf/open/floor/plasteel/white, /area/crew_quarters/kitchen) +"vpq" = ( +/mob/living/basic/mothroach, +/obj/structure/sign/poster/official/moth1{ + pixel_y = 32 + }, +/obj/structure/sign/poster/official/moth3{ + pixel_x = -32 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "HB" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/security/prison) "vpz" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #3"; @@ -68315,6 +68301,11 @@ }, /turf/open/floor/circuit, /area/ai_monitored/storage/satellite) +"vqu" = ( +/mob/living/basic/cockroach, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/vacant_room/office) "vqC" = ( /obj/effect/turf_decal/tile/dark_blue/fourcorners/contrasted{ alpha = 180 @@ -68919,6 +68910,15 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, /area/maintenance/department/security) +"vCx" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse, +/turf/open/floor/plasteel, +/area/engine/atmos) "vCB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -73789,11 +73789,6 @@ }, /turf/open/floor/plasteel/grid/steel, /area/medical/virology) -"xfE" = ( -/mob/living/simple_animal/cockroach, -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating, -/area/maintenance/department/science) "xfN" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -74285,6 +74280,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"xnK" = ( +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/dead_body_placer/medbay_morgue, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "xnN" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -98440,7 +98440,7 @@ cxk cxk cxk vJE -fVO +tnB dDa rBF cMW @@ -99211,7 +99211,7 @@ cxk cxk cxk xnQ -dHb +eWg hle uZf cMW @@ -99733,7 +99733,7 @@ qce cCS xzi eRd -rcN +iHr tIR cCS cCS @@ -99939,10 +99939,10 @@ kRU qdN bPe woY -eEl -jdx -sYX -bsS +vpq +spI +hrp +ely tXw dlI oZB @@ -99986,7 +99986,7 @@ uer cCS sBR dkh -xfE +niE cCS jMi hsr @@ -100196,10 +100196,10 @@ dUK tpT woW woY -cEj -qBe -rHU -mJu +tXN +jPX +mhz +tUj tXw tyK nAB @@ -102073,7 +102073,7 @@ qZZ wyu vHW qaH -kIV +fKp jPZ ycb xbP @@ -103277,7 +103277,7 @@ vHl nKF fHK qyI -myC +jAx xoe pSN kVe @@ -103619,7 +103619,7 @@ aEY lXr wfM eCS -psU +cEF qZZ qZZ wqs @@ -104091,7 +104091,7 @@ cFQ clo vhr xGG -fXR +bRf pzH rde eyH @@ -104369,7 +104369,7 @@ bek fAl rkH oDO -qkG +jFg lOO irK can @@ -105058,7 +105058,7 @@ gsA uYx tqK hsz -eOo +pEP uYx ovo ovo @@ -105871,7 +105871,7 @@ aGC vEI ijJ cbJ -pmr +jap oKM pis sNq @@ -106901,7 +106901,7 @@ gRs deu rsi gTU -fzD +vqu gTU hfC hOZ @@ -107205,7 +107205,7 @@ wkj lWC iEd yht -nFB +cdH slN jcW otr @@ -108741,7 +108741,7 @@ ngO msF wFI wzQ -qVp +iqZ hwg xyQ cKp @@ -111517,7 +111517,7 @@ gCb qsq smT tib -gew +dWQ wlS gGU jFh @@ -113315,7 +113315,7 @@ nFn nFn dnb nFn -gvc +bib eQz aue srO @@ -113587,7 +113587,7 @@ dFC xgu eGd guk -rso +xnK nOM jkr maA @@ -114065,7 +114065,7 @@ vtI vtI iAG cuo -onr +dIZ dsp iMw mVN @@ -114357,8 +114357,8 @@ dFC dFC dFC eGd -sbX -gnr +nnt +fRl uff gKg wFR @@ -114873,7 +114873,7 @@ boh eGd mcN nOM -rso +xnK eTl maA gdx @@ -115693,7 +115693,7 @@ xac nGy dhP wSy -aUl +vCx uIy kiZ sOJ @@ -115927,7 +115927,7 @@ wdZ bWm kII rAi -hEO +uog xWd iRY wAP @@ -116183,7 +116183,7 @@ bWm bWm bWm ciA -sSI +muZ bWl xWd iRY @@ -118500,7 +118500,7 @@ shZ dHW cMi dHW -jDC +cXE gLb xtQ xtQ @@ -120298,7 +120298,7 @@ bSm tfq dHW dHW -jDC +cXE dHW dHW gLb diff --git a/beestation.dme b/beestation.dme index 2f3fdc131491f..540efb79906b9 100644 --- a/beestation.dme +++ b/beestation.dme @@ -43,6 +43,7 @@ #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\balloon_alert.dm" #include "code\__DEFINES\bans.dm" +#include "code\__DEFINES\basic_mobs.dm" #include "code\__DEFINES\bitfields.dm" #include "code\__DEFINES\blood.dm" #include "code\__DEFINES\bodyparts.dm" @@ -545,9 +546,22 @@ #include "code\datums\ai\_item_behaviors.dm" #include "code\datums\ai\generic_actions.dm" #include "code\datums\ai\telegraph_effects.dm" +#include "code\datums\ai\basic_mobs\base_basic_controller.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\basic_attacking.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\targetting.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\simple_attack_target.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_target.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\speech_subtree.dm" +#include "code\datums\ai\basic_mobs\targetting_datums\basic_targetting_datum.dm" #include "code\datums\ai\dog\dog_behaviors.dm" #include "code\datums\ai\dog\dog_controller.dm" #include "code\datums\ai\dog\dog_subtrees.dm" +#include "code\datums\ai\hunting_behavior\hunting_behaviors.dm" +#include "code\datums\ai\hunting_behavior\hunting_vermin.dm" +#include "code\datums\ai\idle_behaviors\_idle_behavior.dm" +#include "code\datums\ai\idle_behaviors\idle_dog.dm" +#include "code\datums\ai\idle_behaviors\idle_monkey.dm" +#include "code\datums\ai\idle_behaviors\idle_random_walk.dm" #include "code\datums\ai\monkey\monkey_behaviors.dm" #include "code\datums\ai\monkey\monkey_controller.dm" #include "code\datums\ai\monkey\monkey_subtrees.dm" @@ -647,6 +661,7 @@ #include "code\datums\components\spill.dm" #include "code\datums\components\spinny.dm" #include "code\datums\components\spooky.dm" +#include "code\datums\components\squashable.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\swarming.dm" @@ -754,11 +769,14 @@ #include "code\datums\diseases\advance\symptoms\wizarditis.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\atmos_requirements.dm" +#include "code\datums\elements\basic_body_temp_sensitive.dm" #include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\climbable.dm" #include "code\datums\elements\connect_loc.dm" +#include "code\datums\elements\death_drops.dm" #include "code\datums\elements\decal.dm" #include "code\datums\elements\deferred_aquarium_content.dm" #include "code\datums\elements\digital_camo.dm" @@ -772,7 +790,9 @@ #include "code\datums\elements\mechanical_repair.dm" #include "code\datums\elements\mirage_border.dm" #include "code\datums\elements\openspace_item_click_handler.dm" +#include "code\datums\elements\pet_bonus.dm" #include "code\datums\elements\point_of_interest.dm" +#include "code\datums\elements\ranged_attacks.dm" #include "code\datums\elements\rust.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\strippable.dm" @@ -2879,6 +2899,11 @@ #include "code\modules\mob\living\status_procs.dm" #include "code\modules\mob\living\taste.dm" #include "code\modules\mob\living\ventcrawling.dm" +#include "code\modules\mob\living\basic\basic.dm" +#include "code\modules\mob\living\basic\basic_defense.dm" +#include "code\modules\mob\living\basic\health_adjustment.dm" +#include "code\modules\mob\living\basic\vermin\cockroach.dm" +#include "code\modules\mob\living\basic\vermin\mothroach.dm" #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\brain_item.dm" #include "code\modules\mob\living\brain\death.dm" @@ -3058,7 +3083,6 @@ #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\dog.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" @@ -3066,7 +3090,6 @@ #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\hamster.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mothroach.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index 78a12fa15ba9e..a95ff76239202 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -176,6 +176,7 @@ ///Hunting BB keys #define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" +#define BB_LOW_PRIORITY_HUNTING_TARGET "BB_low_priority_hunting_target" #define BB_HUNTING_COOLDOWN "BB_HUNTING_COOLDOWN" ///Basic Mob Keys diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm new file mode 100644 index 0000000000000..fcaccc092f4e9 --- /dev/null +++ b/code/__DEFINES/basic_mobs.dm @@ -0,0 +1,4 @@ +#define BASIC_MOB_MAX_STAMINALOSS 200 + +///Basic mob flags +#define DEL_ON_DEATH (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_atom.dm b/code/__DEFINES/dcs/signals/signals_atom.dm index 954d2394ee2a5..7e4dfd2a96b46 100644 --- a/code/__DEFINES/dcs/signals/signals_atom.dm +++ b/code/__DEFINES/dcs/signals/signals_atom.dm @@ -20,6 +20,9 @@ #define EXAMINE_POSITION_BEFORE (1<<1) //End positions #define COMPONENT_EXNAME_CHANGED (1<<0) +//from base of atom/attack_basic_mob(): (/mob/user) +#define COMSIG_ATOM_ATTACK_BASIC_MOB "attack_basic_mob" + /// from base of [/atom/proc/update_appearance]: (updates) #define COMSIG_ATOM_UPDATE_APPEARANCE "atom_update_appearance" /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its name. diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index 88bfef8c10029..a089a3995c0f7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -26,6 +26,8 @@ #define SINGULARITY_TRY_MOVE_BLOCK (1 << 0) #define COMSIG_LIVING_CAN_TRACK "mob_can_track" ///from base of /mob/living/can_track() #define COMPONENT_CANT_TRACK 1 +/// from start of /mob/living/handle_breathing(): (delta_time, times_fired) +#define COMSIG_LIVING_HANDLE_BREATHING "living_handle_breathing" //ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! #define COMSIG_LIVING_STATUS_STUN "living_stun" //! from base of mob/living/Stun() (amount, update, ignore) @@ -45,3 +47,7 @@ #define STOP_WABBAJACK (1 << 0) ///From wabbajack(): (mob/living/new_mob) #define COMSIG_LIVING_ON_WABBAJACKED "living_wabbajacked" + +// basic mob signals +/// Called on /basic when updating its speed, from base of /mob/living/basic/update_basic_mob_varspeed(): () +#define POST_BASIC_MOB_UPDATE_VARSPEED "post_basic_mob_update_varspeed" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 63efa7e1f4533..1e650b93c7e30 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -402,6 +402,13 @@ ///How much a mob's sprite should be moved when they're lying down #define PIXEL_Y_OFFSET_LYING -6 +///Squash flags. For squashable element + +///Whether or not the squashing requires the squashed mob to be lying down +#define SQUASHED_SHOULD_BE_DOWN (1<<0) +///Whether or not to gib when the squashed mob is moved over +#define SQUASHED_SHOULD_BE_GIBBED (1<<0) + //Body sizes #define BODY_SIZE_NORMAL 1 #define BODY_SIZE_SHORT 0.93 diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 9cb4d24c0c3ab..f238f7cca71c6 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -50,6 +50,7 @@ #define MOVESPEED_ID_CHANGELING_MUSCLES "CHANGELING_MUSCLES" +#define MOVESPEED_ID_BASIC_MOB_VARSPEED "BASIC_MOB_VARSPEED_MODIFIER" #define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER" #define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index c85749be35acb..fd7679d468711 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -458,14 +458,20 @@ GLOBAL_LIST_EMPTY(species_list) mob_spawn_meancritters += T if(FRIENDLY_SPAWN) mob_spawn_nicecritters += T + for(var/mob/living/basic/basic_mob as anything in typesof(/mob/living/basic)) + switch(initial(basic_mob.gold_core_spawnable)) + if(HOSTILE_SPAWN) + mob_spawn_meancritters += basic_mob + if(FRIENDLY_SPAWN) + mob_spawn_nicecritters += basic_mob var/chosen if(mob_class == FRIENDLY_SPAWN) chosen = pick(mob_spawn_nicecritters) else chosen = pick(mob_spawn_meancritters) - var/mob/living/simple_animal/C = new chosen(spawn_location) - return C + var/mob/living/spawned_mob = new chosen(spawn_location) + return spawned_mob /proc/passtable_on(target, source) var/mob/living/L = target diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index 336189bfb5c22..316e073c49a52 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -26,6 +26,7 @@ /turf/open = "OPEN", /turf/closed = "CLOSED", /turf = "T", + /mob/living/basic = "BASIC_MOB", /mob/living/carbon = "CARBON", /mob/living/simple_animal = "SIMPLE", /mob/living = "LIVING", diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index a9fddf5ee1688..b550262dce4fe 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -141,6 +141,12 @@ else return ..() +/mob/living/basic/attacked_by(obj/item/I, mob/living/user) + if(!attack_threshold_check(I.force, I.damtype, MELEE, FALSE)) + playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), TRUE, -1) + else + return ..() + // Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. // Click parameters is the params string from byond Click() code, see that documentation. /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 94fa29b272016..e2a4f96ce9e32 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -114,6 +114,10 @@ SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) return +/atom/proc/attack_basic_mob(mob/user) + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_BASIC_MOB, user) + return + /mob/living/RestrainedClickOn(atom/A) return diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 00d0937bf7aa4..f7abdcdc659c6 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -32,6 +32,9 @@ multiple modular subtrees with behaviors ///All subtrees this AI has available, will run them in order, so make sure they're in the order you want them to run. On initialization of this type, it will start as a typepath(s) and get converted to references of ai_subtrees found in SSai_controllers when init_subtrees() is called var/list/planning_subtrees + ///The idle behavior this AI preforms when it has no actions. + var/datum/idle_behavior/idle_behavior = null + // Movement related things here ///Reference to the movement datum we use. Is a type on initialize but becomes a ref afterwards. var/datum/ai_movement/ai_movement = /datum/ai_movement/dumb @@ -48,6 +51,9 @@ multiple modular subtrees with behaviors change_ai_movement_type(ai_movement) init_subtrees() + if(idle_behavior) + idle_behavior = new idle_behavior() + PossessPawn(new_pawn) /datum/ai_controller/Destroy(force, ...) @@ -128,8 +134,8 @@ multiple modular subtrees with behaviors SSmove_manager.stop_looping(pawn) //stop moving return //this should remove them from processing in the future through event-based stuff. - if(!LAZYLEN(current_behaviors)) - PerformIdleBehavior(delta_time) //Do some stupid shit while we have nothing to do + if(!LAZYLEN(current_behaviors) && idle_behavior) + idle_behavior.perform_idle_behavior(delta_time, src) //Do some stupid shit while we have nothing to do return if(current_movement_target && get_dist(pawn, current_movement_target) > max_target_distance) //The distance is out of range @@ -172,10 +178,6 @@ multiple modular subtrees with behaviors ProcessBehavior(action_delta_time, current_behavior) return -///Perform some dumb idle behavior. -/datum/ai_controller/proc/PerformIdleBehavior(delta_time) - return - ///This is where you decide what actions are taken by the AI. /datum/ai_controller/proc/SelectBehaviors(delta_time) SHOULD_NOT_SLEEP(TRUE) //Fuck you don't sleep in procs like this. diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm new file mode 100644 index 0000000000000..ad50572c39f78 --- /dev/null +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -0,0 +1,26 @@ +/datum/ai_controller/basic_controller + movement_delay = 0.4 SECONDS + +/datum/ai_controller/basic_controller/TryPossessPawn(atom/new_pawn) + if(!isbasicmob(new_pawn)) + return AI_CONTROLLER_INCOMPATIBLE + var/mob/living/basic/basic_mob = new_pawn + + update_speed(basic_mob) + + RegisterSignal(basic_mob, POST_BASIC_MOB_UPDATE_VARSPEED, PROC_REF(update_speed)) + + return ..() //Run parent at end + + +/datum/ai_controller/basic_controller/able_to_run() + . = ..() + if(isliving(pawn)) + var/mob/living/living_pawn = pawn + if(IS_DEAD_OR_INCAP(living_pawn)) + return FALSE + return TRUE + +/datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob) + SIGNAL_HANDLER + movement_delay = basic_mob.cached_multiplicative_slowdown diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm new file mode 100644 index 0000000000000..624cf0d60d65c --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -0,0 +1,67 @@ +/datum/ai_behavior/basic_melee_attack + action_cooldown = 0.6 SECONDS + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + controller.current_movement_target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] //Hiding location is priority + +/datum/ai_behavior/basic_melee_attack/perform(delta_time, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/mob/living/basic/basic_mob = controller.pawn + var/atom/target = controller.blackboard[target_key] + var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + + if(!targetting_datum.can_attack(basic_mob, target)) + finish_action(controller, FALSE, target_key) + return + + var/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! + + controller.blackboard[hiding_location_key] = hiding_target + + if(hiding_target) //Slap it! + basic_mob.melee_attack(hiding_target) + else + basic_mob.melee_attack(target) + + +/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) + . = ..() + if(!succeeded) + controller.blackboard -= target_key + +/datum/ai_behavior/basic_ranged_attack + action_cooldown = 0.6 SECONDS + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 3 + +/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + controller.current_movement_target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] //Hiding location is priority + + +/datum/ai_behavior/basic_ranged_attack/perform(delta_time, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/mob/living/basic/basic_mob = controller.pawn + var/atom/target = controller.blackboard[target_key] + var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + + + if(!targetting_datum.can_attack(basic_mob, target)) + finish_action(controller, FALSE, target_key) + return + + var/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! + + controller.blackboard[hiding_location_key] = hiding_target + + if(hiding_target) //Shoot it! + basic_mob.RangedAttack(hiding_target) + else + basic_mob.RangedAttack(target) + +/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) + . = ..() + if(!succeeded) + controller.blackboard -= target_key diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm new file mode 100644 index 0000000000000..63a9ee83bb071 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm @@ -0,0 +1,46 @@ +/datum/ai_behavior/find_potential_targets + action_cooldown = 2 SECONDS + /// How far can we see stuff? + var/vision_range = 9 + /// Static typecache list of potentially dangerous objs + var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha)) + +/datum/ai_behavior/find_potential_targets/perform(delta_time, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/list/potential_targets + var/mob/living/living_mob = controller.pawn + var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + + if(!targetting_datum) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + + potential_targets = hearers(vision_range, controller.pawn) - living_mob //Remove self, so we don't suicide + + for(var/HM in typecache_filter_list(range(vision_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, vision_range)) + potential_targets += HM + + if(!potential_targets.len) + finish_action(controller, FALSE) + return + + var/list/filtered_targets = list() + + for(var/atom/pot_target in potential_targets) + if(targetting_datum.can_attack(living_mob, pot_target))//Can we attack it? + filtered_targets += pot_target + continue + + if(!filtered_targets.len) + finish_action(controller, FALSE) + return + + var/atom/target = pick(filtered_targets) + controller.blackboard[target_key] = target + + var/atom/potential_hiding_location = targetting_datum.find_hidden_mobs(living_mob, target) + + if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. + controller.blackboard[hiding_location_key] = potential_hiding_location + + finish_action(controller, TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm new file mode 100644 index 0000000000000..56893ce767ee5 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm @@ -0,0 +1,22 @@ +/datum/ai_planning_subtree/basic_melee_attack_subtree + var/datum/ai_behavior/basic_melee_attack/melee_attack_behavior = /datum/ai_behavior/basic_melee_attack + +/datum/ai_planning_subtree/basic_melee_attack_subtree/SelectBehaviors(datum/ai_controller/controller, delta_time) + . = ..() + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!target || QDELETED(target)) + return + controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. + +//If you give this to something without the element you are a dumbass. +/datum/ai_planning_subtree/basic_ranged_attack_subtree + var/datum/ai_behavior/basic_ranged_attack/ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/SelectBehaviors(datum/ai_controller/controller, delta_time) + . = ..() + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!target || QDELETED(target)) + return + controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm new file mode 100644 index 0000000000000..f6ad41d4e01d0 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -0,0 +1,9 @@ +/datum/ai_planning_subtree/simple_find_target + +/datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, delta_time) + . = ..() + var/datum/weakref/weak_target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + var/atom/target = weak_target?.resolve() + if(!QDELETED(target)) + return + controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm new file mode 100644 index 0000000000000..2621efabb7eec --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -0,0 +1,43 @@ +/datum/ai_planning_subtree/random_speech + //The chance of an emote occuring each second + var/speech_chance = 0 + ///Hearable emotes + var/list/emote_hear = list() + ///Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps + var/list/emote_see = list() + ///Possible lines of speech the AI can have + var/list/speak = list() + +/datum/ai_planning_subtree/random_speech/New() + . = ..() + if(speak) + speak = string_list(speak) + if(emote_hear) + emote_hear = string_list(emote_hear) + if(emote_see) + emote_see = string_list(emote_see) + +/datum/ai_planning_subtree/random_speech/SelectBehaviors(datum/ai_controller/controller, delta_time) + if(DT_PROB(speech_chance, delta_time)) + var/audible_emotes_length = emote_hear?.len + var/non_audible_emotes_length = emote_see?.len + var/speak_lines_length = speak?.len + + var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length + + var/random_number_in_range = rand(1, total_choices_length) + + if(random_number_in_range <= audible_emotes_length) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear)) + else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) + else + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak)) + +/datum/ai_planning_subtree/random_speech/cockroach + speech_chance = 1 + emote_hear = list("chitters.") + +/datum/ai_planning_subtree/random_speech/mothroach + speech_chance = 2 + emote_hear = list("flutters.", "flaps its wings.", "flaps its wings agressively!") diff --git a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm new file mode 100644 index 0000000000000..5aa2aafdf66e0 --- /dev/null +++ b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm @@ -0,0 +1,56 @@ +///Datum for basic mobs to define what they can attack. +/datum/targetting_datum + +///Returns true or false depending on if the target can be attacked by the mob +/datum/targetting_datum/proc/can_attack(mob/living/living_mob, atom/target) + return + +///Returns something the target might be hiding inside of +/datum/targetting_datum/proc/find_hidden_mobs(mob/living/living_mob, atom/target) + var/atom/target_hiding_location + if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper)) + target_hiding_location = target.loc + return target_hiding_location + +/datum/targetting_datum/basic + /// When we do our basic faction check, do we look for exact faction matches? + var/check_factions_exactly = FALSE + +/datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target) + if(isturf(the_target) || !the_target) // bail out on invalids + return FALSE + + if(ismob(the_target)) //Target is in godmode, ignore it. + var/mob/M = the_target + if(M.status_flags & GODMODE) + return FALSE + + if(living_mob.see_invisible < the_target.invisibility)//Target's invisible to us, forget it + return FALSE + + if(living_mob.get_virtual_z_level() != the_target.get_virtual_z_level()) + return FALSE + + if(isliving(the_target)) //Targetting vs living mobs + var/mob/living/L = the_target + var/faction_check = living_mob.faction_check_mob(L, exact_match = check_factions_exactly) + if(faction_check || L.stat) + return FALSE + return TRUE + + if(ismecha(the_target)) //Targetting vs mechas + var/obj/mecha/M = the_target + if(can_attack(living_mob, M.occupant)) //Can we attack any of the occupants? + return TRUE + + if(istype(the_target, /obj/machinery/porta_turret)) //Cringe turret! kill it! + var/obj/machinery/porta_turret/P = the_target + if(P.in_faction(living_mob)) //Don't attack if the turret is in the same faction + return FALSE + if(P.has_cover && !P.raised) //Don't attack invincible turrets + return FALSE + if(P.machine_stat & BROKEN) //Or turrets that are already broken + return FALSE + return TRUE + + return FALSE diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm index 60c60214dff75..d0af81326a186 100644 --- a/code/datums/ai/dog/dog_behaviors.dm +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -62,7 +62,7 @@ var/atom/pawn = controller.pawn pawn.visible_message("[pawn] drops [carried_item].") carried_item.forceMove(get_turf(pawn)) - controller.blackboard[BB_SIMPLE_CARRY_ITEM] = null + controller.blackboard -= BB_SIMPLE_CARRY_ITEM return TRUE diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index e493e88f6c0e3..2808472f2f4f7 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -9,6 +9,7 @@ BB_DOG_PLAYING_DEAD = FALSE,\ BB_DOG_HARASS_TARGET = null) ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_dog planning_subtrees = list(/datum/ai_planning_subtree/dog) COOLDOWN_DECLARE(heel_cooldown) @@ -55,30 +56,6 @@ return simple_pawn.access_card -/datum/ai_controller/dog/PerformIdleBehavior(delta_time) - var/mob/living/living_pawn = pawn - if(!isturf(living_pawn.loc) || living_pawn.pulledby) - return - - // if we were just ordered to heel, chill out for a bit - if(!COOLDOWN_FINISHED(src, heel_cooldown)) - return - - // if we're just ditzing around carrying something, occasionally print a message so people know we have something - if(blackboard[BB_SIMPLE_CARRY_ITEM] && DT_PROB(5, delta_time)) - var/obj/item/carry_item = blackboard[BB_SIMPLE_CARRY_ITEM] - living_pawn.visible_message("[living_pawn] gently teethes on \the [carry_item] in [living_pawn.p_their()] mouth.", vision_distance=COMBAT_MESSAGE_RANGE) - - if(DT_PROB(5, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE)) - var/move_dir = pick(GLOB.alldirs) - living_pawn.Move(get_step(living_pawn, move_dir), move_dir) - else if(DT_PROB(10, delta_time)) - living_pawn.manual_emote(pick("dances around.", "chases [living_pawn.p_their()] tail!")) - living_pawn.AddComponent(/datum/component/spinny) - for(var/mob/living/carbon/human/H in oviewers(living_pawn)) - if(H.mind) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "animal_play", /datum/mood_event/animal_play, living_pawn) - /// Someone has thrown something, see if it's someone we care about and start listening to the thrown item so we can see if we want to fetch it when it lands /datum/ai_controller/dog/proc/listened_throw(datum/source, mob/living/carbon/carbon_thrower) SIGNAL_HANDLER diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm new file mode 100644 index 0000000000000..1cd4e8dab2d0a --- /dev/null +++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm @@ -0,0 +1,133 @@ + +/** + * Tells the AI to find a certain target nearby to hunt. + * If a target has been found, we will start to move towards it, and eventually attack it. + */ +/datum/ai_planning_subtree/find_and_hunt_target + /// What key in the blacbkboard do we store our hunting target? + /// If you want to have multiple hunting behaviors on a controller be sure that this is unique + var/target_key = BB_CURRENT_HUNTING_TARGET + /// What behavior to execute if we have no target + var/datum/ai_behavior/finding_behavior = /datum/ai_behavior/find_hunt_target + /// What behavior to execute if we do have a target + var/datum/ai_behavior/hunting_behavior = /datum/ai_behavior/hunt_target + /// What targets we're hunting for + var/list/hunt_targets + /// In what radius will we hunt + var/hunt_range = 2 + /// What are the chances we hunt something at any given moment + var/hunt_chance = 100 + +/datum/ai_planning_subtree/find_and_hunt_target/New() + . = ..() + hunt_targets = typecacheof(hunt_targets) + +/datum/ai_planning_subtree/find_and_hunt_target/SelectBehaviors(datum/ai_controller/controller, delta_time) + if(!DT_PROB(hunt_chance, delta_time)) + return + if(controller.blackboard[BB_HUNTING_COOLDOWN] >= world.time) + return + + var/mob/living/living_pawn = controller.pawn + // We can't hunt if we're indisposed + if(living_pawn.stat != CONSCIOUS) + return + + // We're targeting something else for another reason + var/datum/weakref/target_weakref = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + var/atom/target = target_weakref?.resolve() + if(!QDELETED(target)) + return + + var/datum/weakref/hunting_weakref = controller.blackboard[target_key] + var/atom/hunted = hunting_weakref?.resolve() + + // We're not hunting anything, look around for something + if(QDELETED(hunted)) + controller.queue_behavior(finding_behavior, target_key, hunt_targets, hunt_range) + + else + // We ARE hunting something, execute the hunt. + // Note that if our AI controller has multiple hunting subtrees set, + // we may accidentally be executing another tree's hunt - not ideal, + // try to set a unique target key if you have multiple + controller.queue_behavior(hunting_behavior, target_key, BB_HUNTING_COOLDOWN) + return SUBTREE_RETURN_FINISH_PLANNING //If we're hunting we're too busy for anything else + +/// Finds a specific atom type to hunt. +/datum/ai_behavior/find_hunt_target + +/datum/ai_behavior/find_hunt_target/perform(delta_time, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range) + . = ..() + + var/mob/living/living_mob = controller.pawn + + for(var/atom/possible_dinner as anything in typecache_filter_list(range(hunt_range, living_mob), types_to_hunt)) + if(!valid_dinner(living_mob, possible_dinner, hunt_range)) + continue + controller.blackboard[hunting_target_key] = WEAKREF(possible_dinner) + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + +/datum/ai_behavior/find_hunt_target/proc/valid_dinner(mob/living/source, atom/dinner, radius) + if(isliving(dinner)) + var/mob/living/living_target = dinner + if(living_target.stat == DEAD) //bitch is dead + return FALSE + + return can_see(source, dinner, radius) + +/// Hunts down a specific atom type. +/datum/ai_behavior/hunt_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + /// How long do we have to wait after a successful hunt? + var/hunt_cooldown = 5 SECONDS + /// What emote is said when the hunter eats something? + var/hunt_emote = "chomps" + +/datum/ai_behavior/hunt_target/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + . = ..() + var/datum/weakref/hunting_weakref = controller.blackboard[hunting_target_key] + controller.current_movement_target = hunting_weakref?.resolve() + +/datum/ai_behavior/hunt_target/perform(delta_time, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + . = ..() + var/mob/living/hunter = controller.pawn + var/datum/weakref/hunting_weakref = controller.blackboard[hunting_target_key] + var/atom/hunted = hunting_weakref?.resolve() + + if(QDELETED(hunted)) + //Target is gone for some reason. forget about this task! + controller[hunting_target_key] = null + finish_action(controller, FALSE, hunting_target_key) + return + + target_caught(hunter, hunted) + finish_action(controller, TRUE, hunting_target_key, hunting_cooldown_key) + +/datum/ai_behavior/hunt_target/proc/target_caught(mob/living/hunter, atom/hunted) + if(isliving(hunted)) // Are we hunting a living mob? + var/mob/living/living_target = hunted + hunter.manual_emote("[hunt_emote] [living_target]!") + living_target.death() + + else if(IS_EDIBLE(hunted)) + hunter.attack_animal(hunter) + + else // We're hunting an object, and should delete it instead of killing it. Mostly useful for decal bugs like ants or spider webs. + hunter.manual_emote("[hunt_emote] [hunted]!") + qdel(hunted) + +/datum/ai_behavior/hunt_target/finish_action(datum/ai_controller/controller, succeeded, hunting_target_key, hunting_cooldown_key) + . = ..() + if(succeeded) + controller.blackboard[hunting_cooldown_key] = world.time + hunt_cooldown + else if(hunting_target_key) + controller.blackboard[hunting_target_key] = null + +/datum/ai_behavior/hunt_target/unarmed_attack_target + +/datum/ai_behavior/hunt_target/unarmed_attack_target/target_caught(mob/living/hunter, obj/structure/cable/hunted) + hunter.UnarmedAttack(hunted, TRUE) diff --git a/code/datums/ai/hunting_behavior/hunting_vermin.dm b/code/datums/ai/hunting_behavior/hunting_vermin.dm new file mode 100644 index 0000000000000..85770988b3e5d --- /dev/null +++ b/code/datums/ai/hunting_behavior/hunting_vermin.dm @@ -0,0 +1,11 @@ +/datum/ai_planning_subtree/find_and_hunt_target/cockroach + hunt_targets = list(/obj/effect/decal/cleanable/food) //Bee Edit: We don't have ants yet July 2023, sorry. Also hi!!! + +/datum/ai_planning_subtree/find_and_hunt_target/mothroach + hunt_range = 3 + hunt_targets = list(/obj/effect/decal/cleanable/cobweb, /obj/structure/spider/stickyweb) + hunting_behavior = /datum/ai_behavior/hunt_target/mothroach + +/datum/ai_behavior/hunt_target/mothroach + hunt_cooldown = 25 SECONDS + hunt_emote = "nibbles" diff --git a/code/datums/ai/idle_behaviors/_idle_behavior.dm b/code/datums/ai/idle_behaviors/_idle_behavior.dm new file mode 100644 index 0000000000000..a5ab827636a53 --- /dev/null +++ b/code/datums/ai/idle_behaviors/_idle_behavior.dm @@ -0,0 +1,4 @@ +/datum/idle_behavior + +/datum/idle_behavior/proc/perform_idle_behavior(delta_time, datum/ai_controller/controller) + return diff --git a/code/datums/ai/idle_behaviors/idle_dog.dm b/code/datums/ai/idle_behaviors/idle_dog.dm new file mode 100644 index 0000000000000..4156b2c023c1c --- /dev/null +++ b/code/datums/ai/idle_behaviors/idle_dog.dm @@ -0,0 +1,26 @@ +/datum/idle_behavior/idle_dog + +/datum/idle_behavior/idle_dog/perform_idle_behavior(delta_time, datum/ai_controller/dog/controller) + var/mob/living/living_pawn = controller.pawn + if(!isturf(living_pawn.loc) || living_pawn.pulledby) + return + + // if we were just ordered to heel, chill out for a bit + if(!COOLDOWN_FINISHED(controller, heel_cooldown)) + return + + // if we're just ditzing around carrying something, occasionally print a message so people know we have something + if(controller.blackboard[BB_SIMPLE_CARRY_ITEM] && DT_PROB(5, delta_time)) + var/obj/item/carry_item = controller.blackboard[BB_SIMPLE_CARRY_ITEM] + living_pawn.visible_message("[living_pawn] gently teethes on \the [carry_item] in [living_pawn.p_their()] mouth.", vision_distance=COMBAT_MESSAGE_RANGE) + + if(DT_PROB(5, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE)) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + else if(DT_PROB(10, delta_time)) + living_pawn.manual_emote(pick("dances around.", "chases [living_pawn.p_their()] tail!")) + living_pawn.AddComponent(/datum/component/spinny) + for(var/mob/living/carbon/human/H in oviewers(living_pawn)) + if(H.mind) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "animal_play", /datum/mood_event/animal_play, living_pawn) + diff --git a/code/datums/ai/idle_behaviors/idle_monkey.dm b/code/datums/ai/idle_behaviors/idle_monkey.dm new file mode 100644 index 0000000000000..aa43dff8944d6 --- /dev/null +++ b/code/datums/ai/idle_behaviors/idle_monkey.dm @@ -0,0 +1,10 @@ +/datum/idle_behavior/idle_monkey + +/datum/idle_behavior/idle_monkey/perform_idle_behavior(delta_time, datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + + if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + else if(DT_PROB(1, delta_time)) + INVOKE_ASYNC(living_pawn, TYPE_PROC_REF(/mob, emote), pick("scratch","jump","roll","tail")) diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm new file mode 100644 index 0000000000000..fa6dff67e9a50 --- /dev/null +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -0,0 +1,11 @@ +/datum/idle_behavior/idle_random_walk + ///Chance that the mob random walks per second + var/walk_chance = 25 + +/datum/idle_behavior/idle_random_walk/perform_idle_behavior(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + + if(DT_PROB(walk_chance, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 15a7da9020686..7e78dcdead3c0 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -24,6 +24,7 @@ have ways of interacting with a specific mob and control it. var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) + idle_behavior = /datum/idle_behavior/idle_monkey /datum/ai_controller/monkey/angry @@ -158,16 +159,6 @@ have ways of interacting with a specific mob and control it. return TRUE return FALSE -//When idle just kinda fuck around. -/datum/ai_controller/monkey/PerformIdleBehavior(delta_time) - var/mob/living/living_pawn = pawn - - if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) - var/move_dir = pick(GLOB.alldirs) - living_pawn.Move(get_step(living_pawn, move_dir), move_dir) - else if(DT_PROB(1, delta_time)) - INVOKE_ASYNC(living_pawn, TYPE_PROC_REF(/mob, emote), pick("scratch","jump","roll","tail")) - ///Reactive events to being hit /datum/ai_controller/monkey/proc/retaliate(mob/living/L) var/list/enemies = blackboard[BB_MONKEY_ENEMIES] diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index 41d9b8bf4a1f1..f2270a0d1a97e 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -16,7 +16,9 @@ controller.pathing_attempts = 0 moving_controllers -= controller - SSmove_manager.stop_looping(controller.pawn, SSai_movement) + // We got deleted as we finished an action + if(!QDELETED(controller.pawn)) + SSmove_manager.stop_looping(controller.pawn, SSai_movement) /datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller) controller.pathing_attempts++ diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm new file mode 100644 index 0000000000000..48cc9ef2905ad --- /dev/null +++ b/code/datums/components/squashable.dm @@ -0,0 +1,77 @@ +///This component allows something to be when crossed, for example for cockroaches. +/datum/component/squashable + ///Chance on crossed to be squashed + var/squash_chance = 50 + ///How much brute is applied when mob is squashed + var/squash_damage = 1 + ///Squash flags, for extra checks etcetera. + var/squash_flags = NONE + ///Special callback to call on squash instead, for things like hauberoach + var/datum/callback/on_squash_callback + ///signal list given to connect_loc + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + +/datum/component/squashable/Initialize(squash_chance, squash_damage, squash_flags, squash_callback) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if(squash_chance) + src.squash_chance = squash_chance + if(squash_damage) + src.squash_damage = squash_damage + if(squash_flags) + src.squash_flags = squash_flags + if(!src.on_squash_callback && squash_callback) + on_squash_callback = CALLBACK(parent, squash_callback) + + AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) + +/datum/component/squashable/UnregisterFromParent() + . = ..() + qdel(GetComponent(/datum/component/connect_loc_behalf)) + + +///Handles the squashing of the mob +/datum/component/squashable/proc/on_entered(datum/source, atom/movable/crossing_movable, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(parent == crossing_movable) + return + + var/mob/living/parent_as_living = parent + + if(squash_flags & SQUASHED_SHOULD_BE_DOWN && parent_as_living.resting) + return + + var/should_squash = prob(squash_chance) + + if(should_squash && on_squash_callback) + if(on_squash_callback.Invoke(parent_as_living, crossing_movable)) + return //Everything worked, we're done! + + if(isliving(crossing_movable)) + var/mob/living/crossing_mob = crossing_movable + if(crossing_mob.mob_size > MOB_SIZE_SMALL && !(crossing_mob.movement_type & FLYING)) + if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM)) + crossing_mob.visible_message("[crossing_mob] carefully steps over [parent_as_living].", "You carefully step over [parent_as_living] to avoid hurting it.") + return + if(should_squash) + crossing_mob.visible_message("[crossing_mob] squashed [parent_as_living].", "You squashed [parent_as_living].") + Squish(parent_as_living) + else + parent_as_living.visible_message("[parent_as_living] avoids getting crushed.") + + if(isstructure(crossing_movable) && !crossing_movable.anchored) + if(should_squash) + crossing_movable.visible_message("[parent_as_living] is crushed under [crossing_movable].") + Squish(parent_as_living) + else + parent_as_living.visible_message("[parent_as_living] avoids getting crushed.") + +/datum/component/squashable/proc/Squish(mob/living/target) + if(squash_flags & SQUASHED_SHOULD_BE_GIBBED) + target.gib() + else + target.adjustBruteLoss(squash_damage) diff --git a/code/datums/diseases/advance/symptoms/cockroach.dm b/code/datums/diseases/advance/symptoms/cockroach.dm index 1a91595ecfde7..b1317a0a93bea 100644 --- a/code/datums/diseases/advance/symptoms/cockroach.dm +++ b/code/datums/diseases/advance/symptoms/cockroach.dm @@ -45,7 +45,7 @@ if(prob(30)) M.visible_message("[M] squirms as a cockroach crawls from their pores!", \ "A cockroach crawls out of your face!!") - new /mob/living/simple_animal/cockroach(M.loc) + new /mob/living/basic/cockroach(M.loc) if(prob(50)) to_chat(M, "You feel something crawling in your pipes!") @@ -56,5 +56,5 @@ var/mob/living/M = A.affected_mob to_chat(M, "Your pores explode into a colony of roaches!") for(var/i in 1 to rand(1,5)) - new /mob/living/simple_animal/cockroach(M.loc) + new /mob/living/basic/cockroach(M.loc) diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm new file mode 100644 index 0000000000000..d944a4dbac53f --- /dev/null +++ b/code/datums/elements/atmos_requirements.dm @@ -0,0 +1,69 @@ + ///Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage + ///Leaving something at 0 means it's off - has no maximum. + + ///This damage is taken when atmos doesn't fit all the requirements above. + + +/** + * ## atmos requirements element! + * + * bespoke element that deals damage to the attached mob when the atmos requirements aren't satisfied + */ +/datum/element/atmos_requirements + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/list/atmos_requirements + var/unsuitable_atmos_damage + +/datum/element/atmos_requirements/Attach(datum/target, list/atmos_requirements, unsuitable_atmos_damage) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.atmos_requirements = string_assoc_list(atmos_requirements) + RegisterSignal(target, COMSIG_LIVING_HANDLE_BREATHING, PROC_REF(on_non_stasis_life)) + +/datum/element/atmos_requirements/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_LIVING_HANDLE_BREATHING) + +/datum/element/atmos_requirements/proc/on_non_stasis_life(mob/living/target, delta_time = SSMOBS_DT) + SIGNAL_HANDLER + if(is_breathable_atmos(target)) + target.clear_alert("not_enough_oxy") + return + target.adjustBruteLoss(unsuitable_atmos_damage * delta_time) + target.throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) + +/datum/element/atmos_requirements/proc/is_breathable_atmos(mob/living/target) + if(target.pulledby && target.pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) + return FALSE + + if(!isopenturf(target.loc)) + return TRUE + + var/turf/open/ST = target.loc + if(!ST.air && (atmos_requirements["min_oxy"] || atmos_requirements["min_tox"] || atmos_requirements["min_n2"] || atmos_requirements["min_co2"])) + return FALSE + + var/plas = ST.air.get_moles(GAS_PLASMA) + var/oxy = ST.air.get_moles(GAS_O2) + var/n2 = ST.air.get_moles(GAS_N2) + var/co2 = ST.air.get_moles(GAS_CO2) + + . = TRUE + if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) + . = FALSE + else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"]) + . = FALSE + else if(atmos_requirements["min_plas"] && plas < atmos_requirements["min_plas"]) + . = FALSE + else if(atmos_requirements["max_plas"] && plas > atmos_requirements["max_plas"]) + . = FALSE + else if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"]) + . = FALSE + else if(atmos_requirements["max_n2"] && n2 > atmos_requirements["max_n2"]) + . = FALSE + else if(atmos_requirements["min_co2"] && co2 < atmos_requirements["min_co2"]) + . = FALSE + else if(atmos_requirements["max_co2"] && co2 > atmos_requirements["max_co2"]) + . = FALSE diff --git a/code/datums/elements/basic_body_temp_sensitive.dm b/code/datums/elements/basic_body_temp_sensitive.dm new file mode 100644 index 0000000000000..44c26de8131a5 --- /dev/null +++ b/code/datums/elements/basic_body_temp_sensitive.dm @@ -0,0 +1,65 @@ +/** + * When attached to a basic mob, it gives it the ability to be hurt by cold body temperatures + */ +/datum/element/basic_body_temp_sensetive + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + + ///Min body temp + var/min_body_temp = 250 + ///Max body temp + var/max_body_temp = 350 + ////Damage when below min temp + var/cold_damage = 1 + ///Damage when above max temp + var/heat_damage = 1 + +/datum/element/basic_body_temp_sensetive/Attach(datum/target, min_body_temp, max_body_temp, cold_damage, heat_damage) + . = ..() + if(!isbasicmob(target)) + return ELEMENT_INCOMPATIBLE + + if(min_body_temp) + src.min_body_temp = min_body_temp + if(max_body_temp) + src.max_body_temp = max_body_temp + if(cold_damage) + src.cold_damage = cold_damage + if(heat_damage) + src.heat_damage = heat_damage + RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + +/datum/element/basic_body_temp_sensetive/Detach(datum/source) + if(source) + UnregisterSignal(source, COMSIG_LIVING_LIFE) + return ..() + + +/datum/element/basic_body_temp_sensetive/proc/on_life(datum/target, delta_time, times_fired) + var/mob/living/basic/basic_mob = target + var/gave_alert = FALSE + + if(basic_mob.bodytemperature < min_body_temp) + basic_mob.adjust_health(cold_damage * delta_time) + switch(cold_damage) + if(1 to 5) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/cold, 1) + if(5 to 10) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/cold, 2) + if(10 to INFINITY) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/cold, 3) + gave_alert = TRUE + + else if(basic_mob.bodytemperature > max_body_temp) + basic_mob.adjust_health(heat_damage * delta_time) + switch(heat_damage) + if(1 to 5) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/hot, 1) + if(5 to 10) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/hot, 2) + if(10 to INFINITY) + basic_mob.throw_alert("temp", /atom/movable/screen/alert/hot, 3) + gave_alert = TRUE + + if(!gave_alert) + basic_mob.clear_alert("temp") diff --git a/code/datums/elements/death_drops.dm b/code/datums/elements/death_drops.dm new file mode 100644 index 0000000000000..ea8abff07d3d9 --- /dev/null +++ b/code/datums/elements/death_drops.dm @@ -0,0 +1,34 @@ +/** + * ## death drops element! + * + * bespoke element that spawns loot when a mob is killed + */ +/datum/element/death_drops + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + ///what items the target drops when killed + var/list/loot + +/datum/element/death_drops/Attach(datum/target, list/loot) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + if(!loot) + stack_trace("death drops element added to [target] with NO LOOT") + if(!src.loot) + src.loot = loot.Copy() + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + +/datum/element/death_drops/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_LIVING_DEATH) + +///signal called by the stat of the target changing +/datum/element/death_drops/proc/on_death(mob/living/target, gibbed) + SIGNAL_HANDLER + for(var/thing_to_spawn in loot) + if(loot[thing_to_spawn]) //If this is an assoc list, use the value of that to get the right amount + for(var/index in 1 to loot[thing_to_spawn]) + new thing_to_spawn(target.drop_location()) + else + new thing_to_spawn(target.drop_location()) diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm new file mode 100644 index 0000000000000..6a36f768ad70c --- /dev/null +++ b/code/datums/elements/pet_bonus.dm @@ -0,0 +1,43 @@ +/** + * # Pet bonus element! + * + * Bespoke element that plays a fun message, sends a heart out, and gives a stronger mood bonus when you pet this animal. + * I may have been able to make this work for carbons, but it would have been interjecting on some help mode interactions anyways. + */ +/datum/element/pet_bonus + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + + ///optional cute message to send when you pet your pet! + var/emote_message + ///actual moodlet given, defaults to the pet animal one + var/moodlet + ///optional sound to play when your pet emotes + var/emote_sound + +/datum/element/pet_bonus/Attach(datum/target, emote_message, moodlet = /datum/mood_event/pet_animal, emote_sound = null) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.emote_message = emote_message + src.moodlet = moodlet + src.emote_sound = emote_sound + RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) + +/datum/element/pet_bonus/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_ATTACK_HAND) + +/datum/element/pet_bonus/proc/on_attack_hand(mob/living/pet, mob/living/petter) + SIGNAL_HANDLER + + if(pet.stat != CONSCIOUS || petter.a_intent != INTENT_HELP) + return + + new /obj/effect/temp_visual/heart(pet.loc) + if(emote_message && prob(33)) + pet.manual_emote(emote_message) + if(emote_sound) + playsound(get_turf(pet), emote_sound, 50, TRUE) + SEND_SIGNAL(petter, COMSIG_ADD_MOOD_EVENT, pet, moodlet, pet) diff --git a/code/datums/elements/ranged_attacks.dm b/code/datums/elements/ranged_attacks.dm new file mode 100644 index 0000000000000..dce2b80c92249 --- /dev/null +++ b/code/datums/elements/ranged_attacks.dm @@ -0,0 +1,52 @@ +//Bee edit: This was included in the basic mobs port, but we don't have glockroach so it is kept here in case we find an alternative or actually need it. + +///This proc is used by basic mobs to give them a simple ranged attack! In theory this could be extended to +// /datum/element/ranged_attacks +// element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE +// id_arg_index = 2 +// var/casingtype = /obj/item/ammo_casing/glockroach +// var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' +// var/projectiletype + +// /datum/element/ranged_attacks/Attach(atom/movable/target, casingtype, projectilesound, projectiletype) +// . = ..() +// if(!isbasicmob(target)) +// return COMPONENT_INCOMPATIBLE + +// src.casingtype = casingtype +// src.projectilesound = projectilesound +// src.projectiletype = projectiletype + +// RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, PROC_REF(fire_ranged_attack)) + +// if(casingtype && projectiletype) +// CRASH("Set both casing type and projectile type in [target]'s ranged attacks element! uhoh! stinky!") + +// /datum/element/ranged_attacks/Detach(datum/target) +// UnregisterSignal(target, COMSIG_MOB_ATTACK_RANGED) +// return ..() + +// /datum/element/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) +// SIGNAL_HANDLER +// INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) + + +// /datum/element/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) +// var/turf/startloc = get_turf(firer) + +// if(casingtype) +// var/obj/item/ammo_casing/casing = new casingtype(startloc) +// playsound(firer, projectilesound, 100, TRUE) +// casing.fire_casing(target, firer, null, null, null, ran_zone(), 0, firer) + +// else if(projectiletype) +// var/obj/projectile/P = new projectiletype(startloc) +// playsound(firer, projectilesound, 100, TRUE) +// P.starting = startloc +// P.firer = firer +// P.fired_from = firer +// P.yo = target.y - startloc.y +// P.xo = target.x - startloc.x +// P.original = target +// P.preparePixelProjectile(target, firer) +// P.fire() diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index bb33214859125..c9bca7be5b732 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -140,9 +140,9 @@ . = message_monkey else if(isipc(user) && message_ipc) . = message_ipc - else if((ismoth(user) || isapid(user) || isflyperson(user) || istype(user, /mob/living/simple_animal/mothroach)) && message_insect) + else if((ismoth(user) || isapid(user) || isflyperson(user)) && message_insect) . = message_insect - else if(isanimal(user) && message_simple) + else if((isanimal(user) || isbasicmob(user)) && message_simple) . = message_simple /datum/emote/proc/select_param(mob/user, params) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ebcba7ee02f77..2740ed4653b32 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -972,6 +972,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return ..() return 0 +/obj/item/attack_basic_mob(mob/living/basic/user) + if (obj_flags & CAN_BE_HIT) + return ..() + return 0 + /obj/item/mech_melee_attack(obj/mecha/M) return 0 diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 1468ad3d55343..7835f3f62aaf7 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -760,7 +760,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cockroach, + /mob/living/basic/cockroach, /obj/item/queen_bee )) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 7387b1e86cb9f..52fdb93c3f106 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -110,6 +110,18 @@ if(attack_generic(user, 60, BRUTE, MELEE, 0)) playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) +/obj/attack_basic_mob(mob/living/basic/user) + if(!user.melee_damage && !user.obj_damage) //No damage + user.emote("custom", message = "[user.friendly_verb_continuous] [src].") + return FALSE + else + if(user.obj_damage) + . = attack_generic(user, user.obj_damage, user.melee_damage_type, MELEE, TRUE, user.armour_penetration) + else + . = attack_generic(user, user.melee_damage, user.melee_damage_type, MELEE, TRUE, user.armour_penetration) + if(.) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage && !M.obj_damage) INVOKE_ASYNC(M, TYPE_PROC_REF(/mob, emote), "custom", null, "[M.friendly] [src].") diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 6dd9ab61567a2..fbef700866543 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -2713,7 +2713,7 @@ name = "Mothroach Crate" desc = "Put the mothroach on your head and find out what true cuteness looks like." cost = 5000 - contains = list(/mob/living/simple_animal/mothroach) + contains = list(/mob/living/basic/mothroach) crate_name = "mothroach crate" /datum/supply_pack/critter/monkey diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm new file mode 100644 index 0000000000000..de23dbb240c5d --- /dev/null +++ b/code/modules/mob/living/basic/basic.dm @@ -0,0 +1,164 @@ +///Simple animals 2.0, This time, let's really try to keep it simple. This basetype should purely be used as a base-level for implementing simplified behaviours for things such as damage and attacks. Everything else should be in components or AI behaviours. +/mob/living/basic + name = "basic mob" + icon = 'icons/mob/animal.dmi' + health = 20 + maxHealth = 20 + gender = PLURAL + status_flags = CANPUSH + + var/basic_mob_flags = NONE + + ///Defines how fast the basic mob can move. This is a multiplier + var/speed = 1 + ///How much stamina the mob recovers per second + var/stamina_recovery = 5 + + ///how much damage this basic mob does to objects, if any. + var/obj_damage = 0 + ///How much armour they ignore, as a flat reduction from the targets armour value. + var/armour_penetration = 0 + ///Damage type of a simple mob's melee attack, should it do damage. + var/melee_damage_type = BRUTE + ///How much wounding power it has + // var/wound_bonus = CANT_WOUND + ///How much bare wounding power it has + var/bare_wound_bonus = 0 + ///If the attacks from this are sharp + var/sharpness = NONE + + /// Sound played when the critter attacks. + var/attack_sound + /// Override for the visual attack effect shown on 'do_attack_animation()'. + var/attack_vis_effect + ///Played when someone punches the creature. + var/attacked_sound = "punch" //This should be an element + + ///What kind of objects this mob can smash. + var/environment_smash = ENVIRONMENT_SMASH_NONE + + /// 1 for full damage , 0 for none , -1 for 1:1 heal from that source. + var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + + ///Verbs used for speaking e.g. "Says" or "Chitters". This can be elementized + var/list/speak_emote = list() + + /// Minimum force required to deal any damage + var/force_threshold = 0 + + ///When someone interacts with the simple animal. + ///Help-intent verb in present continuous tense. + var/response_help_continuous = "pokes" + ///Help-intent verb in present simple tense. + var/response_help_simple = "poke" + ///Disarm-intent verb in present continuous tense. + var/response_disarm_continuous = "shoves" + ///Disarm-intent verb in present simple tense. + var/response_disarm_simple = "shove" + ///Harm-intent verb in present continuous tense. + var/response_harm_continuous = "hits" + ///Harm-intent verb in present simple tense. + var/response_harm_simple = "hit" + + ///Basic mob's own attacks verbs, + ///Attacking verb in present continuous tense. + var/attack_verb_continuous = "attacks" + ///Attacking verb in present simple tense. + var/attack_verb_simple = "attack" + ///Attacking, but without damage, verb in present continuous tense. + var/friendly_verb_continuous = "nuzzles" + ///Attacking, but without damage, verb in present simple tense. + var/friendly_verb_simple = "nuzzle" + + ////////THIS SECTION COULD BE ITS OWN ELEMENT + ///Icon to use + var/icon_living = "" + ///Icon when the animal is dead. Don't use animated icons for this. + var/icon_dead = "" + ///We only try to show a gibbing animation if this exists. + var/icon_gib = null + ///Flip the sprite upside down on death. Mostly here for things lacking custom dead sprites. + var/flip_on_death = FALSE + + ///If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood. + var/gold_core_spawnable = NO_SPAWN + ///Sentience type, for slime potions. SHOULD BE AN ELEMENT BUT I DONT CARE ABOUT IT FOR NOW + var/sentience_type = SENTIENCE_ORGANIC + + + +/mob/living/basic/Initialize(mapload) + . = ..() + + if(gender == PLURAL) + gender = pick(MALE,FEMALE) + + if(!real_name) + real_name = name + + if(!loc) + stack_trace("Basic mob being instantiated in nullspace") + + update_basic_mob_varspeed() + + if(speak_emote) + speak_emote = string_list(speak_emote) + +/mob/living/basic/Life(delta_time = SSMOBS_DT, times_fired) + . = ..() + ///Automatic stamina re-gain + if(staminaloss > 0) + adjustStaminaLoss(-stamina_recovery * delta_time, FALSE, TRUE) + +/mob/living/basic/say_mod(input, list/message_mods = list()) + if(length(speak_emote)) + verb_say = pick(speak_emote) + return ..() + +/mob/living/basic/death(gibbed) + if(!gibbed) + if(!(basic_mob_flags & DEL_ON_DEATH)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, emote), "deathgasp") + + if(basic_mob_flags & DEL_ON_DEATH) + ..() + qdel(src) + return + else + health = 0 + icon_state = icon_dead + if(flip_on_death) + transform = transform.Turn(180) + set_density(FALSE) + ..() + +// copied from simplemobs +/mob/living/basic/revive(full_heal = 0, admin_revive = 0) + if(..()) //successfully ressuscitated from death + icon = initial(icon) + icon_state = icon_living + set_density(initial(density)) + mobility_flags = MOBILITY_FLAGS_DEFAULT + update_mobility() + . = 1 + setMovetype(initial(movement_type)) + +/mob/living/basic/proc/melee_attack(atom/target) + src.face_atom(target) + // if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target) & COMPONENT_HOSTILE_NO_ATTACK) + // return FALSE //but more importantly return before attack_animal called + var/result = target.attack_basic_mob(src) + // SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result) //Bee edit: We don't have pre_attackingtarget nor hostile simplemobs, so I'll just leave these here for anyone who stumbles upon this down the line + return result + +/mob/living/basic/proc/set_varspeed(var_value) + speed = var_value + update_basic_mob_varspeed() + +/mob/living/basic/proc/update_basic_mob_varspeed() + if(speed == 0) + // remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed) + remove_movespeed_modifier(MOVESPEED_ID_BASIC_MOB_VARSPEED, TRUE) + // remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) + add_movespeed_modifier(MOVESPEED_ID_BASIC_MOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE) + SEND_SIGNAL(src, POST_BASIC_MOB_UPDATE_VARSPEED) diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm new file mode 100644 index 0000000000000..ac5c261a85a6f --- /dev/null +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -0,0 +1,195 @@ +/mob/living/basic/attack_hand(mob/living/carbon/human/user) + // so that martial arts don't double dip + if(..()) + return TRUE + + switch(user.a_intent) + if(INTENT_HELP) + if(stat == DEAD) + return + visible_message("[user] [response_help_continuous] [src].", \ + "[user] [response_help_continuous] you.", null, null, list(user)) + to_chat(user, "You [response_help_simple] [src].") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + return TRUE + + if(INTENT_GRAB) + grabbedby(user) + + if(INTENT_DISARM) + user.do_attack_animation(src, ATTACK_EFFECT_DISARM) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + var/shove_dir = get_dir(user, src) + if(!Move(get_step(src, shove_dir), shove_dir)) + log_combat(user, src, "shoved", "failing to move it") + visible_message("[user] [response_disarm_continuous] [src]!", \ + "[user] [response_disarm_continuous] you!", \ + "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, list(user)) + to_chat(user, "You [response_disarm_simple] [src]!") + else + log_combat(user, src, "shoved", "pushing it") + visible_message("[user] [response_disarm_continuous] [src], pushing [p_them()]!", \ + "You're pushed by [user]!", \ + "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, list(user)) + to_chat(user, "You [response_disarm_simple] [src], pushing [p_them()]!") + return TRUE + + if(INTENT_HARM) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to hurt [src]!") + return + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + visible_message("[user] [response_harm_continuous] [src]!",\ + "[user] [response_harm_continuous] you!", null, COMBAT_MESSAGE_RANGE, list(user)) + to_chat(user, "You [response_harm_simple] [src]!") + playsound(loc, attacked_sound, 25, TRUE, -1) + + attack_threshold_check(user.dna.species.punchdamage) + log_combat(user, src, "attacked") + updatehealth() + return TRUE + +/mob/living/basic/attack_hulk(mob/living/carbon/human/user) + . = ..() + if(!.) + return + playsound(loc, "punch", 25, TRUE, -1) + visible_message("[user] punches [src]!", \ + "You're punched by [user]!", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You punch [src]!") + adjustBruteLoss(15) + +/mob/living/basic/attack_paw(mob/living/carbon/human/user) + if(..()) //successful monkey bite. + if(stat != DEAD) + var/damage = rand(1, 3) + attack_threshold_check(damage) + return 1 + if (user.a_intent == INTENT_HELP) + if (health > 0) + visible_message("[user.name] [response_help_continuous] [src].", \ + "[user.name] [response_help_continuous] you.", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You [response_help_simple] [src].") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + +/mob/living/basic/attack_alien(mob/living/carbon/alien/humanoid/user) + if(..()) //if harm or disarm intent. + if(user.a_intent == INTENT_DISARM) + playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1) + visible_message("[user] [response_disarm_continuous] [name]!", \ + "[user] [response_disarm_continuous] you!", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You [response_disarm_simple] [name]!") + log_combat(user, src, "disarmed") + else + var/damage = rand(15, 30) + visible_message("[user] slashes at [src]!", \ + "You're slashed at by [user]!", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You slash at [src]!") + playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1) + attack_threshold_check(damage) + log_combat(user, src, "attacked") + return 1 + +/mob/living/basic/attack_larva(mob/living/carbon/alien/larva/L) + . = ..() + if(. && stat != DEAD) //successful larva bite + var/damage = rand(5, 10) + . = attack_threshold_check(damage) + if(.) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + +/mob/living/basic/attack_basic_mob(mob/living/basic/user) + . = ..() + if(.) + // var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) // We don't have melee_damage_lower and melee_damage_upper, kept to make this easier to understand and drop-in in the future + return attack_threshold_check(user.melee_damage, user.melee_damage_type) + +/mob/living/basic/attack_animal(mob/living/simple_animal/user) + . = ..() + if(.) + // var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) // We don't have melee_damage_lower and melee_damage_upper, kept to make this easier to understand and drop-in in the future + return attack_threshold_check(user.melee_damage, user.melee_damage_type) + +/mob/living/basic/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = 20 + if(M.is_adult) + damage = 30 + if(M.transformeffects & SLIME_EFFECT_RED) + damage *= 1.1 + return attack_threshold_check(damage) + +/mob/living/basic/attack_drone(mob/living/simple_animal/drone/M) + if(M.a_intent == INTENT_HARM) //No kicking dogs even as a rogue drone. Use a weapon. + return + return ..() + +/mob/living/basic/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE, actuallydamage = TRUE) + var/temp_damage = damage + if(!damage_coeff[damagetype]) + temp_damage = 0 + else + temp_damage *= damage_coeff[damagetype] + + if(temp_damage >= 0 && temp_damage <= force_threshold) + visible_message("[src] looks unharmed.") + return FALSE + else + apply_damage(damage, damagetype, null, getarmor(null, armorcheck)) + return TRUE + +/mob/living/basic/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) + apply_damage(Proj.damage, Proj.damage_type) + Proj.on_hit(src, 0, piercing_hit) + return BULLET_ACT_HIT + +/mob/living/basic/ex_act(severity, target, origin) + if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) + return FALSE + + ..() + if(QDELETED(src)) + return + var/bomb_armor = getarmor(null, BOMB) + switch (severity) + if (EXPLODE_DEVASTATE) + if(prob(bomb_armor)) + adjustBruteLoss(500) + else + gib() + return + if (EXPLODE_HEAVY) + var/bloss = 60 + if(prob(bomb_armor)) + bloss = bloss / 1.5 + adjustBruteLoss(bloss) + + if (EXPLODE_LIGHT) + var/bloss = 30 + if(prob(bomb_armor)) + bloss = bloss / 1.5 + adjustBruteLoss(bloss) + +/mob/living/basic/blob_act(obj/structure/blob/B) + adjustBruteLoss(20) + return + +/mob/living/basic/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect) + if(!no_effect && !visual_effect_icon && melee_damage) + if(melee_damage < 10) + visual_effect_icon = ATTACK_EFFECT_PUNCH + else + visual_effect_icon = ATTACK_EFFECT_SMASH + ..() + + +/mob/living/basic/update_stat() + if(status_flags & GODMODE) + return + if(stat != DEAD) + if(health <= 0) + death() + else + set_stat(CONSCIOUS) + med_hud_set_status() diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm new file mode 100644 index 0000000000000..8354d1424ef27 --- /dev/null +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -0,0 +1,56 @@ +/** + * Adjusts the health of a simple mob by a set amount and wakes AI if its idle to react + * + * Arguments: + * * amount The amount that will be used to adjust the mob's health + * * updating_health If the mob's health should be immediately updated to the new value + * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like GODMODE + */ +/mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE) + . = FALSE + if(forced || !(status_flags & GODMODE)) + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) + if(updating_health) + updatehealth() + . = amount + if(ckey || stat) + return + //if(AIStatus == AI_IDLE) + // toggle_ai(AI_ON) + +/mob/living/basic/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) + if(forced) + . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) + else if(damage_coeff[BRUTE]) + . = adjust_health(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) + +/mob/living/basic/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) + if(forced) + . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) + else if(damage_coeff[BURN]) + . = adjust_health(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced) + +/mob/living/basic/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) + if(forced) + . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) + else if(damage_coeff[OXY]) + . = adjust_health(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced) + +/mob/living/basic/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) + if(forced) + . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) + else if(damage_coeff[TOX]) + . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) + +/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) + if(forced) + . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) + else if(damage_coeff[CLONE]) + . = adjust_health(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) + +/mob/living/basic/adjustStaminaLoss(amount, updating_health = FALSE, forced = FALSE) + if(forced) + staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + amount)) + else + staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + (amount * damage_coeff[STAMINA]))) + update_stamina() diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm new file mode 100644 index 0000000000000..e6aa05dfc459f --- /dev/null +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -0,0 +1,58 @@ +/mob/living/basic/cockroach + name = "cockroach" + desc = "This station is just crawling with bugs." + icon_state = "cockroach" + icon_dead = "cockroach" //Make this work + density = FALSE + mob_biotypes = list(MOB_ORGANIC, MOB_BUG) + mob_size = MOB_SIZE_TINY + health = 1 + maxHealth = 1 + speed = 1.25 + gold_core_spawnable = FRIENDLY_SPAWN + pass_flags = PASSTABLE | PASSMOB + ventcrawler = VENTCRAWLER_ALWAYS + + verb_say = "chitters" + verb_ask = "chitters inquisitively" + verb_exclaim = "chitters loudly" + verb_yell = "chitters loudly" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "splats" + response_harm_simple = "splat" + speak_emote = list("chitters") + + basic_mob_flags = DEL_ON_DEATH + faction = list("hostile") + + ai_controller = /datum/ai_controller/basic_controller/cockroach + +/mob/living/basic/cockroach/Initialize() + . = ..() + AddElement(/datum/element/death_drops, list(/obj/effect/decal/cleanable/insectguts)) + // AddElement(/datum/element/swabable, CELL_LINE_TABLE_COCKROACH, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7) //Bee edit: No swabable elements + AddElement(/datum/element/basic_body_temp_sensetive, 270, INFINITY) + AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) + +/mob/living/basic/cockroach/death(gibbed) + if(SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. + return + ..() + +/mob/living/basic/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. + return FALSE + + +/datum/ai_controller/basic_controller/cockroach + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic() + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/find_and_hunt_target/cockroach, + ) diff --git a/code/modules/mob/living/basic/vermin/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach.dm new file mode 100644 index 0000000000000..6250a3ac80a63 --- /dev/null +++ b/code/modules/mob/living/basic/vermin/mothroach.dm @@ -0,0 +1,61 @@ +/mob/living/basic/mothroach + name = "mothroach" + desc = "This is the adorable by-product of multiple attempts at genetically mixing mothpeople with cockroaches." + icon_state = "mothroach" + icon_living = "mothroach" + icon_dead = "mothroach_dead" + held_state = "mothroach" + held_lh = 'icons/mob/pets_held_lh.dmi' + held_rh = 'icons/mob/pets_held_rh.dmi' + head_icon = 'icons/mob/pets_held.dmi' + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/mothroach = 3, /obj/item/stack/sheet/animalhide/mothroach = 1) + density = TRUE + mob_biotypes = list(MOB_ORGANIC, MOB_BUG) + mob_size = MOB_SIZE_SMALL + mobility_flags = MOBILITY_FLAGS_DEFAULT + health = 25 + maxHealth = 25 + speed = 1.25 + gold_core_spawnable = FRIENDLY_SPAWN + can_be_held = TRUE + worn_slot_flags = ITEM_SLOT_HEAD + ventcrawler = VENTCRAWLER_ALWAYS + + verb_say = "flutters" + verb_ask = "flutters inquisitively" + verb_exclaim = "flutters loudly" + verb_yell = "flutters loudly" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "hits" + response_harm_simple = "hit" + response_help_continuous = "pats" + response_help_simple = "pat" + + faction = list("neutral") + + ai_controller = /datum/ai_controller/basic_controller/mothroach + +/mob/living/basic/mothroach/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "squeaks happily!", emote_sound = 'sound/voice/moth/scream_moth.ogg') + +/mob/living/basic/mothroach/update_resting() + . = ..() + if(stat == DEAD) + return + if(resting) + icon_state = "[icon_living]_rest" + else + icon_state = "[icon_living]" + +/datum/ai_controller/basic_controller/mothroach + blackboard = list() + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/mothroach, + /datum/ai_planning_subtree/find_and_hunt_target/mothroach, + ) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 7c34a80138d70..50cc5b4c9493d 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -63,14 +63,14 @@ /datum/emote/living/carbon/human/moth // allow mothroach as well as human base mob - species check is done in can_run_emote - mob_type_allowed_typecache = list(/mob/living/carbon/human,/mob/living/simple_animal/mothroach) + mob_type_allowed_typecache = list(/mob/living/carbon/human,/mob/living/basic/mothroach) /datum/emote/living/carbon/human/moth/can_run_emote(mob/user, status_check = TRUE, intentional) if(!..()) return FALSE if(ishuman(user)) return ismoth(user) - return istype(user, /mob/living/simple_animal/mothroach) + return istype(user, /mob/living/basic/mothroach) /datum/emote/living/carbon/human/moth/squeak key = "msqueak" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 638da6cbfec76..46103244cabed 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -297,6 +297,20 @@ var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block) +/mob/living/carbon/human/attack_basic_mob(mob/living/basic/user) + . = ..() + if(!.) + return + if(check_shields(user, user.melee_damage, "the [user.name]", MELEE_ATTACK, user.armour_penetration)) + return FALSE + var/dam_zone = dismembering_strike(user, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(!dam_zone) //Dismemberment successful + return TRUE + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor = run_armor_check(affecting, MELEE, armour_penetration = user.armour_penetration) + apply_damage(user.melee_damage, user.melee_damage_type, affecting, armor) /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) . = ..() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f566587adbdc7..7737f0629daa1 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -82,6 +82,8 @@ . = ..() + SEND_SIGNAL(src, COMSIG_LIVING_DEATH, gibbed) + if (client) reset_perspective(null) reload_fullscreen() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 60b7617bb8cb5..52324e53efcf4 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -506,7 +506,7 @@ message_insect = "clicks their mandibles" /datum/emote/living/click/get_sound(mob/living/user) - if(ismoth(user) || isapid(user) || isflyperson(user) || istype(user, /mob/living/simple_animal/mothroach)) + if(ismoth(user) || isapid(user) || isflyperson(user) || istype(user, /mob/living/basic/mothroach)) return 'sound/creatures/rattle.ogg' else if(isipc(user)) return 'sound/machines/click.ogg' diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b2387d30bef8c..c46708605ee37 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -58,6 +58,8 @@ return 1 /mob/living/proc/handle_breathing(times_fired) + // SEND_SIGNAL(src, COMSIG_LIVING_HANDLE_BREATHING, delta_time, times_fired) + SEND_SIGNAL(src, COMSIG_LIVING_HANDLE_BREATHING, SSMOBS_DT, times_fired) //Bee edit: Holy shit I do not want to port delta time Life() refactor just for my mothroach behavior to be better return /mob/living/proc/handle_mutations_and_radiation() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4ecc29f5fd6b1..bfc9b490d2a8e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -257,6 +257,26 @@ "\The [M.name] glomps you!", null, COMBAT_MESSAGE_RANGE) return TRUE +/mob/living/attack_basic_mob(mob/living/basic/user) + if(user.melee_damage == 0) + if(user != src) + visible_message("\The [user] [user.friendly_verb_continuous] [src]!", \ + "\The [user] [user.friendly_verb_continuous] you!", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You [user.friendly_verb_simple] [src]!") + return FALSE + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to hurt anyone!") + return FALSE + + if(user.attack_sound) + playsound(loc, user.attack_sound, 50, TRUE, TRUE) + user.do_attack_animation(src) + visible_message("\The [user] [user.attack_verb_continuous] [src]!", \ + "\The [user] [user.attack_verb_continuous] you!", null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You [user.attack_verb_simple] [src]!") + log_combat(user, src, "attacked") + return TRUE + /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) if(M.melee_damage == 0) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index b1cd3a0e3e884..67a7ea5dbff75 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -90,6 +90,11 @@ if(.) L.amount_grown = min(L.amount_grown + damage, L.max_grown) +/mob/living/simple_animal/attack_basic_mob(mob/living/basic/user, list/modifiers) + . = ..() + if(.) + return attack_threshold_check(user.melee_damage, user.melee_damage_type) + /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) . = ..() if(.) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 9ce25751af005..b4c64ad9fd61f 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -198,7 +198,7 @@ target_types += /obj/effect/decal/cleanable/trail_holder if(pests) - target_types += /mob/living/simple_animal/cockroach + target_types += /mob/living/basic/cockroach target_types += /mob/living/simple_animal/mouse if(drawn) @@ -220,7 +220,7 @@ visible_message("[src] sprays hydrofluoric acid at [A]!") playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) A.acid_act(75, 10) - else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse)) + else if(istype(A, /mob/living/basic/cockroach) || istype(A, /mob/living/simple_animal/mouse)) var/mob/living/simple_animal/M = target if(!M.stat) visible_message("[src] smashes [target] with its mop!") @@ -334,7 +334,7 @@ visible_message("[src] sprays hydrofluoric acid at [A]!") playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) A.acid_act(75, 10) - else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse)) + else if(istype(A, /mob/living/basic/cockroach) || istype(A, /mob/living/simple_animal/mouse)) var/mob/living/simple_animal/M = target if(!M.stat) visible_message("[src] smashes [target] with its mop!") diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm deleted file mode 100644 index b7db4a6a5cbf2..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ /dev/null @@ -1,64 +0,0 @@ -/mob/living/simple_animal/cockroach - name = "cockroach" - desc = "This station is just crawling with bugs." - icon_state = "cockroach" - icon_dead = "cockroach" - health = 1 - maxHealth = 1 - turns_per_move = 5 - loot = list(/obj/effect/decal/cleanable/insectguts) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 270 - maxbodytemp = INFINITY - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_TINY - mob_biotypes = list(MOB_ORGANIC, MOB_BUG) - response_help = "pokes" - response_disarm = "shoos" - response_harm = "splats" - speak_emote = list("chitters") - density = FALSE - ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN - verb_say = "chitters" - verb_ask = "chitters inquisitively" - verb_exclaim = "chitters loudly" - verb_yell = "chitters loudly" - var/squish_chance = 50 - del_on_death = TRUE - chat_color = "#BC7658" - -/mob/living/simple_animal/cockroach/Initialize(mapload) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/mob/living/simple_animal/cockroach/death(gibbed) - if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. - return - ..() - -/mob/living/simple_animal/cockroach/proc/on_entered(datum/source ,var/atom/movable/AM) - SIGNAL_HANDLER - - if(ismob(AM)) - if(isliving(AM)) - var/mob/living/A = AM - if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING)) - if(prob(squish_chance)) - A.visible_message("[A] squashed [src].", "You squashed [src].") - adjustBruteLoss(1) //kills a normal cockroach - else - visible_message("[src] avoids getting crushed.") - else - if(isstructure(AM)) - if(prob(squish_chance)) - AM.visible_message("[src] was crushed under [AM].") - adjustBruteLoss(1) - else - visible_message("[src] avoids getting crushed.") - -/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. - return diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 7bc3de052c4dc..a171d3e6a0cd8 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -21,7 +21,7 @@ gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. + var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/basic/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. chat_color = "#64F88A" /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? diff --git a/code/modules/mob/living/simple_animal/friendly/mothroach.dm b/code/modules/mob/living/simple_animal/friendly/mothroach.dm deleted file mode 100644 index 44067b1524f4c..0000000000000 --- a/code/modules/mob/living/simple_animal/friendly/mothroach.dm +++ /dev/null @@ -1,41 +0,0 @@ -/mob/living/simple_animal/mothroach - name = "mothroach" - desc = "An ancient ancestor of the moth that surprisingly looks like the crossbreed of a moth and a cockroach." - icon_state = "mothroach" - icon_living = "mothroach" - icon_dead = "mothroach_dead" - held_state = "mothroach" - held_lh = 'icons/mob/pets_held_lh.dmi' - held_rh = 'icons/mob/pets_held_rh.dmi' - head_icon = 'icons/mob/pets_held.dmi' - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/mothroach = 3, /obj/item/stack/sheet/animalhide/mothroach = 1) - gold_core_spawnable = FRIENDLY_SPAWN - density = TRUE - mob_biotypes = list(MOB_ORGANIC, MOB_BUG) - mob_size = MOB_SIZE_SMALL - health = 5 - maxHealth = 5 - speed = 1.25 - mobility_flags = MOBILITY_FLAGS_DEFAULT - can_be_held = TRUE - worn_slot_flags = ITEM_SLOT_HEAD - ventcrawler = VENTCRAWLER_ALWAYS - - verb_say = "flutters" - verb_ask = "flutters inquisitively" - verb_exclaim = "flutters loudly" - verb_yell = "flutters loudly" - response_help = "pets" - speak_emote = list("flutters") - emote_hear = list("flutters.") - speak_chance = 1 - attacked_sound = 'sound/voice/moth/scream_moth.ogg' - - faction = list("neutral") - -/mob/living/simple_animal/mothroach/update_resting() - . = ..() - if(resting) - icon_state = "mothroach_rest" - else - icon_state = "mothroach" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 50c086a154fa3..5b83b06d32576 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -796,7 +796,7 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) mobcheck = TRUE break if(!mobcheck) - new /mob/living/simple_animal/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it + new /mob/living/basic/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it /obj/structure/closet/stasis name = "quantum entanglement stasis warp field" diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 53b842c9599c5..00ff103619b36 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -42,15 +42,15 @@ C.flash_act() for(var/i in 1 to amount_to_spawn) - var/mob/living/simple_animal/S + var/mob/living/spawned_mob if(random) - S = create_random_mob(get_turf(holder.my_atom), mob_class) + spawned_mob = create_random_mob(get_turf(holder.my_atom), mob_class) else - S = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class - S.faction |= mob_faction + spawned_mob = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class + spawned_mob.faction |= mob_faction if(prob(50)) for(var/j in 1 to rand(1, 3)) - step(S, pick(NORTH,SOUTH,EAST,WEST)) + step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) ///Simulates a vortex that moves nearby movable atoms towards or away from the turf T. Range also determines the strength of the effect. High values cause nearby objects to be thrown. /proc/goonchem_vortex(turf/T, setting_type, range) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index 28420c546e6f0..1b9b4bddd7aa2 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -686,8 +686,8 @@ ..() var/turf/altar_turf = get_turf(religious_tool) for(var/i in 1 to 8) - var/mob/living/simple_animal/S = create_random_mob(altar_turf, FRIENDLY_SPAWN) - S.faction |= "neutral" + var/mob/living/spawned_mob = create_random_mob(altar_turf, FRIENDLY_SPAWN) + spawned_mob.faction |= "neutral" playsound(altar_turf, 'sound/ambience/servicebell.ogg', 25, TRUE) if(prob(0.1)) playsound(altar_turf, 'sound/effects/bamf.ogg', 100, TRUE) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index d3b36d169f577..48c3b5dff3959 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -248,11 +248,11 @@ Burning extracts: /obj/item/slimecross/burning/gold/do_effect(mob/user) user.visible_message("[src] shudders violently, and summons an army for [user]!") for(var/i in 1 to 3) //Less than gold normally does, since it's safer and faster. - var/mob/living/simple_animal/S = create_random_mob(get_turf(user), HOSTILE_SPAWN) - S.faction |= "[REF(user)]" + var/mob/living/spawned_mob = create_random_mob(get_turf(user), HOSTILE_SPAWN) + spawned_mob.faction |= "[REF(user)]" if(prob(50)) for(var/j in 1 to rand(1, 3)) - step(S, pick(NORTH,SOUTH,EAST,WEST)) + step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) ..() /obj/item/slimecross/burning/oil diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 60f518349e454..4ef153e4255d8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -115,22 +115,22 @@ if(SLIME_ACTIVATE_MINOR) user.visible_message("[user] starts shaking!","Your [name] starts pulsing gently...") if(do_after(user, 4 SECONDS, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), FRIENDLY_SPAWN) - S.faction |= "neutral" + var/mob/living/spawned_mob = create_random_mob(user.drop_location(), FRIENDLY_SPAWN) + spawned_mob.faction |= "neutral" playsound(user, 'sound/effects/splat.ogg', 50, 1) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") + user.visible_message("[user] spits out [spawned_mob]!", "You spit out [spawned_mob]!") return 30 SECONDS if(SLIME_ACTIVATE_MAJOR) user.visible_message("[user] starts shaking violently!","Your [name] starts pulsing violently...") if(do_after(user, 5 SECONDS, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), HOSTILE_SPAWN) + var/mob/living/spawned_mob = create_random_mob(user.drop_location(), HOSTILE_SPAWN) if(user.a_intent != INTENT_HARM) - S.faction |= "neutral" + spawned_mob.faction |= "neutral" else - S.faction |= "slime" + spawned_mob.faction |= "slime" playsound(user, 'sound/effects/splat.ogg', 50, 1) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") + user.visible_message("[user] spits out [spawned_mob]!", "You spit out [spawned_mob]!") return 60 SECONDS /obj/item/slime_extract/silver