diff --git a/.vscode/launch.json b/.vscode/launch.json
index bf3a209531db..f41cbaa49440 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -1,6 +1,13 @@
{
"version": "0.2.0",
"configurations": [
+ {
+ "type": "opendream",
+ "request": "launch",
+ "name": "OpenDream",
+ "preLaunchTask": "OpenDream: compile ${command:CurrentDME}",
+ "json_path": "${workspaceFolder}/${command:CurrentJson}"
+ },
{
"type": "byond",
"request": "launch",
diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm
index 9b2a6c2920b8..c011fba61655 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm
@@ -82,7 +82,6 @@
/turf/open/floor/wood,
/area/ruin/unpowered)
"s" = (
-/obj/effect/decal/cleanable/trail_holder,
/turf/open/floor/wood,
/area/ruin/unpowered)
"t" = (
diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
index 92f43ca70358..467083499b4c 100644
--- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
+++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
@@ -132,7 +132,7 @@
/turf/open/floor/iron/smooth_edge,
/area/ruin/space/has_grav/derelictsulaco)
"eF" = (
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/xenoblood/xtracks,
/turf/open/floor/plating/airless,
/area/ruin/space)
"eU" = (
@@ -165,7 +165,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"fI" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -663,7 +663,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"vl" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -708,7 +708,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"wR" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1017,7 +1017,7 @@
/area/ruin/space)
"Ie" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1322,7 +1322,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"QR" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 5
},
/obj/item/trash/flare,
@@ -1433,7 +1433,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"TL" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1645,7 +1645,7 @@
/area/template_noop)
"ZA" = (
/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 90ee5333b933..8629ad254131 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -3429,7 +3429,7 @@
/obj/machinery/door/airlock/highsecurity,
/obj/structure/alien/weeds,
/obj/structure/cable,
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/xenoblood/xtracks,
/obj/effect/decal/cleanable/blood/tracks,
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "oldstation-aisat"
@@ -4613,7 +4613,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/charlie/hall)
"rC" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 8
},
/obj/effect/decal/cleanable/glass,
@@ -4892,7 +4892,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/item/shard,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 6
},
/obj/effect/turf_decal/tile/purple/half/contrasted,
@@ -7247,7 +7247,7 @@
/turf/open/floor/plating,
/area/ruin/space/ancientstation/beta/supermatter)
"Np" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 10
},
/turf/open/floor/engine,
@@ -8194,7 +8194,7 @@
/turf/open/floor/engine,
/area/ruin/space/ancientstation/delta/biolab)
"Wd" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/xenoblood/xtracks{
dir = 5
},
/turf/open/floor/engine,
diff --git a/_maps/map_files/Blueshift/Blueshift.dmm b/_maps/map_files/Blueshift/Blueshift.dmm
index a379281c7ee5..ca805053a4c7 100644
--- a/_maps/map_files/Blueshift/Blueshift.dmm
+++ b/_maps/map_files/Blueshift/Blueshift.dmm
@@ -1697,6 +1697,15 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/security/prison_upper)
+"arz" = (
+/obj/structure/table,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/item/surgery_tray,
+/turf/open/floor/iron/white,
+/area/station/science/robotics)
"arA" = (
/turf/open/floor/iron/smooth_edge{
dir = 4
@@ -1987,19 +1996,6 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"auS" = (
-/obj/structure/table,
-/obj/machinery/smartfridge/disks,
-/obj/item/stack/package_wrap,
-/obj/item/hand_labeler,
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/trimline/green/filled/corner{
- dir = 8
- },
-/turf/open/floor/iron/dark/corner{
- dir = 1
- },
-/area/station/service/hydroponics)
"auZ" = (
/obj/item/toy/plush/pim,
/turf/open/floor/plating,
@@ -3950,19 +3946,6 @@
/obj/item/trash/candle,
/turf/open/floor/plating,
/area/station/maintenance/department/engineering/engine_aft_port)
-"aOd" = (
-/obj/machinery/smartfridge/chemistry/virology/preloaded,
-/obj/machinery/light/directional/east,
-/obj/structure/reagent_dispensers/wall/virusfood/directional/east,
-/obj/effect/turf_decal/trimline/green/filled/end{
- dir = 4
- },
-/obj/machinery/smartfridge/disks{
- pixel_x = 8;
- pixel_y = 14
- },
-/turf/open/floor/iron/white,
-/area/station/medical/virology)
"aOe" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
@@ -6305,24 +6288,6 @@
dir = 8
},
/area/station/medical/medbay/lobby)
-"bmD" = (
-/obj/structure/table/glass,
-/obj/machinery/light/directional/east,
-/obj/item/seeds/grape{
- pixel_x = -6
- },
-/obj/item/seeds/lime{
- pixel_x = 6
- },
-/obj/item/seeds/watermelon,
-/obj/item/food/grown/wheat,
-/obj/item/food/grown/watermelon,
-/obj/item/food/grown/banana,
-/obj/item/storage/bag/plants/portaseeder,
-/turf/open/floor/iron/dark/side{
- dir = 4
- },
-/area/station/service/hydroponics)
"bmI" = (
/turf/open/floor/iron/stairs/right,
/area/station/maintenance/port/upper)
@@ -13308,6 +13273,20 @@
dir = 1
},
/area/station/security/prison)
+"cAU" = (
+/obj/structure/table,
+/obj/item/wrench,
+/obj/item/crowbar,
+/obj/item/stack/sheet/plasteel/twenty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/station/science/robotics/lab)
"cAV" = (
/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{
dir = 6
@@ -15878,6 +15857,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"cYx" = (
+/obj/effect/turf_decal/bot_red,
+/obj/machinery/autolathe,
+/turf/open/floor/mineral/plastitanium,
+/area/station/science/robotics/lab)
"cYF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16928,15 +16912,6 @@
/obj/machinery/duct,
/turf/open/floor/wood,
/area/station/commons/dorms/room8)
-"djt" = (
-/obj/structure/table,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 10
- },
-/obj/item/radio/intercom/directional/west,
-/obj/item/surgery_tray,
-/turf/open/floor/iron/white,
-/area/station/science/robotics)
"djv" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command/glass{
@@ -22325,6 +22300,19 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/central)
+"eoK" = (
+/obj/structure/table,
+/obj/machinery/smartfridge/disks,
+/obj/item/stack/package_wrap,
+/obj/item/hand_labeler,
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/station/service/hydroponics)
"eoO" = (
/obj/item/stack/sheet/iron{
amount = 10
@@ -25979,10 +25967,6 @@
dir = 4
},
/area/station/security/prison/safe)
-"eWk" = (
-/obj/machinery/smartfridge/organ,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics)
"eWl" = (
/turf/closed/wall,
/area/station/maintenance/disposal)
@@ -28104,13 +28088,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"fqR" = (
-/obj/structure/extinguisher_cabinet/directional/south,
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron/dark/side{
- dir = 4
- },
-/area/station/service/hydroponics)
"fqT" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -30507,30 +30484,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"fRD" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/mask/gas/sechailer{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas/sechailer,
-/obj/item/clothing/mask/gas/sechailer{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/item/flashlight/seclite,
-/obj/item/flashlight/seclite,
-/obj/item/flashlight/seclite,
-/obj/item/key/security,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/red/line{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/red/line{
- dir = 8
- },
-/turf/open/floor/iron/dark/textured,
-/area/station/ai_monitored/security/armory)
"fRF" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 10
@@ -32446,20 +32399,6 @@
dir = 1
},
/area/station/common/night_club/changing_room)
-"gme" = (
-/obj/structure/table,
-/obj/item/wrench,
-/obj/item/crowbar,
-/obj/item/stack/sheet/plasteel/twenty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/mineral/plastitanium,
-/area/station/science/robotics/lab)
"gmf" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -36154,6 +36093,13 @@
/obj/structure/sign/poster/contraband/random/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/fore/upper)
+"gWH" = (
+/obj/machinery/firealarm/directional/north,
+/obj/structure/bodycontainer/morgue{
+ dir = 2
+ },
+/turf/open/floor/iron,
+/area/station/science/robotics)
"gWR" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -45877,6 +45823,21 @@
/obj/structure/bookcase/random/reference,
/turf/open/floor/wood,
/area/station/command/meeting_room/council)
+"iUA" = (
+/obj/structure/table,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/obj/item/reagent_containers/spray/cleaner{
+ pixel_x = 9;
+ pixel_y = 4
+ },
+/obj/item/healthanalyzer{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/science/robotics)
"iUB" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -52185,6 +52146,33 @@
},
/turf/open/floor/iron,
/area/station/science/ordnance)
+"kdL" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/mask/gas/sechailer{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/mask/gas/sechailer,
+/obj/item/clothing/mask/gas/sechailer{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/flashlight/seclite,
+/obj/item/flashlight/seclite,
+/obj/item/flashlight/seclite,
+/obj/item/key/security,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/line{
+ dir = 8
+ },
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark/textured,
+/area/station/ai_monitored/security/armory)
"kdO" = (
/obj/machinery/light/directional/west,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -64079,6 +64067,10 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/engineering/engine_aft_starboard)
+"mvr" = (
+/obj/machinery/smartfridge/organ,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics)
"mvD" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 6
@@ -65616,6 +65608,24 @@
/obj/structure/chair/stool,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
+"mKM" = (
+/obj/structure/table/glass,
+/obj/machinery/light/directional/east,
+/obj/item/seeds/grape{
+ pixel_x = -6
+ },
+/obj/item/seeds/lime{
+ pixel_x = 6
+ },
+/obj/item/seeds/watermelon,
+/obj/item/food/grown/wheat,
+/obj/item/food/grown/watermelon,
+/obj/item/food/grown/banana,
+/obj/item/storage/bag/plants/portaseeder,
+/turf/open/floor/iron/dark/side{
+ dir = 4
+ },
+/area/station/service/hydroponics)
"mKN" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -80727,11 +80737,6 @@
/obj/effect/spawner/random/maintenance/three,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"pHX" = (
-/obj/effect/turf_decal/bot_red,
-/obj/machinery/autolathe,
-/turf/open/floor/mineral/plastitanium,
-/area/station/science/robotics/lab)
"pHY" = (
/obj/effect/turf_decal/tile/neutral,
/obj/structure/sign/departments/restroom/directional/south,
@@ -88232,6 +88237,19 @@
},
/turf/open/floor/carpet,
/area/station/commons/dorms/vacantroom)
+"reP" = (
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/obj/machinery/light/directional/east,
+/obj/structure/reagent_dispensers/wall/virusfood/directional/east,
+/obj/effect/turf_decal/trimline/green/filled/end{
+ dir = 4
+ },
+/obj/machinery/smartfridge/disks{
+ pixel_x = 8;
+ pixel_y = 14
+ },
+/turf/open/floor/iron/white,
+/area/station/medical/virology)
"reW" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
@@ -99774,13 +99792,6 @@
/obj/machinery/shower/directional/south,
/turf/open/floor/iron/freezer,
/area/station/commons/dorms/room3)
-"tpV" = (
-/obj/machinery/firealarm/directional/north,
-/obj/structure/bodycontainer/morgue{
- dir = 2
- },
-/turf/open/floor/iron,
-/area/station/science/robotics)
"tqc" = (
/obj/effect/decal/cleanable/oil,
/obj/effect/landmark/generic_maintenance_landmark,
@@ -119732,21 +119743,6 @@
"xdU" = (
/turf/open/floor/iron,
/area/station/cargo/warehouse)
-"xej" = (
-/obj/structure/table,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 9
- },
-/obj/item/reagent_containers/spray/cleaner{
- pixel_x = 9;
- pixel_y = 4
- },
-/obj/item/healthanalyzer{
- pixel_x = -4;
- pixel_y = 4
- },
-/turf/open/floor/iron/white,
-/area/station/science/robotics)
"xep" = (
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/structure/cable,
@@ -123293,6 +123289,13 @@
/obj/structure/closet/radiation,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/hfr_room)
+"xOF" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron/dark/side{
+ dir = 4
+ },
+/area/station/service/hydroponics)
"xOQ" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
@@ -159447,7 +159450,7 @@ xJn
bqj
pzw
mrb
-fRD
+kdL
uKW
gkm
bkG
@@ -159482,7 +159485,7 @@ bBI
xnF
epa
lHt
-auS
+eoK
gtP
vDx
mHE
@@ -161792,8 +161795,8 @@ fUV
oKN
fAR
qVa
-bmD
-fqR
+mKM
+xOF
mHE
hwb
ofS
@@ -217349,8 +217352,8 @@ reb
nTU
aOe
xot
-xej
-djt
+iUA
+arz
kOu
dur
rxR
@@ -218116,9 +218119,9 @@ eSk
lKo
dbR
tUp
-gme
+cAU
uor
-tpV
+gWH
rVU
mve
uor
@@ -218884,7 +218887,7 @@ sTk
quF
eNE
pKE
-pHX
+cYx
ohm
mYm
ndT
@@ -219660,7 +219663,7 @@ kky
aXQ
rlz
sXt
-eWk
+mvr
vXP
bDH
uor
@@ -237365,7 +237368,7 @@ gOT
cmP
viI
ivX
-aOd
+reP
tvs
fnu
eSa
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 5582f45bb067..763df1a081b2 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3871,6 +3871,23 @@
/obj/effect/turf_decal/bot/right,
/turf/open/floor/engine,
/area/station/engineering/atmos/hfr_room)
+"boL" = (
+/obj/effect/turf_decal/tile/red/fourcorners,
+/obj/structure/rack,
+/obj/item/gun/energy/disabler{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/energy/disabler,
+/obj/item/gun/energy/disabler{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark,
+/area/station/ai_monitored/security/armory)
"boP" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
@@ -7329,6 +7346,25 @@
"crM" = (
/turf/closed/wall/r_wall,
/area/station/security/warden)
+"crP" = (
+/obj/effect/turf_decal/tile/green/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/camera/autoname/directional/south,
+/obj/item/radio/intercom/directional/south,
+/obj/structure/table,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/turf/open/floor/iron/dark/side,
+/area/station/service/hydroponics)
"crV" = (
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 1
@@ -11515,6 +11551,20 @@
/obj/effect/landmark/navigate_destination/atmos,
/turf/open/floor/iron/dark/textured,
/area/station/engineering/break_room)
+"dNc" = (
+/obj/effect/turf_decal/tile/green,
+/obj/structure/table,
+/obj/machinery/plantgenes{
+ pixel_y = 6
+ },
+/obj/item/clothing/suit/apron,
+/obj/item/clothing/accessory/armband/hydro,
+/obj/item/wrench,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/dark/side{
+ dir = 9
+ },
+/area/station/service/hydroponics)
"dNr" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -14836,20 +14886,6 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating,
/area/station/maintenance/department/security/brig)
-"eVZ" = (
-/obj/effect/turf_decal/tile/green,
-/obj/structure/table,
-/obj/machinery/plantgenes{
- pixel_y = 6
- },
-/obj/item/clothing/suit/apron,
-/obj/item/clothing/accessory/armband/hydro,
-/obj/item/wrench,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/dark/side{
- dir = 9
- },
-/area/station/service/hydroponics)
"eWd" = (
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
/obj/structure/extinguisher_cabinet/directional/west,
@@ -25458,20 +25494,6 @@
/obj/machinery/deepfryer,
/turf/open/floor/iron/kitchen,
/area/station/service/kitchen)
-"iuI" = (
-/obj/effect/turf_decal/tile/red/fourcorners,
-/obj/structure/rack,
-/obj/item/gun/energy/disabler{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/gun/energy/disabler,
-/obj/item/gun/energy/disabler{
- pixel_x = 3;
- pixel_y = -3
- },
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/security/armory)
"iuJ" = (
/obj/effect/turf_decal/tile/dark_blue/full,
/obj/effect/turf_decal/bot_white,
@@ -26713,24 +26735,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/processing)
-"iPZ" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 6
- },
-/obj/machinery/camera/directional/east{
- c_tag = "Medical - Pathology, Hallway, East";
- network = list("ss13","medbay");
- name = "medical camera"
- },
-/obj/structure/table/reinforced/rglass,
-/obj/item/storage/box/monkeycubes,
-/obj/item/toy/figure/virologist{
- pixel_y = 13;
- pixel_x = -9
- },
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/white,
-/area/station/medical/virology)
"iQd" = (
/obj/effect/spawner/random/structure/table_or_rack,
/obj/effect/spawner/random/maintenance,
@@ -30214,6 +30218,18 @@
/obj/structure/cable,
/turf/open/floor/carpet/black,
/area/station/security/bitden)
+"kcN" = (
+/obj/effect/turf_decal/tile/green/half/contrasted{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/item/chicken_feed{
+ pixel_y = 10;
+ pixel_x = -5
+ },
+/obj/machinery/feed_machine,
+/turf/open/floor/iron/dark/side,
+/area/station/service/hydroponics)
"kde" = (
/obj/machinery/atmospherics/components/tank/air{
dir = 4
@@ -34622,6 +34638,22 @@
/obj/structure/closet/firecloset,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/aft)
+"lxC" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/item/seeds/tree,
+/obj/effect/spawner/random/contraband/prison,
+/obj/item/seeds/pumpkin,
+/obj/item/seeds/wheat,
+/obj/item/seeds/ambrosia,
+/obj/item/seeds/grass,
+/obj/item/seeds/carrot,
+/obj/item/seeds/tomato,
+/obj/item/seeds/potato,
+/obj/item/seeds/garlic,
+/obj/item/seeds/onion,
+/obj/item/paper/guides/jobs/hydroponics,
+/turf/open/floor/iron/dark,
+/area/station/security/prison/garden)
"lyp" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -44132,18 +44164,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
-"oMD" = (
-/obj/effect/turf_decal/tile/green/half/contrasted{
- dir = 1
- },
-/obj/structure/table,
-/obj/item/chicken_feed{
- pixel_y = 10;
- pixel_x = -5
- },
-/obj/machinery/feed_machine,
-/turf/open/floor/iron/dark/side,
-/area/station/service/hydroponics)
"oMG" = (
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -45448,13 +45468,6 @@
/obj/structure/cable,
/turf/open/floor/circuit/telecomms,
/area/station/tcommsat/server)
-"pml" = (
-/obj/effect/turf_decal/tile/green/half/contrasted{
- dir = 1
- },
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron/dark/side,
-/area/station/service/hydroponics)
"pmr" = (
/obj/effect/turf_decal/trimline/purple/line,
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -55974,18 +55987,6 @@
dir = 1
},
/area/station/commons/storage/primary)
-"sQL" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/healthanalyzer{
- pixel_x = -1;
- pixel_y = 6
- },
-/obj/item/storage/backpack/duffelbag/med/surgery,
-/turf/open/floor/iron/white,
-/area/station/science/robotics/lab)
"sQN" = (
/obj/machinery/power/apc/auto_name/directional/west,
/obj/structure/cable,
@@ -58113,23 +58114,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"tyX" = (
-/obj/structure/closet/crate/hydroponics,
-/obj/item/book/manual/botanical_lexicon,
-/obj/item/seeds/tree,
-/obj/effect/spawner/random/contraband/prison,
-/obj/item/seeds/pumpkin,
-/obj/item/seeds/wheat,
-/obj/item/seeds/ambrosia,
-/obj/item/seeds/grass,
-/obj/item/seeds/carrot,
-/obj/item/seeds/tomato,
-/obj/item/seeds/potato,
-/obj/item/seeds/garlic,
-/obj/item/seeds/onion,
-/obj/item/paper/guides/jobs/hydroponics,
-/turf/open/floor/iron/dark,
-/area/station/security/prison/garden)
"tzc" = (
/obj/effect/spawner/random/engineering/tank,
/turf/open/floor/plating,
@@ -62102,6 +62086,13 @@
/obj/structure/closet/secure_closet/exile,
/turf/open/floor/iron/dark/textured,
/area/station/command/gateway)
+"uRU" = (
+/obj/effect/turf_decal/tile/green/half/contrasted{
+ dir = 1
+ },
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron/dark/side,
+/area/station/service/hydroponics)
"uRW" = (
/obj/machinery/plumbing/ooze_sucker{
mapping_id = "4";
@@ -63123,6 +63114,18 @@
/obj/machinery/telecomms/server/presets/science,
/turf/open/floor/circuit/green/telecomms,
/area/station/tcommsat/server)
+"vjd" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/healthanalyzer{
+ pixel_x = -1;
+ pixel_y = 6
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/iron/white,
+/area/station/science/robotics/lab)
"vje" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
@@ -63241,12 +63244,6 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/secondary/entry)
-"vki" = (
-/obj/effect/turf_decal/bot_red,
-/obj/machinery/status_display/ai/directional/east,
-/obj/machinery/suit_storage_unit/standard_unit,
-/turf/open/floor/iron/large,
-/area/station/ai_monitored/command/storage/eva)
"vkj" = (
/obj/structure/table/wood/fancy/black,
/obj/item/flashlight/lantern{
@@ -65912,25 +65909,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/evidence)
-"wbw" = (
-/obj/effect/turf_decal/tile/green/half/contrasted{
- dir = 1
- },
-/obj/machinery/camera/autoname/directional/south,
-/obj/item/radio/intercom/directional/south,
-/obj/structure/table,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/turf/open/floor/iron/dark/side,
-/area/station/service/hydroponics)
"wbA" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 9
@@ -68660,6 +68638,24 @@
/obj/item/aicard,
/turf/open/floor/iron/dark,
/area/station/command/bridge)
+"wWb" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/machinery/camera/directional/east{
+ c_tag = "Medical - Pathology, Hallway, East";
+ network = list("ss13","medbay");
+ name = "medical camera"
+ },
+/obj/structure/table/reinforced/rglass,
+/obj/item/storage/box/monkeycubes,
+/obj/item/toy/figure/virologist{
+ pixel_y = 13;
+ pixel_x = -9
+ },
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/white,
+/area/station/medical/virology)
"wWd" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/catwalk_floor,
@@ -70859,6 +70855,11 @@
},
/turf/open/floor/iron/white,
/area/station/medical/exam_room)
+"xLa" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/bot_red,
+/turf/open/floor/iron,
+/area/station/ai_monitored/command/storage/eva)
"xLc" = (
/obj/structure/sink/kitchen/directional/south,
/turf/open/floor/iron/freezer,
@@ -85746,7 +85747,7 @@ kNg
jZY
coj
pEY
-eVZ
+dNc
sXx
fZO
cvn
@@ -88844,7 +88845,7 @@ xAQ
tQJ
ctk
pAW
-pml
+uRU
bnl
cLZ
fUs
@@ -89101,7 +89102,7 @@ sjV
fzI
uQP
ohF
-wbw
+crP
bnl
wgX
fUs
@@ -89358,7 +89359,7 @@ juc
juc
juc
ohF
-oMD
+kcN
bnl
cLZ
fUs
@@ -99356,7 +99357,7 @@ nZL
kOK
nVk
rfW
-vki
+xLa
hZS
liC
rTP
@@ -101093,7 +101094,7 @@ tFK
mfE
mfE
xWj
-tyX
+lxC
lEa
wtv
oER
@@ -101632,7 +101633,7 @@ oRs
csZ
gGx
dAx
-iuI
+boL
lZV
jZp
jRr
@@ -113758,7 +113759,7 @@ auK
mxF
dxk
flU
-sQL
+vjd
lpk
eoA
sYI
@@ -115862,7 +115863,7 @@ gmy
nIN
lfj
rzW
-iPZ
+wWb
jRY
axo
hmZ
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index b0d582c657a0..415a96dcd41b 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -4016,15 +4016,6 @@
/obj/effect/spawner/random/trash/moisture_trap,
/turf/open/floor/iron,
/area/station/maintenance/starboard/aft)
-"aUw" = (
-/obj/machinery/light/small/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/power/smes,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/solars/port/aft)
"aUG" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/disposalpipe/segment{
@@ -5786,14 +5777,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/cargo/storage)
-"bqC" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/seed_extractor,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"bqF" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -7997,6 +7980,15 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/iron/dark,
/area/station/service/library)
+"bQk" = (
+/obj/machinery/light/directional/north,
+/obj/machinery/asteroid_magnet{
+ center_y = 61;
+ center_x = 105;
+ area_size = 3
+ },
+/turf/open/floor/iron/dark,
+/area/station/science/explab)
"bQw" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/stripes/line{
@@ -8398,6 +8390,19 @@
},
/turf/open/space,
/area/space/nearstation)
+"bTK" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/smartfridge,
+/obj/structure/railing{
+ dir = 8;
+ layer = 4.1;
+ pixel_x = -5
+ },
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"bTN" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -12818,6 +12823,18 @@
},
/turf/open/floor/iron,
/area/station/security/execution/transfer)
+"cXJ" = (
+/obj/machinery/power/solar_control{
+ dir = 4;
+ id = "aftport";
+ name = "Port Quarter Solar Control"
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"cXL" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/trimline/white/warning{
@@ -15492,6 +15509,20 @@
/obj/structure/sign/warning/radiation/directional/north,
/turf/open/floor/engine,
/area/station/engineering/supermatter)
+"dHG" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/green{
+ dir = 8
+ },
+/obj/machinery/status_display/evac/directional/east,
+/obj/structure/table/glass,
+/obj/item/folder/white,
+/obj/item/pen/red,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron,
+/area/station/medical/pathology)
"dHN" = (
/obj/machinery/door/poddoor/massdriver_chapel,
/obj/structure/fans/tiny,
@@ -23696,6 +23727,17 @@
/obj/effect/decal/cleanable/insectguts,
/turf/open/floor/circuit,
/area/station/science/research/abandoned)
+"fDn" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/structure/table/glass,
+/obj/item/food/grown/poppy/geranium,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"fDy" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table/wood,
@@ -24939,6 +24981,17 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/service/library)
+"fTH" = (
+/obj/structure/sign/painting/library_secure{
+ pixel_x = 32
+ },
+/obj/structure/table/wood/fancy/blue,
+/obj/machinery/door/window/left/directional/west{
+ name = "Hydroponics Center"
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/turf/open/floor/wood/tile,
+/area/station/service/library/artgallery)
"fTJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -25613,6 +25666,20 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"gcj" = (
+/obj/machinery/door/window/left/directional/west{
+ name = "Hydroponics Center"
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Justice gas pump"
+ },
+/obj/effect/turf_decal/siding/dark_red{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/station/security/execution/education)
"gco" = (
/obj/effect/turf_decal/tile/brown/anticorner/contrasted{
dir = 8
@@ -30985,6 +31052,14 @@
},
/turf/open/floor/iron,
/area/station/command/teleporter)
+"hpH" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/door/window/left/directional/west{
+ name = "Hydroponics Center"
+ },
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"hqf" = (
/turf/closed/wall/r_wall,
/area/station/security/bitden)
@@ -33564,11 +33639,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
-"hXG" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/marker_beacon/lime,
-/turf/open/space,
-/area/space/nearstation)
"hXO" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -34602,6 +34672,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
+"iip" = (
+/obj/machinery/power/smes,
+/obj/machinery/light/small/directional/north,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"iiK" = (
/obj/structure/disposalpipe/segment,
/obj/effect/landmark/start/hangover,
@@ -34719,16 +34798,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
-"ikv" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/power/terminal{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/maintenance/solars/port/aft)
"ikx" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -35521,6 +35590,19 @@
/obj/machinery/newscaster/directional/east,
/turf/open/floor/wood,
/area/station/medical/psychology)
+"iuc" = (
+/obj/structure/table/glass,
+/obj/machinery/newscaster/directional/west,
+/obj/machinery/computer/security/telescreen/entertainment/directional/north,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/obj/machinery/light/small/directional/west,
+/obj/item/paper_bin,
+/obj/item/clothing/gloves/latex,
+/obj/item/clothing/neck/stethoscope,
+/turf/open/floor/iron/white,
+/area/station/medical/pathology)
"iud" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod 4";
@@ -36858,6 +36940,19 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"iLa" = (
+/obj/machinery/firealarm/directional/west,
+/obj/structure/table,
+/obj/item/storage/box/beakers,
+/obj/item/storage/box/syringes{
+ pixel_x = 3;
+ pixel_y = 4
+ },
+/obj/machinery/light_switch/directional/south{
+ pixel_x = 8
+ },
+/turf/open/floor/iron/checker,
+/area/station/service/hydroponics)
"iLq" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -41024,6 +41119,23 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible,
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"jIH" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Airlock"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/access/any/engineering/external,
+/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
+/turf/open/floor/iron,
+/area/station/maintenance/port/aft)
"jJc" = (
/turf/closed/wall,
/area/station/security/checkpoint/arrivals)
@@ -43420,6 +43532,17 @@
/obj/structure/chair/stool/directional/east,
/turf/open/floor/iron/dark,
/area/station/service/theater)
+"kjw" = (
+/obj/structure/cable,
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"kjz" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -45208,18 +45331,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"kHK" = (
-/obj/machinery/camera/directional/north{
- c_tag = "Solar - Aft Port";
- name = "solar camera"
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plating,
-/area/station/maintenance/solars/port/aft)
"kHV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/shower/directional/east{
@@ -48665,6 +48776,37 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/engineering/main)
+"lzz" = (
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
+/obj/machinery/status_display/ai/directional/east,
+/obj/structure/rack,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 0
+ },
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 0
+ },
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 6
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark,
+/area/station/ai_monitored/security/armory)
"lzH" = (
/obj/structure/chair{
dir = 8
@@ -48778,9 +48920,6 @@
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/open/floor/iron/dark/herringbone,
/area/station/security/prison)
-"lAS" = (
-/turf/open/space,
-/area/station/cargo/mining/asteroid_magnet)
"lAV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/duct,
@@ -48889,11 +49028,6 @@
/obj/machinery/computer/diseasesplicer,
/turf/open/floor/iron,
/area/station/medical/pathology)
-"lBL" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/marker_beacon/lime,
-/turf/open/space/basic,
-/area/space/nearstation)
"lBR" = (
/obj/structure/sign/nanotrasen,
/turf/closed/wall/r_wall,
@@ -50109,19 +50243,6 @@
/obj/machinery/atm/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"lPs" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/biogenerator,
-/obj/structure/railing{
- dir = 4;
- layer = 4.1;
- pixel_x = 5
- },
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"lPy" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/firecloset,
@@ -51876,20 +51997,6 @@
},
/turf/open/floor/iron,
/area/station/commons/storage/tools)
-"mnA" = (
-/obj/structure/table/glass,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"mnF" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -51950,6 +52057,20 @@
},
/turf/open/floor/iron/dark,
/area/station/security/execution/education)
+"mot" = (
+/obj/structure/table/glass,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"mou" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -52383,6 +52504,11 @@
/obj/effect/turf_decal/tile/yellow/fourcorners,
/turf/open/floor/iron,
/area/station/engineering/storage)
+"mtz" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"mtL" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/status_display/evac/directional/north,
@@ -55068,20 +55194,6 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
-"mZA" = (
-/obj/machinery/door/window/left/directional/west{
- name = "Hydroponics Center"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Justice gas pump"
- },
-/obj/effect/turf_decal/siding/dark_red{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/security/execution/education)
"mZK" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 8
@@ -59752,12 +59864,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/science/research)
-"oiZ" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"ojb" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -60567,6 +60673,12 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
+"otU" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"ouc" = (
/obj/effect/turf_decal/trimline/hot_pink/filled/line,
/obj/effect/turf_decal/trimline/hot_pink/line{
@@ -60736,6 +60848,10 @@
/obj/structure/sign/departments/medbay/alt/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/central/aft)
+"owK" = (
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space)
"owO" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -61242,6 +61358,17 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
+"oDe" = (
+/obj/machinery/camera/directional/north{
+ c_tag = "Solar - Aft Port";
+ name = "solar camera"
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"oDf" = (
/obj/effect/turf_decal/tile/brown/half/contrasted,
/turf/open/floor/iron,
@@ -61764,24 +61891,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/explab)
-"oJj" = (
-/obj/structure/railing{
- dir = 4;
- layer = 4.1;
- pixel_x = 5
- },
-/obj/effect/turf_decal/delivery/white{
- color = "#52B4E9"
- },
-/obj/structure/railing{
- dir = 1;
- pixel_x = 5
- },
-/obj/structure/reagent_dispensers/watertank/high,
-/obj/item/reagent_containers/cup/watering_can,
-/obj/item/reagent_containers/cup/watering_can,
-/turf/open/floor/iron/dark/textured,
-/area/station/service/hydroponics)
"oJy" = (
/turf/closed/wall/r_wall,
/area/station/science/genetics)
@@ -63057,34 +63166,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/engineering/main)
-"pbN" = (
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable,
-/obj/machinery/status_display/ai/directional/east,
-/obj/structure/rack,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 0
- },
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 0
- },
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 6
- },
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/security/armory)
"pbP" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -66377,19 +66458,6 @@
/obj/machinery/station_map/engineering/directional/south,
/turf/open/floor/iron/white,
/area/station/science/lobby)
-"pOB" = (
-/obj/structure/table/glass,
-/obj/machinery/newscaster/directional/west,
-/obj/machinery/computer/security/telescreen/entertainment/directional/north,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 9
- },
-/obj/machinery/light/small/directional/west,
-/obj/item/paper_bin,
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/neck/stethoscope,
-/turf/open/floor/iron/white,
-/area/station/medical/pathology)
"pOC" = (
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
@@ -67931,14 +67999,6 @@
},
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
-"qgR" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 2
- },
-/obj/item/healthanalyzer,
-/turf/open/floor/iron,
-/area/station/science/robotics/lab)
"qgU" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -69328,6 +69388,19 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
+"qzM" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/biogenerator,
+/obj/structure/railing{
+ dir = 4;
+ layer = 4.1;
+ pixel_x = 5
+ },
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"qzT" = (
/obj/machinery/light/directional/east,
/obj/effect/turf_decal/stripes/line{
@@ -69589,6 +69662,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/grimy,
/area/station/service/chapel)
+"qCr" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced/spawner/directional/north{
+ pixel_y = 2
+ },
+/obj/item/healthanalyzer,
+/turf/open/floor/iron,
+/area/station/science/robotics/lab)
"qCA" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -70626,25 +70707,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port)
-"qNQ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/delivery/white{
- color = "#52B4E9"
- },
-/obj/structure/railing{
- dir = 1;
- pixel_x = -5
- },
-/obj/structure/railing{
- dir = 8;
- layer = 4.1;
- pixel_x = -5
- },
-/obj/machinery/composters{
- pixel_x = -1
- },
-/turf/open/floor/iron/dark/textured,
-/area/station/service/hydroponics)
"qNU" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -71636,18 +71698,6 @@
/obj/effect/turf_decal/tile/neutral/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/service/chapel/storage)
-"rcZ" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "aftport";
- name = "Port Quarter Solar Control"
- },
-/turf/open/floor/plating,
-/area/station/maintenance/solars/port/aft)
"rde" = (
/obj/machinery/space_heater/improvised_chem_heater,
/obj/effect/turf_decal/siding/thinplating/dark{
@@ -72441,17 +72491,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/iron,
/area/station/maintenance/port/aft)
-"rlL" = (
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/item/radio/intercom/directional/south,
-/obj/structure/table/glass,
-/obj/item/food/grown/poppy/geranium,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"rlQ" = (
/obj/structure/chair{
dir = 4
@@ -75960,6 +75999,24 @@
/obj/machinery/meter,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
+"sdS" = (
+/obj/structure/railing{
+ dir = 4;
+ layer = 4.1;
+ pixel_x = 5
+ },
+/obj/effect/turf_decal/delivery/white{
+ color = "#52B4E9"
+ },
+/obj/structure/railing{
+ dir = 1;
+ pixel_x = 5
+ },
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/item/reagent_containers/cup/watering_can,
+/obj/item/reagent_containers/cup/watering_can,
+/turf/open/floor/iron/dark/textured,
+/area/station/service/hydroponics)
"sef" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -76715,15 +76772,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/service/hydroponics)
-"soF" = (
-/obj/machinery/light/directional/north,
-/obj/machinery/asteroid_magnet{
- center_y = 59;
- center_x = 101;
- area_size = 7
- },
-/turf/open/floor/iron/dark,
-/area/station/science/explab)
"soK" = (
/obj/structure/chair{
dir = 4
@@ -80900,19 +80948,6 @@
/obj/item/pen,
/turf/open/floor/iron,
/area/station/science/lab)
-"tpr" = (
-/obj/machinery/firealarm/directional/west,
-/obj/structure/table,
-/obj/item/storage/box/beakers,
-/obj/item/storage/box/syringes{
- pixel_x = 3;
- pixel_y = 4
- },
-/obj/machinery/light_switch/directional/south{
- pixel_x = 8
- },
-/turf/open/floor/iron/checker,
-/area/station/service/hydroponics)
"tpE" = (
/obj/machinery/status_display/evac/directional/east,
/obj/machinery/camera/directional/east{
@@ -81014,17 +81049,6 @@
/obj/machinery/vending/wardrobe/medi_wardrobe,
/turf/open/floor/iron,
/area/station/medical/storage)
-"tqy" = (
-/obj/structure/sign/painting/library_secure{
- pixel_x = 32
- },
-/obj/structure/table/wood/fancy/blue,
-/obj/machinery/door/window/left/directional/west{
- name = "Hydroponics Center"
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/floor/wood/tile,
-/area/station/service/library/artgallery)
"tqI" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
@@ -86669,6 +86693,25 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"uHv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/delivery/white{
+ color = "#52B4E9"
+ },
+/obj/structure/railing{
+ dir = 1;
+ pixel_x = -5
+ },
+/obj/structure/railing{
+ dir = 8;
+ layer = 4.1;
+ pixel_x = -5
+ },
+/obj/machinery/composters{
+ pixel_x = -1
+ },
+/turf/open/floor/iron/dark/textured,
+/area/station/service/hydroponics)
"uHC" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -86710,14 +86753,6 @@
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron/dark,
/area/station/security/lockers)
-"uHW" = (
-/obj/structure/table/reinforced,
-/obj/structure/sign/departments/medbay/alt/directional/south,
-/obj/machinery/light/cold/directional/east,
-/obj/machinery/status_display/evac/directional/east,
-/obj/item/surgery_tray,
-/turf/open/floor/iron,
-/area/station/science/robotics/lab)
"uHZ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -88918,6 +88953,18 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron,
/area/station/engineering/atmos/mix)
+"vkl" = (
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 4;
+ layer = 4.1;
+ pixel_x = 5
+ },
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"vkv" = (
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 8
@@ -90843,6 +90890,14 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/security/checkpoint/arrivals)
+"vFX" = (
+/obj/effect/turf_decal/bot,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/seed_extractor,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"vGc" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -92155,19 +92210,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
-"vZo" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/smartfridge,
-/obj/structure/railing{
- dir = 8;
- layer = 4.1;
- pixel_x = -5
- },
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"vZq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -92456,6 +92498,14 @@
"wdb" = (
/turf/open/floor/circuit/green,
/area/station/science/robotics/mechbay)
+"wdg" = (
+/obj/structure/table/reinforced,
+/obj/structure/sign/departments/medbay/alt/directional/south,
+/obj/machinery/light/cold/directional/east,
+/obj/machinery/status_display/evac/directional/east,
+/obj/item/surgery_tray,
+/turf/open/floor/iron,
+/area/station/science/robotics/lab)
"wdl" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -95762,24 +95812,6 @@
},
/turf/open/floor/iron/half,
/area/station/security/range)
-"wPK" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Airlock"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/access/any/engineering/external,
-/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
-/obj/structure/fans/tiny,
-/turf/open/floor/iron,
-/area/station/maintenance/port/aft)
"wPN" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/corner{
@@ -97700,18 +97732,6 @@
/obj/structure/sign/departments/science/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/central/aft)
-"xoU" = (
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/railing{
- dir = 4;
- layer = 4.1;
- pixel_x = 5
- },
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"xpr" = (
/obj/effect/spawner/random/decoration/carpet,
/obj/effect/spawner/random/structure/furniture_parts,
@@ -97805,15 +97825,6 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
-"xqs" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/maintenance/port/aft)
"xqC" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
@@ -100799,14 +100810,6 @@
"yaW" = (
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai_upload)
-"yba" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/window/left/directional/west{
- name = "Hydroponics Center"
- },
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"ybb" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -101102,20 +101105,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
-"yeT" = (
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 8
- },
-/obj/effect/turf_decal/siding/green{
- dir = 8
- },
-/obj/machinery/status_display/evac/directional/east,
-/obj/structure/table/glass,
-/obj/item/folder/white,
-/obj/item/pen/red,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron,
-/area/station/medical/pathology)
"yeZ" = (
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/stripes/line{
@@ -101563,10 +101552,6 @@
/obj/item/pushbroom,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"ykO" = (
-/obj/structure/tank_dispenser/oxygen,
-/turf/open/floor/plating,
-/area/station/maintenance/port/aft)
"ykX" = (
/obj/structure/table/wood,
/obj/item/electronics/firelock,
@@ -125245,22 +125230,22 @@ aaa
aad
aad
rWQ
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
-lvw
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -125500,24 +125485,24 @@ qYo
qYo
aaa
aad
-lBL
-vVc
-vVc
-vVc
-vVc
-vVc
-vVc
-lBL
-vVc
-lBL
-vVc
-vVc
-vVc
-vVc
-vVc
-vVc
-lBL
-lvw
+aaa
+efQ
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -125757,24 +125742,24 @@ aaa
qYo
aaa
aad
-abj
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
+aad
+efQ
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126014,24 +125999,24 @@ aaa
qYo
aaa
aad
-vVc
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
+aaa
+aad
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126271,24 +126256,24 @@ aaa
qYo
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
+aaa
+aad
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -126528,42 +126513,8 @@ aaa
qYo
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
-aaa
-aaa
aaa
aad
-aad
-qgl
-bbD
-qgl
-aad
-qgl
-bbD
-qgl
-aad
-qgl
-bbD
-qgl
-aad
-aac
aaa
aaa
aaa
@@ -126583,6 +126534,21 @@ aaa
aaa
aaa
aaa
+aad
+aad
+qgl
+bbD
+qgl
+aad
+qgl
+bbD
+qgl
+aad
+qgl
+bbD
+qgl
+aad
+aac
aaa
aaa
aaa
@@ -126595,8 +126561,27 @@ aaa
aaa
aaa
aaa
-"}
-(98,1,1) = {"
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+"}
+(98,1,1) = {"
aaa
aaa
aaa
@@ -126780,29 +126765,29 @@ gkT
nEc
qYo
qYo
+vVc
qYo
-qYo
-qYo
+vVc
aad
+abj
aad
abj
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -127037,29 +127022,29 @@ ebX
nEc
qYo
aaa
-aaa
+vVc
aaa
qYo
aaa
aad
-vVc
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-lvw
+aaa
+abj
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+efQ
+efQ
+aaa
efQ
efQ
aaa
@@ -127294,28 +127279,28 @@ lxM
hoT
qYo
qYo
+vVc
qYo
-qYo
-qYo
+vVc
aad
+abj
aad
-lBL
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-lBL
+abj
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+efQ
+qYo
qYo
qYo
qYo
@@ -127556,29 +127541,29 @@ aaa
qYo
aaa
aad
-vVc
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-vVc
-vVc
-vVc
+aaa
+abj
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+aaa
+aaa
+mtz
+aaa
+efQ
+qYo
pSj
-kun
-bbD
-bbD
+pSj
+pSj
+pSj
+bBc
+bBc
bBc
bBc
bBc
@@ -127813,15 +127798,9 @@ aaa
qYo
aaa
aad
-lBL
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -127829,11 +127808,17 @@ bTz
bTz
bTz
bTz
-lBL
+owK
+jUT
+jUT
+mtz
+jUT
qYo
qYo
pSj
qYo
+qYo
+qYo
aad
aaa
aaa
@@ -128070,15 +128055,9 @@ aaa
qYo
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -128086,11 +128065,17 @@ bTz
bTz
bTz
bTz
-vVc
-qYo
+owK
+aaa
+aaa
+mtz
+aaa
+efQ
qYo
kun
qYo
+aaa
+aaa
aac
aaa
qgl
@@ -128327,15 +128312,9 @@ aaa
qYo
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -128343,11 +128322,17 @@ bTz
bTz
bTz
bTz
-vVc
-qYo
+owK
+aaa
+aaa
+aaa
+aaa
+efQ
qYo
kun
qYo
+aaa
+aaa
aac
aaa
qgl
@@ -128584,15 +128569,9 @@ aaa
aad
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -128600,11 +128579,17 @@ bTz
bTz
bTz
bTz
-abj
-qYo
+owK
+aaa
+aaa
+aaa
+aaa
+aad
aad
bbD
aad
+aad
+aaa
aac
aad
qgl
@@ -128841,15 +128826,9 @@ aaa
aad
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -128857,11 +128836,17 @@ bTz
bTz
bTz
bTz
-abj
-qYo
+owK
+aaa
+aaa
+aaa
+aaa
+aad
fuV
ocY
fuV
+aad
+aaa
aac
aaa
qgl
@@ -129095,18 +129080,12 @@ aad
aad
aad
aad
-aad
+abj
aaa
-aad
abj
-lAS
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aad
+aad
+owK
bTz
bTz
bTz
@@ -129114,11 +129093,17 @@ bTz
bTz
bTz
bTz
-abj
-qYo
+owK
+aaa
+mtz
+aaa
+aaa
+aad
fuV
htw
fuV
+aad
+aad
aFo
aaa
qgl
@@ -129355,15 +129340,9 @@ aaa
aad
aaa
aad
-vVc
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
-bTz
+aaa
+aaa
+owK
bTz
bTz
bTz
@@ -129371,12 +129350,18 @@ bTz
bTz
bTz
bTz
-vVc
+owK
+jUT
+mtz
+jUT
+jUT
fuV
fuV
jNx
fuV
fuV
+aad
+aac
aaa
aaa
aad
@@ -129609,31 +129594,31 @@ aad
aad
aad
aad
-aad
+abj
aaa
-aad
-hXG
abj
-vVc
-vVc
-vVc
-vVc
-vVc
-lBL
-vVc
-lBL
-vVc
-vVc
-vVc
-vVc
-vVc
-vVc
-lBL
+abj
+abj
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+owK
+aaa
+mtz
+aaa
+aaa
dPR
-ikv
+kjw
uWa
-rcZ
+cXJ
dPR
+aad
+aac
aac
aac
aFo
@@ -129869,28 +129854,28 @@ fLf
blX
cUJ
kzc
-wPK
+jIH
qQM
aaa
+jUT
aaa
aaa
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+jUT
aaa
aaa
aaa
aaa
dPR
-aUw
+iip
jKG
eZz
dPR
+aad
+aaa
aaa
aaa
aad
@@ -130140,14 +130125,14 @@ igg
igg
igg
igg
-eqU
-aaa
-aaa
+aad
dPR
-kHK
+oDe
dkH
qXJ
dPR
+aad
+aad
qYo
aaa
aad
@@ -130399,12 +130384,12 @@ ntA
igg
qQM
kzc
-kzc
-jtV
-kyA
jGs
+kyA
+jtV
kzc
qQM
+qQM
qYo
efQ
qYo
@@ -130642,7 +130627,7 @@ hGW
hEt
nRr
igg
-soF
+bQk
fBX
oIX
fBX
@@ -130658,7 +130643,7 @@ tTg
dzF
dzF
frM
-xqs
+tlV
tTg
oUU
wjP
@@ -131048,7 +131033,7 @@ lHY
oYs
eWt
tqe
-tpr
+iLa
csw
dzq
kUA
@@ -131562,16 +131547,16 @@ oYs
oYs
qdn
inS
-rlL
+fDn
csw
csw
kaw
iBc
-mnA
+mot
wYd
cpI
soB
-oiZ
+otU
exv
cLt
xJf
@@ -131924,7 +131909,7 @@ aZz
kui
wEI
oGr
-ykO
+uYH
ejx
qQM
wVd
@@ -132587,8 +132572,8 @@ rkM
ueJ
kyR
jQd
-qNQ
-yba
+uHv
+hpH
hAG
nHW
vdN
@@ -132843,7 +132828,7 @@ oYs
jxU
ueJ
cBn
-vZo
+bTK
kDY
ezw
fdY
@@ -133100,7 +133085,7 @@ oYs
hih
ueJ
cBn
-bqC
+vFX
sic
bqf
uvl
@@ -133357,7 +133342,7 @@ oYs
rkM
ueJ
cBn
-lPs
+qzM
iEr
uGf
hiT
@@ -133615,7 +133600,7 @@ lJH
ueJ
rID
xSz
-oJj
+sdS
qSB
aze
cLO
@@ -133939,8 +133924,8 @@ tlN
eGy
liL
rmV
-qgR
-uHW
+qCr
+wdg
khb
bPY
pOx
@@ -134385,7 +134370,7 @@ wkS
oYs
oYs
tsL
-xoU
+vkl
arQ
mZy
aGp
@@ -136304,7 +136289,7 @@ uKl
qQM
qYo
tgT
-pOB
+iuc
nJb
nSp
hXu
@@ -137086,7 +137071,7 @@ tgT
xPc
umi
nWg
-yeT
+dHG
tgT
tgT
nPp
@@ -149121,7 +149106,7 @@ eLk
lsJ
ffP
sMB
-tqy
+fTH
hYh
qMf
oci
@@ -156022,7 +156007,7 @@ teo
teo
teo
pKD
-pbN
+lzz
bLs
hEF
udb
@@ -158816,7 +158801,7 @@ eHO
eHO
omd
gku
-mZA
+gcj
eHO
lhq
tSk
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 556bab189828..a26d174b34db 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -388,6 +388,10 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/project)
+"aiN" = (
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"aiT" = (
/obj/structure/sign/warning/electric_shock,
/turf/closed/wall/r_wall,
@@ -1370,12 +1374,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"awK" = (
-/obj/structure/table,
-/obj/item/radio/intercom/directional/north,
-/obj/item/razor,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"axc" = (
/obj/machinery/door/firedoor/heavy,
/obj/machinery/door/poddoor/preopen{
@@ -2604,27 +2602,6 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
-"aSH" = (
-/obj/effect/turf_decal/tile/red/half/contrasted,
-/obj/structure/rack,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 6
- },
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 0
- },
-/turf/open/floor/iron/dark/textured,
-/area/station/ai_monitored/security/armory/upper)
"aSS" = (
/obj/effect/turf_decal/trimline/dark_red/end,
/obj/machinery/meter,
@@ -4747,6 +4724,11 @@
/obj/effect/landmark/navigate_destination/kitchen,
/turf/open/floor/iron/kitchen/diagonal,
/area/station/service/kitchen)
+"bzt" = (
+/obj/structure/table,
+/obj/item/healthanalyzer,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"bzB" = (
/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/reagent_dispensers/watertank,
@@ -5911,13 +5893,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"bPE" = (
-/obj/structure/table,
-/obj/item/radio/intercom/directional/east,
-/obj/effect/turf_decal/tile/green/full,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/dark/smooth_large,
-/area/station/medical/pathology)
"bPP" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -8839,6 +8814,30 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/locker)
+"cIG" = (
+/obj/effect/turf_decal/tile/red/half/contrasted,
+/obj/structure/rack,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 6
+ },
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 0
+ },
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark/textured,
+/area/station/ai_monitored/security/armory/upper)
"cIH" = (
/obj/item/clothing/glasses/sunglasses,
/obj/item/stack/spacecash/c10,
@@ -19211,18 +19210,6 @@
/obj/structure/sign/warning/secure_area/directional/west,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
-"gbF" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 9
- },
-/obj/effect/turf_decal/trimline/blue/filled/warning{
- dir = 9
- },
-/obj/machinery/light/directional/north,
-/obj/structure/table/glass,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"gbH" = (
/obj/machinery/conveyor{
id = "mining_internal"
@@ -27109,12 +27096,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"iII" = (
-/obj/structure/table,
-/obj/machinery/light/directional/north,
-/obj/item/surgery_tray,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"iIW" = (
/obj/structure/table,
/obj/item/plant_analyzer,
@@ -30854,30 +30835,6 @@
/obj/structure/stairs/east,
/turf/open/floor/plating,
/area/station/hallway/primary/central/fore)
-"jSM" = (
-/obj/machinery/status_display/ai/directional/north,
-/obj/structure/table/glass,
-/obj/item/chicken_feed{
- pixel_y = 2;
- pixel_x = -5
- },
-/obj/machinery/feed_machine{
- pixel_y = 1;
- pixel_x = 9
- },
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"jTf" = (
/obj/structure/railing{
dir = 1
@@ -33052,11 +33009,6 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp)
-"kBT" = (
-/obj/structure/table,
-/obj/item/healthanalyzer,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"kBV" = (
/obj/structure/table,
/obj/item/circuitboard/machine/chem_dispenser/drinks,
@@ -33997,6 +33949,18 @@
/obj/item/crowbar/red,
/turf/open/floor/glass/reinforced,
/area/station/science/xenobiology)
+"kRn" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/trimline/blue/filled/warning{
+ dir = 9
+ },
+/obj/machinery/light/directional/north,
+/obj/structure/table/glass,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"kRr" = (
/obj/machinery/door/airlock/engineering{
name = "Port Quarter Solar Access"
@@ -35541,6 +35505,30 @@
"lpM" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/captain)
+"lpP" = (
+/obj/machinery/status_display/ai/directional/north,
+/obj/structure/table/glass,
+/obj/item/chicken_feed{
+ pixel_y = 2;
+ pixel_x = -5
+ },
+/obj/machinery/feed_machine{
+ pixel_y = 1;
+ pixel_x = 9
+ },
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"lpW" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
@@ -35768,6 +35756,12 @@
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"luw" = (
+/obj/structure/table,
+/obj/item/clothing/gloves/latex,
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"lux" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -44053,6 +44047,10 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"nXi" = (
+/mob/living/basic/goat/pete/icebox,
+/turf/open/misc/asteroid/snow/coldroom,
+/area/station/service/kitchen/coldroom)
"nXj" = (
/obj/machinery/vending/sovietsoda,
/obj/structure/cable,
@@ -45129,22 +45127,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/starboard/upper)
-"ops" = (
-/obj/structure/table/glass,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/siding/white{
- dir = 5
- },
-/obj/item/watertank,
-/obj/item/cultivator,
-/obj/item/plant_analyzer,
-/obj/effect/turf_decal/tile/green/opposingcorners{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue/opposingcorners,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"opu" = (
/obj/structure/extinguisher_cabinet/directional/south,
/obj/structure/disposalpipe/segment{
@@ -54379,6 +54361,12 @@
/obj/structure/sign/poster/official/cleanliness/directional/east,
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
+"rnm" = (
+/obj/structure/table,
+/obj/item/radio/intercom/directional/north,
+/obj/item/razor,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"rns" = (
/obj/structure/table/reinforced,
/obj/item/aicard,
@@ -56991,6 +56979,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"shD" = (
+/obj/structure/table,
+/obj/item/radio/intercom/directional/east,
+/obj/effect/turf_decal/tile/green/full,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/dark/smooth_large,
+/area/station/medical/pathology)
"shE" = (
/obj/structure/closet/secure_closet/chemical,
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -58081,6 +58076,12 @@
},
/turf/open/floor/plating,
/area/station/ai_monitored/turret_protected/aisat/atmos)
+"szh" = (
+/obj/structure/table,
+/obj/machinery/light/directional/north,
+/obj/item/surgery_tray,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"szo" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/engineering/glass{
@@ -61074,10 +61075,6 @@
/obj/structure/grille,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/nospawn)
-"tCs" = (
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"tCx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -62087,6 +62084,22 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"tSQ" = (
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/siding/white{
+ dir = 5
+ },
+/obj/item/watertank,
+/obj/item/cultivator,
+/obj/item/plant_analyzer,
+/obj/effect/turf_decal/tile/green/opposingcorners{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"tTw" = (
/obj/structure/stairs/east,
/obj/structure/railing,
@@ -67982,12 +67995,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"vPE" = (
-/obj/structure/table,
-/obj/item/clothing/gloves/latex,
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"vPF" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -69636,15 +69643,6 @@
"wqx" = (
/turf/closed/wall/r_wall,
/area/station/hallway/primary/fore)
-"wqE" = (
-/mob/living/basic/goat/pete{
- desc = "Not known for their pleasant disposition. This one seems a bit more hardy to the cold.";
- habitable_atmos = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0);
- minimum_survivable_temperature = 150;
- name = "Snowy Pete"
- },
-/turf/open/misc/asteroid/snow/coldroom,
-/area/station/service/kitchen/coldroom)
"wqI" = (
/obj/item/radio/intercom/directional/north,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -173422,7 +173420,7 @@ rcY
scw
xMq
hmb
-gbF
+kRn
eYX
sCZ
sCZ
@@ -174195,14 +174193,14 @@ gAN
qXz
gAy
rhR
-ops
+tSQ
lEH
lgA
gAy
bqH
jtv
exw
-jSM
+lpP
rCh
jTf
gUF
@@ -179084,7 +179082,7 @@ dEB
dMS
jBB
mQk
-wqE
+nXi
wMP
fwB
fwB
@@ -182189,7 +182187,7 @@ ueE
wDk
jUB
vjJ
-bPE
+shD
ffe
ffe
ffe
@@ -232490,7 +232488,7 @@ mAe
stt
qum
diC
-aSH
+cIG
mwJ
rUb
hYu
@@ -241520,7 +241518,7 @@ gmW
uiw
hWh
hGI
-tCs
+aiN
exw
exw
exw
@@ -248999,7 +248997,7 @@ vzX
bJJ
gzB
uvt
-vPE
+luw
unw
xwN
npD
@@ -249256,7 +249254,7 @@ kBl
hOY
dbx
uvt
-awK
+rnm
pra
wVJ
mtI
@@ -249513,7 +249511,7 @@ vvP
mxD
cgZ
uvt
-iII
+szh
pra
rdb
mtI
@@ -249770,7 +249768,7 @@ ddk
dry
apM
uvt
-kBT
+bzt
pra
tSc
mtI
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 854d8c081185..c77cc4d1da6e 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -490,10 +490,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/rd)
-"aeL" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible,
-/turf/closed/wall/rust,
-/area/station/engineering/atmos)
"aeS" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -982,18 +978,6 @@
/obj/machinery/light/directional/east,
/turf/open/floor/carpet/black,
/area/station/security/prison)
-"amu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/siding/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow/half/contrasted{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/machinery/incident_display/delam/directional/north,
-/turf/open/floor/iron,
-/area/station/engineering/storage_shared)
"amy" = (
/obj/machinery/door/airlock/grunge{
name = "Cell 2"
@@ -1545,13 +1529,6 @@
},
/turf/open/floor/stone,
/area/station/science/xenobiology)
-"awG" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall/rust,
-/area/station/engineering/atmos)
"awR" = (
/obj/structure/table/wood,
/obj/machinery/firealarm/directional/north,
@@ -2801,17 +2778,6 @@
/mob/living/basic/chicken,
/turf/open/floor/sandy_dirt,
/area/station/service/hydroponics)
-"aUv" = (
-/obj/effect/decal/cleanable/blood/drip,
-/obj/effect/decal/cleanable/blood/drip{
- pixel_x = 14;
- pixel_y = 13
- },
-/obj/effect/landmark/start/prisoner,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plastic,
-/area/station/security/prison/shower)
"aUz" = (
/obj/structure/flora/rock/pile/style_random,
/turf/open/misc/asteroid/airless,
@@ -3174,6 +3140,32 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
+"bbJ" = (
+/obj/effect/turf_decal/bot,
+/obj/item/storage/belt/utility{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/item/storage/belt/utility,
+/obj/item/clothing/head/utility/welding,
+/obj/item/clothing/head/utility/welding,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/table,
+/obj/machinery/cell_charger_multi,
+/obj/item/stock_parts/cell/high,
+/turf/open/floor/iron/dark,
+/area/station/engineering/storage_shared)
"bbM" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -3733,10 +3725,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
/area/station/medical/medbay/central)
-"blX" = (
-/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible,
-/turf/closed/wall,
-/area/station/engineering/atmos)
"blZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -3978,6 +3966,14 @@
dir = 8
},
/area/station/hallway/primary/central/fore)
+"bqk" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"bqo" = (
/mob/living/basic/clown{
name = "Maniac"
@@ -4000,12 +3996,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"bqY" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/plastic,
-/area/station/security/prison/shower)
"brg" = (
/obj/structure/rack,
/obj/effect/spawner/random/techstorage/engineering_all,
@@ -5775,12 +5765,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"bUO" = (
-/obj/effect/turf_decal/box/corners{
- dir = 8
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"bVh" = (
/obj/structure/urinal/directional/west,
/obj/effect/decal/remains/human,
@@ -6768,6 +6752,16 @@
"chD" = (
/turf/closed/wall,
/area/station/ai_monitored/turret_protected/aisat/foyer)
+"chF" = (
+/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/robot_debris/old,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"chH" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin{
@@ -7333,13 +7327,6 @@
"cok" = (
/turf/closed/wall/r_wall,
/area/space/nearstation)
-"cos" = (
-/obj/effect/turf_decal/box,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cov" = (
/obj/structure/disposaloutlet{
dir = 8
@@ -7520,12 +7507,6 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
/area/station/service/chapel/funeral)
-"crK" = (
-/obj/effect/turf_decal/box/corners{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"crR" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/decal/cleanable/dirt,
@@ -8476,11 +8457,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/showroomfloor,
/area/station/command/heads_quarters/cmo)
-"cJu" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel)
"cJv" = (
/obj/effect/turf_decal/tile/brown{
dir = 4
@@ -9909,6 +9885,31 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"djc" = (
+/obj/machinery/door/firedoor,
+/obj/structure/table/reinforced,
+/obj/item/toy/figure/paramedic{
+ pixel_x = 10;
+ pixel_y = 15
+ },
+/obj/machinery/door/window/left/directional/west{
+ name = "Medbay Storage"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/turf/open/floor/iron/dark,
+/area/station/medical/storage)
+"dje" = (
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/smartfridge/disks{
+ pixel_x = -7;
+ pixel_y = 15
+ },
+/turf/open/floor/iron/dark,
+/area/station/medical/pathology)
"djo" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{
dir = 8
@@ -10442,19 +10443,6 @@
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/misc/asteroid/airless,
/area/space/nearstation)
-"dqn" = (
-/obj/machinery/door/firedoor,
-/obj/structure/table/reinforced,
-/obj/item/toy/figure/paramedic{
- pixel_x = 10;
- pixel_y = 15
- },
-/obj/machinery/door/window/left/directional/west{
- name = "Medbay Storage"
- },
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/dark,
-/area/station/medical/storage)
"dqw" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -11682,32 +11670,6 @@
dir = 8
},
/area/station/service/chapel)
-"dKz" = (
-/obj/effect/turf_decal/bot,
-/obj/item/storage/belt/utility{
- pixel_x = 5;
- pixel_y = 5
- },
-/obj/item/storage/belt/utility,
-/obj/item/clothing/head/utility/welding,
-/obj/item/clothing/head/utility/welding,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/structure/table,
-/obj/machinery/cell_charger_multi,
-/obj/item/stock_parts/cell/high,
-/turf/open/floor/iron/dark,
-/area/station/engineering/storage_shared)
"dKJ" = (
/turf/closed/wall/r_wall/rust,
/area/station/command/heads_quarters/captain/private)
@@ -12429,15 +12391,6 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/port/greater)
-"dVQ" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/hot_pink/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/herringbone,
-/area/station/security/prison)
"dWr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -12765,6 +12718,18 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/genetics)
+"edY" = (
+/obj/docking_port/stationary{
+ dir = 4;
+ dwidth = 3;
+ height = 14;
+ name = "kilo arrivals";
+ roundstart_template = /datum/map_template/shuttle/arrival/kilo;
+ shuttle_id = "arrival_stationary";
+ width = 7
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"eeb" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -14760,6 +14725,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"eKq" = (
+/obj/machinery/shower/directional/west,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/plastic,
+/area/station/security/prison/shower)
"eKA" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
dir = 4
@@ -15482,6 +15454,15 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/plating,
/area/station/maintenance/starboard)
+"eVC" = (
+/obj/structure/curtain,
+/obj/structure/cable,
+/obj/structure/sign/directions/cryo/directional/west,
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark/herringbone,
+/area/station/security/prison/shower)
"eVP" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/turf_decal/stripes/corner{
@@ -16905,6 +16886,15 @@
},
/turf/open/floor/iron/dark/corner,
/area/station/hallway/primary/starboard)
+"fqF" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/trimline/hot_pink/filled/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark/herringbone,
+/area/station/security/prison)
"fqG" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -17121,23 +17111,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
-"fuP" = (
-/obj/structure/rack,
-/obj/item/gun/energy/disabler{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/gun/energy/disabler,
-/obj/item/gun/energy/disabler{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/ai_monitored/security/armory)
"fuX" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -17462,6 +17435,12 @@
/obj/machinery/cryopod,
/turf/open/floor/iron/freezer,
/area/station/hallway/secondary/exit/departure_lounge)
+"fyD" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"fyG" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -17652,14 +17631,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
-"fBl" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/growing/tray,
-/obj/effect/turf_decal/trimline/green/end{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"fBt" = (
/obj/machinery/door/airlock/grunge{
name = "Chapel Office"
@@ -17872,19 +17843,6 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark,
/area/station/security/lockers)
-"fDX" = (
-/obj/effect/turf_decal/siding/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"fEb" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -18255,6 +18213,11 @@
/obj/machinery/nanite_chamber,
/turf/open/floor/iron/dark,
/area/station/science/lab)
+"fKb" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel)
"fKf" = (
/obj/machinery/chem_heater/withbuffer{
pixel_x = 6
@@ -18856,13 +18819,6 @@
/obj/machinery/growing/tray,
/turf/open/floor/grass,
/area/station/service/hydroponics/garden)
-"fSM" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm/directional/south,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"fSS" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -21320,12 +21276,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard)
-"gIY" = (
-/obj/structure/sign/poster/random/directional/south,
-/obj/machinery/shower/directional/north,
-/obj/effect/turf_decal/box/red,
-/turf/open/floor/noslip,
-/area/station/medical/treatment_center)
"gJc" = (
/obj/structure/railing{
dir = 1
@@ -23563,6 +23513,28 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/research)
+"hsp" = (
+/obj/effect/turf_decal/siding/blue,
+/obj/effect/turf_decal/tile/blue/half/contrasted,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/right/directional/south{
+ name = "First Aid Supplies";
+ req_access = list("medical");
+ dir = 1
+ },
+/obj/item/defibrillator/loaded{
+ pixel_y = 6
+ },
+/obj/item/defibrillator/loaded{
+ pixel_y = 3
+ },
+/obj/item/defibrillator/loaded,
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"hsx" = (
/obj/machinery/vending/hydroseeds{
slogan_delay = 700
@@ -23816,32 +23788,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/iron/grimy,
/area/station/hallway/primary/fore)
-"hxg" = (
-/obj/effect/turf_decal/siding/blue{
- dir = 5
- },
-/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue/opposingcorners,
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/right/directional/south{
- name = "First Aid Supplies";
- req_access = list("medical")
- },
-/obj/item/storage/medkit/o2{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/medkit/o2,
-/obj/item/storage/medkit/o2{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/light/directional/north,
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"hxi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -24731,14 +24677,34 @@
},
/turf/open/floor/iron/dark,
/area/station/service/bar/atrium)
-"hJY" = (
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "medbay_front_door";
- name = "Medbay Storage"
+"hJX" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/structure/window/spawner/directional/west,
+/obj/machinery/door/window/left/directional/south{
+ name = "First Aid Supplies"
+ },
+/obj/item/storage/medkit/toxin{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/toxin,
+/obj/item/storage/medkit/toxin{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/machinery/requests_console/directional/north{
+ assistance_requestable = 1;
+ department = "Medbay";
+ name = "Medbay Requests Console"
},
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/obj/machinery/door/firedoor,
-/turf/open/floor/iron/dark,
+/turf/open/floor/iron/showroomfloor,
/area/station/medical/storage)
"hJZ" = (
/obj/effect/turf_decal/stripes/line{
@@ -25197,6 +25163,21 @@
/obj/item/clothing/mask/surgical,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"hPr" = (
+/obj/structure/table,
+/obj/item/paper/guides/jobs/hydroponics,
+/obj/item/reagent_containers/dropper,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/item/toy/figure/botanist,
+/obj/machinery/plantgenes,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"hPx" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/structure/crate,
@@ -26216,15 +26197,6 @@
},
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
-"idV" = (
-/obj/structure/cable,
-/obj/structure/barricade/wooden/crude,
-/obj/machinery/door/airlock/maintenance_hatch,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"idY" = (
/obj/machinery/door/airlock/maintenance{
name = "Morgue Maintenance"
@@ -26948,22 +26920,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/hallway/primary/aft)
-"ipo" = (
-/obj/machinery/chem_master/condimaster{
- desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments.";
- name = "BrewMaster 2199"
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/obj/machinery/smartfridge/disks{
- pixel_x = -4;
- pixel_y = 16
- },
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"ipq" = (
/obj/structure/flora/bush/grassy/style_random,
/obj/effect/turf_decal/stripes/line,
@@ -29052,14 +29008,6 @@
},
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/service/chapel/dock)
-"iSP" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris,
-/obj/effect/decal/cleanable/oil/streak,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"iSQ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/turf/closed/wall/r_wall,
@@ -29224,28 +29172,6 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/science/research)
-"iUC" = (
-/obj/effect/turf_decal/siding/blue,
-/obj/effect/turf_decal/tile/blue/half/contrasted,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/right/directional/south{
- name = "First Aid Supplies";
- req_access = list("medical");
- dir = 1
- },
-/obj/item/defibrillator/loaded{
- pixel_y = 6
- },
-/obj/item/defibrillator/loaded{
- pixel_y = 3
- },
-/obj/item/defibrillator/loaded,
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"iUF" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -30629,21 +30555,13 @@
"jri" = (
/turf/closed/wall,
/area/station/security/execution/transfer)
-"jrr" = (
-/obj/structure/table,
-/obj/item/paper/guides/jobs/hydroponics,
-/obj/item/reagent_containers/dropper,
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
+"jro" = (
+/obj/effect/turf_decal/box,
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/turf_decal/bot,
-/obj/item/toy/figure/botanist,
-/obj/machinery/plantgenes,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"jrs" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -31702,13 +31620,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/station/maintenance/port/fore)
-"jJW" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
-/obj/machinery/medipen_refiller,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/medbay/lobby)
"jKj" = (
/obj/machinery/door/airlock/mining{
name = "Auxiliary Base"
@@ -32319,6 +32230,14 @@
/obj/machinery/deepfryer,
/turf/open/floor/iron/kitchen,
/area/station/security/prison/mess)
+"jTI" = (
+/obj/structure/table,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/structure/window/reinforced/spawner/directional/east,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"jUa" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
@@ -32975,6 +32894,39 @@
/obj/structure/cable,
/turf/open/floor/iron/solarpanel/airless,
/area/station/solars/starboard/aft)
+"kgH" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/structure/table/reinforced,
+/obj/structure/window/spawner/directional/east,
+/obj/machinery/door/window/right/directional/south{
+ name = "First Aid Supplies";
+ req_access = list("medical")
+ },
+/obj/item/storage/medkit/fire{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/fire{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay Central";
+ name = "medical camera";
+ network = list("ss13","medical")
+ },
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"kgY" = (
/obj/structure/table,
/obj/item/storage/portable_chem_mixer,
@@ -34423,6 +34375,12 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/command/gateway)
+"kGF" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plastic,
+/area/station/security/prison/shower)
"kGI" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/event_spawn,
@@ -36725,13 +36683,6 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/cafeteria,
/area/station/service/kitchen)
-"luk" = (
-/obj/machinery/light/small/directional/south,
-/obj/effect/decal/cleanable/oil,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"lun" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -37070,6 +37021,12 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/chemistry)
+"lzP" = (
+/obj/machinery/shower/directional/north,
+/obj/machinery/station_map/engineering/directional/south,
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/noslip,
+/area/station/medical/treatment_center)
"lzQ" = (
/obj/machinery/door/airlock/maintenance,
/obj/structure/disposalpipe/segment,
@@ -37321,12 +37278,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/aft)
-"lDK" = (
-/obj/effect/decal/remains/robot,
-/obj/effect/decal/cleanable/oil/streak,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"lDT" = (
/obj/machinery/light_switch/directional/east,
/obj/structure/cable,
@@ -37809,14 +37760,6 @@
/obj/structure/sign/departments/engineering,
/turf/closed/wall,
/area/station/cargo/warehouse)
-"lLM" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/medbay/central)
"lLN" = (
/obj/structure/fans/tiny,
/obj/machinery/door/poddoor/massdriver_chapel,
@@ -37998,18 +37941,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"lOt" = (
-/obj/docking_port/stationary{
- dir = 4;
- dwidth = 3;
- height = 14;
- name = "kilo arrivals";
- roundstart_template = /datum/map_template/shuttle/arrival/kilo;
- shuttle_id = "arrival_stationary";
- width = 7
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"lOA" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -38069,13 +38000,6 @@
/obj/structure/sign/poster/contraband/random/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/starboard)
-"lPU" = (
-/obj/machinery/shower/directional/west,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/plastic,
-/area/station/security/prison/shower)
"lPV" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -38592,6 +38516,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"mar" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/oil/streak,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"mav" = (
/obj/structure/sign/departments/security/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -39069,6 +39001,13 @@
dir = 1
},
/area/station/hallway/primary/starboard)
+"mhB" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm/directional/south,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"mhP" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
@@ -39652,10 +39591,27 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
+"mqU" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/drip{
+ pixel_x = 14;
+ pixel_y = 13
+ },
+/obj/effect/landmark/start/prisoner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/plastic,
+/area/station/security/prison/shower)
"mqY" = (
/obj/machinery/cryopod,
/turf/open/floor/iron/freezer,
/area/station/hallway/secondary/exit/departure_lounge)
+"mre" = (
+/obj/structure/sign/poster/random/directional/south,
+/obj/machinery/shower/directional/north,
+/obj/effect/turf_decal/box/red,
+/turf/open/floor/noslip,
+/area/station/medical/treatment_center)
"mrt" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -39794,16 +39750,6 @@
},
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
-"mtk" = (
-/obj/effect/decal/cleanable/robot_debris/limb,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/streak,
-/obj/effect/decal/cleanable/robot_debris/old,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"mtq" = (
/obj/effect/turf_decal/tile/purple,
/obj/structure/chair/office/light,
@@ -40502,45 +40448,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"mFm" = (
-/obj/structure/flora/bush/sparsegrass/style_random,
-/obj/structure/table/glass,
-/obj/item/chicken_scanner{
- pixel_x = 6
- },
-/obj/item/chicken_scanner{
- pixel_x = 6
- },
-/obj/item/chicken_scanner{
- pixel_x = 6
- },
-/obj/item/chicken_scanner{
- pixel_x = 6
- },
-/obj/item/chicken_feed{
- pixel_y = 2;
- pixel_x = -5
- },
-/obj/machinery/feed_machine{
- pixel_y = 1;
- pixel_x = 9
- },
-/obj/item/storage/bag/egg{
- pixel_y = 8
- },
-/obj/item/storage/bag/egg{
- pixel_y = 8
- },
-/obj/item/storage/bag/egg{
- pixel_y = 8
- },
-/obj/item/storage/bag/egg{
- pixel_y = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/grass,
-/area/station/service/hydroponics)
"mFt" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -42281,14 +42188,6 @@
},
/turf/open/misc/asteroid,
/area/space/nearstation)
-"nij" = (
-/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/structure/window/reinforced/spawner/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"nim" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
@@ -45132,6 +45031,10 @@
},
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
+"ohr" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible,
+/turf/closed/wall/rust,
+/area/station/engineering/atmos)
"ohI" = (
/obj/structure/lattice/catwalk,
/obj/structure/marker_beacon/jade,
@@ -46084,18 +45987,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
-"oyX" = (
-/obj/structure/table,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 1
- },
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/item/surgery_tray,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"oyY" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/tank_dispenser/oxygen,
@@ -46186,6 +46077,13 @@
},
/turf/closed/wall,
/area/station/medical/cryo)
+"oAf" = (
+/obj/machinery/light/small/directional/north,
+/obj/structure/sign/warning/electric_shock/directional/north,
+/obj/structure/cable,
+/obj/machinery/power/smes/full,
+/turf/open/floor/circuit/red/telecomms,
+/area/station/tcommsat/server)
"oAg" = (
/obj/structure/cable,
/obj/structure/lattice/catwalk,
@@ -46270,6 +46168,14 @@
/obj/item/knife/combat/survival,
/turf/open/floor/carpet/green,
/area/station/cargo/warehouse)
+"oBq" = (
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/effect/landmark/atmospheric_sanity/ignore_area,
+/turf/open/floor/iron/dark,
+/area/station/cargo/warehouse)
"oBt" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/stripes/line{
@@ -46506,34 +46412,6 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/carpet/green,
/area/station/maintenance/port/greater)
-"oFC" = (
-/obj/item/storage/box/syringes{
- pixel_y = 23;
- pixel_x = -7
- },
-/obj/item/storage/box/beakers{
- pixel_x = -1;
- pixel_y = 22
- },
-/obj/item/hand_labeler{
- pixel_x = 7;
- pixel_y = 17
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/machinery/camera/directional/west{
- c_tag = "Hydroponcis Fore";
- name = "hydroponics camera"
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"oGo" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -48064,6 +47942,15 @@
},
/turf/open/floor/engine/air,
/area/station/engineering/atmos)
+"pfp" = (
+/obj/structure/cable,
+/obj/structure/barricade/wooden/crude,
+/obj/machinery/door/airlock/maintenance_hatch,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"pfI" = (
/mob/living/basic/clown{
name = "Lost Cause";
@@ -49205,6 +49092,19 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/wood,
/area/station/maintenance/starboard/fore)
+"pvJ" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"pvK" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -50078,6 +49978,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/atmos/pumproom)
+"pKb" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "medbay_front_door";
+ name = "Medbay Storage"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/dark,
+/area/station/medical/storage)
"pKm" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -52730,6 +52639,10 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/cryo)
+"qBu" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible,
+/turf/closed/wall,
+/area/station/engineering/atmos)
"qBz" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -53054,6 +52967,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal/incinerator)
+"qHI" = (
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/station/engineering/atmos)
"qHN" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -53875,14 +53795,6 @@
/obj/machinery/smartfridge/food,
/turf/closed/wall,
/area/station/service/kitchen)
-"qUH" = (
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark,
-/area/station/service/chapel/storage)
"qUO" = (
/obj/machinery/airalarm/directional/west,
/obj/effect/turf_decal/stripes/line{
@@ -54261,12 +54173,6 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
-"raH" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/cable,
-/obj/effect/landmark/start/chief_medical_officer,
-/turf/open/floor/iron/showroomfloor,
-/area/station/command/heads_quarters/cmo)
"raK" = (
/obj/effect/landmark/start/scientist,
/obj/effect/decal/cleanable/dirt,
@@ -54731,12 +54637,6 @@
"rhf" = (
/turf/open/floor/iron/stairs/old,
/area/station/maintenance/port/fore)
-"rhl" = (
-/obj/machinery/shower/directional/north,
-/obj/machinery/station_map/engineering/directional/south,
-/obj/effect/turf_decal/box/red,
-/turf/open/floor/noslip,
-/area/station/medical/treatment_center)
"rhv" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -54908,6 +54808,22 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/textured_large,
/area/station/ai_monitored/security/armory)
+"rjG" = (
+/obj/machinery/chem_master/condimaster{
+ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments.";
+ name = "BrewMaster 2199"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/smartfridge/disks{
+ pixel_x = -4;
+ pixel_y = 16
+ },
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"rjV" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -56684,6 +56600,14 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
+"rMk" = (
+/obj/machinery/shower/directional/east,
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plastic,
+/area/station/security/prison/shower)
"rMl" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -57979,6 +57903,34 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"sgl" = (
+/obj/item/storage/box/syringes{
+ pixel_y = 23;
+ pixel_x = -7
+ },
+/obj/item/storage/box/beakers{
+ pixel_x = -1;
+ pixel_y = 22
+ },
+/obj/item/hand_labeler{
+ pixel_x = 7;
+ pixel_y = 17
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/camera/directional/west{
+ c_tag = "Hydroponcis Fore";
+ name = "hydroponics camera"
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"sgn" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
@@ -57994,6 +57946,17 @@
},
/turf/open/floor/iron,
/area/station/security/processing)
+"sgJ" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/blue/half/contrasted{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/medbay/central)
"sgW" = (
/obj/structure/window/reinforced/spawner/directional/east,
/mob/living/carbon/human/species/monkey,
@@ -59363,15 +59326,6 @@
},
/turf/closed/wall/r_wall/rust,
/area/station/engineering/atmos/pumproom)
-"sDQ" = (
-/obj/structure/curtain,
-/obj/structure/cable,
-/obj/structure/sign/directions/cryo/directional/west,
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/dark/herringbone,
-/area/station/security/prison/shower)
"sDW" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 4
@@ -59871,13 +59825,6 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/service/janitor)
-"sLU" = (
-/obj/machinery/light/small/directional/north,
-/obj/structure/sign/warning/electric_shock/directional/north,
-/obj/structure/cable,
-/obj/machinery/power/smes/full,
-/turf/open/floor/circuit/red/telecomms,
-/area/station/tcommsat/server)
"sLW" = (
/obj/machinery/atmospherics/pipe/smart/manifold/supply/visible{
dir = 4
@@ -60830,14 +60777,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
-"taA" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"taK" = (
/obj/effect/turf_decal/tile/purple,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -61819,6 +61758,13 @@
/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/station/security/brig)
+"tqx" = (
+/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
+ dir = 4
+ },
+/turf/closed/wall/r_wall/rust,
+/area/station/engineering/atmos)
"tqz" = (
/turf/closed/wall/r_wall/rust,
/area/station/maintenance/central)
@@ -62975,14 +62921,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/commons/toilet/restrooms)
-"tMu" = (
-/obj/machinery/shower/directional/east,
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/turf/open/floor/plastic,
-/area/station/security/prison/shower)
"tMD" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -63465,6 +63403,26 @@
/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central/fore)
+"tTI" = (
+/obj/structure/rack,
+/obj/item/gun/energy/disabler{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/energy/disabler,
+/obj/item/gun/energy/disabler{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/ai_monitored/security/armory)
"tUc" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{
@@ -63952,9 +63910,43 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/security/processing)
+"uar" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/medbay/central)
"uax" = (
/turf/closed/wall/r_wall,
/area/station/security/office)
+"ubg" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners,
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/right/directional/south{
+ name = "First Aid Supplies";
+ req_access = list("medical")
+ },
+/obj/item/storage/medkit/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/medkit/o2,
+/obj/item/storage/medkit/o2{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/machinery/light/directional/north,
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"ubt" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -64379,6 +64371,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/engine,
/area/station/ai_monitored/turret_protected/ai_upload)
+"uiJ" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/decal/cleanable/oil,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"uiN" = (
/obj/effect/turf_decal/siding/wood,
/obj/structure/chair/stool/directional/south,
@@ -64807,18 +64806,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/cargo/sorting)
-"upb" = (
-/obj/machinery/smartfridge/chemistry/virology/preloaded,
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/machinery/smartfridge/disks{
- pixel_x = -7;
- pixel_y = 15
- },
-/turf/open/floor/iron/dark,
-/area/station/medical/pathology)
"upt" = (
/obj/machinery/light/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -65961,39 +65948,6 @@
/obj/effect/turf_decal/box,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"uIr" = (
-/obj/effect/turf_decal/siding/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/structure/window/spawner/directional/east,
-/obj/machinery/door/window/right/directional/south{
- name = "First Aid Supplies";
- req_access = list("medical")
- },
-/obj/item/storage/medkit/fire{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/medkit/fire,
-/obj/item/storage/medkit/fire{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/camera/directional/north{
- c_tag = "Medbay Central";
- name = "medical camera";
- network = list("ss13","medical")
- },
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"uIs" = (
/obj/machinery/turretid{
control_area = "/area/station/ai_monitored/turret_protected/aisat_interior";
@@ -66393,14 +66347,6 @@
/obj/structure/spider/stickyweb,
/turf/open/floor/iron/dark,
/area/station/maintenance/port/greater)
-"uQt" = (
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/effect/landmark/atmospheric_sanity/ignore_area,
-/turf/open/floor/iron/dark,
-/area/station/cargo/warehouse)
"uQF" = (
/obj/machinery/door/poddoor/preopen{
id = "Xenolab";
@@ -66827,6 +66773,14 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"uYx" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/growing/tray,
+/obj/effect/turf_decal/trimline/green/end{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"uYy" = (
/obj/structure/sign/directions/evac{
dir = 4;
@@ -66938,6 +66892,33 @@
},
/turf/open/floor/plating,
/area/station/maintenance/disposal/incinerator)
+"vaj" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/left/directional/south{
+ name = "First Aid Supplies"
+ },
+/obj/item/storage/medkit/brute{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/storage/medkit/brute,
+/obj/item/storage/medkit/brute{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/machinery/light/directional/north,
+/obj/effect/mapping_helpers/airlock/access/all/medical/general,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/storage)
"vam" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -67154,6 +67135,13 @@
/obj/structure/flora/grass/jungle/b/style_5,
/turf/open/misc/asteroid,
/area/space/nearstation)
+"vdL" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
+/obj/machinery/medipen_refiller,
+/turf/open/floor/iron/showroomfloor,
+/area/station/medical/medbay/lobby)
"vdS" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
@@ -67195,6 +67183,20 @@
},
/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
+"veG" = (
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/keycard_auth/directional/north,
+/obj/machinery/light_switch/directional/north{
+ pixel_x = 10
+ },
+/obj/effect/landmark/start/chief_medical_officer,
+/turf/open/floor/iron/showroomfloor,
+/area/station/command/heads_quarters/cmo)
"veP" = (
/obj/machinery/door/airlock/grunge{
name = "Restrooms"
@@ -67443,17 +67445,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/cargo/quartermaster)
-"vil" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/turf_decal/tile/blue/half/contrasted{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/medbay/central)
"vim" = (
/obj/effect/turf_decal/siding/thinplating/light/corner{
dir = 4
@@ -69707,12 +69698,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/security/courtroom)
-"vNt" = (
-/obj/item/radio/intercom/directional/south,
-/obj/effect/turf_decal/box/red,
-/obj/machinery/shower/directional/north,
-/turf/open/floor/noslip,
-/area/station/engineering/storage_shared)
"vNB" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -69890,6 +69875,12 @@
/obj/structure/sign/warning/electric_shock,
/turf/closed/wall/r_wall,
/area/station/maintenance/port/lesser)
+"vPu" = (
+/obj/effect/decal/remains/robot,
+/obj/effect/decal/cleanable/oil/streak,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"vPx" = (
/obj/machinery/door/window/left/directional/north{
dir = 2;
@@ -70440,33 +70431,6 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/medical/surgery/aft)
-"vXg" = (
-/obj/effect/turf_decal/siding/blue{
- dir = 9
- },
-/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue/opposingcorners{
- dir = 1
- },
-/obj/structure/table/reinforced,
-/obj/machinery/door/window/left/directional/south{
- name = "First Aid Supplies"
- },
-/obj/item/storage/medkit/brute{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/storage/medkit/brute,
-/obj/item/storage/medkit/brute{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/machinery/light/directional/north,
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
"vXp" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/conveyor{
@@ -71244,6 +71208,12 @@
},
/turf/open/floor/iron/dark,
/area/station/service/bar/atrium)
+"wiE" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"wiM" = (
/obj/structure/cable,
/obj/structure/table,
@@ -71437,35 +71407,20 @@
dir = 1
},
/area/station/service/chapel)
-"wlL" = (
-/obj/effect/turf_decal/siding/blue{
- dir = 1
+"wlC" = (
+/obj/structure/table,
+/obj/structure/window/reinforced/spawner/directional/north{
+ pixel_y = 1
},
-/obj/effect/turf_decal/tile/blue/half/contrasted{
+/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 1
},
-/obj/structure/table/reinforced,
-/obj/structure/window/spawner/directional/west,
-/obj/machinery/door/window/left/directional/south{
- name = "First Aid Supplies"
- },
-/obj/item/storage/medkit/toxin{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/storage/medkit/toxin,
-/obj/item/storage/medkit/toxin{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/requests_console/directional/north{
- assistance_requestable = 1;
- department = "Medbay";
- name = "Medbay Requests Console"
- },
-/obj/effect/mapping_helpers/airlock/access/all/medical/general,
-/turf/open/floor/iron/showroomfloor,
-/area/station/medical/storage)
+/obj/item/clothing/gloves/latex,
+/obj/item/healthanalyzer,
+/obj/item/clothing/mask/surgical,
+/obj/item/clothing/suit/apron/surgical,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"wlO" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4,
/obj/effect/decal/cleanable/dirt,
@@ -72478,6 +72433,18 @@
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/cargo/miningoffice)
+"wCi" = (
+/obj/structure/table,
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/structure/window/reinforced/spawner/directional/north{
+ pixel_y = 1
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/item/surgery_tray,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"wCq" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/north,
@@ -72536,6 +72503,45 @@
/obj/structure/flora/rock/pile/style_random,
/turf/open/misc/asteroid/lowpressure,
/area/space/nearstation)
+"wDQ" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/obj/structure/table/glass,
+/obj/item/chicken_scanner{
+ pixel_x = 6
+ },
+/obj/item/chicken_scanner{
+ pixel_x = 6
+ },
+/obj/item/chicken_scanner{
+ pixel_x = 6
+ },
+/obj/item/chicken_scanner{
+ pixel_x = 6
+ },
+/obj/item/chicken_feed{
+ pixel_y = 2;
+ pixel_x = -5
+ },
+/obj/machinery/feed_machine{
+ pixel_y = 1;
+ pixel_x = 9
+ },
+/obj/item/storage/bag/egg{
+ pixel_y = 8
+ },
+/obj/item/storage/bag/egg{
+ pixel_y = 8
+ },
+/obj/item/storage/bag/egg{
+ pixel_y = 8
+ },
+/obj/item/storage/bag/egg{
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/grass,
+/area/station/service/hydroponics)
"wDX" = (
/obj/effect/mapping_helpers/broken_floor,
/obj/machinery/light/small/red/directional/east,
@@ -72646,13 +72652,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"wGd" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/station/engineering/atmos)
"wGe" = (
/obj/effect/landmark/start/assistant,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -73944,6 +73943,18 @@
},
/turf/open/floor/iron/showroomfloor,
/area/station/medical/chemistry)
+"wYT" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/incident_display/delam/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/storage_shared)
"wYX" = (
/obj/structure/sign/warning,
/turf/closed/wall,
@@ -74142,6 +74153,14 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
+"xcC" = (
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/dark,
+/area/station/service/chapel/storage)
"xcE" = (
/obj/structure/chair/office/light{
dir = 1;
@@ -75207,20 +75226,6 @@
/obj/structure/closet/emcloset/wall/directional/west,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/medbay/central)
-"xvh" = (
-/obj/structure/table,
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 1
- },
-/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
- dir = 1
- },
-/obj/item/clothing/gloves/latex,
-/obj/item/healthanalyzer,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/suit/apron/surgical,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"xvj" = (
/obj/structure/flora/bush/stalky/style_random,
/obj/structure/flora/bush/flowers_br/style_random,
@@ -75653,20 +75658,6 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/dark,
/area/station/engineering/main)
-"xCt" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/keycard_auth/directional/north,
-/obj/machinery/light_switch/directional/north{
- pixel_x = 10
- },
-/obj/effect/landmark/start/chief_medical_officer,
-/turf/open/floor/iron/showroomfloor,
-/area/station/command/heads_quarters/cmo)
"xCy" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -76423,6 +76414,12 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"xQg" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/cable,
+/obj/effect/landmark/start/chief_medical_officer,
+/turf/open/floor/iron/showroomfloor,
+/area/station/command/heads_quarters/cmo)
"xQj" = (
/obj/machinery/firealarm/directional/east,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -76817,6 +76814,12 @@
dir = 4
},
/area/station/ai_monitored/security/armory)
+"xWd" = (
+/obj/item/radio/intercom/directional/south,
+/obj/effect/turf_decal/box/red,
+/obj/machinery/shower/directional/north,
+/turf/open/floor/noslip,
+/area/station/engineering/storage_shared)
"xWh" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/neutral{
@@ -86286,7 +86289,7 @@ aaa
aaa
giH
obO
-tMu
+rMk
lhv
twX
bzX
@@ -86543,10 +86546,10 @@ aaa
aaa
twX
gaX
-aUv
-bqY
-sDQ
-dVQ
+mqU
+kGF
+eVC
+fqF
lQr
fSe
lWx
@@ -86800,7 +86803,7 @@ aaa
aaa
twX
byh
-lPU
+eKq
tns
twX
rsk
@@ -92356,7 +92359,7 @@ aeU
bVv
bbO
dIR
-mtk
+chF
rBV
pOV
ogM
@@ -92612,8 +92615,8 @@ aeU
aeU
aeU
qOd
-lDK
-fSM
+vPu
+mhB
pOV
pOV
tiv
@@ -92870,7 +92873,7 @@ aeU
aeU
qOd
xRP
-luk
+uiJ
ecE
nUf
eTS
@@ -93127,7 +93130,7 @@ aeU
aeU
bbO
wno
-iSP
+mar
pOV
sOI
rjV
@@ -93384,11 +93387,11 @@ aeU
aeU
lUq
bbO
-qUH
-idV
+xcC
+pfp
vmZ
-cJu
-cJu
+fKb
+fKb
qci
wXa
siH
@@ -95508,7 +95511,7 @@ xyl
vbD
xyl
lki
-gIY
+mre
lWI
vBi
hpY
@@ -95765,7 +95768,7 @@ hFs
muA
jtr
wRp
-rhl
+lzP
lWI
vjh
wFG
@@ -96262,7 +96265,7 @@ xtt
xxk
msR
uxn
-raH
+xQg
dhX
gHC
mYS
@@ -96774,7 +96777,7 @@ pVz
pVP
ami
xxk
-xCt
+veG
rtU
rLp
xak
@@ -97549,7 +97552,7 @@ lFN
lBU
sIP
eUN
-vXg
+vaj
uxd
bnG
wpP
@@ -97806,7 +97809,7 @@ ukO
gZX
czD
rwr
-uIr
+kgH
kpm
hVw
qtV
@@ -98063,8 +98066,8 @@ jIg
pdI
bPb
jHY
-fDX
-taA
+pvJ
+bqk
iEv
wFh
hea
@@ -98074,7 +98077,7 @@ lFJ
mcM
oqe
moy
-lLM
+uar
vAW
vAW
pqZ
@@ -98331,7 +98334,7 @@ pFu
kBh
gWC
smk
-vil
+sgJ
eCX
xgb
jrs
@@ -98578,10 +98581,10 @@ dkh
jUU
dkh
qGK
-wlL
+hJX
kpm
kpm
-iUC
+hsp
eWd
mJR
wPj
@@ -98835,7 +98838,7 @@ vJg
fwx
eMB
qGK
-hxg
+ubg
oWt
vED
jsh
@@ -98860,7 +98863,7 @@ nEr
rTK
jVH
vrE
-upb
+dje
pGi
hRD
xDc
@@ -99093,8 +99096,8 @@ eby
gtK
qGK
qGK
-dqn
-hJY
+djc
+pKb
qhU
qGK
lHd
@@ -99411,7 +99414,7 @@ swZ
uNG
nPD
wNz
-fuP
+tTI
bwI
bwI
tPO
@@ -100387,7 +100390,7 @@ fkK
oqD
eyA
eIW
-jJW
+vdL
vss
aeH
xzS
@@ -104293,11 +104296,11 @@ gmG
gva
fLZ
xLM
-wGd
+qHI
rTi
fLZ
xLM
-awG
+tqx
rTi
uhp
xLM
@@ -106874,7 +106877,7 @@ iLQ
lst
pWY
tzF
-blX
+qBu
eQf
fOH
eSl
@@ -107902,7 +107905,7 @@ xAW
dkD
kMq
tYZ
-blX
+qBu
eQf
fOH
qWT
@@ -108081,7 +108084,7 @@ qlC
yaN
efG
tPD
-sLU
+oAf
uWU
nYp
mLJ
@@ -108930,7 +108933,7 @@ tNB
cUA
aal
gZm
-aeL
+ohr
eQf
fOH
gyn
@@ -111697,9 +111700,9 @@ hat
nol
lox
ocZ
-oFC
+sgl
lbj
-ipo
+rjG
wxq
wxq
hat
@@ -112210,7 +112213,7 @@ tWg
oEc
rYx
udF
-fBl
+uYx
xHP
yaS
rbO
@@ -112465,7 +112468,7 @@ dEc
umq
tWg
oIx
-jrr
+hPr
cAu
ppH
xHP
@@ -112479,7 +112482,7 @@ aMe
pmc
oRF
oRF
-mFm
+wDQ
izo
fXQ
arl
@@ -112972,7 +112975,7 @@ xSO
vTu
dRR
tmf
-xvh
+wlC
lvV
bBF
jdE
@@ -113030,10 +113033,10 @@ kGc
mPP
vww
kUS
-amu
+wYT
gDu
xtc
-dKz
+bbJ
cry
cry
cry
@@ -113290,7 +113293,7 @@ kUS
whP
jWL
bFv
-vNt
+xWd
cry
cry
cry
@@ -113486,8 +113489,8 @@ lyc
cWV
rqJ
tmf
-oyX
-nij
+wCi
+jTI
bBF
weL
umq
@@ -113679,7 +113682,7 @@ wYC
tMG
gUT
ihD
-uQt
+oBq
dME
aaa
aaa
@@ -116630,7 +116633,7 @@ bPP
cko
cko
cko
-lOt
+edY
cko
cko
cko
@@ -119968,13 +119971,13 @@ sMh
aeu
aeu
bTT
-bUO
+wiE
cko
cko
cko
cko
cko
-crK
+fyD
bUD
aeu
aeu
@@ -120228,7 +120231,7 @@ vJm
aeZ
aeZ
aeZ
-cos
+jro
aeZ
aeZ
aeZ
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index c9adba0773ee..e6951002b8a6 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -2419,6 +2419,27 @@
"aRI" = (
/turf/open/floor/circuit/green,
/area/station/science/robotics/mechbay)
+"aRM" = (
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/hand_labeler,
+/obj/structure/table/glass,
+/obj/effect/turf_decal/trimline/green/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/requests_console/directional/west{
+ department = "Hydroponics";
+ name = "Hydroponics Requests Console";
+ supplies_requestable = 1
+ },
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"aRS" = (
/obj/machinery/computer/security/telescreen/ce{
dir = 1;
@@ -4366,6 +4387,19 @@
},
/turf/open/floor/wood,
/area/station/service/theater)
+"bzO" = (
+/obj/structure/table,
+/obj/machinery/plantgenes,
+/obj/item/clothing/suit/apron,
+/obj/item/clothing/accessory/armband/hydro,
+/obj/item/wrench,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/light/directional/west,
+/obj/structure/sign/poster/random/directional/west,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"bzV" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/security/glass{
@@ -11563,27 +11597,6 @@
"elJ" = (
/turf/closed/wall/r_wall,
/area/station/science/server)
-"elM" = (
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/hand_labeler,
-/obj/structure/table/glass,
-/obj/effect/turf_decal/trimline/green/filled/corner{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/requests_console/directional/west{
- department = "Hydroponics";
- name = "Hydroponics Requests Console";
- supplies_requestable = 1
- },
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"elT" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -12529,6 +12542,24 @@
},
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/captain/private)
+"eDZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/machinery/microwave{
+ pixel_y = 6
+ },
+/obj/item/food/donkpocket/berry{
+ pixel_y = 18;
+ pixel_x = 8
+ },
+/obj/item/reagent_containers/cup/glass/bottle/beer{
+ pixel_y = 21;
+ pixel_x = -1
+ },
+/turf/open/floor/wood/parquet,
+/area/station/medical/pathology)
"eEf" = (
/obj/machinery/camera/directional/north{
c_tag = "Bar - Backroom"
@@ -20510,6 +20541,31 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"hwO" = (
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/status_display/ai/directional/north,
+/obj/structure/table/glass,
+/obj/item/chicken_feed{
+ pixel_y = 2;
+ pixel_x = -5
+ },
+/obj/machinery/feed_machine{
+ pixel_y = 1;
+ pixel_x = 9
+ },
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/turf/open/floor/grass,
+/area/station/service/hydroponics)
"hwZ" = (
/obj/structure/chair/stool/directional/north,
/obj/structure/cable,
@@ -25367,12 +25423,6 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"iYO" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/purple/half/contrasted,
-/obj/item/surgery_tray,
-/turf/open/floor/iron/white,
-/area/station/science/robotics/lab)
"iYP" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -28489,28 +28539,6 @@
},
/turf/open/floor/plating,
/area/station/cargo/sorting)
-"kaC" = (
-/obj/machinery/light_switch/directional/east,
-/obj/effect/turf_decal/tile/red/half/contrasted{
- dir = 8
- },
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/structure/rack,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/ammo_box/magazine/m35,
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag,
-/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
- pixel_y = 6
- },
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/security/armory)
"kaF" = (
/obj/effect/turf_decal/trimline/purple/line{
dir = 1
@@ -31273,6 +31301,25 @@
/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
+"laR" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/obj/item/reagent_containers/cup/bottle/synaptizine{
+ pixel_y = 19;
+ pixel_x = -10
+ },
+/obj/item/reagent_containers/cup/bottle/sugar{
+ pixel_y = 17;
+ pixel_x = -5
+ },
+/obj/machinery/smartfridge/disks{
+ pixel_x = 8;
+ pixel_y = 15
+ },
+/turf/open/floor/wood/parquet,
+/area/station/medical/pathology)
"laT" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
@@ -32907,6 +32954,31 @@
/obj/machinery/duct,
/turf/open/floor/engine,
/area/station/science/xenobiology)
+"lFk" = (
+/obj/machinery/light_switch/directional/east,
+/obj/effect/turf_decal/tile/red/half/contrasted{
+ dir = 8
+ },
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/structure/rack,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/ammo_box/magazine/m35,
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag,
+/obj/item/gun/ballistic/automatic/pistol/paco/no_mag{
+ pixel_y = 6
+ },
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark,
+/area/station/ai_monitored/security/armory)
"lFo" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -33579,6 +33651,15 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"lRO" = (
+/obj/structure/window/spawner/directional/west,
+/obj/structure/table,
+/obj/effect/turf_decal/tile/purple/half/contrasted,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/iron/white,
+/area/station/science/robotics/lab)
"lRS" = (
/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
/obj/effect/spawner/structure/window/reinforced,
@@ -46430,6 +46511,12 @@
},
/turf/open/floor/iron/dark,
/area/station/command/bridge)
+"qpt" = (
+/obj/machinery/light/small/directional/south,
+/obj/structure/table,
+/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
+/turf/open/floor/iron/white,
+/area/station/science/robotics/lab)
"qpD" = (
/obj/structure/sign/warning/secure_area,
/turf/closed/wall/r_wall,
@@ -47022,15 +47109,6 @@
/obj/effect/spawner/random/trash/janitor_supplies,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"qBr" = (
-/obj/structure/window/spawner/directional/west,
-/obj/structure/table,
-/obj/effect/turf_decal/tile/purple/half/contrasted,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/iron/white,
-/area/station/science/robotics/lab)
"qBy" = (
/turf/closed/wall,
/area/station/command/heads_quarters/hop)
@@ -52205,24 +52283,6 @@
/obj/item/training_toolbox,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"soR" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/table/wood,
-/obj/machinery/microwave{
- pixel_y = 6
- },
-/obj/item/food/donkpocket/berry{
- pixel_y = 18;
- pixel_x = 8
- },
-/obj/item/reagent_containers/cup/glass/bottle/beer{
- pixel_y = 21;
- pixel_x = -1
- },
-/turf/open/floor/wood/parquet,
-/area/station/medical/pathology)
"soW" = (
/obj/structure/rack,
/obj/effect/spawner/random/techstorage/security_all,
@@ -53784,15 +53844,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/white,
/area/station/science/cytology)
-"sRb" = (
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/status_display/ai/directional/west,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"sRf" = (
/obj/effect/turf_decal/plaque{
icon_state = "L11"
@@ -61363,19 +61414,6 @@
/obj/item/tail_pin,
/turf/open/space/basic,
/area/space/nearstation)
-"vDt" = (
-/obj/structure/table,
-/obj/machinery/plantgenes,
-/obj/item/clothing/suit/apron,
-/obj/item/clothing/accessory/armband/hydro,
-/obj/item/wrench,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light/directional/west,
-/obj/structure/sign/poster/random/directional/west,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"vDz" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -63133,6 +63171,12 @@
/obj/machinery/newscaster/directional/south,
/turf/open/floor/wood,
/area/station/service/library)
+"wij" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/purple/half/contrasted,
+/obj/item/surgery_tray,
+/turf/open/floor/iron/white,
+/area/station/science/robotics/lab)
"wit" = (
/obj/machinery/atmospherics/miner/carbon_dioxide,
/turf/open/floor/engine/co2,
@@ -63290,18 +63334,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/rd)
-"wkW" = (
-/obj/effect/turf_decal/tile/green{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/extinguisher_cabinet/directional/south,
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron,
-/area/station/service/hydroponics)
"wlt" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/blue/filled/warning,
@@ -64437,25 +64469,6 @@
/obj/structure/sign/poster/contraband/random/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"wJI" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 5
- },
-/obj/machinery/smartfridge/chemistry/virology/preloaded,
-/obj/item/reagent_containers/cup/bottle/synaptizine{
- pixel_y = 19;
- pixel_x = -10
- },
-/obj/item/reagent_containers/cup/bottle/sugar{
- pixel_y = 17;
- pixel_x = -5
- },
-/obj/machinery/smartfridge/disks{
- pixel_x = 8;
- pixel_y = 15
- },
-/turf/open/floor/wood/parquet,
-/area/station/medical/pathology)
"wJL" = (
/turf/open/floor/iron/dark,
/area/station/security/holding_cell)
@@ -64469,6 +64482,15 @@
/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
+"wKg" = (
+/obj/structure/table,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/status_display/ai/directional/west,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"wKo" = (
/obj/structure/closet/toolcloset,
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
@@ -65699,6 +65721,18 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/port)
+"xeX" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron,
+/area/station/service/hydroponics)
"xfe" = (
/obj/effect/turf_decal/tile/neutral,
/obj/structure/disposalpipe/segment,
@@ -66477,31 +66511,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/main)
-"xsh" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/status_display/ai/directional/north,
-/obj/structure/table/glass,
-/obj/item/chicken_feed{
- pixel_y = 2;
- pixel_x = -5
- },
-/obj/machinery/feed_machine{
- pixel_y = 1;
- pixel_x = 9
- },
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/turf/open/floor/grass,
-/area/station/service/hydroponics)
"xsn" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/turf_decal/siding/purple{
@@ -68585,12 +68594,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
-"yeS" = (
-/obj/machinery/light/small/directional/south,
-/obj/structure/table,
-/obj/effect/turf_decal/tile/purple/anticorner/contrasted,
-/turf/open/floor/iron/white,
-/area/station/science/robotics/lab)
"yeV" = (
/obj/structure/closet/secure_closet/hos,
/obj/item/clothing/shoes/cowboy/black,
@@ -84542,7 +84545,7 @@ hZL
rkz
mci
kQK
-soR
+eDZ
qTr
dto
rFY
@@ -84799,7 +84802,7 @@ sKe
uuE
qkR
kQK
-wJI
+laR
epW
rqT
dmu
@@ -96529,7 +96532,7 @@ sDw
eew
hxF
daO
-kaC
+lFk
anl
vDh
ewj
@@ -98664,7 +98667,7 @@ noN
bCc
scd
vjq
-qBr
+lRO
eut
dEV
gwf
@@ -98921,7 +98924,7 @@ wOg
nJH
gso
nQX
-iYO
+wij
tga
kzQ
gwf
@@ -99178,7 +99181,7 @@ pfK
wRD
sUp
xIM
-yeS
+qpt
eut
beZ
gwf
@@ -102241,13 +102244,13 @@ wYB
ebC
iQI
tNL
-elM
+aRM
xOU
ijv
hRQ
-sRb
+wKg
lPz
-vDt
+bzO
xor
pXj
kCZ
@@ -102507,7 +102510,7 @@ mrC
mrC
mrC
upT
-wkW
+xeX
kCZ
jGv
tAg
@@ -104295,7 +104298,7 @@ jER
rMA
ukv
wYB
-xsh
+hwO
lXr
lav
mVi
diff --git a/_maps/map_files/Ouroboros/Ouroboros.dmm b/_maps/map_files/Ouroboros/Ouroboros.dmm
index bafe34f6628b..c6788d420e26 100644
--- a/_maps/map_files/Ouroboros/Ouroboros.dmm
+++ b/_maps/map_files/Ouroboros/Ouroboros.dmm
@@ -23476,29 +23476,6 @@
dir = 8
},
/area/station/security/office)
-"hag" = (
-/obj/effect/turf_decal/trimline/green/filled/warning{
- dir = 1
- },
-/obj/structure/table/glass,
-/obj/item/reagent_containers/spray/plantbgone{
- pixel_x = -3;
- pixel_y = 11
- },
-/obj/item/reagent_containers/spray/plantbgone{
- pixel_x = -8;
- pixel_y = 7
- },
-/obj/item/hand_labeler{
- pixel_x = 4;
- pixel_y = 5
- },
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/obj/item/stack/package_wrap,
-/turf/open/floor/iron/dark/smooth_edge,
-/area/station/service/hydroponics)
"hao" = (
/obj/structure/bed,
/obj/item/bedsheet/qm,
@@ -28458,6 +28435,24 @@
/obj/machinery/light/warm/dim/directional/west,
/turf/open/floor/carpet,
/area/station/service/abandoned_gambling_den)
+"ixl" = (
+/obj/structure/rack/gunrack,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/requests_console/auto_name/directional/south,
+/obj/effect/mapping_helpers/requests_console/assistance,
+/obj/effect/mapping_helpers/requests_console/information,
+/obj/machinery/camera/motion/directional/south{
+ c_tag = "Security - Armory"
+ },
+/obj/effect/spawner/random/armory/disablers,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/engine,
+/area/station/ai_monitored/security/armory)
"ixo" = (
/obj/effect/turf_decal/tile/green/opposingcorners,
/obj/machinery/camera/directional/east{
@@ -39210,13 +39205,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/cargo/drone_bay)
-"lBs" = (
-/obj/structure/table,
-/obj/item/watertank,
-/obj/item/wrench,
-/obj/item/crowbar,
-/turf/open/floor/iron/large,
-/area/station/service/hydroponics)
"lBx" = (
/obj/effect/turf_decal/siding/green/end{
dir = 8
@@ -39410,21 +39398,6 @@
},
/turf/open/floor/iron/white/diagonal,
/area/station/commons/toilet/auxiliary)
-"lEq" = (
-/obj/structure/rack/gunrack,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/effect/turf_decal/bot,
-/obj/machinery/requests_console/auto_name/directional/south,
-/obj/effect/mapping_helpers/requests_console/assistance,
-/obj/effect/mapping_helpers/requests_console/information,
-/obj/machinery/camera/motion/directional/south{
- c_tag = "Security - Armory"
- },
-/obj/effect/spawner/random/armory/disablers,
-/turf/open/floor/engine,
-/area/station/ai_monitored/security/armory)
"lEB" = (
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/obj/structure/railing{
@@ -41183,6 +41156,19 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
+"mdW" = (
+/obj/structure/table,
+/obj/item/kirbyplants/organic/plant15{
+ pixel_y = 12;
+ pixel_x = 6
+ },
+/obj/structure/lattice/catwalk,
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/mob/living/basic/pet/bumbles,
+/obj/item/chicken_feed,
+/turf/open/openspace,
+/area/station/service/hydroponics/upper)
"mea" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/medical/psychology,
@@ -41788,14 +41774,6 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/engine,
/area/station/engineering/atmos/hfr_room)
-"mmM" = (
-/obj/structure/table,
-/obj/item/radio/intercom/directional/north,
-/obj/machinery/light/directional/north,
-/obj/machinery/light_switch/directional/west,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/large,
-/area/station/service/hydroponics)
"mmP" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -43918,15 +43896,6 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/commons/dorms)
-"mRw" = (
-/obj/effect/turf_decal/trimline/green/filled/warning{
- dir = 1
- },
-/obj/item/radio/intercom/directional/west,
-/obj/machinery/light/directional/west,
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron/dark/smooth_edge,
-/area/station/service/hydroponics)
"mRD" = (
/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{
dir = 1
@@ -47015,6 +46984,13 @@
},
/turf/open/floor/iron/dark/smooth_edge,
/area/station/service/hydroponics)
+"nNv" = (
+/obj/structure/table,
+/obj/item/watertank,
+/obj/item/wrench,
+/obj/item/crowbar,
+/turf/open/floor/iron/large,
+/area/station/service/hydroponics)
"nNF" = (
/obj/machinery/requests_console/auto_name/directional/east,
/obj/effect/mapping_helpers/requests_console/assistance,
@@ -50484,6 +50460,14 @@
dir = 4
},
/area/station/security/office)
+"oRB" = (
+/obj/structure/table,
+/obj/item/radio/intercom/directional/north,
+/obj/machinery/light/directional/north,
+/obj/machinery/light_switch/directional/west,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/large,
+/area/station/service/hydroponics)
"oRX" = (
/obj/structure/transit_tube/curved{
dir = 4
@@ -53446,6 +53430,29 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"pMb" = (
+/obj/effect/turf_decal/trimline/green/filled/warning{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/reagent_containers/spray/plantbgone{
+ pixel_x = -3;
+ pixel_y = 11
+ },
+/obj/item/reagent_containers/spray/plantbgone{
+ pixel_x = -8;
+ pixel_y = 7
+ },
+/obj/item/hand_labeler{
+ pixel_x = 4;
+ pixel_y = 5
+ },
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/obj/item/stack/package_wrap,
+/turf/open/floor/iron/dark/smooth_edge,
+/area/station/service/hydroponics)
"pMi" = (
/obj/structure/railing{
dir = 4
@@ -59406,6 +59413,14 @@
},
/turf/open/openspace,
/area/station/science/xenobiology)
+"rDH" = (
+/obj/machinery/disease2/incubator,
+/obj/machinery/smartfridge/disks{
+ pixel_x = -4;
+ pixel_y = 14
+ },
+/turf/open/floor/iron/dark,
+/area/station/medical/virology)
"rDQ" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -62829,6 +62844,15 @@
/obj/effect/spawner/random/structure/closet_maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/greater)
+"sCe" = (
+/obj/effect/turf_decal/trimline/green/filled/warning{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/west,
+/obj/machinery/light/directional/west,
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron/dark/smooth_edge,
+/area/station/service/hydroponics)
"sCh" = (
/turf/open/floor/engine,
/area/station/security/range)
@@ -69955,19 +69979,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/escape_pod)
-"uKg" = (
-/obj/structure/table,
-/obj/item/kirbyplants/organic/plant15{
- pixel_y = 12;
- pixel_x = 6
- },
-/obj/structure/lattice/catwalk,
-/obj/item/radio/intercom/directional/west,
-/obj/machinery/light/directional/west,
-/mob/living/basic/pet/bumbles,
-/obj/item/chicken_feed,
-/turf/open/openspace,
-/area/station/service/hydroponics/upper)
"uKn" = (
/obj/structure/disposalpipe/junction{
dir = 4
@@ -79013,14 +79024,6 @@
"xoC" = (
/turf/closed/wall,
/area/station/medical/surgery/theatre)
-"xoS" = (
-/obj/machinery/disease2/incubator,
-/obj/machinery/smartfridge/disks{
- pixel_x = -4;
- pixel_y = 14
- },
-/turf/open/floor/iron/dark,
-/area/station/medical/virology)
"xoT" = (
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
@@ -106096,9 +106099,9 @@ cEu
tJE
hDR
qxU
-hag
+pMb
kSJ
-mRw
+sCe
uys
fWE
kSJ
@@ -108154,7 +108157,7 @@ rbG
icp
oMF
dIb
-mmM
+oRB
uKn
wvO
sHu
@@ -108411,7 +108414,7 @@ hDR
rqT
xzG
dIb
-lBs
+nNv
uTy
cDP
pDE
@@ -122002,7 +122005,7 @@ kdj
hSi
rXg
jsY
-lEq
+ixl
sFW
sFW
wbh
@@ -123850,7 +123853,7 @@ kTx
vLA
vLA
kTx
-xoS
+rDH
tuz
neS
bAS
@@ -171635,7 +171638,7 @@ xtO
xtO
xtO
tag
-uKg
+mdW
sJc
jdw
bQz
diff --git a/_maps/map_files/Voidraptor/VoidRaptor.dmm b/_maps/map_files/Voidraptor/VoidRaptor.dmm
index 381bd7d3d918..38d356feff86 100644
--- a/_maps/map_files/Voidraptor/VoidRaptor.dmm
+++ b/_maps/map_files/Voidraptor/VoidRaptor.dmm
@@ -5047,16 +5047,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
-"bws" = (
-/obj/structure/table,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/turf/open/floor/wood,
-/area/station/service/hydroponics/upper)
"bwv" = (
/obj/effect/spawner/random/structure/crate,
/obj/effect/decal/cleanable/dirt,
@@ -7086,15 +7076,6 @@
/obj/effect/turf_decal/box,
/turf/open/floor/engine,
/area/station/science/ordnance/storage)
-"cfa" = (
-/obj/effect/decal/cleanable/blood/xtracks,
-/obj/machinery/door/window/brigdoor/left/directional/south{
- name = "Secure Creature Pen";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"cfm" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -16281,6 +16262,24 @@
},
/turf/open/floor/wood,
/area/station/commons/vacant_room/office)
+"eIc" = (
+/obj/structure/table/glass,
+/obj/item/paper_bin{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot,
+/obj/item/pen{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/turf/open/floor/iron/edge{
+ dir = 4
+ },
+/area/station/service/hydroponics)
"eId" = (
/turf/closed/wall,
/area/station/hallway/primary/central/fore)
@@ -18261,6 +18260,30 @@
},
/turf/open/floor/iron/textured,
/area/station/cargo/lobby)
+"fnq" = (
+/obj/structure/table,
+/obj/machinery/button/door/directional/east{
+ id = "roboticssurgery";
+ name = "Robotics Surgery Privacy";
+ pixel_y = -4;
+ req_access = list("robotics")
+ },
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{
+ dir = 4
+ },
+/obj/item/mmi{
+ pixel_y = -14
+ },
+/obj/item/mmi{
+ pixel_y = -10
+ },
+/obj/item/mmi{
+ pixel_y = -5
+ },
+/obj/item/healthanalyzer,
+/turf/open/floor/iron/dark/textured,
+/area/station/science/robotics/lab)
"fnt" = (
/obj/structure/drain,
/obj/effect/turf_decal/stripes/line{
@@ -18947,16 +18970,27 @@
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/carpet/stellar,
/area/station/service/chapel/funeral)
-"fyh" = (
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/wood,
-/area/station/service/hydroponics/upper)
"fys" = (
/obj/effect/turf_decal/trimline/purple/filled/warning{
dir = 1
},
/turf/open/floor/iron/white/side,
/area/station/science/lab)
+"fyu" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "Xtestlab";
+ name = "Test Chamber Blast Door"
+ },
+/obj/item/toy/toy_xeno,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/window/brigdoor/left/directional/north{
+ name = "Secure Creature Pen";
+ req_access = list("xenobiology")
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"fyy" = (
/obj/effect/mapping_helpers/airlock/abandoned,
/obj/machinery/door/airlock/maintenance{
@@ -27037,6 +27071,28 @@
dir = 1
},
/area/station/security/checkpoint/engineering)
+"hPg" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/suit/hooded/ablative{
+ pixel_y = 7
+ },
+/obj/item/gun/energy/temperature/security{
+ pixel_y = 5
+ },
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/window/reinforced/spawner/directional/east{
+ layer = 2.9;
+ pixel_x = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/delivery,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron/dark/textured_large,
+/area/station/ai_monitored/security/armory)
"hPi" = (
/turf/open/floor/iron/textured_large,
/area/station/command/cc_dock)
@@ -28376,6 +28432,10 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port)
+"iju" = (
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/wood,
+/area/station/service/hydroponics/upper)
"ijw" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -37008,23 +37068,6 @@
/obj/effect/turf_decal/siding/green,
/turf/open/floor/iron/textured,
/area/station/service/hydroponics/garden/abandoned)
-"kzj" = (
-/obj/structure/table/glass,
-/obj/effect/turf_decal/trimline/dark_green/filled/line,
-/obj/item/stack/sheet/mineral/plasma{
- amount = 5;
- pixel_x = 11;
- pixel_y = 0
- },
-/obj/item/stack/sheet/mineral/uranium/five{
- pixel_x = 15;
- pixel_y = 0
- },
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/white/textured_edge{
- dir = 1
- },
-/area/station/medical/pathology)
"kzk" = (
/obj/structure/table/wood,
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -43818,6 +43861,16 @@
},
/turf/open/floor/wood/large,
/area/station/commons/fitness/recreation/entertainment)
+"mpV" = (
+/obj/structure/table,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/turf/open/floor/wood,
+/area/station/service/hydroponics/upper)
"mqd" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/structure/closet_empty,
@@ -44333,6 +44386,18 @@
},
/turf/open/floor/plating/airless,
/area/station/science/ordnance/bomb)
+"mzH" = (
+/obj/machinery/smartfridge,
+/obj/machinery/splicer{
+ pixel_y = 12;
+ pixel_x = -8
+ },
+/obj/machinery/smartfridge/disks{
+ pixel_x = 9;
+ pixel_y = 14
+ },
+/turf/open/floor/iron/dark/textured_large,
+/area/station/service/hydroponics)
"mAj" = (
/obj/machinery/power/shuttle_engine/huge{
dir = 4
@@ -44928,10 +44993,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/large,
/area/station/security/courtroom)
-"mIH" = (
-/obj/effect/decal/cleanable/blood/xtracks,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"mII" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 10
@@ -51821,30 +51882,6 @@
dir = 4
},
/area/station/medical/surgery)
-"oEc" = (
-/obj/structure/table,
-/obj/machinery/button/door/directional/east{
- id = "roboticssurgery";
- name = "Robotics Surgery Privacy";
- pixel_y = -4;
- req_access = list("robotics")
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{
- dir = 4
- },
-/obj/item/mmi{
- pixel_y = -14
- },
-/obj/item/mmi{
- pixel_y = -10
- },
-/obj/item/mmi{
- pixel_y = -5
- },
-/obj/item/healthanalyzer,
-/turf/open/floor/iron/dark/textured,
-/area/station/science/robotics/lab)
"oEk" = (
/obj/machinery/airalarm/directional/east,
/obj/machinery/light/small/directional/east,
@@ -53813,24 +53850,6 @@
/obj/item/folder/white,
/turf/open/floor/iron/dark/textured_large,
/area/station/medical/morgue)
-"pep" = (
-/obj/structure/table/glass,
-/obj/item/paper_bin{
- pixel_x = -6;
- pixel_y = 4
- },
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 8
- },
-/obj/effect/turf_decal/bot,
-/obj/item/pen{
- pixel_x = -6;
- pixel_y = 4
- },
-/turf/open/floor/iron/edge{
- dir = 4
- },
-/area/station/service/hydroponics)
"pev" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -54425,6 +54444,28 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/dark/textured,
/area/station/service/hydroponics/garden)
+"pmi" = (
+/obj/structure/table/glass,
+/obj/item/storage/box/beakers,
+/obj/item/storage/box/syringes{
+ pixel_x = 3;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/obj/item/clothing/accessory/armband/hydro,
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/machinery/camera/directional/east{
+ c_tag = "Service - Hydroponics Back";
+ dir = 6;
+ name = "service camera"
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/edge{
+ dir = 8
+ },
+/area/station/service/hydroponics)
"pmk" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -59294,25 +59335,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"qBO" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/suit/hooded/ablative{
- pixel_y = 7
- },
-/obj/item/gun/energy/temperature/security{
- pixel_y = 5
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/east{
- layer = 2.9;
- pixel_x = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark/textured_large,
-/area/station/ai_monitored/security/armory)
"qBR" = (
/obj/structure/transit_tube,
/obj/structure/lattice,
@@ -61073,18 +61095,6 @@
},
/turf/open/floor/iron/textured_large,
/area/station/engineering/atmos)
-"qZN" = (
-/obj/machinery/smartfridge,
-/obj/machinery/splicer{
- pixel_y = 12;
- pixel_x = -8
- },
-/obj/machinery/smartfridge/disks{
- pixel_x = 9;
- pixel_y = 14
- },
-/turf/open/floor/iron/dark/textured_large,
-/area/station/service/hydroponics)
"qZQ" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 1
@@ -62919,22 +62929,6 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/wood/large,
/area/station/service/library)
-"rCy" = (
-/obj/machinery/door/poddoor/preopen{
- id = "Xtestlab";
- name = "Test Chamber Blast Door"
- },
-/obj/effect/decal/cleanable/blood/xtracks,
-/obj/item/toy/toy_xeno,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/door/window/brigdoor/left/directional/north{
- name = "Secure Creature Pen";
- req_access = list("xenobiology")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"rCB" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
@@ -63954,28 +63948,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port)
-"rSW" = (
-/obj/structure/table/glass,
-/obj/item/storage/box/beakers,
-/obj/item/storage/box/syringes{
- pixel_x = 3;
- pixel_y = 4
- },
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 4
- },
-/obj/item/clothing/accessory/armband/hydro,
-/obj/structure/extinguisher_cabinet/directional/east,
-/obj/machinery/camera/directional/east{
- c_tag = "Service - Hydroponics Back";
- dir = 6;
- name = "service camera"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron/edge{
- dir = 8
- },
-/area/station/service/hydroponics)
"rSX" = (
/obj/structure/table,
/obj/item/reagent_containers/condiment/saltshaker{
@@ -79857,6 +79829,23 @@
/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
+"wjt" = (
+/obj/structure/table/glass,
+/obj/effect/turf_decal/trimline/dark_green/filled/line,
+/obj/item/stack/sheet/mineral/plasma{
+ amount = 5;
+ pixel_x = 11;
+ pixel_y = 0
+ },
+/obj/item/stack/sheet/mineral/uranium/five{
+ pixel_x = 15;
+ pixel_y = 0
+ },
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/white/textured_edge{
+ dir = 1
+ },
+/area/station/medical/pathology)
"wjA" = (
/obj/effect/turf_decal/tile/dark_red/fourcorners,
/obj/effect/turf_decal/loading_area,
@@ -84870,6 +84859,14 @@
dir = 4
},
/area/station/cargo/miningdock)
+"xGd" = (
+/obj/machinery/door/window/brigdoor/left/directional/south{
+ name = "Secure Creature Pen";
+ req_access = list("xenobiology")
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"xGe" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -104867,7 +104864,7 @@ vMv
sqo
bGR
sqo
-kzj
+wjt
qbX
ttw
ttw
@@ -105303,9 +105300,9 @@ kVR
jRP
abP
nlj
-mIH
-rCy
-cfa
+uiw
+fyu
+xGd
sYn
vBO
ktF
@@ -117653,7 +117650,7 @@ kJi
lTr
jbi
rlk
-oEc
+fnq
gKY
tlq
bmt
@@ -122299,7 +122296,7 @@ bPZ
fLp
gsl
hhJ
-pep
+eIc
udR
cuJ
bDA
@@ -123587,7 +123584,7 @@ jru
qKf
nGh
bYk
-qZN
+mzH
mKb
fLp
ePt
@@ -124868,7 +124865,7 @@ rMB
fLp
dyf
eKj
-rSW
+pmi
rGQ
jGY
xsd
@@ -126418,7 +126415,7 @@ cqI
xiF
kVo
fYs
-fyh
+iju
jpR
uKN
kAB
@@ -126891,7 +126888,7 @@ vwn
ewC
ybu
cDc
-qBO
+hPg
pKY
nRV
iqx
@@ -127189,7 +127186,7 @@ jpR
muX
eKx
vxA
-bws
+mpV
ykh
aqi
yep
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index e41f37a3398e..ba03f5ff5785 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -2526,11 +2526,6 @@
"ajF" = (
/turf/open/floor/iron,
/area/station/engineering/gravity_generator)
-"ajG" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron/dark,
-/area/station/science/explab)
"ajI" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -6713,10 +6708,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"bax" = (
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/glass/reinforced,
-/area/station/science/research)
"bay" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6776,6 +6767,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
+"bbI" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/effect/landmark/start/depsec/science,
+/turf/open/floor/iron,
+/area/station/security/checkpoint/science)
"bbS" = (
/obj/machinery/light/small/directional/north,
/turf/open/floor/engine/o2,
@@ -7658,6 +7656,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/prison)
+"brZ" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/effect/landmark/start/research_director,
+/turf/open/floor/glass/reinforced,
+/area/station/command/heads_quarters/rd)
"bsf" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/portable_atmospherics/canister/bz,
@@ -7865,16 +7870,6 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms)
-"buM" = (
-/obj/structure/chair/office{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 1
- },
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/iron,
-/area/station/science/robotics/lab)
"buQ" = (
/obj/structure/closet/secure_closet/security/sec,
/obj/machinery/status_display/evac/directional/east,
@@ -8652,23 +8647,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/department/security)
-"bGV" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 5
- },
-/obj/structure/table,
-/obj/item/stack/sheet/cardboard,
-/obj/item/paper{
- default_raw_text = "buy more donk pockets";
- name = "To-Do List"
- },
-/obj/item/food/donkpocket/pizza,
-/obj/machinery/camera/directional/east{
- c_tag = "Medical - Virology Break Room";
- network = list("ss13","medbay")
- },
-/turf/open/floor/iron/dark,
-/area/station/medical/pathology)
"bHb" = (
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 8
@@ -12499,6 +12477,15 @@
"cSr" = (
/turf/closed/wall,
/area/station/service/library)
+"cSO" = (
+/obj/structure/table,
+/obj/machinery/camera/directional/north{
+ c_tag = "Service - Hydroponics"
+ },
+/obj/effect/turf_decal/tile/green/fourcorners,
+/obj/machinery/plantgenes,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"cSR" = (
/obj/structure/table,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -12893,6 +12880,15 @@
/obj/effect/turf_decal/trimline/purple/filled/corner,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"cZN" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/dark,
+/area/station/medical/pathology)
"cZT" = (
/obj/structure/alien/weeds,
/obj/item/clothing/mask/facehugger/dead,
@@ -13270,6 +13266,10 @@
},
/turf/open/floor/catwalk_floor,
/area/station/maintenance/tram/mid)
+"dge" = (
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/white,
+/area/station/science/ordnance)
"dgi" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -14384,6 +14384,23 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron,
/area/station/maintenance/tram/mid)
+"dzj" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/obj/structure/table,
+/obj/item/stack/sheet/cardboard,
+/obj/item/paper{
+ default_raw_text = "buy more donk pockets";
+ name = "To-Do List"
+ },
+/obj/item/food/donkpocket/pizza,
+/obj/machinery/camera/directional/east{
+ c_tag = "Medical - Virology Break Room";
+ network = list("ss13","medbay")
+ },
+/turf/open/floor/iron/dark,
+/area/station/medical/pathology)
"dzk" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 8
@@ -14788,18 +14805,6 @@
},
/turf/open/floor/iron,
/area/station/security/checkpoint/supply)
-"dGd" = (
-/obj/structure/table/glass,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 6
- },
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/obj/item/storage/bag/egg,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"dGh" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Tunnel Access Hatch"
@@ -15601,6 +15606,10 @@
"dSe" = (
/turf/closed/wall,
/area/station/security/prison/mess)
+"dSi" = (
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/glass/reinforced,
+/area/station/science/research)
"dSo" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -16046,15 +16055,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
/turf/open/floor/iron/smooth,
/area/station/maintenance/port/aft)
-"eah" = (
-/obj/structure/chair/office{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/red/filled/line,
-/obj/item/radio/intercom/directional/south,
-/obj/effect/landmark/start/depsec/science,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/science)
"eal" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/trash/food_packaging,
@@ -17349,16 +17349,6 @@
/obj/structure/sign/clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/security/courtroom/holding)
-"etW" = (
-/obj/structure/table/glass,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/item/chicken_scanner,
-/obj/effect/turf_decal/trimline/green/filled/line,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"eud" = (
/obj/structure/lattice,
/obj/structure/table,
@@ -18481,6 +18471,13 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness)
+"eOE" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/effect/landmark/start/depsec/science,
+/turf/open/floor/iron,
+/area/station/security/checkpoint/science)
"eON" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 8
@@ -26982,14 +26979,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"hFH" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron/cafeteria,
-/area/station/science/breakroom)
"hFJ" = (
/obj/machinery/duct,
/obj/structure/cable,
@@ -29747,13 +29736,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/catwalk_floor,
/area/station/maintenance/department/medical)
-"iyh" = (
-/obj/structure/chair/office,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron,
-/area/station/science/lower)
"iyi" = (
/obj/effect/turf_decal/stripes/end,
/obj/structure/cable/multilayer/multiz,
@@ -32262,6 +32244,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/circuit/green,
/area/station/ai_monitored/command/nuke_storage)
+"jni" = (
+/obj/structure/chair/office,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron,
+/area/station/science/lower)
"jnn" = (
/obj/machinery/light/neon_lining{
dir = 8
@@ -33440,10 +33429,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/tram/left)
-"jFW" = (
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/iron/white,
-/area/station/science/robotics/lab)
"jGa" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 1
@@ -34698,17 +34683,6 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/station/security/prison/workout)
-"kav" = (
-/obj/structure/table/glass,
-/obj/machinery/feed_machine,
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 10
- },
-/obj/structure/disposalpipe/segment,
-/obj/item/chicken_feed,
-/obj/item/chicken_feed,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"kaD" = (
/obj/structure/table,
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -35792,10 +35766,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"ksh" = (
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron/white,
-/area/station/science/ordnance)
"ksq" = (
/obj/effect/mapping_helpers/airlock/access/all/service/general,
/obj/effect/turf_decal/trimline/neutral/filled/line,
@@ -36803,6 +36773,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/construction/engineering)
+"kIW" = (
+/obj/effect/turf_decal/trimline/red/filled/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/landmark/start/depsec/science,
+/turf/open/floor/iron,
+/area/station/security/checkpoint/science)
"kIZ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -37346,6 +37325,14 @@
"kPC" = (
/turf/closed/wall/rust,
/area/station/security/prison/workout)
+"kPK" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/cafeteria,
+/area/station/science/breakroom)
"kPT" = (
/obj/vehicle/ridden/wheelchair,
/obj/effect/turf_decal/bot,
@@ -37618,6 +37605,17 @@
"kUo" = (
/turf/open/floor/iron/dark,
/area/station/service/chapel)
+"kUA" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 1
+ },
+/obj/machinery/light/directional/north,
+/obj/structure/sign/clock/directional/north,
+/obj/structure/cable,
+/obj/structure/table,
+/obj/machinery/smartfridge/disks,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"kUN" = (
/obj/machinery/door/airlock/external{
autoclose = 0;
@@ -41634,15 +41632,6 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"min" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/radio/intercom/directional/east,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/dark,
-/area/station/medical/pathology)
"miE" = (
/obj/effect/turf_decal/siding/thinplating/dark,
/obj/structure/chair{
@@ -41818,21 +41807,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/lab)
-"mlS" = (
-/obj/structure/rack,
-/obj/item/gun/energy/disabler{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/gun/energy/disabler,
-/obj/item/gun/energy/disabler{
- pixel_x = 3;
- pixel_y = -3
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/floor/iron,
-/area/station/ai_monitored/security/armory)
"mlW" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/displaycase/labcage,
@@ -43011,6 +42985,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
+"mGk" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/iron,
+/area/station/science/robotics/mechbay)
"mGl" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/circuit,
@@ -43149,6 +43131,19 @@
/obj/effect/decal/cleanable/blood/old,
/turf/open/misc/asteroid/airless,
/area/station/asteroid)
+"mHU" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/white,
+/area/station/science/ordnance/office)
"mHX" = (
/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{
dir = 10
@@ -43218,15 +43213,6 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
-"mJg" = (
-/obj/structure/table,
-/obj/machinery/camera/directional/north{
- c_tag = "Service - Hydroponics"
- },
-/obj/effect/turf_decal/tile/green/fourcorners,
-/obj/machinery/plantgenes,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"mJh" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 8
@@ -43630,13 +43616,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron,
/area/station/engineering/main)
-"mPV" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron/dark,
-/area/station/science/ordnance/testlab)
"mQa" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
@@ -43922,12 +43901,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
-"mWe" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/iron/dark,
-/area/station/science/robotics/lab)
"mWj" = (
/obj/structure/table,
/obj/effect/spawner/random/food_or_drink/donkpockets,
@@ -44251,6 +44224,18 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/crew_quarters/dorms)
+"nbW" = (
+/obj/structure/table/glass,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 6
+ },
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/obj/item/storage/bag/egg,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"nca" = (
/turf/open/openspace,
/area/station/security/brig)
@@ -46244,15 +46229,6 @@
/obj/item/pen/fourcolor,
/turf/open/floor/iron/smooth,
/area/station/maintenance/starboard/lesser)
-"nHu" = (
-/obj/effect/turf_decal/trimline/red/filled/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/landmark/start/depsec/science,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/science)
"nHW" = (
/obj/effect/turf_decal/trimline/red/filled/corner{
dir = 4
@@ -47719,14 +47695,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/engineering/gravity_generator)
-"oga" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/iron,
-/area/station/science/robotics/mechbay)
"ogp" = (
/obj/structure/table/wood,
/turf/open/floor/wood/tile,
@@ -49294,17 +49262,6 @@
/obj/effect/turf_decal/trimline/dark_green/filled/line,
/turf/open/floor/iron/white,
/area/station/science/genetics)
-"oIk" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 1
- },
-/obj/machinery/light/directional/north,
-/obj/structure/sign/clock/directional/north,
-/obj/structure/cable,
-/obj/structure/table,
-/obj/machinery/smartfridge/disks,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"oIo" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 4
@@ -51087,6 +51044,24 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
+"ppd" = (
+/obj/structure/rack,
+/obj/item/gun/energy/disabler{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/energy/disabler,
+/obj/item/gun/energy/disabler{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/obj/item/gun/energy/taser,
+/turf/open/floor/iron,
+/area/station/ai_monitored/security/armory)
"pph" = (
/obj/structure/table/glass,
/obj/item/storage/box/syringes{
@@ -52552,6 +52527,16 @@
},
/turf/open/floor/iron,
/area/station/security/prison)
+"pJH" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/iron,
+/area/station/science/robotics/lab)
"pJJ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -53839,6 +53824,13 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation/entertainment)
+"qew" = (
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 5
+ },
+/obj/structure/bookcase/manuals/botany,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"qeD" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 8
@@ -55565,6 +55557,16 @@
},
/turf/open/floor/iron,
/area/station/security/execution/transfer)
+"qGx" = (
+/obj/structure/table/glass,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/item/chicken_scanner,
+/obj/effect/turf_decal/trimline/green/filled/line,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"qGy" = (
/obj/structure/transit_tube/crossing,
/turf/open/floor/plating/airless,
@@ -56403,13 +56405,6 @@
"qUB" = (
/turf/closed/wall,
/area/station/hallway/secondary/exit)
-"qUC" = (
-/obj/structure/chair/office/light{
- dir = 1
- },
-/obj/effect/landmark/start/research_director,
-/turf/open/floor/glass/reinforced,
-/area/station/command/heads_quarters/rd)
"qUF" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
@@ -58022,6 +58017,10 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/command/nuke_storage)
+"rsK" = (
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/iron/white,
+/area/station/science/robotics/lab)
"rsL" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -59557,6 +59556,15 @@
"rUR" = (
/turf/closed/wall/r_wall,
/area/station/ai_monitored/command/nuke_storage)
+"rVl" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/item/radio/intercom/directional/south,
+/obj/effect/landmark/start/depsec/science,
+/turf/open/floor/iron,
+/area/station/security/checkpoint/science)
"rVp" = (
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
@@ -62100,6 +62108,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"sLc" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/dark,
+/area/station/science/explab)
"sLd" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -62812,13 +62825,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
-"sVG" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/obj/effect/landmark/start/depsec/science,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/science)
"sVV" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/engineering/material_cheap,
@@ -63939,6 +63945,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/security/execution/transfer)
+"tnU" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/iron/dark,
+/area/station/science/robotics/lab)
"tnV" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -69945,6 +69957,17 @@
/obj/item/stock_parts/cell/high/empty,
/turf/open/floor/iron/smooth,
/area/station/maintenance/starboard/lesser)
+"vhA" = (
+/obj/structure/table/glass,
+/obj/machinery/feed_machine,
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 10
+ },
+/obj/structure/disposalpipe/segment,
+/obj/item/chicken_feed,
+/obj/item/chicken_feed,
+/turf/open/floor/iron/dark,
+/area/station/service/hydroponics)
"vhB" = (
/obj/structure/chair/office{
dir = 4
@@ -75780,13 +75803,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/atmos/pumproom)
-"wUJ" = (
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 5
- },
-/obj/structure/bookcase/manuals/botany,
-/turf/open/floor/iron/dark,
-/area/station/service/hydroponics)
"wUL" = (
/obj/machinery/status_display/evac/directional/north,
/obj/machinery/fax{
@@ -77549,19 +77565,6 @@
"xBk" = (
/turf/closed/wall,
/area/station/medical/storage)
-"xBC" = (
-/obj/structure/chair/office{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/iron/white,
-/area/station/science/ordnance/office)
"xBD" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 10
@@ -78555,6 +78558,13 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/storage)
+"xVi" = (
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/testlab)
"xVp" = (
/obj/structure/cable,
/turf/open/floor/wood,
@@ -79013,13 +79023,6 @@
},
/turf/open/floor/iron/smooth,
/area/station/maintenance/starboard/lesser)
-"ybW" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/obj/effect/landmark/start/depsec/science,
-/turf/open/floor/iron,
-/area/station/security/checkpoint/science)
"ybX" = (
/obj/effect/spawner/random/engineering/tracking_beacon,
/obj/effect/decal/cleanable/cobweb,
@@ -110952,7 +110955,7 @@ eVz
jbf
pKI
pKI
-kav
+vhA
jyC
cDO
vph
@@ -111209,7 +111212,7 @@ eVz
rCo
xMi
pzz
-etW
+qGx
eVz
wHX
aqu
@@ -111463,10 +111466,10 @@ nUP
eVz
eVz
eVz
-wUJ
+qew
jQS
jQS
-dGd
+nbW
eVz
wHX
mYg
@@ -111985,7 +111988,7 @@ eVz
wHX
qoZ
nUP
-mJg
+cSO
wHX
nWT
adg
@@ -112499,7 +112502,7 @@ nUP
gcE
mDy
nUP
-oIk
+kUA
nbL
uLD
sqF
@@ -126943,7 +126946,7 @@ tiF
its
tiF
gbu
-iyh
+jni
pMJ
iix
bYZ
@@ -126959,7 +126962,7 @@ nZL
rin
pnn
ebs
-hFH
+kPK
tYB
qVr
bfH
@@ -128237,7 +128240,7 @@ dpd
ahG
gzw
stC
-xBC
+mHU
ryT
rpQ
vOx
@@ -131586,7 +131589,7 @@ lkK
aeg
gPB
qOo
-ksh
+dge
jGx
aej
oAn
@@ -131837,7 +131840,7 @@ pyG
qCz
wMz
okA
-mPV
+xVi
xjx
gKc
frV
@@ -132870,7 +132873,7 @@ dWM
frV
frV
rsQ
-ajG
+sLc
xLN
tho
sQZ
@@ -163890,7 +163893,7 @@ uPZ
eSj
dst
xYC
-mlS
+ppd
avf
avg
hgn
@@ -181950,8 +181953,8 @@ whz
rXK
neX
ugt
-bGV
-min
+dzj
+cZN
tkh
kgN
ugt
@@ -187080,7 +187083,7 @@ wSi
moz
gyP
cdB
-mWe
+tnU
mAf
dzu
nto
@@ -187590,7 +187593,7 @@ lVi
kCF
soq
loJ
-oga
+mGk
aRK
qoo
tUT
@@ -187600,7 +187603,7 @@ dzu
doK
uJH
uJH
-jFW
+rsK
ukS
soq
rsL
@@ -189392,7 +189395,7 @@ bvO
vnu
nUy
mUX
-buM
+pJH
goK
gal
pdZ
@@ -190947,7 +190950,7 @@ iij
yaB
tes
byp
-qUC
+brZ
tes
cjz
qKE
@@ -191712,7 +191715,7 @@ cli
oPf
jRy
odC
-bax
+dSi
tqA
rBb
rrL
@@ -193516,8 +193519,8 @@ rQt
kvt
syv
qHW
-ybW
-eah
+eOE
+rVl
syv
aaa
aaa
@@ -194287,7 +194290,7 @@ aso
syv
syv
ubR
-sVG
+bbI
moH
syv
aaa
@@ -194544,7 +194547,7 @@ xNT
syv
aKO
efB
-nHu
+kIW
uoJ
syv
aaa
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index ed8b47ddadd7..f343ab8f7a6c 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -40,7 +40,7 @@
#define DNA_UNI_IDENTITY_BLOCKS 7
/// This number needs to equal the total number of DNA blocks
-#define DNA_FEATURE_BLOCKS 16
+#define DNA_FEATURE_BLOCKS 20
#define DNA_MUTANT_COLOR_BLOCK 1
#define DNA_ETHEREAL_COLOR_BLOCK 2
@@ -58,6 +58,10 @@
#define DNA_MUSHROOM_CAPS_BLOCK 14
#define DNA_POD_HAIR_BLOCK 15
#define DNA_MUTANT_COLOR_SECONDARY 16
+#define DNA_ARM_WINGS_BLOCK 17 // NON-MODULE CHANGE
+#define DNA_AVIAN_EARS_BLOCK 18 // NON-MODULE CHANGE
+#define DNA_AVIAN_TAIL_BLOCK 19 // NON-MODULE CHANGE
+#define DNA_FEATHER_COLOR_BLOCK 20 // NON-MODULE CHANGE
#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
@@ -66,37 +70,19 @@
#define CLONER_FRESH_CLONE "fresh"
#define CLONER_MATURE_CLONE "mature"
-
-
-//species traits for mutantraces
-#define MUTCOLORS 1
-#define NOTRANSSTING 2
-#define NOZOMBIE 3
-#define NO_UNDERWEAR 4
-#define NO_DNA_COPY 5
-#define DRINKSBLOOD 6
-#define ANIME 7
-#define MUTCOLORS_SECONDARY 8
-#define SPECIES_FUR 9
-#define SKINTONES 10
-
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
#define DYNCOLORS 7
#define AGENDER 8
-/// Do not draw eyes or eyeless overlay
-#define NOEYESPRITES 9
///If we have a limb-specific overlay sprite
-#define HAS_MARKINGS 10
+#define HAS_MARKINGS 9
/// Do not draw blood overlay
-#define NOBLOODOVERLAY 11
+#define NOBLOODOVERLAY 10
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
-#define NOAUGMENTS 12
+#define NOAUGMENTS 11
///will be assigned a universal vampire themed last name shared by their department. this is preferenced!
-#define BLOOD_CLANS 13
+#define BLOOD_CLANS 12
-#define REVIVESBYHEALING 14
-#define NOHUSK 15
-#define NOMOUTH 16
+#define REVIVESBYHEALING 13
//organ slots
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
@@ -145,6 +131,7 @@
#define ORGAN_SLOT_EXTERNAL_ANIME_BOTTOM "anime_bottom"
#define ORGAN_SLOT_EXTERNAL_FLORAN_LEAVES "floran_leaves"
#define ORGAN_SLOT_EXTERNAL_FLUFF "fluff"
+#define ORGAN_SLOT_EXTERNAL_FEATHERS "feathers"
/// Xenomorph organ slots
#define ORGAN_SLOT_XENO_ACIDGLAND "acid_gland"
diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm
index 383e34f5c831..2544e9c95950 100644
--- a/code/__DEFINES/atmospherics/atmos_core.dm
+++ b/code/__DEFINES/atmospherics/atmos_core.dm
@@ -29,13 +29,13 @@
/// kPa
#define ONE_ATMOSPHERE 101.325
/// -270.3degC
-#define TCMB 2.7
+#define TCMB CELCIUS_TO_KELVIN(-270.3 CELCIUS)
/// 0degC
-#define T0C 273.15
+#define T0C CELCIUS_TO_KELVIN(0 CELCIUS)
/// 20degC
-#define T20C 293.15
+#define T20C CELCIUS_TO_KELVIN(20 CELCIUS)
/// -14C - Temperature used for kitchen cold room, medical freezer, etc.
-#define COLD_ROOM_TEMP 259.15
+#define COLD_ROOM_TEMP CELCIUS_TO_KELVIN(-14 CELCIUS)
/**
*I feel the need to document what happens here. Basically this is used
@@ -128,11 +128,11 @@
//FIRE
///Minimum temperature for fire to move to the next turf (150 °C or 433 K)
-#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C)
+#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD CELCIUS_TO_KELVIN(150 CELCIUS)
///Minimum temperature for fire to exist on a turf (100 °C or 373 K)
-#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C)
+#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST CELCIUS_TO_KELVIN(100 CELCIUS)
///Minimum temperature for items on fire
-#define BURNING_ITEM_MINIMUM_TEMPERATURE (150+T0C)
+#define BURNING_ITEM_MINIMUM_TEMPERATURE CELCIUS_TO_KELVIN(150 CELCIUS)
///Multiplier for the temperature shared to other turfs
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
///Helper for small fires to grow
diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
index 26f13bc0522c..636eb201d6bf 100644
--- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
+++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm
@@ -41,51 +41,95 @@
/// This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5
+// Defines the cap on fast your body normalizes to the environment
+/// Max negative change in temperature during natural body temperature stabilization
+#define BODYTEMP_ENVIRONMENT_COOLING_MAX -30 KELVIN // needs to be relatively high, as otherwise you will make space not deadly
+/// Max positive change in temperature during natural body temperature stabilization
+#define BODYTEMP_ENVIRONMENT_HEATING_MAX 20 KELVIN // should not be too high, as otherwise atmos meme fires will be extremely deadly
+
+/// Default maximum body temperature mobs can exist in before taking damage
+#define NPC_DEFAULT_MAX_TEMP CELCIUS_TO_KELVIN(76.85 CELCIUS)// 350 KELVIN
+/// Default minimum body temperature mobs can exist in before taking damage
+#define NPC_DEFAULT_MIN_TEMP CELCIUS_TO_KELVIN(-23.15 CELCIUS)// 250 KELVIN
+
+// Helpers for temperature conversion
+#define FAHRENHEIT_TO_KELVIN(x) (((x) + 459.67) * 5 / 9)
+#define KELVIN_TO_FAHRENHEIT(x) (((x) * 9 / 5) - 459.67)
+#define CELCIUS_TO_KELVIN(x) ((x) + 273.15)
+#define KELVIN_TO_CELCIUS(x) ((x) - 273.15)
+#define CELCIUS_TO_FAHRENHEIT(x) (((x) * 9 / 5) + 32)
+#define FAHRENHEIT_TO_CELSIUS(x) (((x) - 32) * 5 / 9)
+
+// These defines do nothing but can be used to make the code more readable by indicating temperature units
+#define CELCIUS * 1
+#define FAHRENHEIT * 1
+#define KELVIN * 1
+
+/// Max change in temperature during natural body temperature stabilization
+#define BODYTEMP_HOMEOSTASIS_COOLING_MAX (BODYTEMP_ENVIRONMENT_COOLING_MAX / 10)
+/// Max change in temperature during natural body temperature stabilization
+#define BODYTEMP_HOMEOSTASIS_HEATING_MAX (BODYTEMP_ENVIRONMENT_HEATING_MAX / 8)
+
+// These defines are DEFAULTS for most mobs
+// Mobs can override these to have whatever they want
+// That means in a lot of situations (namely mob code) you should not directly use these,
+// and instead use the relevant mob vars UNLESS you intentionally are using defaults over reality
+
/// The natural temperature for a body
-#define BODYTEMP_NORMAL 310.15
-/// This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
-#define BODYTEMP_AUTORECOVERY_DIVISOR 28
-/// Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50.
-#define BODYTEMP_AUTORECOVERY_MINIMUM 3
-///Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
-#define BODYTEMP_COLD_DIVISOR 15
-/// Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
-#define BODYTEMP_HEAT_DIVISOR 15
-/// The maximum number of degrees that your body can cool in 1 tick, due to the environment, when in a cold area.
-#define BODYTEMP_COOLING_MAX -30
-/// The maximum number of degrees that your body can heat up in 1 tick, due to the environment, when in a hot area.
-#define BODYTEMP_HEATING_MAX 30
+#define BODYTEMP_NORMAL CELCIUS_TO_KELVIN(37 CELCIUS)
+/// Beyond this point a mob is considered hyperthermic
+#define HYPERTHERMIA (BODYTEMP_NORMAL + 10 CELCIUS)
+/// Beyond this point a mob is considered hypothermic
+#define HYPOTHERMIA (BODYTEMP_NORMAL - 10 CELCIUS)
+
/// The body temperature limit the human body can take before it starts taking damage from heat.
/// This also affects how fast the body normalises it's temperature when hot.
-/// 340k is about 66c, and rather high for a human.
-#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 30)
+#define BODYTEMP_HEAT_DAMAGE_LIMIT CELCIUS_TO_KELVIN(45 CELCIUS)
/// The body temperature limit the human body can take before it starts taking damage from cold.
/// This also affects how fast the body normalises it's temperature when cold.
-/// 270k is about -3c, that is below freezing and would hurt over time.
-#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 40)
-/// The body temperature limit the human body can take before it will take wound damage.
-#define BODYTEMP_HEAT_WOUND_LIMIT (BODYTEMP_NORMAL + 90) // 400.5 k
-/// The modifier on cold damage limit hulks get ontop of their regular limit
-#define BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER 25
-/// The modifier on cold damage hulks get.
-#define HULK_COLD_DAMAGE_MOD 2
+#define BODYTEMP_COLD_DAMAGE_LIMIT CELCIUS_TO_KELVIN(-0.5 CELCIUS)
+
+/// The maximum temperature of Lavaland
+#define LAVALAND_MAX_TEMPERATURE CELCIUS_TO_KELVIN(76.85 CELCIUS)// 350 KELVIN
+#define ICEBOX_MIN_TEMPERATURE CELCIUS_TO_KELVIN(-93.15 CELCIUS)
+
+/// A temperature limit which is above the maximum lavaland temperature
+#define BODYTEMP_HEAT_LAVALAND_SAFE (LAVALAND_MAX_TEMPERATURE + 5 KELVIN)
+/// A temperature limit which is above the minimum icebox temperature
+#define BODYTEMP_COLD_ICEBOX_SAFE (ICEBOX_MIN_TEMPERATURE - 5 KELVIN)
-// Body temperature warning icons
/// The temperature the red icon is displayed.
-#define BODYTEMP_HEAT_WARNING_3 (BODYTEMP_HEAT_DAMAGE_LIMIT + 360) //+700k
+#define BODYTEMP_HEAT_WARNING_3 (BODYTEMP_NORMAL + 23 CELCIUS) // CELCIUS_TO_KELVIN(60 CELCIUS)
/// The temperature the orange icon is displayed.
-#define BODYTEMP_HEAT_WARNING_2 (BODYTEMP_HEAT_DAMAGE_LIMIT + 120) //460K
+#define BODYTEMP_HEAT_WARNING_2 (BODYTEMP_NORMAL + 13 CELCIUS) // CELCIUS_TO_KELVIN(50 CELCIUS)
/// The temperature the yellow icon is displayed.
-#define BODYTEMP_HEAT_WARNING_1 (BODYTEMP_HEAT_DAMAGE_LIMIT) //340K
+#define BODYTEMP_HEAT_WARNING_1 (BODYTEMP_NORMAL + 3 CELCIUS) // CELCIUS_TO_KELVIN(40 CELCIUS)
/// The temperature the light green icon is displayed.
-#define BODYTEMP_COLD_WARNING_1 (BODYTEMP_COLD_DAMAGE_LIMIT) //270k
+#define BODYTEMP_COLD_WARNING_1 (BODYTEMP_NORMAL - 7 CELCIUS) // CELCIUS_TO_KELVIN(30 CELCIUS)
/// The temperature the cyan icon is displayed.
-#define BODYTEMP_COLD_WARNING_2 (BODYTEMP_COLD_DAMAGE_LIMIT - 70) //200k
+#define BODYTEMP_COLD_WARNING_2 (BODYTEMP_NORMAL - 17 CELCIUS) // CELCIUS_TO_KELVIN(20 CELCIUS)
/// The temperature the blue icon is displayed.
-#define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k
+#define BODYTEMP_COLD_WARNING_3 (BODYTEMP_NORMAL - 27 CELCIUS) // CELCIUS_TO_KELVIN(10 CELCIUS)
-/// Beyond this temperature, being on fire will increase body temperature by less and less
-#define BODYTEMP_FIRE_TEMP_SOFTCAP 1200
+// Ok defaults over
+
+/// Beyond this body temperature, being on fire will increase body temperature by less and less
+#define BODYTEMP_FIRE_TEMP_SOFTCAP 600 KELVIN
+
+/// Amount of heating applied per fire stack per tick while on fire
+#define HEAT_PER_FIRE_STACK 0.075 KELVIN
+/// Amount of direct damage applied per fire stack per tick while on fire
+#define BURN_DAMAGE_PER_FIRE_STACK 0.1
+
+/// A warm drink will increase body temperature by this much
+#define WARM_DRINK 0.25 KELVIN
+/// A cold drink will decrease body temperature by this much
+#define COLD_DRINK -0.25 KELVIN
+
+/// The modifier on cold damage limit hulks get ontop of their regular limit
+#define BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER 25 KELVIN
+/// The modifier on cold damage hulks get.
+#define HULK_COLD_DAMAGE_MOD 2
/// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
#define PRESSURE_DAMAGE_COEFFICIENT 2
@@ -100,41 +144,41 @@
//CLOTHES
/// what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
-#define SPACE_HELM_MIN_TEMP_PROTECT 2.0
+#define SPACE_HELM_MIN_TEMP_PROTECT 2.0 KELVIN
/// Thermal insulation works both ways /Malkevin
-#define SPACE_HELM_MAX_TEMP_PROTECT 1500
+#define SPACE_HELM_MAX_TEMP_PROTECT 1500 KELVIN
/// what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0.
-#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0
+#define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 KELVIN
/// The min cold protection of a space suit without the heater active
-#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72
-#define SPACE_SUIT_MAX_TEMP_PROTECT 1500
+#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72 KELVIN
+#define SPACE_SUIT_MAX_TEMP_PROTECT 1500 KELVIN
/// Cold protection for firesuits
-#define FIRE_SUIT_MIN_TEMP_PROTECT 60
+#define FIRE_SUIT_MIN_TEMP_PROTECT 60 KELVIN
/// what max_heat_protection_temperature is set to for firesuit quality suits. MUST NOT BE 0.
-#define FIRE_SUIT_MAX_TEMP_PROTECT 30000
+#define FIRE_SUIT_MAX_TEMP_PROTECT 30000 KELVIN
/// Cold protection for fire helmets
-#define FIRE_HELM_MIN_TEMP_PROTECT 60
+#define FIRE_HELM_MIN_TEMP_PROTECT 60 KELVIN
/// for fire helmet quality items (red and white hardhats)
-#define FIRE_HELM_MAX_TEMP_PROTECT 30000
+#define FIRE_HELM_MAX_TEMP_PROTECT 30000 KELVIN
/// what max_heat_protection_temperature is set to for firesuit quality suits and helmets. MUST NOT BE 0.
-#define FIRE_IMMUNITY_MAX_TEMP_PROTECT 35000
+#define FIRE_IMMUNITY_MAX_TEMP_PROTECT 35000 KELVIN
/// For normal helmets
-#define HELMET_MIN_TEMP_PROTECT 160
+#define HELMET_MIN_TEMP_PROTECT 160 KELVIN
/// For normal helmets
-#define HELMET_MAX_TEMP_PROTECT 600
+#define HELMET_MAX_TEMP_PROTECT 600 KELVIN
/// For armor
-#define ARMOR_MIN_TEMP_PROTECT 160
+#define ARMOR_MIN_TEMP_PROTECT 160 KELVIN
/// For armor
-#define ARMOR_MAX_TEMP_PROTECT 600
+#define ARMOR_MAX_TEMP_PROTECT 600 KELVIN
/// For some gloves (black and)
-#define GLOVES_MIN_TEMP_PROTECT 2.0
+#define GLOVES_MIN_TEMP_PROTECT 2.0 KELVIN
/// For some gloves
-#define GLOVES_MAX_TEMP_PROTECT 1500
+#define GLOVES_MAX_TEMP_PROTECT 1500 KELVIN
/// For gloves
-#define SHOES_MIN_TEMP_PROTECT 2.0
+#define SHOES_MIN_TEMP_PROTECT 2.0 KELVIN
/// For gloves
-#define SHOES_MAX_TEMP_PROTECT 1500
+#define SHOES_MAX_TEMP_PROTECT 1500 KELVIN
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 25e86ab8f191..d6de977fecb6 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -273,6 +273,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BODY_ZONE_L_LEG "l_leg"
#define BODY_ZONE_R_LEG "r_leg"
+#define TOTAL_BODYPART_COUNT 6
+
GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
#define BODY_ZONE_PRECISE_EYES "eyes"
diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm
index 75d37aebf72f..3a245951da58 100644
--- a/code/__DEFINES/dcs/helpers.dm
+++ b/code/__DEFINES/dcs/helpers.dm
@@ -15,7 +15,7 @@
#define AddElement(arguments...) _AddElement(list(##arguments))
/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments
#define RemoveElement(arguments...) _RemoveElement(list(##arguments))
-
+#define HasElement(source, type) _HasElement(source, type)
/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
#define AddComponent(arguments...) _AddComponent(list(##arguments))
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
index d2b720057c4f..132cca0816ea 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
@@ -102,10 +102,14 @@
#define COMSIG_CARBON_SANITY_UPDATE "carbon_sanity_update"
///Called when a carbon attempts to breath, before the breath has actually occured
#define COMSIG_CARBON_ATTEMPT_BREATHE "carbon_attempt_breathe"
- // Prevents the breath
- #define COMSIG_CARBON_BLOCK_BREATH (1 << 0)
-///Called when a carbon breathes, before the breath has actually occured
-#define COMSIG_CARBON_PRE_BREATHE "carbon_pre_breathe"
+ /// Prevents the breath entirely, which means they will neither suffocate nor regain oxyloss nor decay losebreath stacks
+ #define BREATHE_BLOCK_BREATH (1<<0)
+ /// Allow the breath but prevent inake, think losebreath
+ #define BREATHE_SKIP_BREATH (1<<1)
+/// Called when a carbon breathes out (breath (the exhale))
+#define COMSIG_CARBON_BREATH_EXHALE "carbon_breath_exhale"
+ /// Return if the exhale was handled, or I guess to send the exhale into the void
+ #define BREATHE_EXHALE_HANDLED (1<<0)
///Called when a carbon updates their mood
#define COMSIG_CARBON_MOOD_UPDATE "carbon_mood_update"
///Called when a carbon attempts to eat (eating)
@@ -121,10 +125,12 @@
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
///Whenever EquipRanked is called, called after job is set
#define COMSIG_JOB_RECEIVED "job_received"
-///from /mob/living/carbon/human/proc/set_coretemperature(): (oldvalue, newvalue)
-#define COMSIG_HUMAN_CORETEMP_CHANGE "human_coretemp_change"
///from /datum/species/handle_fire. Called when the human is set on fire and burning clothes and stuff
#define COMSIG_HUMAN_BURNING "human_burning"
+ /// Return to do no burn damage
+ #define BURNING_HANDLED (1<<0)
+ /// Return to skip protection check (ie, cause damage even if wearing fireproof clothing)
+ #define BURNING_SKIP_PROTECTION (1<<1)
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers)
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
index 00dbeb79632f..4fdb0479fe34 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
@@ -221,3 +221,11 @@
#define COMSIG_MOB_LOST_CHAIN_TAIL "living_detached_chain_tail"
/// Sent from a 'contract chain' button on a mob chain
#define COMSIG_MOB_CHAIN_CONTRACT "living_chain_contracted"
+
+#define COMSIG_LIVING_BODY_TEMPERATURE_CHANGE "living_body_temperature_change"
+
+#define COMSIG_LIVING_HOMEOSTASIS "living_homeostasis"
+ /// Return to do no homeostasis at all
+ #define HOMEOSTASIS_HANDLED (1<<0)
+ /// Return to not reduce hunger at all
+ #define HOMEOSTASIS_NO_HUNGER (1<<1)
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
index 51b79ec9eb10..d5753bf6e8b5 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -11,6 +11,10 @@
#define COMSIG_MOB_MIND_INITIALIZED "mob_mind_inited"
///from base of mob/set_stat(): (new_stat, old_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
+///from base of mob/reagent_check(): (datum/reagent/chem, seconds_per_tick, times_fired)
+#define COMSIG_MOB_REAGENT_CHECK "mob_reagent_check"
+ ///stops the reagent check call
+ #define COMSIG_MOB_STOP_REAGENT_CHECK (1<<0)
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
diff --git a/code/__DEFINES/dcs/signals/signals_specie.dm b/code/__DEFINES/dcs/signals/signals_specie.dm
index 89239cf39dbc..1ff22aed90c6 100644
--- a/code/__DEFINES/dcs/signals/signals_specie.dm
+++ b/code/__DEFINES/dcs/signals/signals_specie.dm
@@ -5,3 +5,6 @@
#define COMSIG_SPECIES_LOSS "species_loss"
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) called before anything is done to ensure passing of data
#define COMSIG_SPECIES_GAIN_PRE "species_gain_pre"
+///from datum/species/handle_chemical(): (datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired)
+#define COMSIG_SPECIES_HANDLE_CHEMICAL "species_handle_chemicals"
+ // same return values as COMSIG_MOB_STOP_REAGENT_CHECK
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 7d3d5d8e7bbb..a0d08b7644e5 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -28,7 +28,7 @@
#define BLOOD_DEFICIENCY_MODIFIER 0.025
/// Temperature at which blood loss and regen stops. [/mob/living/carbon/human/proc/handle_blood]
-#define BLOOD_STOP_TEMP 225
+#define BLOOD_STOP_TEMP CELCIUS_TO_KELVIN(-48.15 CELCIUS)
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
@@ -166,22 +166,13 @@
#define HUMAN_MAX_OXYLOSS 3
#define HUMAN_CRIT_MAX_OXYLOSS (SSMOBS_DT/3)
-#define HEAT_DAMAGE_LEVEL_1 1 //Amount of damage applied when your body temperature just passes the 360.15k safety point
-#define HEAT_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 400K point
-#define HEAT_DAMAGE_LEVEL_3 4 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
+/// Damage recieved when past heat damage threshold.
+/// Gets multiplied by 2x, 4x, 8x depending on how far past the threshold you are.
+#define HEAT_DAMAGE 1
-#define COLD_DAMAGE_LEVEL_1 0.25 //Amount of damage applied when your body temperature just passes the 260.15k safety point
-#define COLD_DAMAGE_LEVEL_2 0.75 //Amount of damage applied when your body temperature passes the 200K point
-#define COLD_DAMAGE_LEVEL_3 1.5 //Amount of damage applied when your body temperature passes the 120K point
-
-//Note that gas heat damage is only applied once every FOUR ticks.
-#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point
-#define HEAT_GAS_DAMAGE_LEVEL_2 4 //Amount of damage applied when the current breath's temperature passes the 400K point
-#define HEAT_GAS_DAMAGE_LEVEL_3 8 //Amount of damage applied when the current breath's temperature passes the 1000K point
-
-#define COLD_GAS_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when the current breath's temperature just passes the 260.15k safety point
-#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
-#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
+/// Damage recieved when past cold damage threshold.
+/// Gets multiplied by 2x, 4x, 8x depending on how far past the threshold you are.
+#define COLD_DAMAGE 0.25
//Brain Damage defines
#define BRAIN_DAMAGE_MILD 20
@@ -459,8 +450,19 @@
#define POCKET_STRIP_DELAY (4 SECONDS) //time taken to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
-#define HUNGER_FACTOR 0.05 //factor at which mob nutrition decreases
-#define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second
+/// Factor at which mob nutrition decreases
+#define HUNGER_FACTOR 0.1
+
+// These add up to 1 to roughly (VERY roughly) represent the proportion of hunger used by each system
+/// What % of hunger is used by homeostasis
+#define HOMEOSTASIS_HUNGER_MULTIPLIER 0.1
+/// What % of hunger is used by passive hunger
+#define PASSIVE_HUNGER_MULTIPLIER 0.4
+/// What % of hunger is used by movement
+#define MOVEMENT_HUNGER_MULTIPLIER 0.1
+
+/// Factor at which ethereal's charge decreases per second
+#define ETHEREAL_CHARGE_FACTOR 0.2
/// How much nutrition eating clothes as moth gives and drains
#define CLOTHING_NUTRITION_GAIN 15
#define REAGENTS_METABOLISM 0.2 //How many units of reagent are consumed per second, by default.
@@ -929,11 +931,6 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
#define HEALING_TOUCH_NOT_SELF "healing_touch_not_self"
#define HEALING_TOUCH_SELF_ONLY "healing_touch_self_only"
-/// Default minimum body temperature mobs can exist in before taking damage
-#define NPC_DEFAULT_MIN_TEMP 250
-/// Default maximum body temperature mobs can exist in before taking damage
-#define NPC_DEFAULT_MAX_TEMP 350
-
// Flags for mobs which can't do certain things while someone is looking at them
/// Flag which stops you from moving while observed
#define NO_OBSERVED_MOVEMENT (1<<0)
diff --git a/code/__DEFINES/sprite_accessories.dm b/code/__DEFINES/sprite_accessories.dm
index 9c9471130e6f..d4cfb7ca5d57 100644
--- a/code/__DEFINES/sprite_accessories.dm
+++ b/code/__DEFINES/sprite_accessories.dm
@@ -7,3 +7,9 @@
#define FACIAL_HAIR_COLOR "facial_hair_color"
/// Color of the sprite accessory will match the owner's (left) eye color
#define EYE_COLOR "eye_color"
+
+#define SKIN_COLOR "skin_color"
+
+#define MUTANT_COLOR_SECONDARY "mutant_color_secondary"
+
+#define ANIME_COLOR "anime_color"
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index ab2bd38217d6..ba2feadba2c0 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -187,6 +187,7 @@
#define INIT_ORDER_MINOR_MAPPING -40
#define INIT_ORDER_PATH -50
#define INIT_ORDER_EXPLOSIONS -69
+#define INIT_ORDER_CREDITS -93
#define INIT_ORDER_REPLAYS -94
#define INIT_ORDER_HOTSPOTS -95 ///only called on oshan so just call it near the end.
#define INIT_ORDER_TWITCH -96
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 281c2ba5f246..db1506f1be9b 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -147,39 +147,44 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Species with this trait are genderless
#define TRAIT_AGENDER "agender"
/// Species with this trait have a blood clan mechanic
-/* #define TRAIT_BLOOD_CLANS "blood_clans" */
+#define TRAIT_BLOOD_CLANS "blood_clans"
+/// Species with this trait have markings (this SUCKS, remove this later in favor of bodypart overlays)
+#define TRAIT_HAS_MARKINGS "has_markings"
/// Species with this trait use skin tones for coloration
#define TRAIT_USES_SKINTONES "uses_skintones"
/// Species with this trait use mutant colors for coloration
#define TRAIT_MUTANT_COLORS "mutcolors"
+/// Species with this trait use mutant colors for coloration
+#define TRAIT_MUTANT_COLORS_SECONDARY "mutcolors_secondary"
/// Species with this trait have mutant colors that cannot be chosen by the player, nor altered ingame by external means
#define TRAIT_FIXED_MUTANT_COLORS "fixed_mutcolors"
/// Humans with this trait won't get bloody hands, nor bloody feet
-/* #define TRAIT_NO_BLOOD_OVERLAY "no_blood_overlay" */
+#define TRAIT_NO_BLOOD_OVERLAY "no_blood_overlay"
/// Humans with this trait cannot have underwear
#define TRAIT_NO_UNDERWEAR "no_underwear"
/// This carbon doesn't show an overlay when they have no brain
-/* #define TRAIT_NO_DEBRAIN_OVERLAY "no_debrain_overlay" */
+#define TRAIT_FUR_COLORS "trait_fur_colors"
/// Humans with this trait cannot get augmentation surgery
#define TRAIT_NO_AUGMENTS "no_augments"
/// This carbon doesn't get hungry
#define TRAIT_NOHUNGER "no_hunger"
/// This carbon doesn't metabolize reagents.
-#define TRAIT_NOMETABOLISM "no_metabolism"
/// This carbon doesn't bleed
#define TRAIT_NOBLOOD "noblood"
/// This just means that the carbon will always have functional liverless metabolism
#define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism"
+/// Humans with this trait cannot be affected by changeling transformation stings
+#define TRAIT_NO_TRANSFORMATION_STING "no_transformation_sting"
/// This carbon can't be overdosed by chems
-/* #define TRAIT_OVERDOSEIMMUNE "overdose_immune" */
+#define TRAIT_OVERDOSEIMMUNE "overdose_immune"
/// Humans with this trait cannot be turned into zombies
#define TRAIT_NO_ZOMBIFY "no_zombify"
/// Carbons with this trait can't have their DNA copied by diseases nor changelings
#define TRAIT_NO_DNA_COPY "no_dna_copy"
/// Carbons with this trait cant have their dna scrambled by genetics or a disease retrovirus.
-/* #define TRAIT_NO_DNA_SCRAMBLE "no_dna_scramble" */
+#define TRAIT_NO_DNA_SCRAMBLE "no_dna_scramble"
/// Carbons with this trait can eat blood to regenerate their own blood volume, instead of injecting it
-/* #define TRAIT_DRINKS_BLOOD "drinks_blood" */
+#define TRAIT_DRINKS_BLOOD "drinks_blood"
/// Mob is immune to clone (cellular) damage
#define TRAIT_NOCLONELOSS "no_cloneloss"
/// Mob is immune to toxin damage
@@ -196,6 +201,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_EASILY_WOUNDED "easy_limb_wound"
#define TRAIT_HARDLY_WOUNDED "hard_limb_wound"
#define TRAIT_NEVER_WOUNDED "never_wounded"
+#define TRAIT_NO_HUSK "no_husk"
/// Species with this trait have 50% extra chance of bleeding from piercing and slashing wounds
/* #define TRAIT_EASYBLEED "easybleed" */
#define TRAIT_TOXINLOVER "toxinlover"
@@ -543,7 +549,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/* #define TRAIT_UNHITTABLE_BY_PROJECTILES "unhittable_by_projectiles" */
/// Projectile with this trait will always hit the defined zone of a struck living mob.
-/* #define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone" */
+#define TRAIT_ALWAYS_HIT_ZONE "always_hit_zone"
/// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations.
#define TRAIT_MORBID "morbid"
diff --git a/code/__DEFINES/traits/monkestation/declarations.dm b/code/__DEFINES/traits/monkestation/declarations.dm
index 29d153abd301..2e9ea4b80104 100644
--- a/code/__DEFINES/traits/monkestation/declarations.dm
+++ b/code/__DEFINES/traits/monkestation/declarations.dm
@@ -131,4 +131,15 @@
/// Has an item been enchanted by a clock cult Stargazer?
#define TRAIT_STARGAZED "stargazed"
+#define TRAIT_FEATHERED "feathers"
+#define TRAIT_NON_IMPORTANT_SHOE_BLOCK "shoe_block"
+/// Skip a breath once in every x breaths (where x is ticks between breaths)
+#define TRAIT_LABOURED_BREATHING "laboured_breathing"
+/// Blocks losebreath from accumulating from things such as heart attacks or choking
+#define TRAIT_ASSISTED_BREATHING "assisted_breathing"
+/// Stops organs from decaying while dead
+#define TRAIT_NO_ORGAN_DECAY "no_organ_decay"
+/// Mob does not homeostasize body temperature
+#define TRAIT_COLD_BLOODED "cold_blooded"
+
// END TRAIT DEFINES
diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm
index 815e60d0738e..6a108858bb1f 100644
--- a/code/__DEFINES/wounds.dm
+++ b/code/__DEFINES/wounds.dm
@@ -48,16 +48,13 @@ GLOBAL_LIST_INIT(wound_severities_chronological, list(
// ~determination second wind defines
-// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind]
-#define WOUND_DETERMINATION_MODERATE 1
-#define WOUND_DETERMINATION_SEVERE 2.5
-#define WOUND_DETERMINATION_CRITICAL 5
-#define WOUND_DETERMINATION_LOSS 7.5
+// How much determination to add each time someone gains a new wound in [/datum/wound/proc/second_wind]
+#define WOUND_DETERMINATION_MODERATE (5 SECONDS)
+#define WOUND_DETERMINATION_SEVERE (10 SECONDS)
+#define WOUND_DETERMINATION_CRITICAL (20 SECONDS)
+#define WOUND_DETERMINATION_LOSS (30 SECONDS)
/// the max amount of determination you can have
-#define WOUND_DETERMINATION_MAX 10
-
-/// While someone has determination in their system, their bleed rate is slightly reduced
-#define WOUND_DETERMINATION_BLEED_MOD 0.85
+#define WOUND_DETERMINATION_MAX (1 MINUTES)
/// Wounds using this competition mode will remove any wounds of a greater severity than itself in a random wound roll. In most cases, you dont want to use this.
#define WOUND_COMPETITION_OVERPOWER_GREATERS "wound_submit"
diff --git a/code/__DEFINES/~monkestation/blood_datums.dm b/code/__DEFINES/~monkestation/blood_datums.dm
new file mode 100644
index 000000000000..e1f906a8b103
--- /dev/null
+++ b/code/__DEFINES/~monkestation/blood_datums.dm
@@ -0,0 +1,21 @@
+#define COMSIG_HUMAN_ON_HANDLE_BLOOD "human_on_handle_blood"
+ #define HANDLE_BLOOD_HANDLED (1<<0)
+ #define HANDLE_BLOOD_NO_NUTRITION_DRAIN (1<<1)
+ #define HANDLE_BLOOD_NO_EFFECTS (1<<2)
+
+#define COLOR_BLOOD "#c90000"
+
+/// Modifier used in math involving bloodiness, so the above values can be adjusted easily
+#define BLOOD_PER_UNIT_MODIFIER 0.5
+
+/// from /datum/status_effect/limp/proc/check_step()
+#define COMSIG_CARBON_LIMPING "mob_limp_check"
+ #define COMPONENT_CANCEL_LIMP (1<<0)
+
+/// Mob can walk despite having two disabled/missing legs so long as they have two of this trait.
+/// Kind of jank, refactor at a later day when I can think of a better solution.
+/// Just be sure to call update_limbless_locomotion() after applying / removal
+#define TRAIT_NO_LEG_AID "no_leg_aid"
+
+/// Updating a mob's movespeed when lacking limbs. (list/modifiers)
+#define COMSIG_LIVING_LIMBLESS_MOVESPEED_UPDATE "living_get_movespeed_modifiers"
diff --git a/code/__DEFINES/~monkestation/chewin.dm b/code/__DEFINES/~monkestation/chewin.dm
index 980bcb76b964..75b635b5b9b4 100644
--- a/code/__DEFINES/~monkestation/chewin.dm
+++ b/code/__DEFINES/~monkestation/chewin.dm
@@ -64,21 +64,18 @@
#define PLATE "plate"
#define CUTTING_BOARD "cutting board"
#define PAN "pan"
-#define POT "pot"
-#define BOWL "bowl"
+#define POT "cooking pot"
+#define BOWL "mixing bowl"
#define DF_BASKET "deep fryer basket"
#define AF_BASKET "air fryer basket"
#define OVEN "oven"
-#define GRILL "grill"
+#define GRILL "grill grate"
//Stove temp settings.
#define J_LO "Low"
#define J_MED "Medium"
#define J_HI "High"
-//Just a catalog for the cooking catalog
-#define CATALOG_COOKING "cooking"
-
//Burn times for cooking things on a stove.
//Anything put on a stove for this long becomes a burned mess.
#define CHEWIN_BURN_TIME_LOW 15 MINUTES
diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm
index bfc0f361e4f4..969145aeec56 100644
--- a/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm
@@ -33,3 +33,14 @@
#define COMSIG_LIVING_TRACKER_REMOVED "tracker_removed"
#define COMSIG_CLEAR_SEE "clear_see"
+
+/// Carbon is steppin
+#define COMSIG_CARBON_STEP "carbon_step"
+/// Carbon is steppin on a painful limb
+#define COMSIG_CARBON_PAINED_STEP "carbon_pain_step"
+ /// Stop the pain from happening
+ #define STOP_PAIN (1<<0)
+
+#define COMSIG_LIVING_GIVE_ITEM_CHECK "living_give_item_check"
+
+#define COMSIG_LIVING_ITEM_OFFERED_PRECHECK "living_item_offer_precheck"
diff --git a/code/__DEFINES/~monkestation/living.dm b/code/__DEFINES/~monkestation/living.dm
index 06134c4aaffa..b79309b42d8d 100644
--- a/code/__DEFINES/~monkestation/living.dm
+++ b/code/__DEFINES/~monkestation/living.dm
@@ -6,3 +6,32 @@
#define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through"
/// Allow to movable atoms to pass through this living mob
#define COMPONENT_LIVING_PASSABLE (1<<0)
+
+/// Checks if the value is "left"
+/// Used primarily for hand or foot indexes
+#define IS_RIGHT(value) (value % 2 == 0)
+/// Checks if the value is "right"
+/// Used primarily for hand or foot indexes
+#define IS_LEFT(value) (value % 2 != 0)
+/// Helper for picking between left or right when given a value
+/// Used primarily for hand or foot indexes
+#define SELECT_LEFT_OR_RIGHT(value, left, right) (IS_LEFT(value) ? left : right)
+
+
+/// Calculates oxyloss cap
+#define MAX_OXYLOSS(maxHealth) (maxHealth * 2)
+
+// Some source defines for pain and consciousness
+// Consciousness ones are human readable because of laziness (they are shown in cause of death)
+#define PAINSHOCK "neurological shock"
+#define PAINCRIT "paincrit"
+#define PAIN "pain"
+#define HUNGER "starvation"
+#define BRAIN_DAMAGE "brain damage"
+#define BLOOD_LOSS "blood loss"
+#define BLUNT_DAMAGE "blunt force trauma"
+#define BURN_DAMAGE "severe burns"
+#define OXY_DAMAGE "suffocation"
+#define TOX_DAMAGE "toxic poisoning"
+
+#define SKIP_INTERNALS "skip_internals"
diff --git a/code/__DEFINES/~monkestation/mobs.dm b/code/__DEFINES/~monkestation/mobs.dm
index 9f531dc4da76..708feee16e0b 100644
--- a/code/__DEFINES/~monkestation/mobs.dm
+++ b/code/__DEFINES/~monkestation/mobs.dm
@@ -1,5 +1,7 @@
#define SPECIES_ARACHNIDS "arachnid"
#define SPECIES_DRACONIC_SKELETON "draconic_skeleton"
+#define SPECIES_WEREWOLF "werewolf" //Monkestation Addition
+#define SPECIES_ORNITHID "ornithid"
GLOBAL_REAL_VAR(list/voice_type2sound = list(
"1" = list(
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index c6b4e280eed3..b9241abe78a7 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -52,6 +52,10 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition
init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list) //Monkestation Addition
init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) //Monkestation Addition
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wings, GLOB.arm_wings_list) //NON-MODULE CHANGE
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen, GLOB.arm_wingsopen_list) //NON-MODULE CHANGE
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.tails_list_avian) //NON-MODULE CHANGE
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage, GLOB.avian_ears_list) //NON-MODULE CHANGE
/// Inits GLOB.species_list. Not using GLOBAL_LIST_INIT b/c it depends on GLOB.string_lists
/proc/init_species_list()
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index a43a50cda5a2..19feb2cb2c0e 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -89,6 +89,10 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
if(!length(GLOB.pod_hair_list))
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
+ if(!length(GLOB.pod_hair_list))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
+ if(!length(GLOB.pod_hair_list))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
//Monkestation Addition Start
if(!length(GLOB.ethereal_horns_list))
init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_horns, GLOB.ethereal_horns_list)
@@ -126,13 +130,18 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list)
if(!GLOB.satyr_horns_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list)
+ if(!length(GLOB.arm_wings_list))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wings, GLOB.arm_wings_list)
+ if(!length(GLOB.arm_wingsopen_list))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen, GLOB.arm_wingsopen_list)
+ if(!length(GLOB.tails_list_avian))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.tails_list_avian)
+ if(!length(GLOB.avian_ears_list))
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage, GLOB.avian_ears_list)
//Monkestation Addition End
//For now we will always return none for tail_human and ears. | "For now" he says.
return(list(
- "mcolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]",
- "mcolor_secondary" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]",
- "ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)],
"tail_cat" = "None",
"tail_lizard" = "Smooth",
"wings" = "None",
@@ -167,6 +176,9 @@
"satyr_fluff" = pick(GLOB.satyr_fluff_list), //Monkestation Addition
"satyr_tail" = pick(GLOB.satyr_tail_list), //Monkestation Addition
"satyr_horns" = pick(GLOB.satyr_horns_list), //Monkestation Addition
+ "arm_wings" = pick(GLOB.arm_wings_list),
+ "ears_avian" = pick(GLOB.avian_ears_list),
+ "tail_avian" = pick(GLOB.tails_list_avian),
))
/proc/random_hairstyle(gender)
@@ -617,20 +629,6 @@ GLOBAL_LIST_EMPTY(species_list)
. = pick(ais)
return .
-/**
- * Used to get the amount of change between two body temperatures
- *
- * When passed the difference between two temperatures returns the amount of change to temperature to apply.
- * The change rate should be kept at a low value tween 0.16 and 0.02 for optimal results.
- * vars:
- * * temp_diff (required) The differance between two temperatures
- * * change_rate (optional)(Default: 0.06) The rate of range multiplyer
- */
-/proc/get_temp_change_amount(temp_diff, change_rate = 0.06)
- if(temp_diff < 0)
- return -(BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 - (temp_diff * change_rate))
- return (BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 + (temp_diff * change_rate))
-
#define ISADVANCEDTOOLUSER(mob) (HAS_TRAIT(mob, TRAIT_ADVANCEDTOOLUSER) && !HAS_TRAIT(mob, TRAIT_DISCOORDINATED_TOOL_USER))
/// Gets the client of the mob, allowing for mocking of the client.
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 5c3c5334ab13..8c8200cae6e5 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -1,6 +1,7 @@
#define POPCOUNT_SURVIVORS "survivors" //Not dead at roundend
#define POPCOUNT_ESCAPEES "escapees" //Not dead and on centcom/shuttles marked as escaped
#define POPCOUNT_SHUTTLE_ESCAPEES "shuttle_escapees" //Emergency shuttle only.
+#define POPCOUNT_ESCAPEES_HUMANONLY "human_escapees"
#define PERSONAL_LAST_ROUND "personal last round"
#define SERVER_LAST_ROUND "server last round"
#define DISCORD_SUPPRESS_NOTIFICATIONS (1 << 12) // monke edit: discord flag for silent messages
@@ -17,7 +18,10 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO
var/list/file_data = list("escapees" = list("humans" = list(), "silicons" = list(), "others" = list(), "npcs" = list()), "abandoned" = list("humans" = list(), "silicons" = list(), "others" = list(), "npcs" = list()), "ghosts" = list(), "additional data" = list())
var/num_survivors = 0 //Count of non-brain non-camera mobs with mind that are alive
var/num_escapees = 0 //Above and on centcom z
+ var/num_human_escapees = 0 //Above but humans only
var/num_shuttle_escapees = 0 //Above and on escape shuttle
+ var/list/list_of_human_escapees = list() //References to all escaped humans
+ var/list/list_of_mobs_on_shuttle = list()
var/list/area/shuttle_areas
if(SSshuttle?.emergency)
shuttle_areas = SSshuttle.emergency.shuttle_areas
@@ -35,6 +39,8 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO
if(M.mind)
count_only = FALSE
mob_data["ckey"] = M.mind.key
+ if(M.onCentCom())
+ list_of_mobs_on_shuttle += M
if(M.stat != DEAD && !isbrain(M) && !iscameramob(M))
num_survivors++
if(EMERGENCY_ESCAPED_OR_ENDGAMED && (M.onCentCom() || M.onSyndieBase()))
@@ -42,6 +48,9 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO
escape_status = "escapees"
if(shuttle_areas[get_area(M)])
num_shuttle_escapees++
+ if(ishuman(M))
+ num_human_escapees++
+ list_of_human_escapees += M
if(isliving(M))
var/mob/living/L = M
mob_data["location"] = get_area(L)
@@ -105,7 +114,10 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO
. = list()
.[POPCOUNT_SURVIVORS] = num_survivors
.[POPCOUNT_ESCAPEES] = num_escapees
+ .[POPCOUNT_ESCAPEES_HUMANONLY] = num_human_escapees
.[POPCOUNT_SHUTTLE_ESCAPEES] = num_shuttle_escapees
+ .["all_mobs_on_shuttle"] = list_of_mobs_on_shuttle
+ .["human_escapees_list"] = list_of_human_escapees
.["station_integrity"] = station_integrity
/datum/controller/subsystem/ticker/proc/gather_antag_data()
@@ -221,7 +233,7 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO
C?.give_award(/datum/award/achievement/misc/speed_round, C?.mob)
HandleRandomHardcoreScore(C)
- var/popcount = gather_roundend_feedback()
+ popcount = gather_roundend_feedback()
display_report(popcount)
CHECK_TICK
diff --git a/code/__HELPERS/~monkestation-helpers/blood_datums.dm b/code/__HELPERS/~monkestation-helpers/blood_datums.dm
new file mode 100644
index 000000000000..7e74ac55592d
--- /dev/null
+++ b/code/__HELPERS/~monkestation-helpers/blood_datums.dm
@@ -0,0 +1,13 @@
+/proc/random_human_blood_type()
+ var/static/list/human_blood_type_weights = list(
+ /datum/blood_type/crew/human/o_minus = 4,
+ /datum/blood_type/crew/human/o_plus = 36,
+ /datum/blood_type/crew/human/a_minus = 28,
+ /datum/blood_type/crew/human/a_plus = 3,
+ /datum/blood_type/crew/human/b_minus = 20,
+ /datum/blood_type/crew/human/b_plus = 1,
+ /datum/blood_type/crew/human/ab_minus = 5,
+ /datum/blood_type/crew/human/ab_plus = 1
+ )
+
+ return pick_weight(human_blood_type_weights)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index fb117fadab69..4497da073e3e 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -270,6 +270,75 @@ DEFINE_BITFIELD(mob_respiration_type, list(
"RESPIRATION_PLASMA" = RESPIRATION_PLASMA,
))
+DEFINE_BITFIELD(liked_foodtypes, list(
+ "MEAT" = MEAT,
+ "VEGETABLES" = VEGETABLES,
+ "RAW" = RAW,
+ "JUNKFOOD" = JUNKFOOD,
+ "GRAIN" = GRAIN,
+ "FRUIT" = FRUIT,
+ "DAIRY" = DAIRY,
+ "FRIED" = FRIED,
+ "ALCOHOL" = ALCOHOL,
+ "SUGAR" = SUGAR,
+ "GROSS" = GROSS,
+ "TOXIC" = TOXIC,
+ "PINEAPPLE" = PINEAPPLE,
+ "BREAKFAST" = BREAKFAST,
+ "CLOTH" = CLOTH,
+ "NUTS" = NUTS,
+ "SEAFOOD" = SEAFOOD,
+ "ORANGES" = ORANGES,
+ "BUGS" = BUGS,
+ "GORE" = GORE,
+))
+
+DEFINE_BITFIELD(disliked_foodtypes, list(
+ "MEAT" = MEAT,
+ "VEGETABLES" = VEGETABLES,
+ "RAW" = RAW,
+ "JUNKFOOD" = JUNKFOOD,
+ "GRAIN" = GRAIN,
+ "FRUIT" = FRUIT,
+ "DAIRY" = DAIRY,
+ "FRIED" = FRIED,
+ "ALCOHOL" = ALCOHOL,
+ "SUGAR" = SUGAR,
+ "GROSS" = GROSS,
+ "TOXIC" = TOXIC,
+ "PINEAPPLE" = PINEAPPLE,
+ "BREAKFAST" = BREAKFAST,
+ "CLOTH" = CLOTH,
+ "NUTS" = NUTS,
+ "SEAFOOD" = SEAFOOD,
+ "ORANGES" = ORANGES,
+ "BUGS" = BUGS,
+ "GORE" = GORE,
+))
+
+DEFINE_BITFIELD(toxic_foodtypes, list(
+ "MEAT" = MEAT,
+ "VEGETABLES" = VEGETABLES,
+ "RAW" = RAW,
+ "JUNKFOOD" = JUNKFOOD,
+ "GRAIN" = GRAIN,
+ "FRUIT" = FRUIT,
+ "DAIRY" = DAIRY,
+ "FRIED" = FRIED,
+ "ALCOHOL" = ALCOHOL,
+ "SUGAR" = SUGAR,
+ "GROSS" = GROSS,
+ "TOXIC" = TOXIC,
+ "PINEAPPLE" = PINEAPPLE,
+ "BREAKFAST" = BREAKFAST,
+ "CLOTH" = CLOTH,
+ "NUTS" = NUTS,
+ "SEAFOOD" = SEAFOOD,
+ "ORANGES" = ORANGES,
+ "BUGS" = BUGS,
+ "GORE" = GORE,
+))
+
DEFINE_BITFIELD(mobility_flags, list(
"MOVE" = MOBILITY_MOVE,
"PICKUP" = MOBILITY_PICKUP,
@@ -438,6 +507,7 @@ DEFINE_BITFIELD(organ_flags, list(
"ORGAN_EDIBLE" = ORGAN_EDIBLE,
"ORGAN_SYNTHETIC_EMP" = ORGAN_SYNTHETIC_EMP,
"ORGAN_UNREMOVABLE" = ORGAN_UNREMOVABLE,
+ "ORGAN_HIDDEN" = ORGAN_HIDDEN, //Monkestation edit: BLOOD_DATUMS, how was this forgotten
))
DEFINE_BITFIELD(respiration_type, list(
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 99db47cf8472..d342bf01d594 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -318,6 +318,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS,
"TRAIT_MUSICIAN" = TRAIT_MUSICIAN,
"TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS,
+ "TRAIT_MUTANT_COLORS_SECONDARY" = TRAIT_MUTANT_COLORS_SECONDARY,
+ "TRAIT_FUR_COLORS" = TRAIT_FUR_COLORS,
+ "TRAIT_NO_TRANSFORMATION_STING" = TRAIT_NO_TRANSFORMATION_STING,
+ "TRAIT_NO_HUSK" = TRAIT_NO_HUSK,
+ "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
"TRAIT_MUTE" = TRAIT_MUTE,
"TRAIT_NAIVE" = TRAIT_NAIVE,
"TRAIT_NANITE_MONITORING" = TRAIT_NANITE_MONITORING,
@@ -341,7 +346,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT,
"TRAIT_NOHUNGER" = TRAIT_NOHUNGER,
"TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE,
- "TRAIT_NOMETABOLISM" = TRAIT_NOMETABOLISM,
"TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP,
"TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY,
"TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT,
@@ -508,6 +512,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_XENO_HOST" = TRAIT_XENO_HOST,
"TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE,
"TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION,
+ "TRAIT_COLD_BLOODED" = TRAIT_COLD_BLOODED,
/* "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, */
/* "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, */
/* "TRAIT_ANOSMIA" = TRAIT_ANOSMIA, */
@@ -630,6 +635,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE,
"TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE,
"TRAIT_WIELDED" = TRAIT_WIELDED,
+ "TRAIT_FEATHERED" = TRAIT_FEATHERED,
+ "TRAIT_NON_IMPORTANT_SHOE_BLOCK" = TRAIT_NON_IMPORTANT_SHOE_BLOCK,
+ "TRAIT_LABOURED_BREATHING" = TRAIT_LABOURED_BREATHING,
+ "TRAIT_ASSISTED_BREATHING" = TRAIT_ASSISTED_BREATHING,
+ "TRAIT_NO_ORGAN_DECAY" = TRAIT_NO_ORGAN_DECAY,
/* "TRAIT_BAIT_UNCONSUMABLE" = TRAIT_BAIT_UNCONSUMABLE, */
/* "TRAIT_BAKEABLE" = TRAIT_BAKEABLE, */
/* "TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR, */
@@ -708,7 +718,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/* "TRAIT_MODPC_INTERACTING_WITH_FRAME" = TRAIT_MODPC_INTERACTING_WITH_FRAME, */
),
/obj/projectile = list(
- /* "TRAIT_ALWAYS_HIT_ZONE" = TRAIT_ALWAYS_HIT_ZONE, */
+ "TRAIT_ALWAYS_HIT_ZONE" = TRAIT_ALWAYS_HIT_ZONE,
),
/obj/structure = list(
"TRAIT_RADSTORM_IMMUNE" = TRAIT_RADSTORM_IMMUNE,
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 302cd10c28f0..b4d62bf89221 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -57,8 +57,7 @@
thealert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts()
thealert.master = new_master
else
- thealert.icon_state = "[initial(thealert.icon_state)][severity]"
- thealert.severity = severity
+ thealert.set_severity(severity)
alerts[category] = thealert
if(client && hud_used)
@@ -120,6 +119,15 @@
/atom/movable/screen/alert/MouseExited()
closeToolTip(usr)
+/atom/movable/screen/alert/proc/set_severity(new_val)
+ if(severity == new_val)
+ return
+ severity = new_val
+ update_appearance()
+
+/atom/movable/screen/alert/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state || initial(icon_state)][severity]"
//Gas alerts
// Gas alerts are continuously thrown/cleared by:
@@ -213,15 +221,52 @@
icon_state = "gross3"
/atom/movable/screen/alert/hot
- name = "Too Hot"
- desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit."
+ name = "Hot"
icon_state = "hot"
+/atom/movable/screen/alert/hot/update_name(updates)
+ . = ..()
+ switch(severity)
+ if(1)
+ name = "Warm"
+ if(2)
+ name = "Hot"
+ if(3)
+ name = "Flaming Hot"
+
+/atom/movable/screen/alert/hot/update_desc(updates)
+ . = ..()
+ switch(severity)
+ if(1)
+ desc = "It's pretty warm around here. You might not want to stick around for long, but it won't hurt you unless it gets hotter."
+ if(2)
+ desc = "You're getting pretty hot. You might want to find somewhere cooler soon, or take off any insulating clothing like a fire suit."
+ if(3)
+ desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit."
+
/atom/movable/screen/alert/cold
- name = "Too Cold"
- desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit."
+ name = "Cold"
icon_state = "cold"
+/atom/movable/screen/alert/cold/update_name(updates)
+ . = ..()
+ switch(severity)
+ if(1)
+ name = "Chilly"
+ if(2)
+ name = "Cold"
+ if(3)
+ name = "Freezing"
+
+/atom/movable/screen/alert/cold/update_desc(updates)
+ . = ..()
+ switch(severity)
+ if(1)
+ desc = "You feel pretty chilly. You might not want to stick around for long, but it won't hurt you unless it gets colder."
+ if(2)
+ desc = "You're getting pretty cold. You might want to find somewhere warmer soon, or put on some insulating clothing like a space suit or winter coat."
+ if(3)
+ desc = "You're freezing cold! Get somewhere warmer and put on some insulating clothing like a space suit or winter coat."
/atom/movable/screen/alert/lowpressure
name = "Low Pressure"
desc = "The air around you is hazardously thin. A space suit would protect you."
@@ -329,7 +374,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
* * offerer - The person giving the alert and item
* * receiving - The item being given by the offerer
*/
-/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, datum/status_effect/offering/offer)
+/atom/movable/screen/alert/give/proc/setup(mob/living/taker, datum/status_effect/offering/offer)
src.offer = offer
var/mob/living/offerer = offer.owner
@@ -370,12 +415,15 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
handle_transfer()
/// An overrideable proc used simply to hand over the item when claimed, this is a proc so that high-fives can override them since nothing is actually transferred
-/atom/movable/screen/alert/give/proc/handle_transfer()
- var/mob/living/carbon/taker = owner
+/atom/movable/screen/alert/give/proc/handle_transfer(visible_message = TRUE)
+ var/mob/living/taker = owner
var/mob/living/offerer = offer.owner
var/obj/item/receiving = offer.offered_item
- taker.take(offerer, receiving)
+ if(!taker.take(offerer, receiving, visible_message))
+ return FALSE
+
SEND_SIGNAL(offerer, COMSIG_CARBON_ITEM_GIVEN, taker, receiving)
+ return TRUE
/atom/movable/screen/alert/give/highfive
additional_desc_text = "Click this alert to slap it."
diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm
deleted file mode 100644
index e39e1ef36d07..000000000000
--- a/code/_onclick/hud/credits.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-#define CREDIT_ROLL_SPEED 125
-#define CREDIT_SPAWN_SPEED 10
-#define CREDIT_ANIMATE_HEIGHT (14 * world.icon_size)
-#define CREDIT_EASE_DURATION 22
-#define CREDITS_PATH "[global.config.directory]/contributors.dmi"
-
-/client/proc/RollCredits()
- set waitfor = FALSE
- if(!fexists(CREDITS_PATH))
- return
- var/icon/credits_icon = new(CREDITS_PATH)
- LAZYINITLIST(credits)
- var/list/_credits = credits
- add_verb(src, /client/proc/ClearCredits)
- var/static/list/credit_order_for_this_round
- if(isnull(credit_order_for_this_round))
- credit_order_for_this_round = list("Thanks for playing!") + (shuffle(icon_states(credits_icon)) - "Thanks for playing!")
- for(var/I in credit_order_for_this_round)
- if(!credits)
- return
- _credits += new /atom/movable/screen/credit(null, I, src, credits_icon)
- sleep(CREDIT_SPAWN_SPEED)
- sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED)
- remove_verb(src, /client/proc/ClearCredits)
- qdel(credits_icon)
-
-/client/proc/ClearCredits()
- set name = "Hide Credits"
- set category = "OOC"
- remove_verb(src, /client/proc/ClearCredits)
- QDEL_LIST(credits)
- credits = null
-
-/atom/movable/screen/credit
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- alpha = 0
- screen_loc = "12,1"
- plane = SPLASHSCREEN_PLANE
- var/client/parent
- var/matrix/target
-
-/atom/movable/screen/credit/Initialize(mapload, credited, client/P, icon/I)
- . = ..()
- icon = I
- parent = P
- icon_state = credited
- maptext = MAPTEXT_PIXELLARI(credited)
- maptext_x = world.icon_size + 8
- maptext_y = (world.icon_size / 2) - 4
- maptext_width = world.icon_size * 3
- var/matrix/M = matrix(transform)
- M.Translate(0, CREDIT_ANIMATE_HEIGHT)
- animate(src, transform = M, time = CREDIT_ROLL_SPEED)
- target = M
- animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL)
- addtimer(CALLBACK(src, PROC_REF(FadeOut)), CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION)
- QDEL_IN(src, CREDIT_ROLL_SPEED)
- if(parent)
- parent.screen += src
-
-/atom/movable/screen/credit/Destroy()
- icon = null
- if(parent)
- parent.screen -= src
- LAZYREMOVE(parent.credits, src)
- parent = null
- return ..()
-
-/atom/movable/screen/credit/proc/FadeOut()
- animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION)
-
-#undef CREDIT_ANIMATE_HEIGHT
-#undef CREDIT_EASE_DURATION
-#undef CREDIT_ROLL_SPEED
-#undef CREDIT_SPAWN_SPEED
-#undef CREDITS_PATH
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 539dcb585ab2..3f149ec80769 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -334,7 +334,7 @@
send_item_attack_message(attacking_item, user)
if(!attacking_item.force)
return FALSE
- var/damage = attacking_item.force
+ var/damage = attacking_item.force * user.outgoing_damage_mod
if(mob_biotypes & MOB_ROBOTIC)
damage *= attacking_item.demolition_mod
apply_damage(damage, attacking_item.damtype)
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 5fb06027a5fc..f85392756bc5 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -234,6 +234,7 @@ GLOBAL_REAL(Master, /datum/controller/master)
// Initialize subsystems.
for (var/datum/controller/subsystem/subsystem in stage_sorted_subsystems[current_init_stage])
init_subsystem(subsystem)
+ #ifndef OPENDREAM
if(world.system_type == MS_WINDOWS)
var/ss_name = "[subsystem.name]"
var/memory_summary = call_ext("memorystats", "get_memory_stats")()
@@ -241,6 +242,7 @@ GLOBAL_REAL(Master, /datum/controller/master)
var/string = "[ss_name] [memory_summary]"
WRITE_FILE(file, string)
+ #endif
CHECK_TICK
current_initializing_subsystem = null
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 21bab011b399..1b77a8555554 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(blackbox)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
init_order = INIT_ORDER_BLACKBOX
- var/list/feedback_list = list() //list of datum/feedback_variable
+ var/list/datum/feedback_variable/feedback_list = list() //list of datum/feedback_variable
var/list/first_death = list() //the first death of this round, assoc. vars keep track of different things
var/triggertime = 0
var/sealed = FALSE //time to stop tracking stats?
diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm
index 8e305d95699b..8dbd88e6231a 100644
--- a/code/controllers/subsystem/dcs.dm
+++ b/code/controllers/subsystem/dcs.dm
@@ -58,3 +58,12 @@ PROCESSING_SUBSYSTEM_DEF(dcs)
fullid += named_arguments
return list2params(fullid)
+
+/datum/controller/subsystem/processing/dcs/proc/_Has_Element(atom/checker, datum/element/element_id)
+ var/datum/element/eletype = elements_by_type[element_id]
+ if(!eletype)
+ return FALSE //not yet created simply return FALSE
+
+ if(!(checker in eletype?._signal_procs)) //shitcode beware
+ return FALSE
+ return TRUE
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 6ef45699f514..ab0406609acf 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -74,6 +74,8 @@ SUBSYSTEM_DEF(ticker)
///add jobs to this that should get rewarded monkecoins, example: JOB_SECURITY_OFFICER
var/list/jobs_to_reward = list(JOB_JANITOR,)
+ var/list/popcount
+
/datum/controller/subsystem/ticker/Initialize()
// monkestation start: fix-lobby-music
var/old_login_music = trim(file2text("data/last_round_lobby_music.txt"))
diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm
index 3fa845b144cd..868658f04226 100644
--- a/code/datums/atmosphere/planetary.dm
+++ b/code/datums/atmosphere/planetary.dm
@@ -47,8 +47,8 @@
minimum_pressure = HAZARD_LOW_PRESSURE + 10
maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1
- minimum_temp = 180
- maximum_temp = 180
+ minimum_temp = ICEBOX_MIN_TEMPERATURE
+ maximum_temp = ICEBOX_MIN_TEMPERATURE
/datum/atmosphere/oshan
id = OSHAN_DEFAULT_ATMOS
diff --git a/code/datums/bodypart_overlays/bodypart_overlay.dm b/code/datums/bodypart_overlays/bodypart_overlay.dm
index 3173296a03e8..365a9f73197e 100644
--- a/code/datums/bodypart_overlays/bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/bodypart_overlay.dm
@@ -8,6 +8,14 @@
///Key of the icon states of all the sprite_datums for easy caching
var/cache_key = ""
+ ///our color palette
+ var/datum/color_palette/palette
+ ///our palette key
+ var/palette_key
+ ///our fallback key
+ var/fallback_key
+ ///list of palette keys to colors used if the accessory says it needs multiple colors
+ var/list/color_keys
///Wrapper for getting the proper image, colored and everything
/datum/bodypart_overlay/proc/get_overlay(layer, obj/item/bodypart/limb)
diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
index 0b52225359cb..e5abf9f742ef 100644
--- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
@@ -13,10 +13,6 @@
///Take on the dna/preference from whoever we're gonna be inserted in
var/imprint_on_next_insertion = TRUE
-/datum/bodypart_overlay/mutant/get_overlay(layer, obj/item/bodypart/limb)
- inherit_color(limb) // If draw_color is not set yet, go ahead and do that
- return ..()
-
///Completely random image and color generation (obeys what a player can choose from)
/datum/bodypart_overlay/mutant/proc/randomize_appearance()
randomize_sprite()
@@ -53,27 +49,6 @@
/datum/bodypart_overlay/mutant/proc/get_base_icon_state()
return sprite_datum.icon_state
-///Get the image we need to draw on the person. Called from get_overlay() which is called from _bodyparts.dm. Limb can be null
-/datum/bodypart_overlay/mutant/get_image(image_layer, obj/item/bodypart/limb)
- if(!sprite_datum)
- CRASH("Trying to call get_image() on [type] while it didn't have a sprite_datum. This shouldn't happen, report it as soon as possible.")
-
- var/gender = (limb?.limb_gender == FEMALE) ? "f" : "m"
- var/list/icon_state_builder = list()
- icon_state_builder += sprite_datum.gender_specific ? gender : "m" //Male is default because sprite accessories are so ancient they predate the concept of not hardcoding gender
- icon_state_builder += feature_key
- icon_state_builder += get_base_icon_state()
- icon_state_builder += mutant_bodyparts_layertext(image_layer)
-
- var/finished_icon_state = icon_state_builder.Join("_")
-
- var/mutable_appearance/appearance = mutable_appearance(sprite_datum.icon, finished_icon_state, layer = image_layer)
-
- if(sprite_datum.center)
- center_image(appearance, sprite_datum.dimension_x, sprite_datum.dimension_y)
-
- return appearance
-
///Get the image we need to draw on the person. Called from get_overlay() which is called from _bodyparts.dm. Limb can be null
/datum/bodypart_overlay/mutant/get_image_inner(image_layer, obj/item/bodypart/limb)
if(!sprite_datum)
@@ -98,10 +73,6 @@
return appearance
-/datum/bodypart_overlay/mutant/color_image(image/overlay, layer, obj/item/bodypart/limb)
-
- overlay.color = sprite_datum.color_src ? draw_color : null
-
/datum/bodypart_overlay/mutant/added_to_limb(obj/item/bodypart/limb)
inherit_color(limb)
@@ -136,26 +107,25 @@
if(draw_color && !force)
return FALSE
- switch(color_source)
- if(ORGAN_COLOR_OVERRIDE)
- draw_color = override_color(ownerlimb.draw_color)
- if(ORGAN_COLOR_INHERIT)
- draw_color = ownerlimb.draw_color
- if(ORGAN_COLOR_HAIR)
- if(!ishuman(ownerlimb.owner))
- return
- var/mob/living/carbon/human/human_owner = ownerlimb.owner
- draw_color = human_owner.hair_color
- if(ORGAN_COLOR_ANIME)
- if(!ishuman(ownerlimb.owner))
- return
- var/mob/living/carbon/human/human_owner = ownerlimb.owner
- draw_color = human_owner.dna.features["animecolor"]
- if(ORGAN_COLOR_MUTSECONDARY)
- if(!ishuman(ownerlimb.owner))
- return
- var/mob/living/carbon/human/human_owner = ownerlimb.owner
- draw_color = human_owner.dna.features["mcolor_secondary"]
+ if(palette)
+ var/datum/color_palette/located = ownerlimb.owner.dna.color_palettes[palette]
+ draw_color = located.return_color(palette_key, fallback_key)
+ else
+ switch(color_source)
+ if(ORGAN_COLOR_OVERRIDE)
+ draw_color = override_color(ownerlimb.draw_color)
+ if(ORGAN_COLOR_INHERIT)
+ draw_color = ownerlimb.draw_color
+ if(ORGAN_COLOR_HAIR)
+ if(!ishuman(ownerlimb.owner))
+ return
+ var/mob/living/carbon/human/human_owner = ownerlimb.owner
+ draw_color = human_owner.hair_color
+ if(ORGAN_COLOR_ANIME)
+ if(!ishuman(ownerlimb.owner))
+ return
+ var/mob/living/carbon/human/human_owner = ownerlimb.owner
+ draw_color = human_owner.dna.features["animecolor"]
return TRUE
diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm
index 0d950031f229..b2e98144d536 100644
--- a/code/datums/components/bloodysoles.dm
+++ b/code/datums/components/bloodysoles.dm
@@ -3,35 +3,44 @@
* Component for clothing items that can pick up blood from decals and spread it around everywhere when walking, such as shoes or suits with integrated shoes.
*/
/datum/component/bloodysoles
+ /*
/// The type of the last grub pool we stepped in, used to decide the type of footprints to make
var/last_blood_state = BLOOD_STATE_NOT_BLOODY
/// How much of each grubby type we have on our feet
var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
+ */ //Monkestation removal: BLOOD_DATUMS
+
+ // Monkestation Addition: BLOOD_DATUMS
+ /// What percentage of the bloodiness is deposited on the ground per step
+ var/blood_dropped_per_step = 3
+ /// Bloodiness on our clothines
+ VAR_FINAL/total_bloodiness = 0
+ // Monkestation Addition: BLOOD_DATUMS
/// The ITEM_SLOT_* slot the item is equipped on, if it is.
var/equipped_slot
- /// The parent item but casted into atom type for easier use.
- var/atom/parent_atom
-
/// Either the mob carrying the item, or the mob itself for the /feet component subtype
- var/mob/living/carbon/wielder
+ VAR_FINAL/mob/living/carbon/wielder
/// The world.time when we last picked up blood
- var/last_pickup
+ VAR_FINAL/last_pickup
var/footprint_sprite = FOOTPRINT_SPRITE_SHOES
/datum/component/bloodysoles/Initialize()
if(!isclothing(parent))
return COMPONENT_INCOMPATIBLE
- parent_atom = parent
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean))
+/datum/component/bloodysoles/Destroy()
+ wielder = null
+ return ..()
+
/**
* Unregisters from the wielder if necessary
*/
@@ -55,63 +64,52 @@
var/obj/item/parent_item = parent
parent_item.update_slot_icon()
-
-/datum/component/bloodysoles/proc/reset_bloody_shoes()
- bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
- on_changed_bloody_shoes(BLOOD_STATE_NOT_BLOODY)
-
-///lowers bloody_shoes[index] by adjust_by
-/datum/component/bloodysoles/proc/adjust_bloody_shoes(index, adjust_by)
- bloody_shoes[index] = max(bloody_shoes[index] - adjust_by, 0)
- on_changed_bloody_shoes()
-
-/datum/component/bloodysoles/proc/set_bloody_shoes(index, new_value)
- bloody_shoes[index] = new_value
- on_changed_bloody_shoes(index)
-
///called whenever the value of bloody_soles changes
-/datum/component/bloodysoles/proc/on_changed_bloody_shoes(index)
- if(index && index != last_blood_state)
- last_blood_state = index
+/datum/component/bloodysoles/proc/change_blood_amount(some_amount)
+ total_bloodiness = clamp(round(total_bloodiness + some_amount, 0.1), 0, BLOOD_ITEM_MAX)
if(!wielder)
return
- if(bloody_shoes[index] <= BLOOD_FOOTPRINTS_MIN * 2)//need twice that amount to make footprints
+ if(total_bloodiness <= BLOOD_FOOTPRINTS_MIN * 2)//need twice that amount to make footprints
UnregisterSignal(wielder, COMSIG_MOVABLE_MOVED)
else
RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE)
+ update_icon()
/**
* Run to equally share the blood between us and a decal
*/
/datum/component/bloodysoles/proc/share_blood(obj/effect/decal/cleanable/pool)
// Share the blood between our boots and the blood pool
- var/total_bloodiness = pool.bloodiness + bloody_shoes[pool.blood_state]
-
- // We can however be limited by how much blood we can hold
- var/new_our_bloodiness = min(BLOOD_ITEM_MAX, total_bloodiness / 2)
-
- set_bloody_shoes(pool.blood_state, new_our_bloodiness)
- pool.bloodiness = total_bloodiness - new_our_bloodiness // Give the pool the remaining blood incase we were limited
+ var/new_total_bloodiness = min(BLOOD_ITEM_MAX, pool.bloodiness + total_bloodiness / 2)
+ if(new_total_bloodiness == total_bloodiness || new_total_bloodiness == 0)
+ return
- if(HAS_TRAIT(wielder, TRAIT_LIGHT_STEP)) //the character is agile enough to don't mess their clothing and hands just from one blood splatter at floor
- return TRUE
+ var/delta = new_total_bloodiness - total_bloodiness
+ pool.adjust_bloodiness(-1 * delta)
+ change_blood_amount(delta)
+ var/atom/parent_atom = parent
parent_atom.add_blood_DNA(GET_ATOM_BLOOD_DNA(pool))
- update_icon()
/**
- * Find a blood decal on a turf that matches our last_blood_state
+ * Adds blood to an existing (or new) footprint
*/
-/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null, footprint_sprite)
- for(var/obj/effect/decal/cleanable/blood/pool in turfLoc)
- if(pool.blood_state == last_blood_state && pool.footprint_sprite == footprint_sprite && (!typeFilter || istype(pool, typeFilter)))
- return pool
+/datum/component/bloodysoles/proc/add_blood_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint, bloodiness_to_add, exiting = FALSE)
+ var/atom/atom_parent = parent
+ add_parent_to_footprint(footprint)
+ footprint.adjust_bloodiness(bloodiness_to_add)
+ footprint.add_blood_DNA(GET_ATOM_BLOOD_DNA(atom_parent))
+ if(exiting)
+ footprint.exited_dirs |= wielder.dir
+ else
+ footprint.entered_dirs |= wielder.dir
+ footprint.update_appearance()
/**
* Adds the parent type to the footprint's shoe_types var
*/
-/datum/component/bloodysoles/proc/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
- FP.shoe_types |= parent.type
+/datum/component/bloodysoles/proc/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint)
+ footprint.shoe_types |= parent.type
/**
* Called when the parent item is equipped by someone
@@ -130,7 +128,7 @@
equipped_slot = slot
wielder = equipper
- if(bloody_shoes[last_blood_state] > BLOOD_FOOTPRINTS_MIN * 2)
+ if(total_bloodiness > BLOOD_FOOTPRINTS_MIN * 2)
RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
RegisterSignal(wielder, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood))
@@ -149,61 +147,51 @@
*
* Used to make bloody footprints on the ground
*/
-/datum/component/bloodysoles/proc/on_moved(datum/source, OldLoc, Dir, Forced)
+/datum/component/bloodysoles/proc/on_moved(datum/source, atom/old_loc, Dir, Forced)
SIGNAL_HANDLER
- if(bloody_shoes[last_blood_state] == 0)
+ if(total_bloodiness <= 0)
return
if(QDELETED(wielder) || is_obscured())
return
if(wielder.body_position == LYING_DOWN || !wielder.has_gravity(wielder.loc))
return
- var/half_our_blood = bloody_shoes[last_blood_state] / 2
- var/footprint_sprite = wielder.get_footprint_sprite()
+ var/atom/parent_atom = parent
+ var/blood_used = round(total_bloodiness / 3, 0.01)
+
// Add footprints in old loc if we have enough cream
- if(half_our_blood >= BLOOD_FOOTPRINTS_MIN)
- var/turf/oldLocTurf = get_turf(OldLoc)
- var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, footprint_sprite)
- if(oldLocFP)
- // Footprints found in the tile we left, add us to it
- add_parent_to_footprint(oldLocFP)
- if (!(oldLocFP.exited_dirs & wielder.dir))
- oldLocFP.exited_dirs |= wielder.dir
- oldLocFP.update_appearance()
- else if(find_pool_by_blood_state(oldLocTurf, footprint_sprite = footprint_sprite))
- // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it
- adjust_bloody_shoes(last_blood_state, half_our_blood)
- update_icon()
+ if(blood_used >= BLOOD_FOOTPRINTS_MIN)
+ var/turf/old_loc_turf = get_turf(old_loc)
+ var/obj/effect/decal/cleanable/blood/footprints/old_loc_prints = locate() in old_loc_turf
+ if(old_loc_prints)
+ add_blood_to_footprint(old_loc_prints, 0, TRUE) // Add no actual blood, just update sprite
- oldLocFP = new(oldLocTurf, footprint_sprite)
- if(!QDELETED(oldLocFP)) ///prints merged
- oldLocFP.blood_state = last_blood_state
- oldLocFP.exited_dirs |= wielder.dir
- add_parent_to_footprint(oldLocFP)
- oldLocFP.bloodiness = half_our_blood
- oldLocFP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom))
- oldLocFP.update_appearance()
+ else if(locate(/obj/effect/decal/cleanable/blood) in old_loc_turf)
+ // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it
+ change_blood_amount(-1 * blood_used)
+ old_loc_prints = new(old_loc_turf)
+ if(!QDELETED(old_loc_prints)) // prints merged
+ add_blood_to_footprint(old_loc_prints, blood_used, TRUE)
- half_our_blood = bloody_shoes[last_blood_state] / 2
+ blood_used = round(total_bloodiness / 3, 0.01)
// If we picked up the blood on this tick in on_step_blood, don't make footprints at the same place
if(last_pickup && last_pickup == world.time)
return
// Create new footprints
- if(half_our_blood >= BLOOD_FOOTPRINTS_MIN)
- adjust_bloody_shoes(last_blood_state, half_our_blood)
- update_icon()
+ if(blood_used >= BLOOD_FOOTPRINTS_MIN)
+ var/turf/new_loc_turf = get_turf(parent_atom)
+ var/obj/effect/decal/cleanable/blood/footprints/new_loc_prints = locate() in new_loc_turf
+ if(new_loc_prints)
+ add_blood_to_footprint(new_loc_prints, 0, FALSE) // Add no actual blood, just update sprite
- var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), footprint_sprite)
- if(!QDELETED(FP)) ///prints merged
- FP.blood_state = last_blood_state
- FP.entered_dirs |= wielder.dir
- add_parent_to_footprint(FP)
- FP.bloodiness = half_our_blood
- FP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom))
- FP.update_appearance()
+ else
+ change_blood_amount(-1 * blood_used)
+ new_loc_prints = new(new_loc_turf)
+ if(!QDELETED(new_loc_prints)) // prints merged
+ add_blood_to_footprint(new_loc_prints, blood_used, FALSE)
/**
@@ -214,20 +202,16 @@
/datum/component/bloodysoles/proc/on_step_blood(datum/source, obj/effect/decal/cleanable/pool)
SIGNAL_HANDLER
- if(QDELETED(wielder) || is_obscured())
+ if(QDELETED(wielder) || is_obscured() || !wielder.has_gravity(wielder.loc))
+ return
+ /// The character is agile enough to not mess their clothing and hands just from one blood splatter at floor
+ if(HAS_TRAIT(wielder, TRAIT_LIGHT_STEP))
+ return
+ // Don't share from other feetprints, not super realistic but I think it ruins the effect a bit
+ if(istype(pool, /obj/effect/decal/cleanable/blood/footprints))
return
-
- if(istype(pool, /obj/effect/decal/cleanable/blood/footprints) && pool.blood_state == last_blood_state)
- // The pool we stepped in was actually footprints with the same type
- var/obj/effect/decal/cleanable/blood/footprints/pool_FP = pool
- add_parent_to_footprint(pool_FP)
- if((bloody_shoes[last_blood_state] / 2) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir))
- // If our feet are bloody enough, add an entered dir
- pool_FP.entered_dirs |= wielder.dir
- pool_FP.update_appearance()
share_blood(pool)
-
last_pickup = world.time
/**
@@ -236,10 +220,10 @@
/datum/component/bloodysoles/proc/on_clean(datum/source, clean_types)
SIGNAL_HANDLER
- if(!(clean_types & CLEAN_TYPE_BLOOD) || last_blood_state == BLOOD_STATE_NOT_BLOODY)
+ if(!(clean_types & CLEAN_TYPE_BLOOD))
return NONE
- reset_bloody_shoes()
+ total_bloodiness = 0
update_icon()
return COMPONENT_CLEANED
@@ -248,12 +232,12 @@
* Like its parent but can be applied to carbon mobs instead of clothing items
*/
/datum/component/bloodysoles/feet
+ equipped_slot = ITEM_SLOT_FEET
var/static/mutable_appearance/bloody_feet
/datum/component/bloodysoles/feet/Initialize()
if(!iscarbon(parent))
return COMPONENT_INCOMPATIBLE
- parent_atom = parent
wielder = parent
if(footprint_sprite)
src.footprint_sprite = footprint_sprite
@@ -266,29 +250,26 @@
RegisterSignal(parent, COMSIG_CARBON_EQUIP_SHOECOVER, PROC_REF(equip_shoecover))
/datum/component/bloodysoles/feet/update_icon()
- if(ishuman(wielder))
- var/mob/living/carbon/human/human = wielder
- if(NOBLOODOVERLAY in human.dna.species.species_traits)
- return
- if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
- human.remove_overlay(SHOES_LAYER)
- human.overlays_standing[SHOES_LAYER] = bloody_feet
- human.apply_overlay(SHOES_LAYER)
- else
- human.update_worn_shoes()
+ if(!ishuman(wielder) || HAS_TRAIT(wielder, TRAIT_NO_BLOOD_OVERLAY))
+ return
+ wielder.remove_overlay(SHOES_LAYER)
+ if(total_bloodiness > 0 && !is_obscured())
+ bloody_feet.color = wielder.get_blood_dna_color()
+ wielder.overlays_standing[SHOES_LAYER] = bloody_feet
+ wielder.apply_overlay(SHOES_LAYER)
+ else
+ wielder.update_worn_shoes()
-/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
+/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint)
if(!ishuman(wielder))
- FP.species_types |= "unknown"
+ footprint.species_types |= "unknown"
return
// Find any leg of our human and add that to the footprint, instead of the default which is to just add the human type
- for(var/X in wielder.bodyparts)
- var/obj/item/bodypart/affecting = X
- if(affecting.body_part == LEG_RIGHT || affecting.body_part == LEG_LEFT)
- if(!affecting.bodypart_disabled)
- FP.species_types |= affecting.limb_id
- break
+ for(var/obj/item/bodypart/affecting as anything in wielder.bodyparts)
+ if(!affecting.bodypart_disabled && (affecting.body_part == LEG_RIGHT || affecting.body_part == LEG_LEFT))
+ footprint.species_types |= affecting.limb_id
+ break
/datum/component/bloodysoles/feet/is_obscured()
@@ -297,16 +278,12 @@
return wielder.check_obscured_slots(TRUE) & ITEM_SLOT_FEET
/datum/component/bloodysoles/feet/on_moved(datum/source, OldLoc, Dir, Forced)
- if(wielder.num_legs < 2)
- return
-
- ..()
+ if(wielder.num_legs >= 2)
+ return ..()
/datum/component/bloodysoles/feet/on_step_blood(datum/source, obj/effect/decal/cleanable/pool)
- if(wielder.num_legs < 2)
- return
-
- ..()
+ if(wielder.num_legs >= 2)
+ return ..()
/datum/component/bloodysoles/feet/proc/unequip_shoecover(datum/source)
SIGNAL_HANDLER
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 55e14ac851d3..08864d934cb9 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -150,7 +150,7 @@
butcher_callback?.Invoke(butcher, meat)
meat.harvest(butcher)
meat.log_message("has been butchered by [key_name(butcher)]", LOG_ATTACK)
- meat.gib(FALSE, FALSE, TRUE)
+ meat.gib(FALSE, FALSE, FALSE, TRUE)
///Enables the butchering mechanic for the mob who has equipped us.
/datum/component/butchering/proc/enable_butchering(datum/source)
diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm
index 874af94cc50e..eff8531afafc 100644
--- a/code/datums/components/cleaner.dm
+++ b/code/datums/components/cleaner.dm
@@ -96,8 +96,8 @@
ADD_TRAIT(target, TRAIT_CURRENTLY_CLEANING, REF(src))
// We need to update our planes on overlay changes
RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(cleaning_target_moved))
- var/mutable_appearance/low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, GAME_PLANE)
- var/mutable_appearance/high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, ABOVE_GAME_PLANE)
+ var/mutable_appearance/low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, GAME_PLANE, appearance_flags = RESET_COLOR) // Monkestation edit BLOOD_DATUM
+ var/mutable_appearance/high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, ABOVE_GAME_PLANE, appearance_flags = RESET_COLOR) // Monkestation edit BLOOD_DATUM
if(target.plane > low_bubble.plane) //check if the higher overlay is necessary
target.add_overlay(high_bubble)
else if(target.plane == low_bubble.plane)
@@ -140,16 +140,18 @@
REMOVE_TRAIT(target, TRAIT_CURRENTLY_CLEANING, REF(src))
/datum/component/cleaner/proc/cleaning_target_moved(atom/movable/source, turf/old_turf, turf/new_turf, same_z_layer)
+ SIGNAL_HANDLER
+
if(same_z_layer)
return
// First, get rid of the old overlay
- var/mutable_appearance/old_low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, old_turf, GAME_PLANE)
- var/mutable_appearance/old_high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, old_turf, ABOVE_GAME_PLANE)
+ var/mutable_appearance/old_low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, old_turf, GAME_PLANE, appearance_flags = RESET_COLOR) // NON-MODULE CHANGE
+ var/mutable_appearance/old_high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, old_turf, ABOVE_GAME_PLANE, appearance_flags = RESET_COLOR) // NON-MODULE CHANGE
source.cut_overlay(old_low_bubble)
source.cut_overlay(old_high_bubble)
// Now, add the new one
- var/mutable_appearance/new_low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, new_turf, GAME_PLANE)
- var/mutable_appearance/new_high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, new_turf, ABOVE_GAME_PLANE)
+ var/mutable_appearance/new_low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, new_turf, GAME_PLANE, appearance_flags = RESET_COLOR) // NON-MODULE CHANGE
+ var/mutable_appearance/new_high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, new_turf, ABOVE_GAME_PLANE, appearance_flags = RESET_COLOR) // NON-MODULE CHANGE
source.add_overlay(new_low_bubble)
source.add_overlay(new_high_bubble)
diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm
index 584d9c0f5267..8d2e9fc133e0 100644
--- a/code/datums/components/cult_ritual_item.dm
+++ b/code/datums/components/cult_ritual_item.dm
@@ -303,7 +303,7 @@
span_cult("You [cultist.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.")
)
- if(cultist.blood_volume)
+ if(!HAS_TRAIT(cultist, TRAIT_NOBLOOD)) // Monkestation Edit: BLOOD_DATUM
cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(GLOB.arm_zones), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days?
var/scribe_mod = initial(rune_to_scribe.scribe_delay)
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
index 33de3942ec3a..a1726ca00b4e 100644
--- a/code/datums/components/food/edible.dm
+++ b/code/datums/components/food/edible.dm
@@ -452,7 +452,7 @@ Behavior that's still missing from this component that original food items had t
stack_trace("[eater] failed to bite [owner], because [owner] had no reagents.")
return FALSE
if(eater.satiety > -200)
- eater.satiety -= junkiness
+ eater.adjust_satiety(-junkiness)
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
if(!owner.reagents.total_volume)
return
@@ -511,57 +511,39 @@ Behavior that's still missing from this component that original food items had t
return TRUE
///Check foodtypes to see if we should send a moodlet
-/datum/component/edible/proc/checkLiked(fraction, mob/M)
+/datum/component/edible/proc/checkLiked(fraction, mob/eater)
if(last_check_time + 50 > world.time)
return FALSE
- if(!ishuman(M))
+ if(!ishuman(eater))
return FALSE
- var/mob/living/carbon/human/H = M
+ var/mob/living/carbon/human/gourmand = eater
//Bruh this breakfast thing is cringe and shouldve been handled separately from food-types, remove this in the future (Actually, just kill foodtypes in general)
if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
- H.add_mood_event("breakfast", /datum/mood_event/breakfast)
+ gourmand.add_mood_event("breakfast", /datum/mood_event/breakfast)
last_check_time = world.time
- if(HAS_TRAIT(H, TRAIT_AGEUSIA))
- if(foodtypes & H.dna.species.toxic_food)
- to_chat(H, span_warning("You don't feel so good..."))
- H.adjust_disgust(25 + 30 * fraction)
- return // Don't care about the later checks if user has ageusia
-
var/food_taste_reaction
if(check_liked) //Callback handling; use this as an override for special food like donuts
- food_taste_reaction = check_liked.Invoke(fraction, H)
+ food_taste_reaction = check_liked.Invoke(fraction, gourmand)
if(!food_taste_reaction)
- if(foodtypes & H.dna.species.toxic_food)
- food_taste_reaction = FOOD_TOXIC
- else if(foodtypes & H.dna.species.disliked_food)
- food_taste_reaction = FOOD_DISLIKED
- else if(foodtypes & H.dna.species.liked_food)
- food_taste_reaction = FOOD_LIKED
-
- if(HAS_TRAIT(parent, TRAIT_FOOD_SILVER)) // it's not real food
- food_taste_reaction = isjellyperson(H) ? FOOD_LIKED : FOOD_TOXIC
+ food_taste_reaction = gourmand.get_food_taste_reaction(parent, foodtypes)
switch(food_taste_reaction)
if(FOOD_TOXIC)
- to_chat(H,span_warning("What the hell was that thing?!"))
- H.adjust_disgust(25 + 30 * fraction)
- H.add_mood_event("toxic_food", /datum/mood_event/disgusting_food)
+ to_chat(gourmand,span_warning("What the hell was that thing?!"))
+ gourmand.adjust_disgust(25 + 30 * fraction)
+ gourmand.add_mood_event("toxic_food", /datum/mood_event/disgusting_food)
if(FOOD_DISLIKED)
- to_chat(H,span_notice("That didn't taste very good..."))
- H.adjust_disgust(11 + 15 * fraction)
- H.add_mood_event("gross_food", /datum/mood_event/gross_food)
+ to_chat(gourmand,span_notice("That didn't taste very good..."))
+ gourmand.adjust_disgust(11 + 15 * fraction)
+ gourmand.add_mood_event("gross_food", /datum/mood_event/gross_food)
if(FOOD_LIKED)
- to_chat(H,span_notice("I love this taste!"))
- H.adjust_disgust(-5 + -2.5 * fraction)
- H.add_mood_event("fav_food", /datum/mood_event/favorite_food)
- if(istype(parent, /obj/item/food))
- var/obj/item/food/memorable_food = parent
- if(memorable_food.venue_value >= FOOD_PRICE_EXOTIC)
- H.add_mob_memory(/datum/memory/good_food, food = parent)
+ to_chat(gourmand,span_notice("I love this taste!"))
+ gourmand.adjust_disgust(-5 + -2.5 * fraction)
+ gourmand.add_mood_event("fav_food", /datum/mood_event/favorite_food)
///Delete the item when it is fully eaten
/datum/component/edible/proc/On_Consume(mob/living/eater, mob/living/feeder)
diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm
index 4dcb69a2e9eb..7898d252b5ca 100644
--- a/code/datums/components/rot.dm
+++ b/code/datums/components/rot.dm
@@ -42,20 +42,25 @@
AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections)
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(rot_react))
if(isliving(parent))
+ var/mob/living/living_parent = parent
RegisterSignal(parent, COMSIG_LIVING_REVIVE, PROC_REF(react_to_revive)) //mobs stop this when they come to life
RegisterSignal(parent, COMSIG_LIVING_GET_PULLED, PROC_REF(rot_react_touch))
+
+ RegisterSignal(parent, COMSIG_LIVING_BODY_TEMPERATURE_CHANGE, PROC_REF(check_for_temperature))
+ check_for_temperature(parent, living_parent.bodytemperature, living_parent.bodytemperature)
if(iscarbon(parent))
var/mob/living/carbon/carbon_parent = parent
- RegisterSignals(carbon_parent.reagents, list(COMSIG_REAGENTS_ADD_REAGENT,
+ RegisterSignals(carbon_parent.reagents, list(
+ COMSIG_REAGENTS_ADD_REAGENT,
+ COMSIG_REAGENTS_DEL_REAGENT,
COMSIG_REAGENTS_REM_REAGENT,
- COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(check_reagent))
- RegisterSignals(parent, list(SIGNAL_ADDTRAIT(TRAIT_HUSK), SIGNAL_REMOVETRAIT(TRAIT_HUSK)), PROC_REF(check_husk_trait))
+ ), PROC_REF(check_reagent))
check_reagent(carbon_parent.reagents, null)
- check_husk_trait(null)
- if(ishuman(parent))
- var/mob/living/carbon/human/human_parent = parent
- RegisterSignal(parent, COMSIG_HUMAN_CORETEMP_CHANGE, PROC_REF(check_for_temperature))
- check_for_temperature(null, 0, human_parent.coretemperature)
+
+ RegisterSignals(parent, list(
+ SIGNAL_ADDTRAIT(TRAIT_HUSK),
+ SIGNAL_REMOVETRAIT(TRAIT_HUSK),
+ ), PROC_REF(check_husk_trait))
start_up(NONE) //If nothing's blocking it, start
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index bfdd2ce481fb..9ccf58e71431 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -367,25 +367,12 @@
var/obj/machinery/vending/darth_vendor = hit
darth_vendor.tilt(user, 100)
return
- else if(istype(hit, /obj/structure/window))
- var/obj/structure/window/W = hit
- splatWindow(user, W)
- if(QDELETED(W))
- return COMPONENT_MOVABLE_IMPACT_NEVERMIND
- return
-
var/oopsie_mod = 0
var/danger_zone = (speed - 1) * 13 // for every extra speed we have over 1, take away 13 of the safest chance
danger_zone = max(min(danger_zone, 100), 1)
- if(ishuman(user))
- var/mob/living/carbon/human/S = user
- var/head_slot = S.get_item_by_slot(ITEM_SLOT_HEAD)
- var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING)
- if(head_slot && (istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/utility/hardhat)))
- oopsie_mod -= 6
- if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/riot)))
- oopsie_mod -= 6
+ oopsie_mod -= floor(user.getarmor(BODY_ZONE_HEAD, MELEE) * 0.18)
+ oopsie_mod -= floor(user.getarmor(BODY_ZONE_CHEST, MELEE) * 0.12)
if(HAS_TRAIT(user, TRAIT_CLUMSY))
oopsie_mod += 6 //honk!
@@ -411,7 +398,7 @@
playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE)
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE)
- user.emote("scream")
+ user.pain_emote("scream")
user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed!
shake_camera(user, 7, 7)
user.flash_act(1, TRUE, TRUE, length = 4.5)
@@ -476,31 +463,6 @@
QDEL_NULL(tackle_ref)
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
-///A special case for splatting for handling windows
-/datum/component/tackler/proc/splatWindow(mob/living/carbon/user, obj/structure/window/W)
- playsound(user, 'sound/effects/Glasshit.ogg', 140, TRUE)
-
- if(W.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows
- for(var/i in 1 to speed)
- var/obj/item/shard/shard = new /obj/item/shard(get_turf(user))
- shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=3, pain_chance=5)
- shard.updateEmbedding()
- user.hitby(shard, skipcatch = TRUE, hitpush = FALSE)
- shard.embedding = null
- shard.updateEmbedding()
- W.atom_destruction()
- user.stamina.adjust(-10 * speed)
- user.Paralyze(3 SECONDS)
- user.visible_message(span_danger("[user] smacks into [W] and shatters it, shredding [user.p_them()]self with glass!"), span_userdanger("You smacks into [W] and shatter it, shredding yourself with glass!"))
-
- else
- user.visible_message(span_danger("[user] smacks into [W] like a bug!"), span_userdanger("You smacks into [W] like a bug!"))
- user.Paralyze(1 SECONDS)
- user.Knockdown(3 SECONDS)
- W.take_damage(30 * speed)
- user.stamina.adjust(-10 * speed)
- user.adjustBruteLoss(5 * speed)
-
/datum/component/tackler/proc/delayedSmash(obj/structure/window/W)
if(W)
W.atom_destruction()
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index 7fd6bf70d494..77e3b3121a88 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -26,6 +26,7 @@
"Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.",
"Resistance 10" = "Further increases fever intensity.",
)
+ var/heat_cap = 6 KELVIN
/datum/symptom/fever/Start(datum/disease/advance/A)
. = ..()
@@ -57,12 +58,9 @@
* * datum/disease/advance/A The disease applying the symptom
*/
/datum/symptom/fever/proc/set_body_temp(mob/living/M, datum/disease/advance/A)
- if(unsafe) // when unsafe the fever can cause heat damage
- M.add_body_temperature_change(FEVER_CHANGE, 6 * power * A.stage)
- else
- // Get the max amount of change allowed before going over heat damage limit, then cap the maximum allowed temperature change from a safe fever to 5 under the heat damage limit
- var/change_limit = max(M.get_body_temp_heat_damage_limit() - 5 - M.get_body_temp_normal(apply_change=FALSE), 0)
- M.add_body_temperature_change(FEVER_CHANGE, min(6 * power * A.stage, change_limit))
+ var/mob/living/affected = M
+ var/new_level = affected.standard_body_temperature + (heat_cap * power * A.stage)
+ affected.add_homeostasis_level(type, new_level, 0.25 KELVIN * power)
/// Update the body temp change based on the new stage
/datum/symptom/fever/on_stage_change(datum/disease/advance/A)
@@ -74,6 +72,6 @@
/datum/symptom/fever/End(datum/disease/advance/A)
var/mob/living/carbon/M = A.affected_mob
if(M)
- M.remove_body_temperature_change(FEVER_CHANGE)
+ M.remove_homeostasis_level(type)
#undef FEVER_CHANGE
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index a40c0097eb10..e6c7a51a3e39 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -20,7 +20,6 @@ GLOBAL_LIST_INIT(identity_block_lengths, list(
* (commonly abbreviated with uf) and its blocks. Both ui and uf have a standard block length of 3 ASCII characters.
*/
GLOBAL_LIST_INIT(features_block_lengths, list(
- "[DNA_MUTANT_COLOR_BLOCK]" = DNA_BLOCK_SIZE_COLOR,
"[DNA_ETHEREAL_COLOR_BLOCK]" = DNA_BLOCK_SIZE_COLOR,
))
@@ -53,7 +52,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
var/unique_enzymes
///Stores the hashed values of traits such as skin tones, hair style, and gender
var/unique_identity
- var/blood_type
+ /// So humans have a variety of blood types while other species do not
+ /// This tracks JUST human blood type. Might seem a bit bias but everyone is a human under their scales and feathers.
+ /// Essentially only exists so humans have their same blood type swapping from human -> non-human -> human.
+ var/datum/blood_type/crew/human/human_blood_type
///The type of mutant race the player is if applicable (i.e. potato-man)
var/datum/species/species = new /datum/species/human
///first value is mutant color
@@ -103,11 +105,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
return
destination.dna.unique_enzymes = unique_enzymes
destination.dna.unique_identity = unique_identity
- destination.dna.blood_type = blood_type
+ destination.dna.human_blood_type = human_blood_type
destination.dna.unique_features = unique_features
destination.dna.features = features.Copy()
destination.dna.real_name = real_name
destination.dna.temporary_mutations = temporary_mutations.Copy()
+ destination.dna.color_palettes = color_palettes.Copy()
if(transfer_SE)
destination.dna.mutation_index = mutation_index
destination.dna.default_mutation_genes = default_mutation_genes
@@ -120,8 +123,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
new_dna.default_mutation_genes = default_mutation_genes
new_dna.unique_identity = unique_identity
new_dna.unique_features = unique_features
- new_dna.blood_type = blood_type
+ new_dna.human_blood_type = human_blood_type
new_dna.features = features.Copy()
+ new_dna.color_palettes = color_palettes.Copy()
//if the new DNA has a holder, transform them immediately, otherwise save it
if(new_dna.holder)
new_dna.holder.set_species(species.type, icon_update = 0)
@@ -194,12 +198,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
. = ""
var/list/L = new /list(DNA_FEATURE_BLOCKS)
- if(features["mcolor"])
- L[DNA_MUTANT_COLOR_BLOCK] = sanitize_hexcolor(features["mcolor"], include_crunch = FALSE)
- if(features["mcolor_secondary"])
- L[DNA_MUTANT_COLOR_SECONDARY] = sanitize_hexcolor(features["mcolor_secondary"], include_crunch = FALSE)
- if(features["ethcolor"])
- L[DNA_ETHEREAL_COLOR_BLOCK] = sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)
if(features["body_markings"])
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len)
if(features["tail_cat"])
@@ -226,7 +224,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_MUSHROOM_CAPS_BLOCK] = construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len)
if(features["pod_hair"])
L[DNA_POD_HAIR_BLOCK] = construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)
-
+ if(features["arm_wings"]) // NON-MODULE CHANGE
+ L[DNA_ARM_WINGS_BLOCK] = construct_block(GLOB.arm_wings_list.Find(features["arm_wings"]), GLOB.arm_wings_list.len)
+ if(features["tail_avian"]) // NON-MODULE CHANGE
+ L[DNA_AVIAN_TAIL_BLOCK] = construct_block(GLOB.tails_list_avian.Find(features["tail_avian"]), GLOB.tails_list_avian.len)
+ if(features["ears_avian"]) // NON-MODULE CHANGE
+ L[DNA_AVIAN_EARS_BLOCK] = construct_block(GLOB.avian_ears_list.Find(features["ears_avian"]), GLOB.avian_ears_list.len)
for(var/blocknum in 1 to DNA_FEATURE_BLOCKS)
. += L[blocknum] || random_string(GET_UI_BLOCK_LEN(blocknum), GLOB.hex_characters)
@@ -330,12 +333,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(!ishuman(holder))
CRASH("Non-human mobs shouldn't have DNA")
switch(blocknumber)
- if(DNA_MUTANT_COLOR_BLOCK)
- set_uni_feature_block(blocknumber, sanitize_hexcolor(features["mcolor"], include_crunch = FALSE))
- if(DNA_MUTANT_COLOR_SECONDARY)
- set_uni_feature_block(blocknumber, sanitize_hexcolor(features["mcolor_secondary"], include_crunch = FALSE))
- if(DNA_ETHEREAL_COLOR_BLOCK)
- set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE))
if(DNA_LIZARD_MARKINGS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len))
if(DNA_TAIL_BLOCK)
@@ -360,7 +357,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len))
if(DNA_POD_HAIR_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len))
-
+ if(DNA_ARM_WINGS_BLOCK) // NON-MODULE CHANGE
+ set_uni_feature_block(blocknumber, construct_block(GLOB.arm_wings_list.Find(features["arm_wings"]), GLOB.arm_wings_list.len))
+ if(DNA_AVIAN_TAIL_BLOCK) // NON-MODULE CHANGE
+ set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_avian.Find(features["tail_avian"]), GLOB.tails_list_avian.len))
+ if(DNA_AVIAN_EARS_BLOCK) // NON-MODULE CHANGE
+ set_uni_feature_block(blocknumber, construct_block(GLOB.avian_ears_list.Find(features["ears_avian"]), GLOB.avian_ears_list.len))
//Please use add_mutation or activate_mutation instead
/datum/dna/proc/force_give(datum/mutation/human/human_mutation)
if(holder && human_mutation)
@@ -393,7 +395,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
&& real_name == target_dna.real_name \
&& species.type == target_dna.species.type \
&& compare_list(features, target_dna.features) \
- && blood_type == target_dna.blood_type \
+ && human_blood_type == target_dna.human_blood_type \
)
return TRUE
@@ -431,9 +433,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
unique_enzymes = generate_unique_enzymes()
unique_features = generate_unique_features()
-/datum/dna/proc/initialize_dna(newblood_type, skip_index = FALSE)
+/datum/dna/proc/initialize_dna(newblood_type = random_human_blood_type(), skip_index = FALSE)
if(newblood_type)
- blood_type = newblood_type
+ human_blood_type = newblood_type
unique_enzymes = generate_unique_enzymes()
unique_identity = generate_unique_identity()
if(!skip_index) //I hate this
@@ -543,7 +545,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.generate_unique_enzymes()
if(newblood_type)
- dna.blood_type = newblood_type
+ dna.human_blood_type = newblood_type
if(unique_identity)
dna.unique_identity = unique_identity
@@ -576,6 +578,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(!has_dna())
return
+ //Always plural gender if agender
+ if(HAS_TRAIT(src, TRAIT_AGENDER))
+ gender = PLURAL
+ return
+
switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), 3))
if(G_MALE)
gender = MALE
@@ -601,12 +608,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
else
hairstyle = GLOB.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), GLOB.hairstyles_list.len)]
var/features = dna.unique_features
- if(dna.features["mcolor"])
- dna.features["mcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_BLOCK))
- if(dna.features["mcolor_secondary"])
- dna.features["mcolor_secondary"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_SECONDARY))
- if(dna.features["ethcolor"])
- dna.features["ethcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_ETHEREAL_COLOR_BLOCK))
if(dna.features["body_markings"])
dna.features["body_markings"] = GLOB.body_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), GLOB.body_markings_list.len)]
if(dna.features["snout"])
@@ -637,6 +638,12 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["caps"] = GLOB.caps_list[deconstruct_block(get_uni_feature_block(features, DNA_MUSHROOM_CAPS_BLOCK), GLOB.caps_list.len)]
if(dna.features["pod_hair"])
dna.features["pod_hair"] = GLOB.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), GLOB.pod_hair_list.len)]
+ if(dna.features["arm_wings"]) // NON-MODULE CHANGE
+ dna.features["arm_wings"] = GLOB.arm_wings_list[deconstruct_block(get_uni_feature_block(features, DNA_ARM_WINGS_BLOCK), GLOB.arm_wings_list.len)]
+ if(dna.features["tail_avian"]) // NON-MODULE CHANGE
+ dna.features["tail_avian"] = GLOB.tails_list_avian[deconstruct_block(get_uni_feature_block(features, DNA_AVIAN_TAIL_BLOCK), GLOB.tails_list_avian.len)]
+ if(dna.features["ears_avian"]) // NON-MODULE CHANGE
+ dna.features["ears_avian"] = GLOB.avian_ears_list[deconstruct_block(get_uni_feature_block(features, DNA_AVIAN_EARS_BLOCK), GLOB.avian_ears_list.len)]
for(var/obj/item/organ/external/external_organ in organs)
external_organ.mutate_feature(features, src)
diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm
index ee1d5a9af9ac..7a6703d86195 100644
--- a/code/datums/elements/_element.dm
+++ b/code/datums/elements/_element.dm
@@ -57,6 +57,10 @@
if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE)
CRASH("Incompatible element [ele.type] was assigned to a [type]! args: [json_encode(args)]")
+/// Finds the element and checks if the source is currently part of the element
+/datum/proc/_HasElement(datum/source, datum/element/type)
+ return SSdcs._Has_Element(source, type)
+
/**
* Finds the singleton for the element type given and detaches it from src
* You only need additional arguments beyond the type if you're using [ELEMENT_BESPOKE]
diff --git a/code/datums/elements/basic_body_temp_sensitive.dm b/code/datums/elements/basic_body_temp_sensitive.dm
deleted file mode 100644
index 8e11ed92575e..000000000000
--- a/code/datums/elements/basic_body_temp_sensitive.dm
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * When attached to a basic mob, it gives it the ability to be hurt by cold/hot body temperatures
- */
-/datum/element/basic_body_temp_sensitive
- element_flags = ELEMENT_BESPOKE
- argument_hash_start_idx = 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_sensitive/Attach(datum/target, min_body_temp, max_body_temp, cold_damage, heat_damage)
- . = ..()
- if(!isbasicmob(target))
- return ELEMENT_INCOMPATIBLE
-
- if(isnum(min_body_temp))
- src.min_body_temp = min_body_temp
-
- if(isnum(max_body_temp))
- src.max_body_temp = max_body_temp
-
- if(isnum(cold_damage))
- src.cold_damage = cold_damage
-
- if(isnum(heat_damage))
- src.heat_damage = heat_damage
-
- RegisterSignal(target, COMSIG_LIVING_LIFE, PROC_REF(on_life))
-
-/datum/element/basic_body_temp_sensitive/Detach(datum/source)
- if(source)
- UnregisterSignal(source, COMSIG_LIVING_LIFE)
- return ..()
-
-
-/datum/element/basic_body_temp_sensitive/proc/on_life(datum/target, seconds_per_tick, times_fired)
- SIGNAL_HANDLER
-
- var/mob/living/basic/basic_mob = target
- var/gave_alert = FALSE
-
- if(basic_mob.bodytemperature < min_body_temp)
- basic_mob.adjust_health(cold_damage * seconds_per_tick)
- switch(cold_damage)
- if(1 to 5)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1)
- if(5 to 10)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2)
- if(10 to INFINITY)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3)
- gave_alert = TRUE
-
- else if(basic_mob.bodytemperature > max_body_temp)
- basic_mob.adjust_health(heat_damage * seconds_per_tick)
- switch(heat_damage)
- if(1 to 5)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1)
- if(5 to 10)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 2)
- if(10 to INFINITY)
- basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3)
- gave_alert = TRUE
-
- if(!gave_alert)
- basic_mob.clear_alert(ALERT_TEMPERATURE)
diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm
index 889ebb12904b..cd679b80003d 100644
--- a/code/datums/elements/decals/blood.dm
+++ b/code/datums/elements/decals/blood.dm
@@ -38,6 +38,10 @@
blood_splatter_appearances[index] = pic
return TRUE
+/datum/element/decal/blood/apply_overlay(obj/item/source, list/overlay_list)
+ pic.color = source.get_blood_dna_color() || COLOR_BLOOD
+ return ..()
+
/datum/element/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override)
SIGNAL_HANDLER
diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm
index f3e5176d0972..1bc10f91bd4d 100644
--- a/code/datums/elements/footstep.dm
+++ b/code/datums/elements/footstep.dm
@@ -146,8 +146,14 @@
footstep_sounds[shoestep_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS)
else
var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT]
- if(source.dna.species.special_step_sounds)
- heard_clients = playsound(source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary)
+ var/leg_num = source.step_leg
+ source.step_leg++
+ if(source.step_leg > source.usable_legs)
+ source.step_leg = 1
+ var/bodypart_slot = leg_num == 2 ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG
+ var/obj/item/bodypart/leg/gotten = source.get_bodypart(bodypart_slot)
+ if(gotten?.step_sounds)
+ heard_clients = playsound(source.loc, pick(gotten.step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary)
else
var/static/list/bare_footstep_sounds = GLOB.barefootstep
diff --git a/code/datums/interactions/intents.dm b/code/datums/interactions/intents.dm
index 493bff0f4dde..93076a7395c5 100644
--- a/code/datums/interactions/intents.dm
+++ b/code/datums/interactions/intents.dm
@@ -10,7 +10,6 @@
if(LAZYACCESS(modifiers, RIGHT_CLICK))
M.istate = ISTATE_SECONDARY
- return
switch (intent)
if (INTENT_DISARM)
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index efa76ca24cd7..452048b3c231 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -183,9 +183,7 @@
desc = "These gloves can teach you to perform Krav Maga using nanochips."
icon_state = "fightgloves"
greyscale_colors = "#c41e0d"
- cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
- heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
@@ -196,9 +194,7 @@
greyscale_colors = "#2f2e31"
siemens_coefficient = 0
strip_delay = 80
- cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
- heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor_type = /datum/armor/krav_maga_combatglovesplus
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index df8369a707e1..ccaf1ae6caf8 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -162,7 +162,7 @@
/datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user)
if(!COOLDOWN_FINISHED(src, block_cooldown))
- if(prob(70))
+ if(prob(50))
return FALSE
if(!can_use(carp_user))
return FALSE
@@ -191,7 +191,7 @@
)
COOLDOWN_START(src, block_cooldown, 3 SECONDS)
playsound(carp_user, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), vol = 75, vary = TRUE)
- carp_user.stamina?.adjust(-50)
+ carp_user.stamina?.adjust(-15)
hitting_projectile.firer = carp_user
hitting_projectile.set_angle(rand(0, 360))//SHING
return COMPONENT_BULLET_PIERCED
diff --git a/code/datums/mood.dm b/code/datums/mood.dm
index 9cce6e98a8f3..14817b4d52e9 100644
--- a/code/datums/mood.dm
+++ b/code/datums/mood.dm
@@ -316,6 +316,41 @@
/// Prints the users mood, sanity, and moodies to chat
/datum/mood/proc/print_mood(mob/user)
var/msg = "[span_info("My current mental status:")]\n"
+
+ if(!HAS_TRAIT(src, TRAIT_NOHUNGER))
+ msg += span_notice("My hunger: ")
+ var/nutrition = mob_parent.nutrition
+ switch(nutrition)
+ if(NUTRITION_LEVEL_FULL to INFINITY)
+ msg += span_info("I'm completely stuffed!\n")
+ if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL)
+ msg += span_info("I'm well fed!\n")
+ if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
+ msg += span_info("I'm not hungry.\n")
+ if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
+ msg += span_info("I could use a bite to eat.\n")
+ if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
+ msg += span_warning("I feel quite hungry.\n")
+ if(0 to NUTRITION_LEVEL_STARVING)
+ msg += span_boldwarning("I'm starving!\n")
+
+ var/drunkness = mob_parent.get_timed_status_effect_duration(/datum/status_effect/inebriated)
+ if(drunkness >= 1)
+ msg += span_notice("My current drunkenness: ")
+ switch(drunkness)
+ if(1 to 10)
+ msg += span_info("I'm feeling a little tipsy.\n")
+ if(11 to 21)
+ msg += span_info("I'm feeling a bit drunk.\n")
+ if(21 to 41)
+ msg += span_info("I'm feeling quite drunk.\n")
+ if(41 to 61)
+ msg += span_info("I'm feeling very drunk.\n")
+ if(61 to 81)
+ msg += span_warning("I'm feeling like a mess.\n")
+ if(81 to INFINITY)
+ msg += span_boldwarning("I'm completely wasted.\n")
+
msg += span_notice("My current sanity: ") //Long term
switch(sanity)
if(SANITY_GREAT to INFINITY)
@@ -356,6 +391,7 @@
if(mood_events.len)
for(var/category in mood_events)
var/datum/mood_event/event = mood_events[category]
+ msg += "• "
switch(event.mood_change)
if(-INFINITY to MOOD_SAD2)
msg += span_boldwarning(event.description + "\n")
@@ -370,7 +406,10 @@
if(MOOD_HAPPY2 to INFINITY)
msg += span_boldnicegreen(event.description + "\n")
else
- msg += "[span_grey("I don't have much of a reaction to anything right now.")]\n"
+ msg += "• [span_grey("I don't have much of a reaction to anything right now.")]\n"
+
+ if(LAZYLEN(mob_parent.quirks))
+ msg += span_notice("You have these quirks: [mob_parent.get_quirk_string(FALSE, CAT_QUIRK_ALL)].")
to_chat(user, examine_block(msg))
/// Updates the mob's moodies, if the area provides a mood bonus
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index c22e940c990b..962c26c4936e 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -19,13 +19,29 @@
mood_change = -1
timeout = 2 MINUTES
+/datum/mood_event/chilly
+ description = "I'm feeling a bit chilly."
+ mood_change = -2
+
/datum/mood_event/cold
- description = "It's way too cold in here."
- mood_change = -5
+ description = "It's way too cold."
+ mood_change = -3
+
+/datum/mood_event/freezing
+ description = "It's freezing cold!"
+ mood_change = -6
+
+/datum/mood_event/warm
+ description = "I'm feeling a bit warm."
+ mood_change = -2
/datum/mood_event/hot
- description = "It's getting hot in here."
- mood_change = -5
+ description = "It's way too hot."
+ mood_change = -3
+
+/datum/mood_event/overhot
+ description = "It's scorching hot!"
+ mood_change = -6
/datum/mood_event/creampie
description = "I've been creamed. Tastes like pie flavor."
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index c1b42564f593..c306ab7c4dfa 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -15,7 +15,6 @@
var/list/mutation_traits = list(
TRAIT_CHUNKYFINGERS,
TRAIT_HULK,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_PUSHIMMUNE,
TRAIT_STUNIMMUNE,
)
@@ -29,9 +28,13 @@
part.variable_color = "#00aa00"
owner.update_body_parts()
owner.add_mood_event("hulk", /datum/mood_event/hulk)
+ owner.physiology?.cold_mod *= HULK_COLD_DAMAGE_MOD
+ owner.bodytemp_cold_damage_limit += BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER
RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand))
RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing))
+ RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(statchange))
+ owner.add_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
/datum/mutation/human/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers)
SIGNAL_HANDLER
@@ -77,8 +80,9 @@
owner.cause_wound_of_type_and_severity(WOUND_BLUNT, arm, severity, wound_source = "hulk smashing")
-/datum/mutation/human/hulk/on_life(seconds_per_tick, times_fired)
- if(owner.health < owner.crit_threshold)
+/datum/mutation/human/hulk/proc/statchange(mob/living/carbon/human/owner, stat, old_stat)
+ SIGNAL_HANDLER
+ if(stat >= UNCONSCIOUS)
on_losing(owner)
to_chat(owner, span_danger("You suddenly feel very weak."))
qdel(src)
@@ -91,9 +95,13 @@
part.variable_color = null
owner.update_body_parts()
owner.clear_mood_event("hulk")
+ owner.physiology?.cold_mod /= HULK_COLD_DAMAGE_MOD
+ owner.bodytemp_cold_damage_limit -= BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER
UnregisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
UnregisterSignal(owner, COMSIG_MOB_SAY)
UnregisterSignal(owner, COMSIG_MOB_CLICKON)
+ UnregisterSignal(owner, COMSIG_MOB_STATCHANGE)
+ owner.remove_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
/datum/mutation/human/hulk/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
@@ -264,6 +272,7 @@
log_combat(the_hulk, yeeted_person, "has thrown by tail")
/datum/mutation/human/hulk/wizardly
+ name = "Hulk (Magic)"
species_allowed = null //yes skeleton/lizard hulk - note that species that dont have skintone changing (like skellies) get custom handling
health_req = 0
instability = 0
@@ -271,7 +280,6 @@
/// List of traits to add/remove when someone gets this mutation.
mutation_traits = list(
TRAIT_HULK,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_PUSHIMMUNE,
TRAIT_STUNIMMUNE,
) // no chunk
diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm
index 2b55f0932f04..3c18ddad816d 100644
--- a/code/datums/quirks/_quirk.dm
+++ b/code/datums/quirks/_quirk.dm
@@ -32,7 +32,7 @@
/// A list of items people can receive from mail who have this quirk enabled
/// The base weight for the each quirk's mail goodies list to be selected is 5
/// then the item selected is determined by pick(selected_quirk.mail_goodies)
- var/mail_goodies = list()
+ var/list/mail_goodies = list() //Monkestation Edit BLOOD_DATUM: Why? this is already a list all this does is mess confuse us.
/datum/quirk/Destroy()
if(quirk_holder)
@@ -147,7 +147,7 @@
/// Otherwise, it runs once on the next COMSIG_MOB_LOGIN.
/datum/quirk/proc/post_add()
return
-
+
/// return additional data that should be remembered by cloning
/datum/quirk/proc/clone_data()
return
@@ -155,7 +155,7 @@
/// create the quirk from clone data
/datum/quirk/proc/on_clone(data)
return
-
+
/// Subtype quirk that has some bonus logic to spawn items for the player.
/datum/quirk/item_quirk
/// Lazylist of strings describing where all the quirk items have been spawned.
diff --git a/code/datums/quirks/negative_quirks.dm b/code/datums/quirks/negative_quirks.dm
index a2528c8c9d92..f10307b0fae2 100644
--- a/code/datums/quirks/negative_quirks.dm
+++ b/code/datums/quirks/negative_quirks.dm
@@ -69,31 +69,43 @@
var/min_blood = BLOOD_VOLUME_SAFE - 25 // just barely survivable without treatment
/datum/quirk/blooddeficiency/post_add()
- if(!ishuman(quirk_holder))
- return
+ update_mail()
- // for making sure the roundstart species has the right blood pack sent to them
- var/mob/living/carbon/human/carbon_target = quirk_holder
- carbon_target.dna.species.update_quirk_mail_goodies(carbon_target, src)
-
-/**
- * Makes the mob lose blood from having the blood deficiency quirk, if possible
- *
- * Arguments:
- * * seconds_per_tick
- */
-/datum/quirk/blooddeficiency/proc/lose_blood(seconds_per_tick)
- if(quirk_holder.stat == DEAD)
+/datum/quirk/blooddeficiency/add(client/client_source)
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_HUMAN_ON_HANDLE_BLOOD, PROC_REF(lose_blood))
+ RegisterSignal(quirk_holder, COMSIG_SPECIES_GAIN, PROC_REF(update_mail))
+
+/datum/quirk/blooddeficiency/remove()
+ . = ..()
+ UnregisterSignal(quirk_holder, COMSIG_HUMAN_ON_HANDLE_BLOOD)
+ UnregisterSignal(quirk_holder, COMSIG_SPECIES_GAIN)
+
+/datum/quirk/blooddeficiency/proc/lose_blood(mob/living/carbon/human/draining, seconds_per_tick, times_fired)
+ SIGNAL_HANDLER
+ if(quirk_holder.stat == DEAD || quirk_holder.blood_volume <= min_blood)
return
- var/mob/living/carbon/human/carbon_target = quirk_holder
- if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) && isnull(carbon_target.dna.species.exotic_blood)) //can't lose blood if your species doesn't have any
+ // Ensures that we don't reduce total blood volume below min_blood.
+ draining.blood_volume = max(min_blood, draining.blood_volume - draining.dna.species.blood_deficiency_drain_rate * seconds_per_tick)
+
+/datum/quirk/blooddeficiency/proc/update_mail(datum/source, datum/species/new_species, datum/species/old_species)
+ SIGNAL_HANDLER
+
+ mail_goodies.Cut()
+
+ var/datum/blood_type/new_type = quirk_holder.get_blood_type()
+ if(isnull(new_type))
return
- if (carbon_target.blood_volume <= min_blood)
+ if(istype(new_type, /datum/blood_type/crew/human))
+ mail_goodies += /obj/item/reagent_containers/blood/o_minus
return
- // Ensures that we don't reduce total blood volume below min_blood.
- carbon_target.blood_volume = max(min_blood, carbon_target.blood_volume - carbon_target.dna.species.blood_deficiency_drain_rate * seconds_per_tick)
+
+ for(var/obj/item/reagent_containers/blood/blood_bag as anything in typesof(/obj/item/reagent_containers/blood))
+ if(initial(blood_bag.blood_type) == new_type.type)
+ mail_goodies += blood_bag
+ break
/datum/quirk/item_quirk/blindness
name = "Blind"
@@ -862,7 +874,7 @@
quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS)
/datum/quirk/item_quirk/junkie/process(seconds_per_tick)
- if(HAS_TRAIT(quirk_holder, TRAIT_NOMETABOLISM))
+ if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM))
return
var/mob/living/carbon/human/human_holder = quirk_holder
if(world.time > next_process)
diff --git a/code/datums/quirks/neutral_quirks.dm b/code/datums/quirks/neutral_quirks.dm
index 4bc4c2168ab0..126af15ec8be 100644
--- a/code/datums/quirks/neutral_quirks.dm
+++ b/code/datums/quirks/neutral_quirks.dm
@@ -68,26 +68,18 @@
mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad)
/datum/quirk/vegetarian/add(client/client_source)
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food &= ~MEAT
- species.disliked_food |= MEAT
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
-
-/datum/quirk/vegetarian/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- new_species.liked_food &= ~MEAT
- new_species.disliked_food |= MEAT
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes &= ~MEAT
+ tongue.disliked_foodtypes |= MEAT
/datum/quirk/vegetarian/remove()
- var/mob/living/carbon/human/human_holder = quirk_holder
-
- var/datum/species/species = human_holder.dna.species
- if(initial(species.liked_food) & MEAT)
- species.liked_food |= MEAT
- if(!(initial(species.disliked_food) & MEAT))
- species.disliked_food &= ~MEAT
- UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
/datum/quirk/snob
name = "Snob"
@@ -111,20 +103,16 @@
mail_goodies = list(/obj/item/food/pizzaslice/pineapple)
/datum/quirk/pineapple_liker/add(client/client_source)
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food |= PINEAPPLE
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
-
-/datum/quirk/pineapple_liker/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- new_species.liked_food |= PINEAPPLE
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes |= PINEAPPLE
/datum/quirk/pineapple_liker/remove()
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food &= ~PINEAPPLE
- UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
/datum/quirk/pineapple_hater
name = "Ananas Aversion"
@@ -143,20 +131,16 @@
)
/datum/quirk/pineapple_hater/add(client/client_source)
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.disliked_food |= PINEAPPLE
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
-
-/datum/quirk/pineapple_hater/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- new_species.disliked_food |= PINEAPPLE
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.disliked_foodtypes |= PINEAPPLE
/datum/quirk/pineapple_hater/remove()
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.disliked_food &= ~PINEAPPLE
- UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
/datum/quirk/deviant_tastes
name = "Deviant Tastes"
@@ -169,25 +153,19 @@
mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy
/datum/quirk/deviant_tastes/add(client/client_source)
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- var/liked = species.liked_food
- species.liked_food = species.disliked_food
- species.disliked_food = liked
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
-
-/datum/quirk/deviant_tastes/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- var/liked = new_species.liked_food
- new_species.liked_food = new_species.disliked_food
- new_species.disliked_food = liked
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ var/liked_foodtypes = tongue.liked_foodtypes
+ tongue.liked_foodtypes = tongue.disliked_foodtypes
+ tongue.disliked_foodtypes = liked_foodtypes
/datum/quirk/deviant_tastes/remove()
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food = initial(species.liked_food)
- species.disliked_food = initial(species.disliked_food)
- UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
/datum/quirk/heterochromatic
name = "Heterochromatic"
@@ -410,27 +388,22 @@
var/gaming_withdrawal_timer = TIMER_ID_NULL
/datum/quirk/gamer/add(client/client_source)
- // Gamer diet
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food = JUNKFOOD
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
- RegisterSignal(human_holder, COMSIG_MOB_WON_VIDEOGAME, PROC_REF(won_game))
- RegisterSignal(human_holder, COMSIG_MOB_LOST_VIDEOGAME, PROC_REF(lost_game))
- RegisterSignal(human_holder, COMSIG_MOB_PLAYED_VIDEOGAME, PROC_REF(gamed))
-
-/datum/quirk/gamer/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- new_species.liked_food = JUNKFOOD
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(tongue)
+ // Gamer diet
+ tongue.liked_foodtypes = JUNKFOOD
+ RegisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME, PROC_REF(won_game))
+ RegisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME, PROC_REF(lost_game))
+ RegisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME, PROC_REF(gamed))
/datum/quirk/gamer/remove()
- var/mob/living/carbon/human/human_holder = quirk_holder
- var/datum/species/species = human_holder.dna.species
- species.liked_food = initial(species.liked_food)
- UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN)
- UnregisterSignal(human_holder, COMSIG_MOB_WON_VIDEOGAME)
- UnregisterSignal(human_holder, COMSIG_MOB_LOST_VIDEOGAME)
- UnregisterSignal(human_holder, COMSIG_MOB_PLAYED_VIDEOGAME)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(tongue)
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME)
+
/datum/quirk/gamer/add_unique(client/client_source)
// The gamer starts off quelled
diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm
index 3bd91072ab8f..786d94ef0f9c 100644
--- a/code/datums/records/manifest.dm
+++ b/code/datums/records/manifest.dm
@@ -113,7 +113,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
var/datum/record/locked/lockfile = new(
age = person.age,
- blood_type = person.dna.blood_type,
+ blood_type = "[person.get_blood_type() || "None"]",
character_appearance = character_appearance,
dna_string = person.dna.unique_enzymes,
fingerprint = md5(person.dna.unique_identity),
@@ -130,7 +130,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
var/datum/record/crew/crewfile = new (
age = person.age,
- blood_type = person.dna.blood_type,
+ blood_type = "[person.get_blood_type() || "None"]",
character_appearance = character_appearance,
dna_string = person.dna.unique_enzymes,
fingerprint = md5(person.dna.unique_identity),
diff --git a/code/datums/status_effects/_status_effect_helpers.dm b/code/datums/status_effects/_status_effect_helpers.dm
index 0ee952200610..144a972da621 100644
--- a/code/datums/status_effects/_status_effect_helpers.dm
+++ b/code/datums/status_effects/_status_effect_helpers.dm
@@ -56,7 +56,7 @@
. = FALSE
for(var/datum/status_effect/existing_effect as anything in status_effects)
- if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arguments))
+ if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arglist(arguments)))
qdel(existing_effect)
. = TRUE
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 2e9714fb2959..ee06eee43f13 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -335,11 +335,7 @@
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT)
owner.adjustBruteLoss(-25)
owner.adjustFireLoss(-25)
- owner.fully_heal(HEAL_CC_STATUS)
- owner.bodytemperature = owner.get_body_temp_normal()
- if(ishuman(owner))
- var/mob/living/carbon/human/humi = owner
- humi.set_coretemperature(humi.get_body_temp_normal())
+ owner.fully_heal(HEAL_CC_STATUS|HEAL_TEMP)
return TRUE
/datum/status_effect/regenerative_core/on_remove()
@@ -480,7 +476,7 @@
owner.adjustFireLoss(-2 * seconds_per_tick, updating_health = FALSE)
owner.adjustOxyLoss(-4 * seconds_per_tick, updating_health = FALSE)
owner.stamina.adjust(4 * seconds_per_tick)
- owner.adjust_bodytemperature(BODYTEMP_NORMAL, 0, BODYTEMP_NORMAL) //Won't save you from the void of space, but it will stop you from freezing or suffocating in low pressure
+ owner.adjust_bodytemperature(INFINITY, max_temp = owner.standard_body_temperature) //Won't save you from the void of space, but it will stop you from freezing or suffocating in low pressure
/atom/movable/screen/alert/status_effect/nest_sustenance
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index 4fe68d281eae..aa0be7f3120e 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -138,14 +138,19 @@
ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id))
RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_insomniac))
RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_sleepy))
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_owner_death))
/datum/status_effect/incapacitating/sleeping/on_remove()
- UnregisterSignal(owner, list(SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE)))
+ UnregisterSignal(owner, list(SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE), COMSIG_LIVING_DEATH))
if(!HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE))
REMOVE_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id))
tick_interval = initial(tick_interval)
return ..()
+/datum/status_effect/incapacitating/sleeping/proc/on_owner_death(mob/living/source)
+ SIGNAL_HANDLER
+ qdel(src)
+
///If the mob is sleeping and gain the TRAIT_SLEEPIMMUNE we remove the TRAIT_KNOCKEDOUT and stop the tick() from happening
/datum/status_effect/incapacitating/sleeping/proc/on_owner_insomniac(mob/living/source)
SIGNAL_HANDLER
@@ -365,11 +370,10 @@
/datum/status_effect/stacking/saw_bleed/threshold_cross_effect()
owner.adjustBruteLoss(bleed_damage)
- var/turf/T = get_turf(owner)
- new /obj/effect/temp_visual/bleed/explode(T)
+ new /obj/effect/temp_visual/bleed/explode(owner.loc)
for(var/d in GLOB.alldirs)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, d)
- playsound(T, SFX_DESECRATION, 100, TRUE, -1)
+ owner.do_splatter_effect(d)
+ playsound(owner, SFX_DESECRATION, 100, TRUE, -1)
/datum/status_effect/stacking/saw_bleed/bloodletting
id = "bloodletting"
diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm
index f2c014578adc..d00d0c348439 100644
--- a/code/datums/status_effects/debuffs/fire_stacks.dm
+++ b/code/datums/status_effects/debuffs/fire_stacks.dm
@@ -189,36 +189,6 @@
var/turf/location = get_turf(owner)
location.hotspot_expose(700, 25 * seconds_per_tick, TRUE)
-/**
- * Used to deal damage to humans and count their protection.
- *
- * Arguments:
- * - seconds_per_tick
- * - times_fired
- * - no_protection: When set to TRUE, fire will ignore any possible fire protection
- *
- */
-
-/datum/status_effect/fire_handler/fire_stacks/proc/harm_human(seconds_per_tick, times_fired, no_protection = FALSE)
- var/mob/living/carbon/human/victim = owner
- var/thermal_protection = victim.get_thermal_protection()
-
- if(!no_protection)
- if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
- return
- if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
- victim.adjust_bodytemperature(5.5 * seconds_per_tick)
- return
-
- var/amount_to_heat = (BODYTEMP_HEATING_MAX + (stacks * 12)) * 0.5 * seconds_per_tick
- if(owner.bodytemperature > BODYTEMP_FIRE_TEMP_SOFTCAP)
- // Apply dimishing returns upon temp beyond the soft cap
- amount_to_heat = amount_to_heat ** (BODYTEMP_FIRE_TEMP_SOFTCAP / owner.bodytemperature)
-
- victim.adjust_bodytemperature(amount_to_heat)
- victim.add_mood_event("on_fire", /datum/mood_event/on_fire)
- victim.add_mob_memory(/datum/memory/was_burning)
-
/**
* Handles mob ignition, should be the only way to set on_fire to TRUE
*
diff --git a/code/datums/status_effects/debuffs/strandling.dm b/code/datums/status_effects/debuffs/strandling.dm
index 5465171df820..5fbf37e6f6f2 100644
--- a/code/datums/status_effects/debuffs/strandling.dm
+++ b/code/datums/status_effects/debuffs/strandling.dm
@@ -10,25 +10,22 @@
var/time_to_remove = 3.5 SECONDS
/datum/status_effect/strandling/on_apply()
- RegisterSignal(owner, COMSIG_CARBON_PRE_BREATHE, PROC_REF(on_breathe))
+ RegisterSignal(owner, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(on_breathe))
RegisterSignal(owner, COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), PROC_REF(on_cut))
RegisterSignal(owner, COMSIG_CARBON_PRE_MISC_HELP, PROC_REF(on_self_check))
return TRUE
/datum/status_effect/strandling/on_remove()
- UnregisterSignal(owner, list(COMSIG_CARBON_PRE_BREATHE, COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), COMSIG_CARBON_PRE_MISC_HELP))
+ UnregisterSignal(owner, list(COMSIG_CARBON_ATTEMPT_BREATHE, COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), COMSIG_CARBON_PRE_MISC_HELP))
/datum/status_effect/strandling/get_examine_text()
return span_warning("[owner.p_they(TRUE)] seem[owner.p_s()] to be being choked by some durathread strands. You may be able to cut them off.")
-/// Signal proc for [COMSIG_CARBON_PRE_BREATHE], causes losebreath whenever we're trying to breathe
+/// Signal proc for [COMSIG_CARBON_ATTEMPT_BREATHE], causes losebreath whenever we're trying to breathe
/datum/status_effect/strandling/proc/on_breathe(mob/living/source)
SIGNAL_HANDLER
- if(source.get_organ_slot(ORGAN_SLOT_BREATHING_TUBE))
- return
-
- source.losebreath++
+ return HAS_TRAIT(owner, TRAIT_ASSISTED_BREATHING) ? NONE : BREATHE_SKIP_BREATH
/// Signal proc for [COMSIG_ATOM_TOOL_ACT] with [TOOL_WIRECUTTER], allowing wirecutters to remove the effect (from others / themself)
/datum/status_effect/strandling/proc/on_cut(mob/living/source, mob/user, obj/item/tool)
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index cfa282732058..bf0822d879f8 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -24,7 +24,7 @@
/datum/status_effect/freon/tick()
- if(can_melt && owner.bodytemperature >= owner.get_body_temp_normal())
+ if(can_melt && owner.bodytemperature >= owner.standard_body_temperature - 2 KELVIN)
qdel(src)
/datum/status_effect/freon/proc/owner_resist()
@@ -43,7 +43,7 @@
if(!owner.stat)
to_chat(owner, span_notice("The cube melts!"))
owner.cut_overlay(cube)
- owner.adjust_bodytemperature(100)
+ owner.adjust_bodytemperature(50 KELVIN, max_temp = owner.standard_body_temperature - 5 KELVIN)
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id))
return ..()
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index b9428e2d250b..c3d684560c26 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -163,7 +163,7 @@
/// The type of alert given to people when offered, in case you need to override some behavior (like for high-fives)
var/give_alert_type = /atom/movable/screen/alert/give
-/datum/status_effect/offering/on_creation(mob/living/new_owner, obj/item/offer, give_alert_override, mob/living/carbon/offered)
+/datum/status_effect/offering/on_creation(mob/living/new_owner, obj/item/offer, give_alert_override, mob/living/offered)
. = ..()
if(!.)
return
@@ -171,11 +171,11 @@
if(give_alert_override)
give_alert_type = give_alert_override
- if(offered && is_taker_elligible(offered))
+ if(offered && is_taker_elligible(offered, offer))
register_candidate(offered)
else
- for(var/mob/living/carbon/possible_taker in orange(1, owner))
- if(!is_taker_elligible(possible_taker))
+ for(var/mob/living/possible_taker in orange(1, owner))
+ if(!is_taker_elligible(possible_taker, offer))
continue
register_candidate(possible_taker)
@@ -202,6 +202,7 @@
LAZYADD(possible_takers, possible_candidate)
RegisterSignal(possible_candidate, COMSIG_MOVABLE_MOVED, PROC_REF(check_taker_in_range))
G.setup(possible_candidate, src)
+ SEND_SIGNAL(possible_candidate, COMSIG_LIVING_GIVE_ITEM_CHECK, G, offered_item)
/// Remove the alert and signals for the specified carbon mob. Automatically removes the status effect when we lost the last taker
/datum/status_effect/offering/proc/remove_candidate(mob/living/carbon/removed_candidate)
@@ -239,8 +240,8 @@
*
* Returns `TRUE` if the taker is valid as a target for the offering.
*/
-/datum/status_effect/offering/proc/is_taker_elligible(mob/living/carbon/taker)
- return owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker)
+/datum/status_effect/offering/proc/is_taker_elligible(mob/living/carbon/taker, obj/item/offer)
+ return (owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker)) || SEND_SIGNAL(taker, COMSIG_LIVING_ITEM_OFFERED_PRECHECK, offer)
/**
* Additional checks added to `CanReach()` and `IS_DEAD_OR_INCAP()` in `is_taker_elligible()`.
diff --git a/code/datums/status_effects/stacking_effect.dm b/code/datums/status_effects/stacking_effect.dm
index 9896ef5ec707..9a682000eb78 100644
--- a/code/datums/status_effects/stacking_effect.dm
+++ b/code/datums/status_effects/stacking_effect.dm
@@ -86,8 +86,11 @@
/datum/status_effect/stacking/proc/add_stacks(stacks_added)
if(stacks_added > 0 && !can_gain_stacks())
return FALSE
- owner.cut_overlay(status_overlay)
- owner.underlays -= status_underlay
+ if(status_overlay)
+ owner.cut_overlay(status_overlay)
+ if(status_underlay)
+ owner.underlays -= status_underlay
+
stacks += stacks_added
if(stacks > 0)
if(stacks >= stack_threshold && !threshold_crossed) //threshold_crossed check prevents threshold effect from occuring if changing from above threshold to still above threshold
@@ -98,13 +101,15 @@
else if(stacks < stack_threshold && threshold_crossed)
threshold_crossed = FALSE //resets threshold effect if we fall below threshold so threshold effect can trigger again
on_threshold_drop()
- if(stacks_added > 0)
- tick_interval += delay_before_decay //refreshes time until decay
+ if((stacks_added > 0) && delay_before_decay)
+ tick_interval = world.time + delay_before_decay //refreshes time until decay
stacks = min(stacks, max_stacks)
- status_overlay.icon_state = "[overlay_state][stacks]"
- status_underlay.icon_state = "[underlay_state][stacks]"
- owner.add_overlay(status_overlay)
- owner.underlays += status_underlay
+ if(status_overlay)
+ status_overlay.icon_state = "[overlay_state][stacks]"
+ owner.add_overlay(status_overlay)
+ if(status_underlay)
+ status_underlay.icon_state = "[underlay_state][stacks]"
+ owner.underlays += status_underlay
else
fadeout_effect()
qdel(src) //deletes status if stacks fall under one
@@ -117,23 +122,34 @@
/datum/status_effect/stacking/on_apply()
if(!can_have_status())
return FALSE
- status_overlay = mutable_appearance(overlay_file, "[overlay_state][stacks]")
- status_underlay = mutable_appearance(underlay_file, "[underlay_state][stacks]")
- var/icon/I = icon(owner.icon, owner.icon_state, owner.dir)
- var/icon_height = I.Height()
- status_overlay.pixel_x = -owner.pixel_x
- status_overlay.pixel_y = FLOOR(icon_height * 0.25, 1)
- status_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the status's overlay size based on the target's icon size
- status_underlay.pixel_x = -owner.pixel_x
- status_underlay.transform = matrix() * (icon_height/world.icon_size) * 3
- status_underlay.alpha = 40
- owner.add_overlay(status_overlay)
- owner.underlays += status_underlay
- return ..()
-
-/datum/status_effect/stacking/Destroy()
- if(owner)
+ if(overlay_file || underlay_file)
+ if(overlay_file)
+ status_overlay = mutable_appearance(overlay_file, "[overlay_state][stacks]")
+ if(underlay_file)
+ status_underlay = mutable_appearance(underlay_file, "[underlay_state][stacks]")
+
+ var/icon/I = icon(owner.icon, owner.icon_state, owner.dir)
+ var/icon_height = I.Height()
+
+ if(status_overlay)
+ status_overlay.pixel_x = -owner.pixel_x
+ status_overlay.pixel_y = FLOOR(icon_height * 0.25, 1)
+ status_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the status's overlay size based on the target's icon size
+ owner.add_overlay(status_overlay)
+
+ if(status_underlay)
+ status_underlay.pixel_x = -owner.pixel_x
+ status_underlay.transform = matrix() * (icon_height/world.icon_size) * 3
+ status_underlay.alpha = 40
+ owner.underlays += status_underlay
+
+ return TRUE
+
+/datum/status_effect/stacking/on_remove()
+ if(QDELETED(owner))
+ return
+ if(status_overlay)
owner.cut_overlay(status_overlay)
+ QDEL_NULL(status_overlay)
+ if(status_underlay)
owner.underlays -= status_underlay
- QDEL_NULL(status_overlay)
- return ..()
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index 8965d22ad197..baec06c7c048 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -1,29 +1,102 @@
// The shattered remnants of your broken limbs fill you with determination!
-/atom/movable/screen/alert/status_effect/determined
+/atom/movable/screen/alert/determined
name = "Determined"
desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!"
icon_state = "wounded"
+/// While someone has determination in their system, their bleed rate is slightly reduced
+#define WOUND_DETERMINATION_BLEED_MOD 0.85
+
/datum/status_effect/determined
id = "determined"
- alert_type = /atom/movable/screen/alert/status_effect/determined
remove_on_fullheal = TRUE
+ tick_interval = 2 SECONDS
+ alert_type = null
+ status_type = STATUS_EFFECT_REFRESH
+ /// World.time when the status effect was applied
+ var/start_time = 0
+
+/datum/status_effect/determined/on_creation(mob/living/new_owner, set_duration = 5 SECONDS)
+ src.duration = min(WOUND_DETERMINATION_MAX, set_duration)
+ start_time = world.time
+ return ..()
+
+/datum/status_effect/determined/refresh(mob/living/new_owner, set_duration = 5 SECONDS)
+ duration = min(duration + set_duration, start_time + WOUND_DETERMINATION_MAX)
+ if(set_duration >= WOUND_DETERMINATION_SEVERE)
+ owner.throw_alert(id, /atom/movable/screen/alert/determined)
/datum/status_effect/determined/on_apply()
- . = ..()
- owner.visible_message(span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"), span_notice("Your senses sharpen as your body tenses up from the wounds you've sustained!"), \
- vision_distance=COMBAT_MESSAGE_RANGE)
+ if(owner.stat == DEAD)
+ return FALSE
+ owner.visible_message(
+ span_danger("[owner]'s body tenses up noticeably, gritting against [owner.p_their()] pain!"),
+ span_boldnotice("Your senses sharpen as your body tenses up from the wounds you've sustained!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ )
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.bleed_mod *= WOUND_DETERMINATION_BLEED_MOD
+ human_owner.set_pain_mod(id, 0.625) // 0.625 * 0.8 = 0.5 = numbness
+ ADD_TRAIT(owner, TRAIT_NO_PAIN_EFFECTS, TRAIT_STATUS_EFFECT(id))
+ ADD_TRAIT(owner, TRAIT_ABATES_SHOCK, TRAIT_STATUS_EFFECT(id))
+ if(duration >= WOUND_DETERMINATION_SEVERE)
+ owner.throw_alert(id, /atom/movable/screen/alert/determined)
+ return TRUE
/datum/status_effect/determined/on_remove()
- owner.visible_message(span_danger("[owner]'s body slackens noticeably!"), span_warning("Your adrenaline rush dies off, and the pain from your wounds come aching back in..."), vision_distance=COMBAT_MESSAGE_RANGE)
+ if(QDELING(owner))
+ return
+
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.bleed_mod /= WOUND_DETERMINATION_BLEED_MOD
- return ..()
+ human_owner.unset_pain_mod(id)
+ REMOVE_TRAIT(owner, TRAIT_NO_PAIN_EFFECTS, TRAIT_STATUS_EFFECT(id))
+ REMOVE_TRAIT(owner, TRAIT_ABATES_SHOCK, TRAIT_STATUS_EFFECT(id))
+ owner.clear_alert(id)
+ owner.apply_status_effect(/datum/status_effect/determination_crash)
+
+/datum/status_effect/determined/tick(seconds_between_ticks)
+ if(HAS_TRAIT(owner, TRAIT_STASIS) || owner.stat == DEAD || !iscarbon(owner))
+ return
+
+ var/mob/living/carbon/carbowner = owner
+ for(var/datum/wound/wound as anything in carbowner.all_wounds)
+ wound.limb?.heal_damage(0.2 * seconds_between_ticks, 0.2 * seconds_between_ticks)
+
+#undef WOUND_DETERMINATION_BLEED_MOD
+
+/datum/status_effect/determination_crash
+ id = "determination_crash"
+ alert_type = null
+ remove_on_fullheal = TRUE
+ tick_interval = -1
+ duration = 10 SECONDS
+
+/datum/status_effect/determination_crash/on_apply()
+ if(owner.stat == DEAD)
+ return FALSE
+
+ owner.visible_message(
+ span_danger("[owner]'s body slackens noticeably!"),
+ span_boldwarning("Your adrenaline rush dies off, and the pain from your wounds come aching back in..."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ )
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/determination_crash)
+ owner.add_actionspeed_modifier(/datum/actionspeed_modifier/determination_crash)
+ return TRUE
+
+/datum/status_effect/determination_crash/on_remove()
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/determination_crash)
+ owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/determination_crash)
+
+/datum/movespeed_modifier/determination_crash
+ multiplicative_slowdown = 0.1
+
+/datum/actionspeed_modifier/determination_crash
+ multiplicative_slowdown = 0.1
/datum/status_effect/limp
id = "limp"
@@ -71,8 +144,11 @@
if(!owner.client || owner.body_position == LYING_DOWN || !owner.has_gravity() || (owner.movement_type & FLYING) || forced || owner.buckled)
return
+ if(SEND_SIGNAL(owner, COMSIG_CARBON_LIMPING, (next_leg || right || left)) & COMPONENT_CANCEL_LIMP)
+ return
+
// less limping while we have determination still
- var/determined_mod = owner.has_status_effect(/datum/status_effect/determined) ? 0.5 : 1
+ var/determined_mod = owner.can_feel_pain(TRUE) ? 1 : 0.5
if(next_leg == left)
if(prob(limp_chance_left * determined_mod))
@@ -187,6 +263,8 @@
/datum/status_effect/wound/blunt/bone
// blunt
+/datum/status_effect/wound/blunt/bone/rib_break
+ id = "rib_break"
/datum/status_effect/wound/blunt/bone/moderate
id = "disjoint"
/datum/status_effect/wound/blunt/bone/severe
diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm
index 69f077ddd82b..2018f290f97f 100644
--- a/code/datums/voice_of_god_command.dm
+++ b/code/datums/voice_of_god_command.dm
@@ -225,7 +225,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands())
/datum/voice_of_god_command/hot/execute(list/listeners, mob/living/user, power_multiplier = 1, message)
for(var/mob/living/target as anything in listeners)
- target.adjust_bodytemperature(50 * power_multiplier)
+ target.adjust_bodytemperature(5 KELVIN * power_multiplier)
/// This command cools the listeners down like freezing water.
/datum/voice_of_god_command/cold
@@ -234,7 +234,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands())
/datum/voice_of_god_command/cold/execute(list/listeners, mob/living/user, power_multiplier = 1, message)
for(var/mob/living/target as anything in listeners)
- target.adjust_bodytemperature(-50 * power_multiplier)
+ target.adjust_bodytemperature(-7.5 KELVIN * power_multiplier)
/// This command throws the listeners away from the user.
/datum/voice_of_god_command/repulse
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
index 1a5bd69d2a04..e10e39505bc0 100644
--- a/code/datums/weather/weather_types/ash_storm.dm
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -66,7 +66,7 @@
if(!. || !ishuman(mob_to_check))
return
var/mob/living/carbon/human/human_to_check = mob_to_check
- if(human_to_check.get_thermal_protection() >= FIRE_IMMUNITY_MAX_TEMP_PROTECT)
+ if(human_to_check.get_insulation(FIRE_IMMUNITY_MAX_TEMP_PROTECT) >= 0.9) //potentially broken
return FALSE
/datum/weather/ash_storm/weather_act(mob/living/victim)
diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm
index becfa9859a81..13dbd09cb523 100644
--- a/code/datums/weather/weather_types/void_storm.dm
+++ b/code/datums/weather/weather_types/void_storm.dm
@@ -36,7 +36,7 @@
victim.adjustFireLoss(1)
victim.adjustOxyLoss(rand(1, 3))
victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS))
- victim.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT)
+ victim.adjust_bodytemperature(-4 KELVIN)
// Goes through former_impacted_areas and sets the overlay of each back to the telegraph overlay, to indicate the ascended heretic is no longer in that area.
/datum/weather/void_storm/update_areas()
diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm
index f996bb258c79..15aa2dd7afa7 100644
--- a/code/datums/wounds/_wound_static_data.dm
+++ b/code/datums/wounds/_wound_static_data.dm
@@ -86,7 +86,14 @@
* if we have a biotype mismatch, if the limb isnt in a viable zone, or if theres any duplicate wound types.
* TRUE otherwise.
*/
-/datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types = required_wounding_types, datum/wound/old_wound, random_roll = FALSE, duplicates_allowed = src.duplicates_allowed, care_about_existing_wounds = TRUE)
+/datum/wound_pregen_data/proc/can_be_applied_to(
+ obj/item/bodypart/limb,
+ list/suggested_wounding_types = required_wounding_types,
+ datum/wound/old_wound,
+ random_roll = FALSE,
+ duplicates_allowed = src.duplicates_allowed,
+ care_about_existing_wounds = TRUE,
+)
SHOULD_BE_PURE(TRUE)
if (!istype(limb) || !limb.owner)
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 6a52753eef99..53f50fddb0e4 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -19,10 +19,14 @@
/datum/wound
/// What it's named
var/name = "Wound"
+ /// Optional, what is the wound named when someone is checking themselves (IE, no scanner - just with their eyes and hands)
+ var/undiagnosed_name
/// The description shown on the scanners
var/desc = ""
/// The basic treatment suggested by health analyzers
var/treat_text = ""
+ /// Even more basic treatment
+ var/treat_text_short = ""
/// What the limb looks like on a cursory examine
var/examine_desc = "is badly hurt"
@@ -112,6 +116,11 @@
/// The actionspeed modifier we will use in case we are on the arms and have a interaction penalty. Qdelled on destroy.
var/datum/actionspeed_modifier/wound_interaction_inefficiency/actionspeed_mod
+ /// If we did the gel + surgical tape healing method for fractures, how many ticks does it take to heal by default
+ var/regen_ticks_needed
+ /// Our current counter for gel + surgical tape regeneration
+ var/regen_ticks_current
+
/datum/wound/New()
. = ..()
@@ -204,7 +213,7 @@
if(severity == WOUND_SEVERITY_TRIVIAL)
return
- if(!silent && !demoted)
+ if(!silent && !demoted && occur_text)
var/msg = span_danger("[victim]'s [limb.plaintext_zone] [occur_text]!")
var/vis_dist = COMBAT_MESSAGE_RANGE
@@ -440,13 +449,13 @@
/datum/wound/proc/second_wind()
switch(severity)
if(WOUND_SEVERITY_MODERATE)
- victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE)
+ victim.apply_status_effect(/datum/status_effect/determined, WOUND_DETERMINATION_MODERATE)
if(WOUND_SEVERITY_SEVERE)
- victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE)
+ victim.apply_status_effect(/datum/status_effect/determined, WOUND_DETERMINATION_SEVERE)
if(WOUND_SEVERITY_CRITICAL)
- victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL)
+ victim.apply_status_effect(/datum/status_effect/determined, WOUND_DETERMINATION_CRITICAL)
if(WOUND_SEVERITY_LOSS)
- victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_LOSS)
+ victim.apply_status_effect(/datum/status_effect/determined, WOUND_DETERMINATION_LOSS)
/**
* try_treating() is an intercept run from [/mob/living/carbon/proc/attackby] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction.
@@ -515,7 +524,13 @@
/// If var/processing is TRUE, this is run on each life tick
/datum/wound/proc/handle_process(seconds_per_tick, times_fired)
- return
+ SHOULD_CALL_PARENT(TRUE)
+ if(regen_ticks_current > regen_ticks_needed)
+ if(!victim || !limb)
+ qdel(src)
+ return
+ to_chat(victim, span_green("Your [limb.plaintext_zone] has recovered from its [undiagnosed_name || name]!"))
+ remove_wound()
/// For use in do_after callback checks
/datum/wound/proc/still_exists()
@@ -592,7 +607,7 @@
*/
/datum/wound/proc/get_examine_description(mob/user)
. = get_wound_description(user)
- if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED))
+ if(. && HAS_TRAIT(src, TRAIT_WOUND_SCANNED))
. += span_notice("\nThere is a holo-image next to the wound that seems to contain indications for treatment.")
return .
@@ -601,15 +616,29 @@
var/desc
if ((wound_flags & ACCEPTS_GAUZE) && limb.current_gauze)
- var/sling_condition = get_gauze_condition()
- desc = "[victim.p_Their()] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]"
- else
+ desc = "[victim.p_Their()] [limb.plaintext_zone] is [get_gauze_condition()] fastened in a sling of [limb.current_gauze.name]"
+ else if(examine_desc)
desc = "[victim.p_Their()] [limb.plaintext_zone] [examine_desc]"
+ if(!desc)
+ return
+
desc = modify_desc_before_span(desc, user)
return get_desc_intensity(desc)
+/datum/wound/proc/get_self_check_description(mob/user)
+ // future todo : medical doctors can self-diagnose / don't use [undiagnosed_name]
+ switch(severity)
+ if(WOUND_SEVERITY_TRIVIAL)
+ return span_danger("It's suffering [a_or_from] [lowertext(undiagnosed_name || name)].")
+ if(WOUND_SEVERITY_MODERATE)
+ return span_warning("It's suffering [a_or_from] [lowertext(undiagnosed_name || name)].")
+ if(WOUND_SEVERITY_SEVERE)
+ return span_boldwarning("It's suffering [a_or_from] [lowertext(undiagnosed_name || name)]!")
+ if(WOUND_SEVERITY_CRITICAL)
+ return span_boldwarning("It's suffering [a_or_from] [lowertext(undiagnosed_name || name)]!!")
+
/// A hook proc used to modify desc before it is spanned via [get_desc_intensity]. Useful for inserting spans yourself.
/datum/wound/proc/modify_desc_before_span(desc, mob/user)
return desc
@@ -637,10 +666,17 @@
return "[desc]."
/datum/wound/proc/get_scanner_description(mob/user)
- return "Type: [name]\nSeverity: [severity_text(simple = FALSE)]\nDescription: [desc]\nRecommended Treatment: [treat_text]"
+ return "Type: [name]\n\
+ Severity: [severity_text(simple = FALSE)]\n\
+ Description: [desc]\n\
+ Recommended Treatment: [treat_text]"
/datum/wound/proc/get_simple_scanner_description(mob/user)
- return "[name] detected!\nRisk: [severity_text(simple = TRUE)]\nDescription: [simple_desc ? simple_desc : desc]\nTreatment Guide: [simple_treat_text]\nHomemade Remedies: [homemade_treat_text]"
+ return "[name] detected!\n\
+ Risk: [severity_text(simple = TRUE)]\n\
+ Description: [simple_desc ? simple_desc : desc]\n\
+ Treatment Guide: [simple_treat_text]\n\
+ Homemade Remedies: [homemade_treat_text]"
/datum/wound/proc/severity_text(simple = FALSE)
switch(severity)
@@ -653,11 +689,6 @@
if(WOUND_SEVERITY_CRITICAL)
return "Critical" + (simple ? "!!!" : "")
-/// Returns TRUE if our limb is the head or chest, FALSE otherwise.
-/// Essential in the sense of "we cannot live without it".
-/datum/wound/proc/limb_essential()
- return (limb.body_zone == BODY_ZONE_HEAD || limb.body_zone == BODY_ZONE_CHEST)
-
/// Getter proc for our scar_keyword, in case we might have some custom scar gen logic.
/datum/wound/proc/get_scar_keyword(obj/item/bodypart/scarred_limb, add_to_scars)
return scar_keyword
diff --git a/code/datums/wounds/blunt.dm b/code/datums/wounds/blunt.dm
index 219b7dd8805c..e3a9538a8c57 100644
--- a/code/datums/wounds/blunt.dm
+++ b/code/datums/wounds/blunt.dm
@@ -1,3 +1,11 @@
/datum/wound/blunt
name = "Blunt Wound"
+ undiagnosed_name = "Painful Bruising"
sound_effect = 'sound/effects/wounds/crack1.ogg'
+
+/datum/wound/blunt/wound_injury(datum/wound/old_wound, attack_direction)
+ if(!old_wound && limb.current_gauze && (wound_flags & ACCEPTS_GAUZE))
+ // oops your bone injury knocked off your gauze, gotta re-apply it
+ limb.remove_gauze(limb.drop_location())
+
+ return ..()
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index 1b63e5a4a2a4..cc53993907c2 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -22,10 +22,6 @@
var/gelled
/// Have we been taped?
var/taped
- /// If we did the gel + surgical tape healing method for fractures, how many ticks does it take to heal by default
- var/regen_ticks_needed
- /// Our current counter for gel + surgical tape regeneration
- var/regen_ticks_current
/// If we suffer severe head booboos, we can get brain traumas tied to them
var/datum/brain_trauma/active_trauma
/// What brain trauma group, if any, we can draw from for head wounds
@@ -36,6 +32,8 @@
var/trauma_cycle_cooldown
/// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest
var/internal_bleeding_chance = 0
+ /// Counts which tick we're on for footsteps
+ var/footstep_counter = 0
/*
Overwriting of base procs
@@ -53,7 +51,12 @@
I = victim.get_inactive_held_item()
if(I && victim.dropItemToGround(I))
- victim.visible_message(span_danger("[victim] drops [I] in shock!"), span_warning("The force on your [limb.plaintext_zone] causes you to drop [I]!"), vision_distance=COMBAT_MESSAGE_RANGE)
+ victim.visible_message(
+ span_danger("[victim] drops [I] in shock!"),
+ span_boldwarning("The force on your [limb.plaintext_zone] causes you to drop [I]!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
update_inefficiencies()
return ..()
@@ -62,8 +65,14 @@
if (victim)
UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
+ UnregisterSignal(victim, COMSIG_MOB_ITEM_ATTACK)
+ UnregisterSignal(victim, COMSIG_CARBON_STEP)
+ UnregisterSignal(victim, COMSIG_CARBON_ATTEMPT_BREATHE)
if (new_victim)
RegisterSignal(new_victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand))
+ RegisterSignal(new_victim, COMSIG_MOB_ITEM_ATTACK, PROC_REF(weapon_attack_with_hurt_hand))
+ RegisterSignal(new_victim, COMSIG_CARBON_STEP, PROC_REF(carbon_step))
+ RegisterSignal(new_victim, COMSIG_CARBON_ATTEMPT_BREATHE, PROC_REF(breath))
return ..()
@@ -103,62 +112,134 @@
if(prob(33))
to_chat(victim, span_danger("You feel a sharp pain in your body as your bones are reforming!"))
- if(regen_ticks_current > regen_ticks_needed)
- if(!victim || !limb)
- qdel(src)
- return
- to_chat(victim, span_green("Your [limb.plaintext_zone] has recovered from its [name]!"))
- remove_wound()
-
/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
-/datum/wound/blunt/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
+/datum/wound/blunt/bone/proc/attack_with_hurt_hand(datum/source, atom/target, proximity)
+ if(!proximity || severity <= WOUND_SEVERITY_MODERATE)
+ return NONE
+ if(limb.body_zone != BODY_ZONE_CHEST && victim.get_active_hand() != limb)
+ return NONE
+ var/weapon = victim.get_active_held_item()
+ if(!weapon && ((victim.istate & ISTATE_HARM)|| !ismob(target)))
+ return NONE
+
+ // With a severe or critical wound, you have a 15% or 30% chance to proc pain on hit
+ if(!prob((severity - 1) * 15))
+ return NONE
+
+ var/painless = !victim.can_feel_pain() || victim.has_status_effect(/datum/status_effect/determined)
+ // And you have a 70% or 50% chance to actually land the blow, respectively
+ if(prob(70 - 20 * (severity - 1)))
+ to_chat(victim, span_userdanger("The fracture in your [limb.plaintext_zone] [painless ? "jostles uncomfortably" : "shoots with pain"] as you strike [target]!"))
+ victim.apply_damage(8, BRUTE, limb)
+ return NONE
+
+ victim.visible_message(
+ span_danger("[victim] weakly strikes [target] with [victim.p_their()] broken [limb.plaintext_zone], recoiling from pain!"),
+ span_userdanger("You [weapon ? "weakly" : "fail"] to strike [target] as the fracture in your [limb.plaintext_zone] [painless ? "jostles uncomfortably" : "lights up in unbearable pain"]!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
+ victim.Stun(0.5 SECONDS)
+ victim.apply_damage(10, BRUTE, limb)
+ victim.pain_emote(pick("wince", "grimace", "flinch"))
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+/datum/wound/blunt/bone/proc/weapon_attack_with_hurt_hand(datum/source, mob/target, mob/user, params)
SIGNAL_HANDLER
- if(victim.get_active_hand() != limb || !(victim.istate & ISTATE_HARM) || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE)
+ return attack_with_hurt_hand(source, target, TRUE)
+
+/datum/wound/blunt/bone/proc/carbon_step(datum/source)
+ SIGNAL_HANDLER
+
+ if(limb.body_zone != BODY_ZONE_L_LEG && limb.body_zone != BODY_ZONE_R_LEG)
+ return
+ if(victim.body_position == LYING_DOWN || victim.buckled) // wheelchair = fine, being pulled = not fine
+ return
+ if(victim.has_status_effect(/datum/status_effect/determined))
return
- // With a severe or critical wound, you have a 15% or 30% chance to proc pain on hit
- if(prob((severity - 1) * 15))
- // And you have a 70% or 50% chance to actually land the blow, respectively
- if(prob(70 - 20 * (severity - 1)))
- to_chat(victim, span_userdanger("The fracture in your [limb.plaintext_zone] shoots with pain as you strike [target]!"))
- limb.receive_damage(brute=rand(1,5))
- else
- victim.visible_message(span_danger("[victim] weakly strikes [target] with [victim.p_their()] broken [limb.plaintext_zone], recoiling from pain!"), \
- span_userdanger("You fail to strike [target] as the fracture in your [limb.plaintext_zone] lights up in unbearable pain!"), vision_distance=COMBAT_MESSAGE_RANGE)
- INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, emote), "scream")
- victim.Stun(0.5 SECONDS)
- limb.receive_damage(brute=rand(3,7))
- return COMPONENT_CANCEL_ATTACK_CHAIN
+ footstep_counter += 1
+ if(footstep_counter >= 8)
+ footstep_counter = 1
+ if((limb.current_gauze ? limb.current_gauze.splint_factor : 1) <= 0.75 || !victim.can_feel_pain())
+ return
+ if(limb.body_zone == SELECT_LEFT_OR_RIGHT(footstep_counter, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ return
+ var/mod = 1
+ switch(victim.m_intent)
+ if(MOVE_INTENT_RUN)
+ mod = 1.5
+ if(MOVE_INTENT_WALK)
+ mod = 1
+ if(MOVE_INTENT_SPRINT)
+ mod = 2
+ if(!prob(severity * mod * 20))
+ return
+ if(SEND_SIGNAL(victim, COMSIG_CARBON_PAINED_STEP, limb, footstep_counter) & STOP_PAIN)
+ return
+
+ to_chat(victim, span_danger("Your [limb.plaintext_zone] [pick("aches", "pangs", "stings")] as you take a step!"))
+ victim.sharp_pain(limb.body_zone, severity * 6, BRUTE, 10 SECONDS)
-/datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus)
- if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE)
+
+/datum/wound/blunt/bone/proc/breath(...)
+ SIGNAL_HANDLER
+
+ if(limb.body_zone != BODY_ZONE_CHEST)
+ return NONE
+ if(!victim.can_feel_pain() || (limb.current_gauze && limb.current_gauze.splint_factor <= 0.75))
+ return NONE
+ var/pain_prob = min(75, 20 * severity * (victim.body_position == LYING_DOWN ? 1.5 : 1))
+ if(!prob(pain_prob))
+ return NONE
+ to_chat(victim, span_danger("You wince as you take a deep breath, feeling the pain in your ribs!"))
+ var/breath_prob = min(50, 15 * severity * (victim.body_position == LYING_DOWN ? 1.2 : 1))
+ if(prob(breath_prob))
+ victim.pain_emote("gasp")
+ . = BREATHE_SKIP_BREATH
+ else
+ victim.pain_emote("wince")
+ . = NONE
+ victim.sharp_pain(BODY_ZONE_CHEST, rand(5, 10), BRUTE, 10 SECONDS)
+ return .
+
+/datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction, damage_source)
+ if(victim.stat == DEAD || wounding_dmg < WOUND_MINIMUM_DAMAGE || wounding_type == WOUND_BURN)
return
- if(ishuman(victim))
- var/mob/living/carbon/human/human_victim = victim
- if(HAS_TRAIT(human_victim, TRAIT_NOBLOOD))
- return
-
- if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
- var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound
- switch(blood_bled)
- if(1 to 6)
- victim.bleed(blood_bled, TRUE)
- if(7 to 13)
- victim.visible_message("A thin stream of blood drips from [victim]'s mouth from the blow to [victim.p_their()] chest.", span_danger("You cough up a bit of blood from the blow to your chest."), vision_distance=COMBAT_MESSAGE_RANGE)
- victim.bleed(blood_bled, TRUE)
- if(14 to 19)
- victim.visible_message("Blood spews out of [victim]'s mouth from the blow to [victim.p_their()] chest!", span_danger("You spit out a string of blood from the blow to your chest!"), vision_distance=COMBAT_MESSAGE_RANGE)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir, COLOR_DARK_RED)
- victim.bleed(blood_bled)
- victim.blood_particles(amount = 1)
- if(20 to INFINITY)
- victim.visible_message(span_danger("Blood spurts out of [victim]'s mouth from the blow to [victim.p_their()] chest!"), span_danger("You choke up on a spray of blood from the blow to your chest!"), vision_distance=COMBAT_MESSAGE_RANGE)
- victim.bleed(blood_bled)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir, COLOR_DARK_RED)
- victim.add_splatter_floor(get_step(victim.loc, victim.dir))
- victim.blood_particles(amount = 3)
+ if(limb.body_zone != BODY_ZONE_CHEST || !limb.can_bleed() || !prob(internal_bleeding_chance))
+ return
+ if(limb.current_gauze?.splint_factor)
+ wounding_dmg *= (1 - limb.current_gauze.splint_factor)
+ var/blood_bled = sqrt(wounding_dmg) * (severity * 0.75) * pick(0.75, 1, 1.25) // melbert todo : push upstream
+ switch(blood_bled)
+ if(7 to 13)
+ victim.visible_message(
+ span_smalldanger("A thin stream of blood drips from [victim]'s mouth from the blow to [victim.p_their()] chest."),
+ span_danger("You cough up a bit of blood from the blow to your chest."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
+ if(14 to 19)
+ victim.visible_message(
+ span_smalldanger("Blood spews out of [victim]'s mouth from the blow to [victim.p_their()] chest!"),
+ span_danger("You spit out a string of blood from the blow to your chest!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
+ if(20 to INFINITY)
+ victim.visible_message(
+ span_danger("Blood spurts out of [victim]'s mouth from the blow to [victim.p_their()] chest!"),
+ span_bolddanger("You choke up on a spray of blood from the blow to your chest!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
+ victim.bleed(blood_bled, TRUE)
+ if(blood_bled >= 14)
+ victim.do_splatter_effect(attack_direction)
+ victim.add_splatter_floor(get_step(victim.loc, victim.dir))
+ victim.blood_particles(amount = 1 * round(blood_bled / 14, 1))
/datum/wound/blunt/bone/modify_desc_before_span(desc)
. = ..()
@@ -181,11 +262,54 @@
return ..()
+/datum/wound_pregen_data/bone/rib_break
+ abstract = FALSE
+ wound_path_to_generate = /datum/wound/blunt/bone/rib_break
+ required_limb_biostate = BIO_BONE
+ threshold_minimum = 20
+ viable_zones = list(BODY_ZONE_CHEST)
+
+/datum/wound/blunt/bone/rib_break
+ // You may notice higher severity bone wounds are fractures on their own
+ // So this one seems a bit out of place, seeing as it's a generic "rib fracture" when more specific ones exist
+ // This is here as the chest has no moderate wound (as it's not jointed, and can't dislocate)
+ // Flavor wise imagine it as one rib being broken rather than multiple
+ name = "Fractured Rib"
+ desc = "One of the patient's ribs has been fractured, causing sharp pain and difficulty breathing."
+ treat_text = "Repair surgically. In the event of an emergency, \
+ one can also apply bone gel and surgical tape to the affected area to fix over time."
+ treat_text_short = "Repair surgically, or apply bone gel and surgical tape."
+ occur_text = "cracks and bruises"
+ examine_desc = ""
+
+ severity = WOUND_SEVERITY_MODERATE
+ threshold_penalty = 20
+ treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel)
+ status_effect_type = /datum/status_effect/wound/blunt/bone/rib_break
+ scar_keyword = "dislocate"
+ internal_bleeding_chance = 25
+ wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR)
+ regen_ticks_needed = 180 // ticks every 2 seconds, 360 seconds, so roughly 6 minutes default
+
+ simple_treat_text = "Bandaging the wound will reduce its impact until treated \
+ surgically or via bone gel and surgical tape."
+ homemade_treat_text = "Bone gel and surgical tape may be applied directly to the wound, \
+ though this is quite difficult for most people to do so individually \
+ unless they've dosed themselves with one or more painkillers."
+
+/datum/wound/blunt/bone/rib_break/get_self_check_description(mob/user)
+ if(locate(/datum/wound/bleed_internal) in limb.wounds)
+ return null
+ return span_warning("It feels tense to the touch.") // same as IB!
+
/// Joint Dislocation (Moderate Blunt)
/datum/wound/blunt/bone/moderate
name = "Joint Dislocation"
+ undiagnosed_name = "Dislocation"
desc = "Patient's limb has been unset from socket, causing pain and reduced motor function."
- treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice."
+ treat_text = "Apply Bonesetter to the affected limb. \
+ Manual relocation by via an aggressive grab and a tight hug to the affected limb may also suffice."
+ treat_text_short = "Apply Bonesetter, or manually relocate the limb."
examine_desc = "is awkwardly janked out of place"
occur_text = "janks violently and becomes unseated"
severity = WOUND_SEVERITY_MODERATE
@@ -197,9 +321,12 @@
status_effect_type = /datum/status_effect/wound/blunt/bone/moderate
scar_keyword = "dislocate"
- simple_desc = "Patient's bone has been dislocated, causing limping or reduced dexterity."
- simple_treat_text = "Bandaging the wound will reduce its impact until treated with a bonesetter. Most commonly, it is treated by aggressively grabbing someone and helpfully wrenching the limb in place, though there's room for malfeasance when doing this."
- homemade_treat_text = "Besides bandaging and wrenching, bone setters can be printed in lathes and utilized on oneself at the cost of great pain. As a last resort, crushing the patient with a firelock has sometimes been noted to fix their dislocated limb."
+ simple_treat_text = "Bandaging the wound will reduce its impact until treated with a bonesetter. \
+ Most commonly, it is treated by aggressively grabbing someone and helpfully wrenching the limb in place, \
+ though there's room for malfeasance when doing this."
+ homemade_treat_text = "Besides bandaging and wrenching, bone setters \
+ can be printed in lathes and utilized on oneself at the cost of great pain. \
+ As a last resort, crushing the patient with a firelock has sometimes been noted to fix their dislocated limb."
/datum/wound_pregen_data/bone/dislocate
abstract = FALSE
@@ -224,6 +351,9 @@
return ..()
+/datum/wound/blunt/bone/moderate/get_self_check_description(mob/user)
+ return span_warning("It feels dislocated!")
+
/// Getting smushed in an airlock/firelock is a last-ditch attempt to try relocating your limb
/datum/wound/blunt/bone/moderate/proc/door_crush()
SIGNAL_HANDLER
@@ -236,7 +366,7 @@
return FALSE
if(user.grab_state == GRAB_PASSIVE)
- to_chat(user, span_warning("You must have [victim] in an aggressive grab to manipulate [victim.p_their()] [lowertext(name)]!"))
+ to_chat(user, span_warning("You must have [victim] in an aggressive grab to manipulate [victim.p_their()] [lowertext(undiagnosed_name || name)]!"))
return TRUE
if(user.grab_state >= GRAB_AGGRESSIVE)
@@ -258,13 +388,13 @@
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.plaintext_zone] back into place!"), span_notice("You snap [victim]'s dislocated [limb.plaintext_zone] back into place!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.plaintext_zone] back into place!"))
- victim.emote("scream")
- limb.receive_damage(brute=20, wound_bonus=CANT_WOUND)
+ user.pain_emote("scream")
+ user.apply_damage(20, BRUTE, limb, wound_bonus = CANT_WOUND)
qdel(src)
else
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [limb.plaintext_zone] around painfully!"), span_danger("You wrench [victim]'s dislocated [limb.plaintext_zone] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [limb.plaintext_zone] around painfully!"))
- limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
+ user.apply_damage(10, BRUTE, limb, wound_bonus = CANT_WOUND)
chiropractice(user)
/// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent
@@ -277,12 +407,12 @@
if(prob(65))
user.visible_message(span_danger("[user] snaps [victim]'s dislocated [limb.plaintext_zone] with a sickening crack!"), span_danger("You snap [victim]'s dislocated [limb.plaintext_zone] with a sickening crack!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.plaintext_zone] with a sickening crack!"))
- victim.emote("scream")
- limb.receive_damage(brute=25, wound_bonus=30)
+ user.pain_emote("scream")
+ user.apply_damage(25, BRUTE, limb, wound_bonus = 30)
else
user.visible_message(span_danger("[user] wrenches [victim]'s dislocated [limb.plaintext_zone] around painfully!"), span_danger("You wrench [victim]'s dislocated [limb.plaintext_zone] around painfully!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] wrenches your dislocated [limb.plaintext_zone] around painfully!"))
- limb.receive_damage(brute=10, wound_bonus=CANT_WOUND)
+ user.apply_damage(10, BRUTE, limb, wound_bonus = CANT_WOUND)
malpractice(user)
@@ -308,7 +438,7 @@
user.visible_message(span_danger("[user] finishes resetting [victim]'s [limb.plaintext_zone]!"), span_nicegreen("You finish resetting [victim]'s [limb.plaintext_zone]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] resets your [limb.plaintext_zone]!"))
- victim.emote("scream")
+ victim.pain_emote("scream")
qdel(src)
/*
@@ -318,7 +448,9 @@
/datum/wound/blunt/bone/severe
name = "Hairline Fracture"
desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality."
- treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation."
+ treat_text = "Repair surgically. In the event of an emergency, an application of bone gel over the affected area will fix over time. \
+ A splint or sling of medical gauze can also be used to prevent the fracture from worsening."
+ treat_text_short = "Repair surgically, or apply bone gel. A splint or gauze sling can also be used."
examine_desc = "appears grotesquely swollen, jagged bumps hinting at chips in the bone"
occur_text = "sprays chips of bone and develops a nasty looking bruise"
@@ -336,9 +468,11 @@
wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR)
regen_ticks_needed = 120 // ticks every 2 seconds, 240 seconds, so roughly 4 minutes default
- simple_desc = "Patient's bone has cracked in the middle, drastically reducing limb functionality."
- simple_treat_text = "Bandaging the wound will reduce its impact until surgically treated with bone gel and surgical tape."
- homemade_treat_text = "Bone gel and surgical tape may be applied directly to the wound, though this is quite difficult for most people to do so individually unless they've dosed themselves with one or more painkillers (Morphine and Miner's Salve have been known to help)"
+ simple_treat_text = "Bandaging the wound will reduce its impact until treated \
+ surgically or via bone gel and surgical tape."
+ homemade_treat_text = "Bone gel and surgical tape may be applied directly to the wound, \
+ though this is quite difficult for most people to do so individually \
+ unless they've dosed themselves with one or more painkillers."
/datum/wound_pregen_data/bone/hairline
@@ -351,8 +485,12 @@
/// Compound Fracture (Critical Blunt)
/datum/wound/blunt/bone/critical
name = "Compound Fracture"
- desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb."
- treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP."
+ undiagnosed_name = "Compound Fracture" // you can tell it's a compound fracture at a glance because of a skin breakage
+ desc = "Patient's bones have suffered multiple fractures, \
+ couped with a break in the skin, causing significant pain and near uselessness of limb."
+ treat_text = "Immediately bind the affected limb with gauze or a splint. Repair surgically. \
+ In the event of an emergency, bone gel and surgical tape can be applied to the affected area to fix over a long period of time."
+ treat_text_short = "Repair surgically, or apply bone gel and surgical tape. A splint or gauze sling should also be used."
examine_desc = "is thoroughly pulped and cracked, exposing shards of bone to open air"
occur_text = "cracks apart, exposing broken bones to open air"
@@ -372,9 +510,12 @@
wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR)
regen_ticks_needed = 240 // ticks every 2 seconds, 480 seconds, so roughly 8 minutes default
- simple_desc = "Patient's bones have effectively shattered completely, causing total immobilization of the limb."
- simple_treat_text = "Bandaging the wound will slightly reduce its impact until surgically treated with bone gel and surgical tape."
- homemade_treat_text = "Although this is extremely difficult and slow to function, Bone gel and surgical tape may be applied directly to the wound, though this is nigh-impossible for most people to do so individually unless they've dosed themselves with one or more painkillers (Morphine and Miner's Salve have been known to help)"
+ simple_treat_text = "Bandaging the wound will slightly reduce its impact until treated \
+ surgically or via bone gel and surgical tape."
+ homemade_treat_text = "Although this is extremely difficult and slow to function, \
+ Bone gel and surgical tape may be applied directly to the wound, \
+ though this is nigh-impossible for most people to do so individually \
+ unless they've dosed themselves with one or more painkillers."
/datum/wound_pregen_data/bone/compound
abstract = FALSE
@@ -406,13 +547,14 @@
return TRUE
I.use(1)
- victim.emote("scream")
+ victim.pain_emote("scream")
if(user != victim)
user.visible_message(span_notice("[user] finishes applying [I] to [victim]'s [limb.plaintext_zone], emitting a fizzing noise!"), span_notice("You finish applying [I] to [victim]'s [limb.plaintext_zone]!"), ignored_mobs=victim)
to_chat(victim, span_userdanger("[user] finishes applying [I] to your [limb.plaintext_zone], and you can feel the bones exploding with pain as they begin melting and reforming!"))
else
if(!HAS_TRAIT(victim, TRAIT_ANALGESIA))
- if(prob(25 + (20 * (severity - 2)) - min(victim.get_drunk_amount(), 10))) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by drunkenness
+ var/painkiller_bonus = 50 * (1 - (victim.pain_controller?.pain_modifier || 1))
+ if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by drunkenness
victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.plaintext_zone], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.plaintext_zone] before you can finish!"))
victim.AdjustUnconscious(5 SECONDS)
return TRUE
@@ -485,21 +627,16 @@
. += "
"
if(severity > WOUND_SEVERITY_MODERATE)
- if((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH))
- if(!gelled)
- . += "Recommended Treatment: Apply bone gel directly to injured limb. Creatures of pure bone don't seem to mind bone gel application nearly as much as fleshed individuals. Surgical tape will also be unnecessary.\n"
- else
- . += "[span_notice("Note: Bone regeneration in effect. Bone is [round(regen_ticks_current*100/regen_ticks_needed)]% regenerated.")]\n"
- else
- if(!gelled)
- . += "Alternative Treatment: Apply bone gel directly to injured limb, then apply surgical tape to begin bone regeneration. This is both excruciatingly painful and slow, and only recommended in dire circumstances.\n"
- else if(!taped)
- . += "[span_notice("Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow, though sleep or laying down will speed recovery.")]\n"
- else
- . += "[span_notice("Note: Bone regeneration in effect. Bone is [round(regen_ticks_current*100/regen_ticks_needed)]% regenerated.")]\n"
+ if(!gelled)
+ . += "Recommended Treatment: \
+ Operate where possible. In the event of emergency, apply bone gel directly to injured limb. \
+ Creatures of pure bone don't seem to mind bone gel application nearly as much as fleshed individuals. \
+ Surgical tape will also be unnecessary.\n"
if(limb.body_zone == BODY_ZONE_HEAD)
- . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired."
- else if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume)
- . += "Ribcage Trauma Detected: Further trauma to chest is likely to worsen internal bleeding until bone is repaired."
+ . += "Cranial Trauma Detected: \
+ Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired."
+ else if(limb.body_zone == BODY_ZONE_CHEST && !HAS_TRAIT(victim, TRAIT_NOBLOOD))
+ . += "Ribcage Trauma Detected: \
+ Further trauma to chest is likely to worsen internal bleeding until bone is repaired."
. += "
"
diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm
index 483b47cce1fa..f5cc3c9a3231 100644
--- a/code/datums/wounds/burns.dm
+++ b/code/datums/wounds/burns.dm
@@ -6,9 +6,19 @@
// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code
/datum/wound/burn
name = "Burn Wound"
+ undiagnosed_name = "Burns"
a_or_from = "from"
sound_effect = 'sound/effects/wounds/sizzle1.ogg'
+/datum/wound/burn/wound_injury(datum/wound/old_wound, attack_direction)
+ if(!old_wound && limb.current_gauze && (wound_flags & ACCEPTS_GAUZE))
+ qdel(limb.remove_gauze())
+ // oops your existing gauze got burned, need a new one now
+ var/obj/effect/decal/cleanable/ash/ash = new(limb.drop_location())
+ ash.desc += " It looks like it used to be some kind of bandage."
+
+ return ..()
+
/datum/wound/burn/flesh
name = "Burn (Flesh) Wound"
a_or_from = "from"
@@ -35,6 +45,11 @@
/// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen)
var/strikes_to_lose_limb = 3
+/datum/wound/burn/flesh/severity_text(simple = FALSE)
+ if(infestation > WOUND_INFECTION_MODERATE)
+ return "Infected, [..()]"
+ return ..()
+
/datum/wound/burn/flesh/handle_process(seconds_per_tick, times_fired)
if (!victim || HAS_TRAIT(victim, TRAIT_STASIS))
@@ -278,7 +293,8 @@
/datum/wound/burn/flesh/moderate
name = "Second Degree Burns"
desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations."
- treat_text = "Recommended application of topical ointment or regenerative mesh to affected region."
+ treat_text = "Apply topical ointment or regenerative mesh to the wound."
+ treat_text_short = "Apply healing aid such as regenerative mesh."
examine_desc = "is badly burned and breaking out in blisters"
occur_text = "breaks out with violent red burns"
severity = WOUND_SEVERITY_MODERATE
@@ -302,7 +318,10 @@
/datum/wound/burn/flesh/severe
name = "Third Degree Burns"
desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity."
- treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment."
+ treat_text = "Swiftly apply healing aids such as Synthflesh or regenerative mesh to the wound. \
+ Disinfect the wound and surgically debride any infected skin, and wrap in clean gauze / use ointment to prevent further infection. \
+ If the limb has locked up, it must be amputated, augmented or treated with cryogenics."
+ treat_text_short = "Apply healing aid such as regenerative mesh or Synthflesh and disinfect / debride."
examine_desc = "appears seriously charred, with aggressive red splotches"
occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns"
severity = WOUND_SEVERITY_SEVERE
@@ -328,7 +347,10 @@
/datum/wound/burn/flesh/critical
name = "Catastrophic Burns"
desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity."
- treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging."
+ treat_text = "Immediately apply healing aids such as Synthflesh or regenerative mesh to the wound. \
+ Disinfect the wound and surgically debride any infected skin, and wrap in clean gauze / use ointment to prevent further infection. \
+ If the limb has locked up, it must be amputated, augmented or treated with cryogenics."
+ treat_text_short = "Apply healing aid such as regenerative mesh or Synthflesh and disinfect / debride."
examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue"
occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess"
severity = WOUND_SEVERITY_CRITICAL
diff --git a/code/datums/wounds/loss.dm b/code/datums/wounds/loss.dm
index bcad804eba68..d8d0aad5e80e 100644
--- a/code/datums/wounds/loss.dm
+++ b/code/datums/wounds/loss.dm
@@ -48,7 +48,7 @@
set_limb(dismembered_part)
second_wind()
log_wound(victim, src)
- if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.blood_volume)
+ if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN)
victim.spray_blood(attack_direction, severity)
victim.blood_particles(amount = rand(3, 6), angle = 0, min_deviation = 0, max_deviation = 360)
dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE, wounding_type = wounding_type)
diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm
index 4deb88361768..0ef431efafd6 100644
--- a/code/datums/wounds/pierce.dm
+++ b/code/datums/wounds/pierce.dm
@@ -3,6 +3,13 @@
Piercing wounds
*/
/datum/wound/pierce
+ undiagnosed_name = "Bleeding Wound"
+
+/datum/wound/pierce/wound_injury(datum/wound/old_wound, attack_direction)
+ if(!old_wound && limb.current_gauze && (wound_flags & ACCEPTS_GAUZE))
+ // oops your existing gauze got penetrated through! need a new one now
+ limb.seep_gauze(initial(limb.current_gauze.absorption_capacity) * 0.8)
+ return ..()
/datum/wound/pierce/bleed
name = "Piercing Wound"
@@ -34,28 +41,45 @@
return ..()
-/datum/wound/pierce/bleed/receive_damage(wounding_type, wounding_dmg, wound_bonus)
- if(QDELETED(victim) || victim.stat == DEAD || (wounding_dmg < 5) || !limb.can_bleed() || !victim.blood_volume || !prob(internal_bleeding_chance + wounding_dmg))
+/datum/wound/pierce/bleed/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction, damage_source)
+ if(victim.stat == DEAD || (wounding_dmg < WOUND_MINIMUM_DAMAGE) || wounding_type == WOUND_BURN)
+ return
+ if(!limb.can_bleed() || !prob(internal_bleeding_chance))
return
+ if(limb.body_zone != BODY_ZONE_CHEST)
+ wounding_dmg *= 0.5
if(limb.current_gauze?.splint_factor)
wounding_dmg *= (1 - limb.current_gauze.splint_factor)
- var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit
+ var/blood_bled = sqrt(wounding_dmg) * internal_bleeding_coefficient * pick(0.75, 1, 1.25, 1.5)
switch(blood_bled)
- if(1 to 6)
- victim.bleed(blood_bled, TRUE)
if(7 to 13)
- victim.visible_message("Blood droplets fly from the hole in [victim]'s [limb.plaintext_zone].", span_danger("You cough up a bit of blood from the blow to your [limb.plaintext_zone]."), vision_distance=COMBAT_MESSAGE_RANGE)
- victim.bleed(blood_bled, TRUE)
+ victim.visible_message(
+ span_smalldanger("Blood droplets fly from the hole in [victim]'s [limb.plaintext_zone]."),
+ span_danger("You cough up a bit of blood from the blow to your [limb.plaintext_zone]."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
if(14 to 19)
- victim.visible_message("A small stream of blood spurts from the hole in [victim]'s [limb.plaintext_zone]!", span_danger("You spit out a string of blood from the blow to your [limb.plaintext_zone]!"), vision_distance=COMBAT_MESSAGE_RANGE)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir, COLOR_DARK_RED)
- victim.bleed(blood_bled)
+ victim.visible_message(
+ span_smalldanger("A small stream of blood spurts from the hole in [victim]'s [limb.plaintext_zone]!"),
+ span_danger("You spit out a string of blood from the blow to your [limb.plaintext_zone]!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
+
if(20 to INFINITY)
- victim.visible_message(span_danger("A spray of blood streams from the gash in [victim]'s [limb.plaintext_zone]!"), span_danger("You choke up on a spray of blood from the blow to your [limb.plaintext_zone]!"), vision_distance=COMBAT_MESSAGE_RANGE)
- victim.bleed(blood_bled)
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir, COLOR_DARK_RED)
+ victim.visible_message(
+ span_danger("A spray of blood streams from the gash in [victim]'s [limb.plaintext_zone]!"),
+ span_bolddanger("You choke up on a spray of blood from the blow to your [limb.plaintext_zone]!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+
+ )
victim.add_splatter_floor(get_step(victim.loc, victim.dir))
+ victim.bleed(blood_bled, TRUE)
+ if(blood_bled >= 14)
+ victim.do_splatter_effect(attack_direction)
+
/datum/wound/pierce/bleed/get_bleed_rate_of_change()
//basically if a species doesn't bleed, the wound is stagnant and will not heal on it's own (nor get worse)
if(!limb.can_bleed())
@@ -67,23 +91,25 @@
return BLOOD_FLOW_STEADY
/datum/wound/pierce/bleed/handle_process(seconds_per_tick, times_fired)
+ . = ..()
if (QDELETED(victim) || HAS_TRAIT(victim, TRAIT_STASIS))
return
set_blood_flow(min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW))
if(limb.can_bleed())
- if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
+ if(!HAS_TRAIT(victim, TRAIT_RESISTCOLD) && victim.get_skin_temperature() < victim.bodytemp_cold_damage_limit)
adjust_blood_flow(-0.1 * seconds_per_tick)
if(SPT_PROB(2.5, seconds_per_tick))
- to_chat(victim, span_notice("You feel the [lowertext(name)] in your [limb.plaintext_zone] firming up from the cold!"))
+ to_chat(victim, span_notice("You feel the [lowertext(undiagnosed_name || name)] in your [limb.plaintext_zone] firming up from the cold!"))
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
adjust_blood_flow(0.25 * seconds_per_tick) // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
if(limb.current_gauze)
- adjust_blood_flow(-limb.current_gauze.absorption_rate * gauzed_clot_rate * seconds_per_tick)
- limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate * seconds_per_tick
+ var/amt_blocking = limb.current_gauze.absorption_rate * seconds_per_tick
+ adjust_blood_flow(-1 * amt_blocking * gauzed_clot_rate)
+ limb.seep_gauze(amt_blocking)
if(blood_flow <= 0)
qdel(src)
@@ -153,14 +179,15 @@
else
user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]..."))
+ playsound(user, 'sound/surgery/cautery1.ogg', 75, TRUE)
if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists))))
return TRUE
+ playsound(user, 'sound/surgery/cautery2.ogg', 75, TRUE)
+
var/bleeding_wording = (!limb.can_bleed() ? "holes" : "bleeding")
user.visible_message(span_green("[user] cauterizes some of the [bleeding_wording] on [victim]."), span_green("You cauterize some of the [bleeding_wording] on [victim]."))
- limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
- if(prob(30))
- victim.emote("scream")
+ victim.apply_damage(2 + severity, BURN, limb, wound_bonus = CANT_WOUND)
var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
adjust_blood_flow(-blood_cauterized)
@@ -176,21 +203,16 @@
wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED
-/datum/wound_pregen_data/flesh_pierce
- abstract = TRUE
-
- required_limb_biostate = (BIO_FLESH)
- required_wounding_types = list(WOUND_PIERCE)
-
- wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED
-
/datum/wound/pierce/get_limb_examine_description()
return span_warning("The flesh on this limb appears badly perforated.")
/datum/wound/pierce/bleed/moderate
name = "Minor Skin Breakage"
desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area."
- treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack!
+ treat_text = "Apply bandaging or suturing to the wound, make use of blood clotting agents, \
+ cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \
+ Follow with food and a rest period."
+ treat_text_short = "Apply bandaging or suturing."
examine_desc = "has a small, circular hole, gently bleeding"
occur_text = "spurts out a thin stream of blood"
sound_effect = 'sound/effects/wounds/pierce1.ogg'
@@ -221,7 +243,10 @@
/datum/wound/pierce/bleed/severe
name = "Open Puncture"
desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability."
- treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work."
+ treat_text = "Swiftly apply bandaging or suturing to the wound, make use of blood clotting agents or saline-glucose, \
+ cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \
+ Follow with iron supplements and a rest period."
+ treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization."
examine_desc = "is pierced clear through, with bits of tissue obscuring the open hole"
occur_text = "looses a violent spray of blood, revealing a pierced wound"
sound_effect = 'sound/effects/wounds/pierce2.ogg'
@@ -251,7 +276,10 @@
/datum/wound/pierce/bleed/critical
name = "Ruptured Cavity"
desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs."
- treat_text = "Surgical repair of puncture wound, followed by supervised resanguination."
+ treat_text = "Immediately apply bandaging or suturing to the wound, make use of blood clotting agents or saline-glucose, \
+ cauterization, or in extreme circumstances, exposure to extreme cold or vaccuum. \
+ Follow with supervised resanguination."
+ treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization."
examine_desc = "is ripped clear through, barely held together by exposed bone"
occur_text = "blasts apart, sending chunks of viscera flying in all directions"
sound_effect = 'sound/effects/wounds/pierce3.ogg'
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index b0edc7f25074..ea2145c2db21 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -5,8 +5,15 @@
/datum/wound/slash
name = "Slashing (Cut) Wound"
+ undiagnosed_name = "Cut"
sound_effect = 'sound/weapons/slice.ogg'
+/datum/wound/slash/wound_injury(datum/wound/old_wound, attack_direction)
+ if(!old_wound && limb.current_gauze && (wound_flags & ACCEPTS_GAUZE))
+ // oops your existing gauze got cut through! need a new one now
+ limb.seep_gauze(initial(limb.current_gauze.absorption_capacity) * 0.8)
+ return ..()
+
/datum/wound_pregen_data/flesh_slash
abstract = TRUE
@@ -134,7 +141,7 @@
return BLOOD_FLOW_INCREASING
/datum/wound/slash/flesh/handle_process(seconds_per_tick, times_fired)
-
+ . = ..()
if (!victim || HAS_TRAIT(victim, TRAIT_STASIS))
return
@@ -317,7 +324,9 @@
/datum/wound/slash/flesh/moderate
name = "Rough Abrasion"
desc = "Patient's skin has been badly scraped, generating moderate blood loss."
- treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest."
+ treat_text = "Apply bandaging or suturing to the wound. \
+ Follow up with food and a rest period."
+ treat_text_short = "Apply bandaging or suturing."
examine_desc = "has an open cut"
occur_text = "is cut open, slowly leaking blood"
sound_effect = 'sound/effects/wounds/blood1.ogg'
@@ -346,7 +355,10 @@
/datum/wound/slash/flesh/severe
name = "Open Laceration"
desc = "Patient's skin is ripped clean open, allowing significant blood loss."
- treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery."
+ treat_text = "Swiftly apply bandaging or suturing to the wound, \
+ or make use of blood clotting agents or cauterization. \
+ Follow up with iron supplements or saline-glucose and a rest period."
+ treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization."
examine_desc = "has a severe cut"
occur_text = "is ripped open, veins spurting blood"
sound_effect = 'sound/effects/wounds/blood2.ogg'
@@ -376,7 +388,10 @@
/datum/wound/slash/flesh/critical
name = "Weeping Avulsion"
desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention."
- treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination."
+ treat_text = "Immediately apply bandaging or suturing to the wound, \
+ or make use of blood clotting agents or cauterization. \
+ Follow up supervised resanguination."
+ treat_text_short = "Apply bandaging, suturing, clotting agents, or cauterization."
examine_desc = "is carved down to the bone, spraying blood wildly"
occur_text = "is torn open, spraying blood wildly"
sound_effect = 'sound/effects/wounds/blood3.ogg'
diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm
index ea9b8994bc78..43422bf2fcba 100644
--- a/code/game/atom_defense.dm
+++ b/code/game/atom_defense.dm
@@ -58,6 +58,11 @@
SHOULD_BE_PURE(TRUE)
return atom_integrity
+/// Similar to get_integrity, but returns the percentage as [0-1] instead.
+/atom/proc/get_integrity_percentage()
+ SHOULD_BE_PURE(TRUE)
+ return round(atom_integrity / max_integrity, 0.01)
+
///returns the damage value of the attack after processing the atom's various armor protections
/atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0)
if(!uses_integrity)
@@ -131,6 +136,10 @@
/// A cut-out proc for [/atom/proc/bullet_act] so living mobs can have their own armor behavior checks without causing issues with needing their own on_hit call
/atom/proc/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent)
- if(uses_integrity)
- return clamp(PENETRATE_ARMOUR(get_armor_rating(impacting_projectile.armor_flag), impacting_projectile.armour_penetration), 0, 100)
- return 0
+ if(!uses_integrity)
+ return 0
+
+ . = clamp(PENETRATE_ARMOUR(get_armor_rating(impacting_projectile.armor_flag), impacting_projectile.armour_penetration), 0, 100)
+ if(impacting_projectile.grazing)
+ . += 50
+ return .
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 95ba030e198a..d95c5ad012af 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1042,20 +1042,19 @@
///returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
/mob/living/proc/get_blood_dna_list()
- if(get_blood_id() != /datum/reagent/blood)
- return
- return list("ANIMAL DNA" = "Y-")
+ var/datum/blood_type/blood = get_blood_type()
+ if(!isnull(blood))
+ return list("UNKNOWN DNA" = blood.type)
+ return null
///Get the mobs dna list
/mob/living/carbon/get_blood_dna_list()
- if(get_blood_id() != /datum/reagent/blood)
- return
- var/list/blood_dna = list()
- if(dna)
- blood_dna[dna.unique_enzymes] = dna.blood_type
- else
- blood_dna["UNKNOWN DNA"] = "X*"
- return blood_dna
+ if(isnull(dna)) // Xenos
+ return ..()
+ var/datum/blood_type/blood = get_blood_type()
+ if(isnull(blood)) // Skeletons?
+ return null
+ return list("[dna.unique_enzymes]" = blood.type)
/mob/living/carbon/alien/get_blood_dna_list()
return list("UNKNOWN DNA" = "X*")
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 932444e63a8f..bd28bed8a6dd 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -1229,7 +1229,7 @@
"UE"=scanner_occupant.dna.unique_enzymes,
"UF"=scanner_occupant.dna.unique_features,
"name"=scanner_occupant.real_name,
- "blood_type"=scanner_occupant.dna.blood_type)
+ "blood_type"="[GLOB.blood_types[scanner_occupant.dna.human_blood_type]]")
return
@@ -1719,7 +1719,7 @@
scanner_occupant.real_name = buffer_slot["name"]
scanner_occupant.name = buffer_slot["name"]
scanner_occupant.dna.unique_enzymes = buffer_slot["UE"]
- scanner_occupant.dna.blood_type = buffer_slot["blood_type"]
+ scanner_occupant.dna.human_blood_type = blood_name_to_blood_type(buffer_slot["blood_type"])
scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase)
scanner_occupant.domutcheck()
return TRUE
@@ -1737,7 +1737,7 @@
scanner_occupant.real_name = buffer_slot["name"]
scanner_occupant.name = buffer_slot["name"]
scanner_occupant.dna.unique_enzymes = buffer_slot["UE"]
- scanner_occupant.dna.blood_type = buffer_slot["blood_type"]
+ scanner_occupant.dna.human_blood_type = blood_name_to_blood_type(buffer_slot["blood_type"])
scanner_occupant.apply_status_effect(/datum/status_effect/genetic_damage, damage_increase)
scanner_occupant.domutcheck()
return TRUE
diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm
index 093c96bf57ec..83692a8af26a 100644
--- a/code/game/machinery/computer/operating_computer.dm
+++ b/code/game/machinery/computer/operating_computer.dm
@@ -138,12 +138,7 @@
data["patient"]["health"] = patient.health
// check here to see if the patient has standard blood reagent, or special blood (like how ethereals bleed liquid electricity) to show the proper name in the computer
- var/blood_id = patient.get_blood_id()
- if(blood_id == /datum/reagent/blood)
- data["patient"]["blood_type"] = patient.dna?.blood_type
- else
- var/datum/reagent/special_blood = GLOB.chemical_reagents_list[blood_id]
- data["patient"]["blood_type"] = special_blood ? special_blood.name : blood_id
+ data["patient"]["blood_type"] = "[patient.get_blood_type() || "None"]"
data["patient"]["maxHealth"] = patient.maxHealth
data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm
index 53c3256dc217..2e18e22ee460 100644
--- a/code/game/machinery/computer/records/medical.dm
+++ b/code/game/machinery/computer/records/medical.dm
@@ -140,7 +140,7 @@
return FALSE
target.age = 18
- target.blood_type = pick(list("A+", "A-", "B+", "B-", "O+", "O-", "AB+", "AB-"))
+ target.blood_type = "[GLOB.blood_types[random_human_blood_type()]]"
target.dna_string = "Unknown"
target.gender = "Unknown"
target.major_disabilities = ""
diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
index 74d028d22c6f..1b915b22653d 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm
@@ -37,6 +37,9 @@
icon = 'icons/obj/medical/organs/fly_organs.dmi'
say_mod = "buzzes"
taste_sensitivity = 25 // you eat vomit, this is a mercy
+ liked_foodtypes = GROSS | GORE // nasty ass
+ disliked_foodtypes = NONE
+ toxic_foodtypes = NONE // these fucks eat vomit, i am sure they can handle drinking bleach or whatever too
modifies_speech = TRUE
languages_native = list(/datum/language/buzzwords)
diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
index ff9a96b7f397..5d088da77889 100644
--- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
@@ -43,51 +43,13 @@
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = RAT_COLORS
/// Multiplier of [physiology.hunger_mod].
- var/hunger_mod = 10
+ hunger_modifier = 10
/obj/item/organ/internal/stomach/rat/Initialize(mapload)
. = ..()
AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat)
AddElement(/datum/element/noticable_organ, "mouth is drooling excessively.", BODY_ZONE_PRECISE_MOUTH)
-/obj/item/organ/internal/stomach/rat/on_insert(mob/living/carbon/receiver)
- . = ..()
- if(!ishuman(receiver))
- return
- var/mob/living/carbon/human/human_holder = receiver
- if(!human_holder.can_mutate())
- return
- var/datum/species/species = human_holder.dna.species
- //mmm, cheese. doesn't especially like anything else
- species.liked_food = DAIRY
- //but a rat can eat anything without issue
- species.disliked_food = NONE
- species.toxic_food = NONE
- if(human_holder.physiology)
- human_holder.physiology.hunger_mod *= hunger_mod
- RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
-
-/obj/item/organ/internal/stomach/rat/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
- SIGNAL_HANDLER
- new_species.liked_food = DAIRY
- new_species.disliked_food = NONE
- new_species.toxic_food = NONE
-
-/obj/item/organ/internal/stomach/rat/on_remove(mob/living/carbon/stomach_owner)
- . = ..()
- if(!ishuman(stomach_owner))
- return
- var/mob/living/carbon/human/human_holder = stomach_owner
- if(!human_holder.can_mutate())
- return
- var/datum/species/species = human_holder.dna.species
- species.liked_food = initial(species.liked_food)
- species.disliked_food = initial(species.disliked_food)
- species.toxic_food = initial(species.toxic_food)
- if(human_holder.physiology)
- human_holder.physiology.hunger_mod /= hunger_mod
- UnregisterSignal(stomach_owner, COMSIG_SPECIES_GAIN)
-
/// makes you smaller, walk over tables, and take 1.5x damage
/obj/item/organ/internal/heart/rat
name = "mutated rat-heart"
@@ -126,13 +88,15 @@
/obj/item/organ/internal/tongue/rat
name = "mutated rat-tongue"
desc = "Rat DNA infused into what was once a normal tongue."
- say_mod = "squeaks"
- modifies_speech = TRUE
-
icon = 'icons/obj/medical/organs/infuser_organs.dmi'
icon_state = "tongue"
+ say_mod = "squeaks"
+ modifies_speech = TRUE
greyscale_config = /datum/greyscale_config/mutant_organ
greyscale_colors = RAT_COLORS
+ liked_foodtypes = DAIRY //mmm, cheese. doesn't especially like anything else
+ disliked_foodtypes = NONE //but a rat can eat anything without issue
+ toxic_foodtypes = NONE
/obj/item/organ/internal/tongue/rat/Initialize(mapload)
. = ..()
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index f92fd03cd04a..c41ca6bfdf72 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -211,7 +211,7 @@
var/bleed_status = "Patient is not currently bleeding."
var/blood_status = " Patient either has no blood, or does not require it to function."
var/blood_percent = round((patient.blood_volume / BLOOD_VOLUME_NORMAL)*100)
- var/blood_type = patient.dna.blood_type
+ var/blood_type = "[patient.get_blood_type() || "None"]"
var/blood_warning = " "
for(var/thing in patient.diseases) //Disease Information
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 79141c5598da..682b8ad66f40 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -466,7 +466,7 @@ DEFINE_BITFIELD(turret_flags, list(
else if(iscarbon(A))
var/mob/living/carbon/C = A
//If not emagged, only target carbons that can use items
- if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE)))
+ if(mode != TURRET_LETHAL && (!(C.mobility_flags & MOBILITY_USE) || HAS_TRAIT(C, TRAIT_INCAPACITATED)))
continue
//If emagged, target all but dead carbons
diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
index 781fd0d5a471..e9378797509b 100644
--- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
+++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
@@ -30,8 +30,7 @@
var/new_colour = pick(/datum/slime_color/red, /datum/slime_color/orange)
var/mob/living/basic/slime/pyro = new(tile, new_colour)
ADD_TRAIT(pyro, TRAIT_SLIME_RABID, "pyro")
- pyro.maximum_survivable_temperature = INFINITY
- pyro.apply_temperature_requirements()
+ pyro.bodytemp_heat_damage_limit = INFINITY
var/mob/chosen_one = SSpolling.poll_ghosts_for_target(check_jobban = ROLE_SENTIENCE, poll_time = 10 SECONDS, checked_target = pyro, ignore_category = POLL_IGNORE_PYROSLIME, alert_pic = pyro, role_name_text = "pyroclastic anomaly slime")
if(isnull(chosen_one))
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 260354cb7cac..35f3d3c872a0 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -53,6 +53,8 @@
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
+ if(bloodiness)
+ update_appearance()
/obj/effect/decal/cleanable/Destroy()
var/turf/T = get_turf(src)
@@ -97,7 +99,7 @@
//This is on /cleanable because fuck this ancient mess
/obj/effect/decal/cleanable/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
- if(iscarbon(AM) && blood_state && bloodiness >= 40)
+ if(iscarbon(AM) && bloodiness >= 40)
SEND_SIGNAL(AM, COMSIG_STEP_ON_BLOOD, src)
update_appearance()
@@ -112,27 +114,35 @@
* Checks if this decal is a valid decal that can be blood crawled in.
*/
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
- if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return bloodiness
-
- return FALSE
-
-/**
- * Gets the color associated with the any blood present on this decal. If there is no blood, returns null.
- */
-/obj/effect/decal/cleanable/proc/get_blood_color()
- switch(blood_state)
- if(BLOOD_STATE_HUMAN)
- return rgb(149, 10, 10)
- if(BLOOD_STATE_XENO)
- return rgb(43, 186, 0)
- if(BLOOD_STATE_OIL)
- return rgb(22, 22, 22)
-
- return null
+ return decal_reagent == /datum/reagent/blood
/obj/effect/decal/cleanable/proc/handle_merge_decal(obj/effect/decal/cleanable/merger)
if(!merger)
return
if(merger.reagents && reagents)
reagents.trans_to(merger, reagents.total_volume)
+
+/// Increments or decrements the bloodiness value
+/obj/effect/decal/cleanable/proc/adjust_bloodiness(by_amount)
+ if(by_amount == 0)
+ return FALSE
+ if(QDELING(src))
+ return FALSE
+
+ bloodiness = clamp((bloodiness + by_amount), 0, BLOOD_POOL_MAX)
+ update_appearance()
+ return TRUE
+
+/// Called before attempting to scoop up reagents from this decal to only load reagents when necessary
+/obj/effect/decal/cleanable/proc/lazy_init_reagents()
+ return
+
+#ifdef TESTING
+/obj/effect/decal/cleanable/update_overlays()
+ . = ..()
+ if(bloodiness)
+ var/mutable_appearance/blah_text = new()
+ blah_text.maptext = MAPTEXT_TINY_UNICODE("[bloodiness]")
+ blah_text.appearance_flags |= (KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM)
+ . += blah_text
+#endif
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index 6da917e8aab9..8083249d742d 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -7,13 +7,14 @@
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
bloodiness = BLOOD_AMOUNT_PER_DECAL
- blood_state = BLOOD_STATE_XENO
beauty = -250
clean_type = CLEAN_TYPE_BLOOD
+ decal_reagent = /datum/blood_type/xenomorph::reagent_type
+ reagent_amount = 15
/obj/effect/decal/cleanable/xenoblood/Initialize(mapload)
. = ..()
- add_blood_DNA(list("UNKNOWN DNA" = "X*"))
+ add_blood_DNA(list("UNKNOWN DNA" = /datum/blood_type/xenomorph))
/obj/effect/decal/cleanable/xenoblood/xsplatter
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
@@ -100,10 +101,6 @@
icon_state = "xgiblarvatorso"
random_icon_states = list("xgiblarvahead", "xgiblarvatorso")
-/obj/effect/decal/cleanable/blood/xtracks
+/obj/effect/decal/cleanable/xenoblood/xtracks
icon_state = "xtracks"
random_icon_states = null
-
-/obj/effect/decal/cleanable/blood/xtracks/Initialize(mapload)
- . = ..()
- add_blood_DNA(list("Unknown DNA" = "X*"))
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 08715536511e..0d8f4e26bb9d 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -1,6 +1,6 @@
/obj/effect/decal/cleanable/blood
name = "blood"
- desc = "It's red and gooey. Perhaps it's the chef's cooking?"
+ desc = "It's weird and gooey. Perhaps it's the chef's cooking?"
icon = 'icons/effects/blood.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
@@ -8,64 +8,156 @@
bloodiness = BLOOD_AMOUNT_PER_DECAL
beauty = -100
clean_type = CLEAN_TYPE_BLOOD
- var/should_dry = TRUE
- var/dryname = "dried blood" //when the blood lasts long enough, it becomes dry and gets a new name
- var/drydesc = "Looks like it's been here a while. Eew." //as above
- var/drytime = 0
+ decal_reagent = /datum/reagent/blood
+ bloodiness = BLOOD_AMOUNT_PER_DECAL
+ color = COLOR_BLOOD
+ appearance_flags = parent_type::appearance_flags | KEEP_TOGETHER
+ /// Can this blood dry out?
+ var/can_dry = TRUE
+ /// Is this blood dried out?
+ var/dried = FALSE
+
+ /// The "base name" of the blood, IE the "pool of" in "pool of blood"
+ var/base_name = "pool of"
+ /// When dried, this is prefixed to the name
+ var/dry_prefix = "dried"
+ /// When dried, this becomes the desc of the blood
+ var/dry_desc = "Looks like it's been here a while. Eew."
+
+ /// How long it takes to dry out
+ var/drying_time = 5 MINUTES
+ /// The process to drying out, recorded in deciseconds
+ var/drying_progress = 0
+ /// Color matrix applied to dried blood via filter to make it look dried
+ var/static/list/blood_dry_filter_matrix = list(
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1,
+ -0.5, -0.75, -0.75, 0,
+ )
var/count = 0
var/footprint_sprite = null
+ var/glows = FALSE
+ var/handles_unique = FALSE
-/obj/effect/decal/cleanable/blood/Initialize(mapload)
+/obj/effect/decal/cleanable/blood/Initialize(mapload, blood_color = COLOR_BLOOD)
. = ..()
- if(!should_dry)
- return
- if(bloodiness)
- start_drying()
- else
- dry()
-
-/obj/effect/decal/cleanable/blood/process()
- if(world.time > drytime)
- dry()
+ START_PROCESSING(SSblood_drying, src)
+ if(color && can_dry && !dried)
+ update_blood_drying_effect()
/obj/effect/decal/cleanable/blood/Destroy()
- STOP_PROCESSING(SSobj, src)
+ STOP_PROCESSING(SSblood_drying, src)
return ..()
-/obj/effect/decal/cleanable/blood/proc/get_timer()
- drytime = world.time + 3 MINUTES
+/obj/effect/decal/cleanable/blood/on_entered(datum/source, atom/movable/AM)
+ if(dried)
+ return
+ return ..()
-/obj/effect/decal/cleanable/blood/proc/start_drying()
- get_timer()
- START_PROCESSING(SSobj, src)
+#define DRY_FILTER_KEY "dry_effect"
+
+/obj/effect/decal/cleanable/blood/update_overlays()
+ . = ..()
+ if(glows && !handles_unique)
+ . += emissive_appearance(icon, icon_state, src)
+
+/obj/effect/decal/cleanable/blood/proc/update_blood_drying_effect()
+ if(!can_dry)
+ remove_filter(DRY_FILTER_KEY) // I GUESS
+ return
+
+ var/existing_filter = get_filter(DRY_FILTER_KEY)
+ if(dried)
+ if(existing_filter)
+ animate(existing_filter) // just stop existing animations and force it to the end state
+ return
+ add_filter(DRY_FILTER_KEY, 2, color_matrix_filter(blood_dry_filter_matrix))
+ return
+
+ if(existing_filter)
+ remove_filter(DRY_FILTER_KEY)
+
+ add_filter(DRY_FILTER_KEY, 2, color_matrix_filter())
+ transition_filter(DRY_FILTER_KEY, color_matrix_filter(blood_dry_filter_matrix), drying_time - drying_progress)
+
+#undef DRY_FILTER_KEY
+
+/obj/effect/decal/cleanable/blood/proc/get_blood_string()
+ var/list/all_dna = GET_ATOM_BLOOD_DNA(src)
+ var/list/all_blood_names = list()
+ for(var/dna_sample in all_dna)
+ var/datum/blood_type/blood = GLOB.blood_types[all_dna[dna_sample]]
+ if(!blood)
+ all_blood_names |= "blood"
+ continue
+ all_blood_names |= lowertext(initial(blood.reagent_type.name))
+ return english_list(all_blood_names, nothing_text = "blood")
+
+/obj/effect/decal/cleanable/blood/process(seconds_per_tick)
+ if(dried || !can_dry)
+ return PROCESS_KILL
+
+ adjust_bloodiness(-0.4 * BLOOD_PER_UNIT_MODIFIER * seconds_per_tick)
+ drying_progress += (seconds_per_tick * 1 SECONDS)
+ if(drying_progress >= drying_time + SSblood_drying.wait) // Do it next tick when we're done
+ dry()
+
+/obj/effect/decal/cleanable/blood/update_name(updates)
+ . = ..()
+ name = initial(name)
+ if(base_name)
+ name = "[base_name] [get_blood_string()]"
+ if(dried && dry_prefix)
+ name = "[dry_prefix] [name]"
+
+/obj/effect/decal/cleanable/blood/update_desc(updates)
+ . = ..()
+ desc = initial(desc)
+ if(dried && dry_desc)
+ desc = dry_desc
///This is what actually "dries" the blood. Returns true if it's all out of blood to dry, and false otherwise
/obj/effect/decal/cleanable/blood/proc/dry()
- if(bloodiness > 20)
- bloodiness -= BLOOD_AMOUNT_PER_DECAL
- get_timer()
+ dried = TRUE
+ reagents?.clear_reagents()
+ update_appearance()
+ update_blood_drying_effect()
+ STOP_PROCESSING(SSblood_drying, src)
+ return TRUE
+
+/obj/effect/decal/cleanable/blood/lazy_init_reagents()
+ var/list/all_dna = GET_ATOM_BLOOD_DNA(src)
+ var/list/reagents_to_add = list()
+ for(var/dna_sample in all_dna)
+ var/datum/blood_type/blood = GLOB.blood_types[all_dna[dna_sample]]
+ reagents_to_add += blood.reagent_type
+
+ var/num_reagents = length(reagents_to_add)
+ for(var/reagent_type in reagents_to_add)
+ reagents.add_reagent(reagent_type, round((bloodiness * 0.2 * BLOOD_PER_UNIT_MODIFIER) / num_reagents, CHEMICAL_VOLUME_ROUNDING))
+
+/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/merger)
+ if(merger.dried) // New blood will lie on dry blood
return FALSE
- else
- name = dryname
- desc = drydesc
- bloodiness = 0
- color = COLOR_GRAY //not all blood splatters have their own sprites... It still looks pretty nice
- STOP_PROCESSING(SSobj, src)
- return TRUE
-
-/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
- C.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
- if (bloodiness)
- C.bloodiness = min((C.bloodiness + bloodiness), BLOOD_AMOUNT_PER_DECAL)
return ..()
+/obj/effect/decal/cleanable/blood/handle_merge_decal(obj/effect/decal/cleanable/blood/merger)
+ . = ..()
+ merger.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ merger.adjust_bloodiness(bloodiness)
+ merger.drying_progress -= (bloodiness * BLOOD_PER_UNIT_MODIFIER) // goes negative = takes longer to dry
+ merger.update_blood_drying_effect()
+
/obj/effect/decal/cleanable/blood/old
bloodiness = 0
icon_state = "floor1-old"
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
- add_blood_DNA(list("Non-human DNA" = random_blood_type())) // Needs to happen before ..()
+ add_blood_DNA(list("UNKNOWN DNA" = random_human_blood_type()))
. = ..()
+ dry()
/obj/effect/decal/cleanable/blood/splatter
icon_state = "gibbl1"
@@ -83,19 +175,18 @@
desc = "They look like tracks left by wheels."
random_icon_states = null
beauty = -50
- dryname = "dried tracks"
- drydesc = "Some old bloody tracks left by wheels. Machines are evil, perhaps."
+ base_name = ""
+ dry_desc = "Some old bloody tracks left by wheels. Machines are evil, perhaps."
-/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
- name = "blood"
- icon = 'icons/effects/blood.dmi'
+/obj/effect/decal/cleanable/blood/trail_holder
+ name = "trail of blood"
desc = "Your instincts say you shouldn't be following these."
beauty = -50
+ icon_state = null
+ random_icon_states = null
+ base_name = "trail of"
var/list/existing_dirs = list()
-/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
- return TRUE
-
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
desc = "They look bloody and gruesome."
@@ -107,8 +198,9 @@
mergeable_decal = FALSE
turf_loc_check = FALSE
- dryname = "rotting gibs"
- drydesc = "They look bloody and gruesome while some terrible smell fills the air."
+ base_name = ""
+ dry_prefix = "rotting"
+ dry_desc = "They look bloody and gruesome while some terrible smell fills the air."
decal_reagent = /datum/reagent/consumable/liquidgibs
reagent_amount = 5
///Information about the diseases our streaking spawns
@@ -122,6 +214,10 @@
LAZYNULL(streak_diseases)
return ..()
+
+/obj/effect/decal/cleanable/blood/gibs/get_blood_string()
+ return ""
+
/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
return FALSE //Never fail to place us
@@ -203,29 +299,25 @@
desc = "Space Jesus, why didn't anyone clean this up? They smell terrible."
icon_state = "gib1-old"
bloodiness = 0
- should_dry = FALSE
- dryname = "old rotting gibs"
- drydesc = "Space Jesus, why didn't anyone clean this up? They smell terrible."
+ dry_prefix = ""
+ dry_desc = ""
/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases)
+ add_blood_DNA(list("UNKNOWN DNA" = random_human_blood_type()))
. = ..()
- setDir(pick(1,2,4,8))
- add_blood_DNA(list("Non-human DNA" = random_blood_type()))
+ setDir(pick(GLOB.cardinals))
AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10)
dry()
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
- desc = "It's red."
+ desc = "A spattering."
icon_state = "drip5" //using drip5 since the others tend to blend in with pipes & wires.
random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
- bloodiness = 0
- var/drips = 1
- dryname = "drips of blood"
- drydesc = "It's red."
-
-/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
- return TRUE
+ bloodiness = BLOOD_AMOUNT_PER_DECAL * 0.2 * BLOOD_PER_UNIT_MODIFIER
+ base_name = "drips of"
+ dry_desc = "A dried spattering."
+ drying_time = 1 MINUTES
//BLOODY FOOTPRINTS
@@ -235,7 +327,10 @@
icon = 'icons/effects/footprints.dmi'
icon_state = "blood_shoes_enter"
random_icon_states = null
- blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
+ bloodiness = 0 // set based on the bloodiness of the foot
+ base_name = ""
+ dry_desc = "HMM... SOMEONE WAS HERE!"
+ handles_unique = TRUE
var/entered_dirs = 0
var/exited_dirs = 0
@@ -245,9 +340,6 @@
/// List of species that have made footprints here.
var/list/species_types = list()
- dryname = "dried footprints"
- drydesc = "HMM... SOMEONE WAS HERE!"
-
/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, footprint_sprite)
src.footprint_sprite = footprint_sprite
. = ..()
@@ -256,6 +348,10 @@
entered_dirs |= dir //Keep the same appearance as in the map editor
update_appearance(mapload ? (ALL) : (UPDATE_NAME | UPDATE_DESC))
+
+/obj/effect/decal/cleanable/blood/footprints/get_blood_string()
+ return ""
+
//Rotate all of the footprint directions too
/obj/effect/decal/cleanable/blood/footprints/setDir(newdir)
if(dir == newdir)
@@ -276,24 +372,13 @@
update_appearance()
return ..()
-/obj/effect/decal/cleanable/blood/footprints/update_name(updates)
- switch(footprint_sprite)
- if(FOOTPRINT_SPRITE_CLAWS)
- name = "clawprints"
- if(FOOTPRINT_SPRITE_SHOES)
- name = "footprints"
- if(FOOTPRINT_SPRITE_PAWS)
- name = "pawprints"
- dryname = "dried [name]"
- return ..()
-
/obj/effect/decal/cleanable/blood/footprints/update_desc(updates)
desc = "WHOSE [uppertext(name)] ARE THESE?"
return ..()
/obj/effect/decal/cleanable/blood/footprints/update_icon()
. = ..()
- alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / (BLOOD_ITEM_MAX / 2), 255)
+ alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / ((BLOOD_ITEM_MAX * BLOOD_PER_UNIT_MODIFIER) / 2), 255)
//Cache of bloody footprint images
//Key:
@@ -303,17 +388,23 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
/obj/effect/decal/cleanable/blood/footprints/update_overlays()
. = ..()
+ var/icon_state_to_use = "blood"
+ if(SPECIES_MONKEY in species_types)
+ icon_state_to_use += "paw"
+ else if(BODYPART_ID_DIGITIGRADE in species_types)
+ icon_state_to_use += "claw"
+
for(var/Ddir in GLOB.cardinals)
if(entered_dirs & Ddir)
- var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"]
+ var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[icon_state_to_use]-[Ddir]"]
if(!bloodstep_overlay)
- GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_enter", dir = Ddir)
+ GLOB.bloody_footprints_cache["entered-[icon_state_to_use]-[Ddir]"] = bloodstep_overlay = image(icon, "[icon_state_to_use]1", dir = Ddir)
. += bloodstep_overlay
if(exited_dirs & Ddir)
- var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"]
+ var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[icon_state_to_use]-[Ddir]"]
if(!bloodstep_overlay)
- GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_exit", dir = Ddir)
+ GLOB.bloody_footprints_cache["exited-[icon_state_to_use]-[Ddir]"] = bloodstep_overlay = image(icon, "[icon_state_to_use]2", dir = Ddir)
. += bloodstep_overlay
@@ -340,21 +431,15 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
else
. += "[icon2html('icons/mob/species/human/bodyparts.dmi', user, "[species]_l_leg")] Some [species] feet."
-/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/blood/blood_decal)
- if(blood_state != blood_decal.blood_state || footprint_sprite != blood_decal.footprint_sprite) //We only replace footprints of the same type as us
- return FALSE
- return ..()
-
-/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
- if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return TRUE
- return FALSE
-
/obj/effect/decal/cleanable/blood/hitsplatter
name = "blood splatter"
pass_flags = PASSTABLE | PASSGRILLE
icon_state = "hitsplatter1"
random_icon_states = list("hitsplatter1", "hitsplatter2", "hitsplatter3")
+
+ base_name = ""
+ can_dry = FALSE // No point
+
/// The turf we just came from, so we can back up when we hit a wall
var/turf/prev_loc
/// The cached info about the blood
@@ -368,8 +453,10 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
/// Type of squirt decals we should try to create when moving
var/line_type = /obj/effect/decal/cleanable/blood/line
-/obj/effect/decal/cleanable/blood/hitsplatter/Initialize(mapload, splatter_strength)
+/obj/effect/decal/cleanable/blood/hitsplatter/Initialize(mapload, splatter_strength, blood_color = COLOR_BLOOD)
. = ..()
+ color = blood_color
+ blood_dna_info = GET_ATOM_BLOOD_DNA(src)
prev_loc = loc //Just so we are sure prev_loc exists
if(splatter_strength)
src.splatter_strength = splatter_strength
@@ -377,6 +464,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
/obj/effect/decal/cleanable/blood/hitsplatter/Destroy()
if(isturf(loc) && !skip)
playsound(src, 'sound/effects/wounds/splatter.ogg', 60, TRUE, -1)
+ if(!length(blood_dna_info))
+ blood_dna_info = GET_ATOM_BLOOD_DNA(src)
if(blood_dna_info)
loc.add_blood_DNA(blood_dna_info)
return ..()
@@ -419,9 +508,11 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
if(line_type && isturf(loc))
var/obj/effect/decal/cleanable/line = locate(line_type) in loc
if(line)
+ line.color = color
line.add_blood_DNA(blood_dna_info)
else
line = new line_type(loc, get_dir(prev_loc, loc))
+ line.color = color
line.add_blood_DNA(blood_dna_info)
line.alpha = 0
animate(line, alpha = initial(line.alpha), time = 2)
@@ -454,6 +545,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(prev_loc)
final_splatter.pixel_x = (dir == EAST ? 32 : (dir == WEST ? -32 : 0))
final_splatter.pixel_y = (dir == NORTH ? 32 : (dir == SOUTH ? -32 : 0))
+ final_splatter.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ final_splatter.add_blood_DNA(blood_dna_info)
else // This will only happen if prev_loc is not even a turf, which is highly unlikely.
abstract_move(bumped_atom)
qdel(src)
@@ -463,6 +556,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
if(!the_window.fulltile)
return
var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new
+ final_splatter.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ final_splatter.add_blood_DNA(blood_dna_info)
final_splatter.forceMove(the_window)
the_window.vis_contents += final_splatter
the_window.bloodied = TRUE
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index d3af1e2846b0..4ba60142f57e 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -7,7 +7,6 @@
icon_state = "gib1"
layer = LOW_OBJ_LAYER
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
- blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
beauty = -50
@@ -16,6 +15,7 @@
/obj/effect/decal/cleanable/robot_debris/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
+ add_blood_DNA(list("UNKNOWN DNA" = /datum/blood_type/oil))
/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions, mapload=FALSE)
var/direction = pick(directions)
@@ -76,29 +76,16 @@
icon = 'icons/mob/silicon/robots.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- blood_state = BLOOD_STATE_OIL
- bloodiness = BLOOD_AMOUNT_PER_DECAL
+ bloodiness = BLOOD_AMOUNT_PER_DECAL * 2
beauty = -100
clean_type = CLEAN_TYPE_BLOOD
decal_reagent = /datum/reagent/fuel/oil
reagent_amount = 30
-/obj/effect/decal/cleanable/oil/attackby(obj/item/I, mob/living/user)
- var/attacked_by_hot_thing = I.get_temperature()
- if(attacked_by_hot_thing)
- user.visible_message(span_warning("[user] tries to ignite [src] with [I]!"), span_warning("You try to ignite [src] with [I]."))
- log_combat(user, src, (attacked_by_hot_thing < 480) ? "tried to ignite" : "ignited", I)
- fire_act(attacked_by_hot_thing)
- return
- return ..()
-
-/obj/effect/decal/cleanable/oil/fire_act(exposed_temperature, exposed_volume)
- if(exposed_temperature < 480)
- return
- visible_message(span_danger("[src] catches fire!"))
- var/turf/T = get_turf(src)
- qdel(src)
- new /obj/effect/hotspot(T)
+/obj/effect/decal/cleanable/oil/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ AddElement(/datum/element/easy_ignite)
+ add_blood_DNA(list("UNKNOWN DNA" = /datum/blood_type/oil))
/obj/effect/decal/cleanable/oil/streak
icon_state = "streak1"
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 86dd2bac70bf..20ca27dbdd16 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -39,7 +39,7 @@
dna_to_add = temp_mob.get_blood_dna_list()
qdel(temp_mob)
else
- dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it.
+ dna_to_add = list("UNKNOWN DNA" = random_human_blood_type()) //else, generate a random bloodtype for it.
for(var/i in 1 to gibtypes.len)
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index d03cfea3f178..168a3f9b0883 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -73,9 +73,6 @@
target_pixel_y = 8
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
-/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
- splatter_type = "xsplatter"
-
/obj/effect/temp_visual/dir_setting/speedbike_trail
name = "speedbike trails"
icon_state = "ion_fade"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index ce8694270287..cd2ee2766e41 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -110,13 +110,11 @@
///Whether spessmen with an ID with an age below AGE_MINOR (20 by default) can buy this item
var/age_restricted = FALSE
- ///flags which determine which body parts are protected from heat. [See here][HEAD]
- var/heat_protection = 0
- ///flags which determine which body parts are protected from cold. [See here][HEAD]
- var/cold_protection = 0
- ///Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags
+ /// Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage.
+ /// Keep at null to disable protection.
var/max_heat_protection_temperature
- ///Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags
+ /// Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage.
+ /// Keep at null to disable protection.
var/min_cold_protection_temperature
///list of /datum/action's that this item has.
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index e65fcf02d60d..5ea51789a3c3 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -937,12 +937,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/mob/living/carbon/human/human_user = user
if(!istype(human_user) || HAS_TRAIT(human_user, TRAIT_RESISTHEAT) || HAS_TRAIT(human_user, TRAIT_RESISTHEATHANDS))
hand_protected = TRUE
- else if(!istype(human_user.gloves, /obj/item/clothing/gloves))
- hand_protected = FALSE
else
- var/obj/item/clothing/gloves/gloves = human_user.gloves
- if(gloves.max_heat_protection_temperature)
- hand_protected = (gloves.max_heat_protection_temperature > 360)
+ hand_protected = human_user.gloves?.max_heat_protection_temperature > 360
if(hand_protected || prob(75))
user.visible_message(
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index f5ef78a60c98..2ac05c111337 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -152,22 +152,10 @@
if(!isturf(loc) || isspaceturf(loc) || !direction)
return //No magical movement! Trust me, this bad boy can do things like leap out of pipes if you're not careful
- if(can_move < world.time)
- var/amount
- switch(user.bodytemperature)
- if(300 to INFINITY)
- amount = 10
- if(295 to 300)
- amount = 13
- if(280 to 295)
- amount = 16
- if(260 to 280)
- amount = 20
- else
- amount = 25
-
- can_move = world.time + amount
- try_step_multiz(direction)
+ if(can_move >= world.time)
+ return
+ can_move = world.time + 2 + (user.cached_multiplicative_slowdown * 4) // Fake movement speed calculating based on the mob's move speed
+ try_step_multiz(direction)
return
/obj/effect/dummy/chameleon/Destroy()
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index 1d18aefec183..0113ff4d393b 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -270,51 +270,62 @@
if(ishuman(target))
var/mob/living/carbon/human/humantarget = target
- // Organ damage, missing organs
- if(humantarget.organs && humantarget.organs.len)
- var/render = FALSE
- var/toReport = "Organs:\
-
\
-
Organ:
\
- [advanced ? "
Dmg
" : ""]\
-
Status
"
-
- for(var/obj/item/organ/organ as anything in humantarget.organs)
- var/status = organ.get_status_text()
- if (status != "")
+ var/render = FALSE
+ var/toReport = "Organ status:\
+ \
+