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