diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm
new file mode 100644
index 00000000000..fe7878295d5
--- /dev/null
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_outpost31.dmm
@@ -0,0 +1,4310 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ah" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/window/spawner/directional/east,
+/obj/structure/table,
+/obj/item/bikehorn/rubberducky,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"ai" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"an" = (
+/obj/effect/decal/cleanable/blood/old,
+/mob/living/basic/fleshblob,
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"aq" = (
+/turf/closed/wall,
+/area/ruin/outpost31/recroom)
+"au" = (
+/obj/machinery/light/small/dim/directional/east,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"aM" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"aP" = (
+/obj/machinery/vending/boozeomat{
+ onstation = 0
+ },
+/obj/effect/mapping_helpers/broken_machine,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"aV" = (
+/turf/closed/wall,
+/area/ruin/outpost31/kitchendiningroom)
+"bb" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"bg" = (
+/obj/structure/table/wood,
+/obj/item/storage/box/drinkingglasses,
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"bp" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/airalarm/directional/east,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"by" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/barricade/wooden/crude/snow{
+ opacity = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/outpost31/commander_room)
+"bE" = (
+/obj/structure/cable,
+/obj/effect/mob_spawn/corpse/human/damaged{
+ husk = 1;
+ burn_damage = 1000;
+ brute_damage = 0
+ },
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/machinery/light_switch/directional/south,
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"bW" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/machinery/status_display{
+ pixel_x = 32;
+ current_mode = 3;
+ current_picture = "biohazard"
+ },
+/turf/open/floor/iron/white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"bX" = (
+/obj/structure/sink/kitchen/directional/west,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"cd" = (
+/obj/item/reagent_containers/blood{
+ pixel_x = 4;
+ pixel_y = 0
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/sign/poster/random/directional/north,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"ce" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"cf" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/frame/machine/secured,
+/obj/effect/decal/cleanable/glass,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"ch" = (
+/obj/structure/closet/crate/freezer,
+/obj/item/reagent_containers/blood,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/smooth_corner,
+/area/ruin/outpost31/medical)
+"ck" = (
+/obj/structure/closet,
+/obj/item/tank/internals/plasma/full,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"cm" = (
+/obj/machinery/power/rtg/advanced{
+ power_gen = 25000
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/west,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"cp" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"cu" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"cw" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"cy" = (
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/medical)
+"cz" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/window/spawner/directional/east,
+/obj/structure/table,
+/obj/effect/spawner/random/maintenance/no_decals,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"db" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken/directional/east,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"dm" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/obj/machinery/status_display{
+ pixel_x = -32;
+ current_mode = 3;
+ current_picture = "biohazard"
+ },
+/turf/open/floor/iron/white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"dt" = (
+/obj/effect/puzzle_poddoor_open{
+ id = "thingbosslootroom";
+ queue_id = "thingbosslootroom"
+ },
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/lootroom)
+"dH" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"dK" = (
+/obj/structure/table,
+/obj/structure/bedsheetbin,
+/obj/machinery/duct,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"dP" = (
+/obj/structure/closet/emcloset,
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"dV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/rglass/fifty,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"dW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"dZ" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/white/end{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"eb" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"eg" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full{
+ pixel_x = -3;
+ pixel_y = 16
+ },
+/obj/item/cigarette/cigar/premium,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"ep" = (
+/obj/structure/table/reinforced,
+/obj/item/flashlight/lamp,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"eu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"eI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"eL" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/door/window/left/directional/west,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"eS" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"eT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/white{
+ dir = 9
+ },
+/obj/effect/spawner/random/entertainment/arcade,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"fb" = (
+/obj/machinery/shower/directional/west,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"fC" = (
+/obj/structure/chair/stool/directional/south,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"fH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/recroom)
+"fI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"fL" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"fM" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"fW" = (
+/obj/structure/chair,
+/turf/open/floor/iron/textured_half{
+ dir = 1
+ },
+/area/ruin/outpost31)
+"ge" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"gi" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"gu" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"gC" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/organ/brain/cybernetic/ai,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"gM" = (
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"gO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"gZ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"he" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/medical)
+"hi" = (
+/obj/item/ammo_casing/spent,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/underground/explored)
+"ho" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/flamethrower,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"hs" = (
+/obj/structure/table,
+/obj/machinery/processor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light_switch/directional/north,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"ht" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/storage/toolbox/electrical,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"hD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"hN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"hT" = (
+/obj/machinery/light/warm/directional/east,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"ih" = (
+/obj/structure/closet{
+ name = "winter gear closet"
+ },
+/obj/item/clothing/suit/hooded/wintercoat/eva,
+/obj/item/clothing/shoes/winterboots/ice_boots/eva,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"in" = (
+/mob/living/basic/boss/thing{
+ dir = 1
+ },
+/turf/open/indestructible/vault{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"iA" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"iH" = (
+/obj/structure/window/spawner/directional/west,
+/obj/machinery/shower/directional/north,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"jl" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/paper,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"jv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"jL" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"jM" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/iron/textured_half{
+ dir = 1
+ },
+/area/ruin/outpost31)
+"jN" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"jP" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"kh" = (
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"ko" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_casing/spent,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"ks" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"kA" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/recroom)
+"kF" = (
+/obj/effect/mob_spawn/corpse{
+ mob_type = /mob/living/basic/mining/wolf
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"kP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"kX" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/mob/living/basic/fleshblob,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"lr" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/paperwork{
+ desc = "Whatever nerd stuff they did down here.";
+ name = "map scraps";
+ pixel_x = -5;
+ pixel_y = 15
+ },
+/obj/item/pen/fountain{
+ pixel_x = -5;
+ pixel_y = -8
+ },
+/obj/item/reagent_containers/cup/glass/mug{
+ pixel_x = 9;
+ pixel_y = 0
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"lz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"lF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"lM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"lO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"lR" = (
+/obj/structure/table/wood,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"lT" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/barricade/wooden/crude/snow{
+ opacity = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/outpost31/kitchendiningroom)
+"lU" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"lW" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/underground/explored)
+"me" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/snack,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"mq" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"mO" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"mU" = (
+/obj/machinery/door/airlock/public/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/dark,
+/area/ruin/outpost31)
+"mV" = (
+/obj/machinery/light/warm/directional/north,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"mW" = (
+/turf/open/floor/circuit/red/off{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"ne" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/commander_room)
+"nj" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/puzzle/keycardpad/directional/north{
+ late_initialize_pop = 1;
+ id = "thingbossentry"
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"no" = (
+/obj/structure/bed/pod{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"nr" = (
+/obj/item/kirbyplants/random/dead,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"nH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/storage/toolbox/mechanical,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"nJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light_switch/directional/north,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"nP" = (
+/obj/structure/cable,
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/lab)
+"nT" = (
+/obj/structure/fence/cut,
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"nV" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"oa" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/recroom)
+"ob" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"og" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/maintenance/no_decals,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"oj" = (
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"op" = (
+/obj/machinery/shower/directional/north,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"ov" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/barricade/wooden/crude/snow{
+ opacity = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"oz" = (
+/obj/machinery/door/airlock,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"oF" = (
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"oJ" = (
+/obj/structure/chair/stool/directional/east,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"oN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"oV" = (
+/obj/structure/table/wood,
+/obj/item/storage/cans/sixbeer,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"pa" = (
+/obj/item/keycard{
+ puzzle_id = "thingbossentry";
+ name = "lab keycard";
+ color = "blue"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"pd" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/machinery/coffeemaker,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"pe" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"pj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage,
+/obj/structure/table,
+/obj/machinery/light/warm/dim/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"pw" = (
+/obj/structure/closet/cabinet,
+/obj/machinery/light/small/broken/directional/east,
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"py" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"pQ" = (
+/obj/item/knife,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"qa" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/food_or_drink/booze,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"qt" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31a"
+ },
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"qz" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/kennel)
+"qH" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"qI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/item/flashlight/lantern,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"qK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"rb" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/ruin/outpost31)
+"rf" = (
+/obj/machinery/washing_machine,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"rk" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"rm" = (
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"ru" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"rx" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"rB" = (
+/obj/machinery/door/airlock/grunge,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"rO" = (
+/obj/machinery/door/airlock/public/glass,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"sd" = (
+/obj/structure/table/wood,
+/obj/machinery/chem_dispenser/drinks{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/broken_machine,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"sg" = (
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"si" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken/directional/east,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"sk" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/storage/toolbox/mechanical,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"sm" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/emcloset,
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"sB" = (
+/obj/structure/window/spawner/directional/west,
+/obj/machinery/shower/directional/south,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"sF" = (
+/obj/structure/table/wood,
+/obj/item/storage/fancy/cigarettes/cigars/cohiba,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"sK" = (
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"sL" = (
+/obj/structure/window/spawner/directional/east,
+/obj/machinery/shower/directional/north,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"sP" = (
+/turf/closed/wall,
+/area/ruin/outpost31/kennel)
+"sQ" = (
+/obj/machinery/door/airlock,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"tj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"to" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"tx" = (
+/obj/structure/closet/crate/bin,
+/obj/machinery/light/broken/directional/west,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"tC" = (
+/obj/structure/closet/secure_closet/freezer/fridge/preopen,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"tG" = (
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"tJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_casing/spent,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"tS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_casing/spent,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"tV" = (
+/obj/machinery/door/airlock/public/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/dark,
+/area/ruin/outpost31)
+"tX" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/poster/random/directional/west,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"tZ" = (
+/obj/structure/table,
+/obj/item/storage/medkit,
+/turf/open/floor/iron/white/smooth_half{
+ dir = 1
+ },
+/area/ruin/outpost31/medical)
+"ub" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"uj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"uA" = (
+/obj/structure/cable,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"uB" = (
+/turf/closed/mineral/random/snow/underground,
+/area/template_noop)
+"uI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"uN" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31a"
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"uR" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"vn" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"vU" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"vX" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"wb" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"wc" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"wp" = (
+/obj/structure/fence/door/opened{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"wq" = (
+/obj/structure/cable,
+/obj/machinery/light/small/broken/directional/east,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"wr" = (
+/obj/machinery/smartfridge/petri/preloaded,
+/turf/open/floor/iron/white/smooth_half{
+ dir = 1
+ },
+/area/ruin/outpost31/medical)
+"wt" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"wu" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/structure/girder,
+/obj/structure/barricade/wooden,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"wx" = (
+/obj/structure/tank_holder/extinguisher,
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"wE" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/pen,
+/obj/item/pen/blue{
+ pixel_x = -8;
+ pixel_y = -3
+ },
+/obj/item/pen/red{
+ pixel_x = -1;
+ pixel_y = 9
+ },
+/obj/item/pen/fourcolor{
+ pixel_x = 9;
+ pixel_y = 8
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"wO" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"wP" = (
+/obj/structure/fence/cut/large,
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"xc" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/radiomap)
+"xk" = (
+/turf/closed/wall,
+/area/ruin/outpost31/medical)
+"xo" = (
+/obj/effect/gibspawner/generic/animal{
+ virusProb = 0
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"xP" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31B"
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"yo" = (
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/lootroom)
+"yp" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"yx" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"yO" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"yQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"yW" = (
+/obj/structure/sign/warning/biohazard,
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/lab)
+"za" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"zd" = (
+/obj/machinery/door/airlock/grunge,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"ze" = (
+/obj/structure/table/optable,
+/obj/machinery/light/broken/directional/south,
+/obj/effect/decal/cleanable/blood/old,
+/obj/item/bodypart/arm/left{
+ pixel_x = 4;
+ pixel_y = 2
+ },
+/obj/item/bodypart/arm/right{
+ pixel_x = -4;
+ pixel_y = 1
+ },
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"zu" = (
+/obj/effect/light_emitter{
+ set_cap = 1;
+ set_luminosity = 10
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"zv" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/crewquarters)
+"zw" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/blue{
+ dir = 8
+ },
+/turf/open/floor/iron/white/textured_large,
+/area/ruin/outpost31/crewquarters)
+"zy" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"zz" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"zF" = (
+/obj/machinery/duct,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"zN" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"zO" = (
+/obj/effect/turf_decal/siding/white,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"zY" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/welded,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31d"
+ },
+/obj/structure/barricade/wooden/crude/snow{
+ opacity = 1
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"Ae" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/cigarette{
+ onstation = 0
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"Ai" = (
+/obj/item/kirbyplants/random/dead,
+/turf/open/floor/iron/white/smooth_corner{
+ dir = 1
+ },
+/area/ruin/outpost31/medical)
+"Al" = (
+/obj/machinery/light/broken/directional/east,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Au" = (
+/obj/machinery/iv_drip,
+/obj/structure/bed/medical/anchored,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"Aw" = (
+/obj/structure/closet/secure_closet{
+ req_access = list("noopen")
+ },
+/obj/item/ammo_box/c9mm,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"AE" = (
+/obj/machinery/door/airlock/grunge,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"AG" = (
+/obj/machinery/door/airlock/grunge,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"AR" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/paper_bin,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"Bb" = (
+/obj/machinery/light/warm/directional/south,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Bc" = (
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Bg" = (
+/obj/machinery/light/broken/directional/east,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"Bj" = (
+/obj/structure/cable,
+/obj/structure/grille/broken,
+/obj/item/shard/plastitanium,
+/obj/item/shard/plastitanium,
+/turf/open/indestructible/plating{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Bu" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/sign/poster/random/directional/east,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Bz" = (
+/obj/structure/tank_dispenser/oxygen{
+ oxygentanks = 5
+ },
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"BI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"BM" = (
+/obj/structure/table,
+/turf/open/floor/iron/white/smooth_half{
+ dir = 1
+ },
+/area/ruin/outpost31/medical)
+"BP" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"BQ" = (
+/obj/structure/flora/rock/icy/style_random,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/underground/explored)
+"BU" = (
+/obj/machinery/shower/directional/south,
+/obj/structure/curtain,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"BZ" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"Ca" = (
+/obj/structure/closet/emcloset,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"Cb" = (
+/obj/machinery/light/warm/directional/south,
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Cc" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/crowbar,
+/turf/open/floor/pod,
+/area/ruin/outpost31)
+"Ce" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/duct,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"CA" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/window/spawner/directional/west,
+/obj/structure/table,
+/obj/item/broken_bottle,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"CC" = (
+/obj/effect/turf_decal/siding/white/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"CM" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/effect/spawner/random/maintenance/no_decals/two,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"CS" = (
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/recroom)
+"Db" = (
+/obj/machinery/door/airlock/grunge,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"Dg" = (
+/obj/structure/cable,
+/obj/structure/grille/broken,
+/obj/item/shard/plastitanium,
+/obj/item/shard/plastitanium,
+/obj/effect/mob_spawn/corpse/human/damaged{
+ husk = 1
+ },
+/turf/open/indestructible/plating{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Dz" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/climbing_hook,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"DF" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/warm/directional/west,
+/obj/structure/table,
+/obj/item/mod/module/flamethrower,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"DM" = (
+/obj/structure/table/wood,
+/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"DU" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/siding/blue/end{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/white/textured_large,
+/area/ruin/outpost31/crewquarters)
+"DW" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"Ea" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/paperwork{
+ desc = "Whatever nerd stuff they did down here.";
+ name = "map scraps"
+ },
+/obj/item/paperwork{
+ desc = "Whatever nerd stuff they did down here.";
+ name = "map scraps";
+ pixel_x = 17;
+ pixel_y = 5
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"Ei" = (
+/obj/structure/bed/pod,
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"EH" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"EL" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"ES" = (
+/obj/item/kirbyplants/random/dead,
+/obj/effect/turf_decal/siding/white{
+ dir = 10
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"EY" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Fb" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/obj/structure/barricade/wooden/crude,
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"Fo" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Fu" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage,
+/obj/structure/table,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"FH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/poster/random/directional/north,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"FK" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"FP" = (
+/obj/structure/chair/stool/directional/north,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"FQ" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/siding/blue/end,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/effect/mapping_helpers/airlock/welded,
+/turf/open/floor/iron/white/textured_large,
+/area/ruin/outpost31/crewquarters)
+"FW" = (
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"FY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Gg" = (
+/turf/closed/wall,
+/area/ruin/outpost31)
+"Gh" = (
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"Gz" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31/kitchendiningroom)
+"GR" = (
+/obj/structure/closet/firecloset,
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"GW" = (
+/obj/machinery/puzzle/keycardpad/directional/west{
+ id = "thingbosslootroom";
+ late_initialize_pop = 1
+ },
+/obj/item/paper{
+ can_become_message_in_bottle = 0;
+ default_raw_text = "Research was promising. We managed to stream an artificial intelligence into an organic host via this brain. Too bad it needs all robotic organs because apparently the human biology hates not having a properly functional nervous system."
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"Hk" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Hm" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/caution/stand_clear,
+/obj/structure/aggro_gate,
+/turf/open/floor/iron/dark{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Hq" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Ht" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"HC" = (
+/obj/machinery/atmospherics/components/unary/airlock_pump{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"HF" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"HL" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"HP" = (
+/obj/machinery/computer/operating{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/broken_machine,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"HW" = (
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Id" = (
+/obj/structure/table,
+/obj/item/food/icecreamsandwich,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"Ie" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31d"
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Ij" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/food/waffles,
+/obj/machinery/microwave,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"Il" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/item/plate/large,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Io" = (
+/obj/structure/chair/stool/bar/directional/east,
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"ID" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/table,
+/obj/item/paperwork{
+ desc = "A map of the outpost.";
+ name = "outpost map"
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"IG" = (
+/turf/open/floor/catwalk_floor/iron_white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"IL" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"IT" = (
+/obj/structure/sign/poster/random/directional/west,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Jd" = (
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31/lab)
+"Jl" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"Jq" = (
+/obj/effect/spawner/random/entertainment/arcade,
+/obj/effect/turf_decal/siding/white{
+ dir = 9
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"JG" = (
+/obj/machinery/door/poddoor/preopen,
+/obj/machinery/door/airlock/vault,
+/obj/structure/fans/tiny/invisible,
+/obj/structure/puzzle_blockade{
+ id = "thingbossentry"
+ },
+/turf/open/floor/iron/white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"JP" = (
+/obj/structure/table,
+/obj/item/storage/medkit/fire,
+/turf/open/floor/iron/white/smooth_corner{
+ dir = 4
+ },
+/area/ruin/outpost31/medical)
+"Kh" = (
+/obj/structure/thing_boss_phase_depleter,
+/turf/open/floor/circuit/red/off{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"KU" = (
+/obj/effect/spawner/random/decoration/glowstick/on,
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"KW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"Lf" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"Lk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"Lx" = (
+/turf/closed/wall,
+/area/ruin/outpost31/commander_room)
+"Ly" = (
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"Lz" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/broken/directional/south,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"LA" = (
+/turf/closed/wall,
+/area/ruin/outpost31/crewquarters)
+"LQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"LW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Ma" = (
+/obj/structure/table/reinforced,
+/obj/item/stack/spacecash/c500,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Mf" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Ml" = (
+/obj/machinery/door/airlock/public/glass,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Mn" = (
+/obj/structure/chair/stool/directional/north,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Ms" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken/directional/south,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Mw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_casing/spent,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"ME" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"MK" = (
+/obj/structure/tank_dispenser/oxygen{
+ oxygentanks = 5
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"MO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"MQ" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"MT" = (
+/obj/structure/tank_dispenser/oxygen{
+ oxygentanks = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"MW" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/item/storage/card_binder,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Nc" = (
+/obj/structure/sink/directional/south,
+/obj/structure/mirror/directional/north{
+ pixel_y = 33
+ },
+/mob/living/basic/fleshblob,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"Nk" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/welded,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31c"
+ },
+/obj/structure/barricade/wooden/crude/snow{
+ opacity = 1
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"Nl" = (
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Nw" = (
+/obj/structure/reagent_dispensers/plumbed,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"NP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Ob" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Oe" = (
+/obj/structure/sink/kitchen/directional/west,
+/obj/structure/mirror/directional/east,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/recroom)
+"Ol" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Oo" = (
+/obj/structure/chair/stool/directional/south,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Or" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass/filled/cola{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/recroom)
+"Ov" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31)
+"Oz" = (
+/obj/item/reagent_containers/blood{
+ pixel_x = -5;
+ pixel_y = 5
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"OW" = (
+/obj/machinery/griddle,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Pb" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_casing/spent,
+/obj/item/ammo_casing/spent,
+/obj/item/ammo_casing/spent,
+/obj/item/ammo_casing/spent,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"Pd" = (
+/obj/machinery/door/airlock/public/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/open/floor/iron/dark,
+/area/ruin/outpost31)
+"Pw" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"PG" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"PR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"PS" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/table,
+/obj/item/storage/fancy/egg_box,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"PT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"PW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/girder,
+/obj/structure/barricade/wooden,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Qj" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/spawner/random/maintenance/no_decals,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"Qy" = (
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"QA" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/chair/office,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"QU" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Rc" = (
+/turf/closed/wall,
+/area/ruin/outpost31/radiomap)
+"Rf" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/effect/spawner/random/food_or_drink/any_snack_or_beverage,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"Rm" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"RD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"RK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/obj/item/crowbar,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"RL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"RO" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"RQ" = (
+/obj/machinery/door/poddoor{
+ id = "thingbosslootroom";
+ name = "Storage Room 2"
+ },
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"RR" = (
+/obj/structure/closet/cabinet,
+/obj/machinery/light/small/broken/directional/west,
+/turf/open/floor/wood,
+/area/ruin/outpost31/crewquarters)
+"Sa" = (
+/obj/machinery/atmospherics/components/tank/air/layer2,
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"Sg" = (
+/turf/closed/wall/r_wall,
+/area/ruin/outpost31)
+"Sm" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/filingcabinet/chestdrawer,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Sq" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Sy" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/sign/poster/random/directional/west,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"SB" = (
+/obj/item/surgery_tray/deployed,
+/obj/effect/decal/cleanable/blood/old,
+/obj/machinery/defibrillator_mount/loaded{
+ pixel_y = -32
+ },
+/turf/open/floor/iron/white/smooth_half,
+/area/ruin/outpost31/medical)
+"SJ" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31c"
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"SN" = (
+/obj/machinery/atmospherics/components/unary/passive_vent/layer4{
+ dir = 8
+ },
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"SW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"Td" = (
+/obj/machinery/light_switch/directional/south,
+/turf/open/floor/carpet/green,
+/area/ruin/outpost31/commander_room)
+"Tm" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Tq" = (
+/obj/machinery/power/rtg/advanced{
+ power_gen = 25000
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"Tr" = (
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/obj/structure/table,
+/obj/item/cigbutt/cigarbutt{
+ pixel_x = 6;
+ pixel_y = 0
+ },
+/obj/item/trash/chips{
+ pixel_x = -5;
+ pixel_y = 7
+ },
+/turf/open/floor/iron/textured_half{
+ dir = 1
+ },
+/area/ruin/outpost31)
+"Tv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"Tx" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/girder,
+/obj/structure/barricade/wooden,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"TP" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/underground/explored)
+"TX" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/item/food/waffles,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Ui" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/gibspawner/generic/animal{
+ virusProb = 0
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"Uv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"Uy" = (
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"UA" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/ruin/outpost31/medical)
+"UH" = (
+/obj/structure/cable,
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"UI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"Vc" = (
+/obj/machinery/light/broken/directional/north,
+/obj/item/storage/cans,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Vd" = (
+/turf/closed/indestructible/reinforced,
+/area/ruin/outpost31)
+"Vg" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/siding/white,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/recroom)
+"Vm" = (
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"Vx" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Vz" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken/directional/south,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"VA" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/effect/decal/cleanable/glass,
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"VG" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"VK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/vending_refill/cola,
+/obj/item/vending_refill/cigarette,
+/obj/item/vending_refill/boozeomat,
+/turf/open/floor/plating,
+/area/ruin/outpost31/lootroom)
+"VM" = (
+/obj/machinery/light/small/dim/directional/west,
+/obj/structure/closet{
+ name = "winter gear closet"
+ },
+/obj/item/clothing/shoes/winterboots/ice_boots/eva,
+/obj/item/clothing/suit/hooded/wintercoat/eva,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"VR" = (
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron/textured_half,
+/area/ruin/outpost31)
+"VU" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/white/herringbone{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"VV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/outpost31/kennel)
+"Wc" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken/directional/south,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"Wd" = (
+/obj/machinery/door/airlock/external/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31B"
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"Wu" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/kitchendiningroom)
+"Wy" = (
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/underground/explored)
+"WD" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "o31c"
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/outpost31)
+"WQ" = (
+/turf/template_noop,
+/area/template_noop)
+"Xa" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Xf" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable,
+/obj/machinery/oven/range,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/kitchen/small,
+/area/ruin/outpost31/kitchendiningroom)
+"Xk" = (
+/obj/machinery/light_switch/directional/north,
+/obj/structure/tank_holder/extinguisher,
+/turf/open/floor/iron/white/smooth_corner{
+ dir = 8
+ },
+/area/ruin/outpost31/medical)
+"XD" = (
+/obj/effect/turf_decal/tile/purple/opposingcorners,
+/turf/open/floor/iron/white{
+ initial_gas_mix = "o2=14;n2=30;TEMP=293.15"
+ },
+/area/ruin/outpost31/lab)
+"XI" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/iron,
+/area/ruin/outpost31)
+"XJ" = (
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 6
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"XN" = (
+/turf/open/floor/wood,
+/area/ruin/outpost31/kennel)
+"XQ" = (
+/obj/machinery/shower/directional/south,
+/obj/structure/curtain,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/fluff/shower_drain,
+/obj/item/food/candy_trash{
+ desc = "Tooth fillings.";
+ name = "tooth fillings"
+ },
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"Yh" = (
+/obj/structure/chair/stool/bar/directional/east,
+/obj/effect/turf_decal/siding/white{
+ dir = 5
+ },
+/turf/open/floor/iron/cafeteria,
+/area/ruin/outpost31/recroom)
+"Yk" = (
+/obj/effect/turf_decal/siding/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/blue{
+ dir = 8
+ },
+/obj/machinery/duct,
+/turf/open/floor/iron/white/textured_large,
+/area/ruin/outpost31/crewquarters)
+"Yo" = (
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/underground/explored)
+"YG" = (
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"YK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron,
+/area/ruin/outpost31)
+"YT" = (
+/obj/structure/closet/preopen{
+ name = "winter gear closet"
+ },
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/pod/light,
+/area/ruin/outpost31)
+"Zq" = (
+/obj/structure/window/spawner/directional/east,
+/obj/structure/table,
+/obj/item/soap/homemade,
+/turf/open/floor/iron/freezer,
+/area/ruin/outpost31/crewquarters)
+"ZA" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+"ZB" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"ZL" = (
+/obj/structure/bed,
+/obj/item/bedsheet,
+/obj/structure/curtain,
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"ZM" = (
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/item/grenade/iedcasing/spawned,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"ZT" = (
+/turf/open/floor/wood,
+/area/ruin/outpost31/commander_room)
+"ZX" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/brown/opposingcorners,
+/obj/structure/filingcabinet/chestdrawer,
+/turf/open/floor/iron,
+/area/ruin/outpost31/radiomap)
+"ZY" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron,
+/area/ruin/outpost31/crewquarters)
+
+(1,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+lW
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+WQ
+WQ
+"}
+(2,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+BQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+WQ
+"}
+(3,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+BQ
+Yo
+Yo
+Yo
+Yo
+BQ
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+TP
+IL
+yo
+yo
+yo
+yo
+yo
+yo
+yo
+yo
+yo
+uB
+"}
+(4,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+hi
+lW
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+TP
+IL
+yo
+ce
+dV
+aM
+DF
+gC
+jl
+nH
+yo
+uB
+"}
+(5,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+IL
+yo
+SW
+SW
+SW
+SW
+SW
+SW
+ht
+yo
+uB
+"}
+(6,1,1) = {"
+WQ
+WQ
+WQ
+WQ
+uB
+uB
+uB
+uB
+Sg
+Sg
+Sg
+Sg
+Sg
+sK
+Yo
+BQ
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+BQ
+Yo
+Yo
+Yo
+Yo
+Yo
+sK
+yo
+ME
+aM
+aM
+SW
+SW
+SW
+VK
+yo
+uB
+"}
+(7,1,1) = {"
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Sg
+Lf
+oF
+Lf
+Sg
+Wy
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+sK
+yo
+yo
+yo
+yo
+dt
+RQ
+RQ
+yo
+yo
+Vd
+"}
+(8,1,1) = {"
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Sg
+YT
+Jl
+lM
+uN
+RL
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+rm
+Vd
+VM
+Bz
+Sg
+GW
+Ov
+rx
+Ov
+CM
+Vd
+"}
+(9,1,1) = {"
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Sg
+Lf
+yQ
+qI
+Sg
+SN
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+sK
+Nk
+oF
+HC
+SJ
+Ov
+Ov
+Ov
+jv
+CM
+ov
+"}
+(10,1,1) = {"
+uB
+uB
+oa
+oa
+oa
+oa
+oa
+oa
+oa
+Sg
+qt
+Sg
+Gz
+Gz
+lT
+lT
+Gz
+Jd
+Jd
+Jd
+Jd
+nP
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Vd
+Sg
+WD
+Sg
+Gg
+mq
+si
+CM
+CM
+Vd
+"}
+(11,1,1) = {"
+uB
+oa
+oa
+eT
+IT
+py
+yp
+ES
+aq
+Ht
+QU
+lO
+aV
+Wu
+gu
+Tv
+Tv
+Jd
+XD
+dm
+EH
+Bc
+mW
+mW
+mW
+MO
+ob
+dm
+XD
+Jd
+sm
+Ht
+QU
+lO
+xk
+xk
+xk
+xk
+xk
+cy
+"}
+(12,1,1) = {"
+uB
+oa
+Jq
+CC
+oJ
+oJ
+kh
+UH
+Ml
+vX
+ge
+oN
+rO
+gu
+gu
+Rf
+Fu
+Jd
+XD
+wt
+Hk
+Bc
+mW
+Kh
+mW
+MO
+VU
+dW
+XD
+Jd
+tG
+Ht
+lF
+oN
+xk
+ch
+wr
+tZ
+JP
+cy
+"}
+(13,1,1) = {"
+uB
+oa
+uR
+Oo
+oV
+og
+FP
+bE
+aq
+MQ
+ge
+FY
+aV
+nJ
+gu
+Rf
+pj
+Jd
+XD
+MO
+ob
+Bc
+mW
+mW
+mW
+MO
+IG
+ob
+XD
+Jd
+wx
+Ht
+ub
+oN
+xk
+cd
+Oz
+gM
+Id
+cy
+"}
+(14,1,1) = {"
+uB
+oa
+cu
+Oo
+DM
+qa
+Mn
+Nl
+aq
+Ht
+ge
+oN
+aV
+Ij
+gu
+tj
+tj
+Jd
+XD
+zy
+eu
+Bc
+nV
+hD
+uI
+dH
+ai
+ob
+XD
+Jd
+Jd
+cp
+qK
+Uy
+xk
+Au
+UA
+gM
+SB
+cy
+"}
+(15,1,1) = {"
+uB
+oa
+mV
+Oo
+lR
+lR
+Mn
+Cb
+aq
+cp
+LQ
+oN
+aV
+pd
+gu
+gu
+fI
+Jd
+eb
+PT
+Bj
+Bj
+Bj
+MO
+ai
+FW
+FW
+ob
+XD
+Hm
+Jd
+nj
+ub
+oN
+xk
+Au
+gM
+an
+ze
+cy
+"}
+(16,1,1) = {"
+uB
+oa
+uR
+fC
+og
+qa
+Mn
+zO
+aq
+cp
+YK
+Ms
+aV
+Ae
+gu
+gu
+me
+nP
+Bc
+Bc
+Dg
+in
+Bj
+zu
+IG
+IG
+IG
+ob
+XD
+Hm
+JG
+cp
+qK
+Bb
+xk
+lU
+gi
+gM
+HP
+cy
+"}
+(17,1,1) = {"
+uB
+oa
+uR
+kh
+sg
+sg
+kh
+Qy
+aq
+FH
+YK
+Uy
+aV
+aV
+TX
+Il
+aV
+Jd
+jP
+Uv
+Bj
+Bj
+Bj
+MO
+FW
+FW
+FW
+za
+XD
+Hm
+yW
+cp
+YK
+Vx
+Fb
+Lk
+gM
+gM
+eS
+cy
+"}
+(18,1,1) = {"
+uB
+oa
+Yh
+Io
+Rm
+Rm
+Rm
+XJ
+aq
+cp
+YK
+oN
+aV
+OW
+HL
+jL
+tC
+Jd
+XD
+zN
+dW
+Bc
+nV
+Hq
+eI
+mO
+FW
+ob
+XD
+Jd
+Jd
+cp
+YK
+Uy
+xk
+Xk
+BM
+BM
+Ai
+cy
+"}
+(19,1,1) = {"
+uB
+oa
+Or
+eg
+eL
+aq
+aq
+aq
+aq
+cp
+YK
+Uy
+aV
+Xf
+jL
+pQ
+PS
+Jd
+XD
+rk
+ob
+Bc
+mW
+mW
+mW
+MO
+IG
+ob
+XD
+Jd
+dP
+Ht
+YK
+Uy
+xk
+xk
+xk
+xk
+xk
+he
+"}
+(20,1,1) = {"
+uB
+oa
+BI
+BI
+BI
+aq
+fH
+CS
+Vg
+Ht
+YK
+BP
+RO
+Xa
+yx
+jL
+Vz
+Jd
+XD
+gO
+yO
+Bc
+mW
+Kh
+mW
+MO
+ru
+RD
+XD
+Jd
+GR
+cp
+KW
+oN
+Rc
+Ea
+lr
+wE
+AR
+xc
+"}
+(21,1,1) = {"
+uB
+oa
+sd
+bg
+aP
+aq
+kA
+Oe
+aq
+cp
+YK
+Uy
+aV
+hs
+PG
+bX
+Ob
+Jd
+XD
+bW
+EH
+Bc
+mW
+mW
+mW
+MO
+ob
+bW
+XD
+Jd
+VR
+Ht
+YK
+Uy
+Rc
+ID
+Pw
+QA
+ho
+xc
+"}
+(22,1,1) = {"
+qz
+oa
+aq
+aq
+aq
+aq
+aq
+aq
+aq
+cp
+YK
+oN
+aV
+aV
+aV
+aV
+aV
+Jd
+Jd
+Jd
+Jd
+nP
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Jd
+Sg
+cp
+YK
+Uy
+Rc
+ZX
+Pw
+Pw
+ks
+xc
+"}
+(23,1,1) = {"
+qz
+Sa
+cw
+gZ
+cm
+sP
+Ht
+cp
+Ht
+cp
+YK
+FK
+cp
+VG
+cp
+cp
+Ht
+Pd
+tX
+cp
+cp
+vX
+pe
+cp
+Ht
+Ht
+Tx
+cp
+Ht
+cp
+Sy
+cp
+YK
+Uy
+fL
+bb
+Pw
+Pw
+CA
+xc
+"}
+(24,1,1) = {"
+qz
+to
+ko
+VV
+lz
+AG
+LW
+YK
+YK
+YK
+YK
+YK
+YK
+ge
+YK
+YK
+YK
+tV
+YK
+YK
+YK
+YK
+ge
+YK
+YK
+YK
+wu
+YK
+YK
+ge
+YK
+YK
+YK
+XI
+Db
+bb
+Pw
+QA
+Dz
+xc
+"}
+(25,1,1) = {"
+qz
+Mw
+Pb
+tJ
+Tq
+sP
+PR
+wc
+Bu
+wO
+hT
+Tm
+Uy
+Uy
+Uy
+Uy
+Uy
+mU
+oN
+Al
+bp
+Uy
+wO
+EL
+RK
+db
+PW
+Uy
+oN
+Uy
+Uy
+HW
+YK
+Uy
+Rc
+Pw
+Pw
+ah
+cz
+xc
+"}
+(26,1,1) = {"
+qz
+sk
+Mw
+tS
+sP
+sP
+zd
+Gg
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+LA
+fW
+Tr
+jM
+Lx
+Lx
+Lx
+iA
+Lx
+Lx
+cp
+YK
+oN
+Rc
+Qj
+DW
+wb
+ZM
+xc
+"}
+(27,1,1) = {"
+qz
+wP
+wp
+nT
+sP
+qH
+kP
+Lz
+LA
+RR
+no
+LA
+RR
+no
+LA
+RR
+no
+LA
+Nw
+dK
+rf
+LA
+LA
+LA
+Lx
+Lx
+ck
+tx
+Ly
+nr
+Lx
+Ht
+LQ
+Uy
+Rc
+cf
+VA
+VA
+cf
+xc
+"}
+(28,1,1) = {"
+qz
+UI
+UI
+xo
+sP
+vn
+uj
+vn
+LA
+Gh
+Gh
+LA
+Gh
+Gh
+LA
+Gh
+Gh
+LA
+Nc
+zF
+oj
+zF
+op
+LA
+Ca
+Ly
+Ly
+Ly
+Ly
+Td
+Lx
+Ol
+YK
+Wc
+Rc
+cf
+cf
+cf
+cf
+xc
+"}
+(29,1,1) = {"
+qz
+xo
+KU
+xo
+sP
+vn
+uj
+BZ
+LA
+sQ
+LA
+LA
+sQ
+LA
+LA
+sQ
+LA
+LA
+Zq
+Ce
+oj
+Ce
+sL
+LA
+Aw
+Ly
+Ly
+Ly
+Ly
+uA
+AE
+vX
+YK
+Uy
+xc
+xc
+xc
+xc
+xc
+xc
+"}
+(30,1,1) = {"
+qz
+xo
+xo
+Ui
+sP
+qH
+kP
+Cc
+rB
+dZ
+ZY
+wq
+vU
+YG
+au
+ZA
+ZA
+DU
+zw
+Yk
+zw
+Yk
+zw
+FQ
+Ly
+Ly
+fM
+Ly
+Ly
+uA
+iA
+Ht
+qK
+Uy
+xc
+uB
+uB
+uB
+uB
+uB
+"}
+(31,1,1) = {"
+qz
+kF
+xo
+XN
+qz
+Sg
+xP
+Sg
+zv
+oz
+LA
+LA
+oz
+LA
+LA
+oz
+LA
+LA
+sB
+zF
+HF
+zF
+iH
+LA
+Sm
+ep
+ZB
+Ma
+kX
+MW
+Lx
+Fo
+NP
+ih
+xc
+uB
+uB
+uB
+uB
+uB
+"}
+(32,1,1) = {"
+qz
+qz
+qz
+qz
+qz
+MT
+jN
+hN
+zv
+Gh
+Gh
+LA
+Gh
+Gh
+LA
+Gh
+Gh
+LA
+BU
+Ce
+zF
+zF
+op
+LA
+Vc
+ZT
+Sq
+Mf
+ZT
+Vm
+ne
+Sg
+Ie
+Sg
+xc
+uB
+uB
+uB
+uB
+uB
+"}
+(33,1,1) = {"
+uB
+uB
+uB
+uB
+Sg
+Sg
+Wd
+Sg
+zv
+pw
+Ei
+LA
+pw
+Ei
+LA
+pw
+Ei
+LA
+XQ
+fb
+Bg
+fb
+op
+LA
+ZL
+ZT
+pa
+EY
+ZT
+sF
+ne
+MK
+zz
+oF
+xc
+uB
+uB
+uB
+uB
+uB
+"}
+(34,1,1) = {"
+WQ
+uB
+uB
+uB
+Sg
+rb
+sK
+rb
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+zv
+by
+by
+by
+ne
+ne
+ne
+ne
+Sg
+zY
+Sg
+xc
+uB
+uB
+uB
+uB
+uB
+"}
+(35,1,1) = {"
+WQ
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+sK
+sK
+sK
+uB
+uB
+uB
+sK
+rb
+sK
+rb
+sK
+uB
+uB
+uB
+uB
+uB
+"}
+(36,1,1) = {"
+WQ
+WQ
+uB
+BQ
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+WQ
+"}
+(37,1,1) = {"
+WQ
+WQ
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+BQ
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+WQ
+"}
+(38,1,1) = {"
+WQ
+WQ
+WQ
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+WQ
+"}
+(39,1,1) = {"
+WQ
+WQ
+WQ
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+BQ
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+WQ
+"}
+(40,1,1) = {"
+WQ
+WQ
+WQ
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+uB
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+Yo
+uB
+uB
+uB
+WQ
+WQ
+"}
diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm
index 6a1433fa5ec..5ce90a76319 100644
--- a/code/__DEFINES/ai/monsters.dm
+++ b/code/__DEFINES/ai/monsters.dm
@@ -305,6 +305,20 @@
///time till our next rest duration
#define BB_DEER_NEXT_REST_TIMER "deer_next_rest_timer"
+//the thing boss
+#define BB_THETHING_CHARGE "BB_THETHING_CHARGE"
+#define BB_THETHING_DECIMATE "BB_THETHING_DECIMATE"
+#define BB_THETHING_BIGTENDRILS "BB_THETHING_BIGTENDRILS"
+#define BB_THETHING_SHRIEK "BB_THETHING_SHRIEK"
+#define BB_THETHING_CARDTENDRILS "BB_THETHING_CARDTENDRILS"
+#define BB_THETHING_ACIDSPIT "BB_THETHING_ACIDSPIT"
+/// Blackboard key for The Thing boss that determines attack mode. TRUE means it will focus on closing the distance and murdering the person in question. Otherwise AOE.
+#define BB_THETHING_ATTACKMODE "BB_THETHING_ATTACKMODE"
+/// The Thing will be in attack mode forever if true
+#define BB_THETHING_NOAOE "BB_THETHING_NOAOE"
+/// What (first in combo) attack was last executed
+#define BB_THETHING_LASTAOE "BB_THETHING_LASTAOE"
+
//turtle
///our tree's ability
#define BB_TURTLE_TREE_ABILITY "turtle_tree_ability"
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 f4557f4b5c1..8205f47fe9a 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -76,6 +76,9 @@
#define COMSIG_MOB_MIND_TRANSFERRED_OUT_OF "mob_mind_transferred_out_of"
/// From /mob/proc/ghostize() Called when a mob successfully ghosts
#define COMSIG_MOB_GHOSTIZED "mob_ghostized"
+/// can_roll_midround(datum/antagonist/antag_type) from certain midround rulesets, (mob/living/source, datum/mind/mind, datum/antagonist/antagonist)
+#define COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL "mob_mind_transferred_out_of"
+ #define CANCEL_ROLL (1<<1)
///from base of obj/allowed(mob/M): (/obj) returns ACCESS_ALLOWED if mob has id access to the obj
#define COMSIG_MOB_TRIED_ACCESS "tried_access"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm
new file mode 100644
index 00000000000..52ee745f66c
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_megafauna.dm
@@ -0,0 +1,2 @@
+
+#define COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED "COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED"
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 6308ad94c89..04dbb129cf4 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define isguardian(A) (istype(A, /mob/living/basic/guardian))
-#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna))
+#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna) || istype(A, /mob/living/basic/boss))
#define isclown(A) (istype(A, /mob/living/basic/clown))
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 5d35a7fcb87..7c31243c5c2 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -1412,6 +1412,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///Trait given to atoms currently affected by projectile dampeners
#define TRAIT_GOT_DAMPENED "got_dampened"
+/// humans with this trait will have their health visible to AIs without suit
+#define HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT "hmsensorsvisiblewithoutsuit"
/// Apply to movables to say "hey, this movable is technically flat on the floor, so it'd be mopped up by a mop"
#define TRAIT_MOPABLE "mopable"
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index e351e155dc1..a4aeb1cab9b 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -585,6 +585,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_IGNORE_FIRE_PROTECTION" = TRAIT_IGNORE_FIRE_PROTECTION,
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
+ "HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT" = HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT,
"TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING,
"TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS,
"TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS,
diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
index 8d054026768..89602f2e7fa 100644
--- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
+++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
@@ -261,7 +261,7 @@
candidates -= player
else if(is_centcom_level(player.z))
candidates -= player // We don't autotator people in CentCom
- else if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround()))
+ else if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround(antag_datum)))
candidates -= player // We don't autotator people with roles already
/datum/dynamic_ruleset/midround/from_living/autotraitor/execute()
@@ -310,7 +310,7 @@
continue
if(isnull(player.mind))
continue
- if(player.mind.special_role || !player.mind.can_roll_midround())
+ if(player.mind.special_role || !player.mind.can_roll_midround(antag_datum))
continue
candidates += player
@@ -479,7 +479,7 @@
candidates -= player
continue
- if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround()))
+ if(player.mind && (player.mind.special_role || !player.mind.can_roll_midround(antag_datum)))
candidates -= player
/datum/dynamic_ruleset/midround/from_living/blob_infection/execute()
diff --git a/code/controllers/subsystem/queuelinks.dm b/code/controllers/subsystem/queuelinks.dm
index a6d56cf622e..1f891ee3ea5 100644
--- a/code/controllers/subsystem/queuelinks.dm
+++ b/code/controllers/subsystem/queuelinks.dm
@@ -60,6 +60,7 @@ SUBSYSTEM_DEF(queuelinks)
if(what in partners)
return
partners += what
+ RegisterSignal(what, COMSIG_QDELETING, PROC_REF(link_object_deleted))
if(queue_max != 0 && max != 0 && max != queue_max)
CRASH("Tried to change queue size to [max] from [queue_max]!")
@@ -77,6 +78,10 @@ SUBSYSTEM_DEF(queuelinks)
item.MatchedLinks(id, partners - item)
qdel(src)
+/datum/queue_link/proc/link_object_deleted(datum/source) // because CI and stuff
+ SIGNAL_HANDLER
+ partners -= source
+
/datum/queue_link/Destroy()
. = ..()
partners = null
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
index 7673551a653..4132a2cf2a5 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm
@@ -164,3 +164,6 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
if(length(priority_targets))
return pick(priority_targets)
return ..()
+
+/datum/ai_behavior/find_potential_targets/bigger_range
+ vision_range = 16
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm
index 759355283ac..f80ffcc155e 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm
@@ -17,3 +17,8 @@
/datum/ai_planning_subtree/simple_find_target/to_flee
target_key = BB_BASIC_MOB_FLEE_TARGET
+
+/datum/ai_planning_subtree/simple_find_target/increased_range
+
+/datum/ai_planning_subtree/simple_find_target/increased_range/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
diff --git a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm
index d552b69c142..2b2297c2d6d 100644
--- a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm
+++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm
@@ -146,3 +146,11 @@
if(isturf(the_target))
return TRUE
return ..()
+
+/// Subtype which searches for mobs that havent been gutted by megafauna
+/datum/targeting_strategy/basic/no_gutted_mobs
+
+/datum/targeting_strategy/basic/no_gutted_mobs/can_attack(mob/living/owner, mob/living/target, vision_range)
+ if(!istype(target) || target.has_status_effect(/datum/status_effect/gutted))
+ return FALSE
+ return ..()
diff --git a/code/datums/elements/crusher_loot.dm b/code/datums/elements/crusher_loot.dm
index c13c62a52ce..02499756095 100644
--- a/code/datums/elements/crusher_loot.dm
+++ b/code/datums/elements/crusher_loot.dm
@@ -6,7 +6,7 @@
/datum/element/crusher_loot
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
- /// Path of the trophy dropped
+ /// Path of the trophy dropped (or list of trophies)
var/trophy_type
/// chance to drop the trophy, lowered by the mob only taking partial crusher damage instead of full
/// for example, 25% would mean ~4 mobs need to die before you find one.
@@ -36,7 +36,14 @@
var/datum/status_effect/crusher_damage/damage = target.has_status_effect(/datum/status_effect/crusher_damage)
if(damage && prob((damage.total_damage/target.maxHealth) * drop_mod)) //on average, you'll need to kill 4 creatures before getting the item. by default.
- if(drop_immediately)
- new trophy_type(get_turf(target))
- else
- target.butcher_results[trophy_type] = 1
+ if(islist(trophy_type))
+ for(var/trophypath in trophy_type)
+ make_path(target, trophypath)
+ return
+ make_path(target, trophy_type)
+
+/datum/element/crusher_loot/proc/make_path(mob/living/target, path)
+ if(drop_immediately)
+ new path(get_turf(target))
+ else
+ target.butcher_results[path] = 1
diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm
index 1df318f9ee4..a9f0d7e5016 100644
--- a/code/datums/mind/_mind.dm
+++ b/code/datums/mind/_mind.dm
@@ -541,7 +541,9 @@
return affected_addiction.on_lose_addiction_points(src)
/// Whether or not we can roll for midrounds, specifically checking if we have any major antag datums that should block it
-/datum/mind/proc/can_roll_midround()
+/datum/mind/proc/can_roll_midround(datum/antagonist/antag_type)
+ if(SEND_SIGNAL(current, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, src, antag_type) & CANCEL_ROLL)
+ return FALSE
for(var/datum/antagonist/antag as anything in antag_datums)
if(antag.block_midrounds)
return FALSE
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index 6ab7539cecd..bca4e3c33cb 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -190,6 +190,12 @@
description = "A small laboratory and living space for Syndicate agents."
suffix = "icemoon_underground_syndielab.dmm"
+/datum/map_template/ruin/icemoon/underground/o31
+ name = "Ice-Ruin Outpost 31"
+ id = "o31"
+ description = "Suspiciously dead silent. May or may not contain megafauna"
+ suffix = "icemoon_underground_outpost31.dmm"
+
//TODO: Bottom-Level ONLY Spawns after Refactoring Related Code
/datum/map_template/ruin/icemoon/underground/plasma_facility
name = "Ice-Ruin Abandoned Plasma Facility"
diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm
index 69d1e5abf4d..bc9a9226316 100644
--- a/code/game/area/areas/ruins/icemoon.dm
+++ b/code/game/area/areas/ruins/icemoon.dm
@@ -94,3 +94,40 @@
name = "\improper Syndicate Lab"
ambience_index = AMBIENCE_DANGER
sound_environment = SOUND_ENVIRONMENT_CAVE
+
+/area/ruin/outpost31
+ name = "\improper Outpost 31"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
+ mood_bonus = -10
+ mood_message = "Something very bad happened here..."
+
+/area/ruin/outpost31/medical
+ name = "\improper Outpost 31 Medical"
+
+/area/ruin/outpost31/kitchendiningroom
+ name = "\improper Outpost 31 Kitchen-Dining Room"
+
+/area/ruin/outpost31/kennel
+ name = "\improper Outpost 31 Kennel"
+
+/area/ruin/outpost31/radiomap
+ name = "\improper Outpost 31 Radio-Map Room"
+
+/area/ruin/outpost31/lab
+ name = "\improper Outpost 31 Lab"
+ area_flags = NOTELEPORT //megafauna arena
+ requires_power = FALSE
+
+/area/ruin/outpost31/lootroom
+ name = "\improper Outpost 31 Secondary Storage"
+ area_flags = NOTELEPORT //megafauna loot room
+ requires_power = FALSE
+
+/area/ruin/outpost31/recroom
+ name = "\improper Outpost 31 Rec Room"
+
+/area/ruin/outpost31/crewquarters
+ name = "\improper Outpost 31 Sleeping Quarters"
+
+/area/ruin/outpost31/commander_room
+ name = "\improper Outpost 31 Station Commander Office"
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index e32d09309c1..b06ee3c5af7 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -22,15 +22,17 @@
/datum/atom_hud/data/human/medical/basic
-/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/H)
- if(!istype(H))
+/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/human)
+ if(!istype(human))
return FALSE
- var/obj/item/clothing/under/U = H.w_uniform
- if(!istype(U))
+ if(HAS_TRAIT(human, HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT))
+ return TRUE
+ var/obj/item/clothing/under/undersuit = human.w_uniform
+ if(!istype(undersuit))
return FALSE
- if(U.has_sensor < HAS_SENSORS)
+ if(undersuit.has_sensor < HAS_SENSORS)
return FALSE
- if(U.sensor_mode <= SENSOR_VITALS)
+ if(undersuit.sensor_mode <= SENSOR_VITALS)
return FALSE
return TRUE
diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
index 119099f587b..b1843196882 100644
--- a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
@@ -231,3 +231,23 @@
var/mob/living/basic/legion_brood/minion = new (LivingUser.loc)
minion.assign_creator(LivingUser)
next_use_time = world.time + 4 SECONDS
+
+//The Thing
+/obj/item/crusher_trophy/flesh_glob
+ name = "glob of shifting flesh"
+ desc = "A glob of shifting flesh. Sealed shut permanently. Suitable as a trophy for a kinetic crusher."
+ icon_state = "glob"
+ denied_type = /obj/item/crusher_trophy/flesh_glob
+ bonus_value = 20
+ /// the order in which we heal damage
+ var/static/list/damage_heal_order = list(BRUTE, BURN, OXY, TOX)
+
+/obj/item/crusher_trophy/flesh_glob/effect_desc()
+ return "melee hits heal you for [bonus_value * 0.2], and for [bonus_value * 0.5] on mark detonation"
+
+/obj/item/crusher_trophy/flesh_glob/on_melee_hit(mob/living/target, mob/living/user)
+ user.heal_ordered_damage(bonus_value * 0.2, damage_heal_order)
+
+/obj/item/crusher_trophy/flesh_glob/on_mark_detonation(mob/living/target, mob/living/user)
+ . = ..()
+ user.heal_ordered_damage(bonus_value * 0.5, damage_heal_order)
diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm
index cfe087a8ab3..5ed8404459f 100644
--- a/code/modules/mining/lavaland/megafauna_loot.dm
+++ b/code/modules/mining/lavaland/megafauna_loot.dm
@@ -1115,3 +1115,170 @@
playsound(target, 'sound/effects/magic/lightningbolt.ogg', 100, TRUE)
target.visible_message(span_danger("A thunderbolt strikes [target]!"))
explosion(target, light_impact_range = (boosted ? 1 : 0), flame_range = (boosted ? 2 : 1), silent = TRUE)
+
+
+/datum/action/innate/brain_undeployment
+ name = "Disconnect from shell"
+ desc = "Stop controlling your shell and resume normal core operations."
+ button_icon = 'icons/mob/actions/actions_AI.dmi'
+ button_icon_state = "ai_core"
+
+/datum/action/innate/brain_undeployment/Trigger(trigger_flags)
+ if(!..())
+ return FALSE
+ var/obj/item/organ/brain/cybernetic/ai/shell_to_disconnect = owner.get_organ_by_type(/obj/item/organ/brain/cybernetic/ai)
+
+ shell_to_disconnect.undeploy()
+ return TRUE
+
+/obj/item/organ/brain/cybernetic/ai
+ name = "AI-uplink brain"
+ desc = "Can be inserted into a body with NO ORGANIC INTERNAL ORGANS (robotic organs only) to allow AIs to control it. Comes with its own health sensors beacon. MUST be a humanoid or bad things happen to the consciousness."
+ can_smoothen_out = FALSE
+ /// if connected, our AI
+ var/mob/living/silicon/ai/mainframe
+ /// action for undeployment
+ var/datum/action/innate/brain_undeployment/undeployment_action = new
+
+/obj/item/organ/brain/cybernetic/ai/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes move with machine precision, their expression completely blank.")
+
+/obj/item/organ/brain/cybernetic/ai/Destroy()
+ . = ..()
+ undeploy()
+ mainframe = null
+ QDEL_NULL(undeployment_action)
+
+/obj/item/organ/brain/cybernetic/ai/on_mob_insert(mob/living/carbon/brain_owner, special, movement_flags)
+ . = ..()
+ brain_owner.add_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP), ORGAN_TRAIT)
+ update_med_hud_status(brain_owner)
+ RegisterSignal(brain_owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_med_hud_status))
+ RegisterSignal(brain_owner, COMSIG_CLICK, PROC_REF(owner_clicked))
+ RegisterSignal(brain_owner, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(get_status_tab_item))
+ RegisterSignal(brain_owner, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, PROC_REF(cancel_rolls))
+ RegisterSignals(brain_owner, list(COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED), PROC_REF(undeploy))
+ RegisterSignal(brain_owner, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain))
+
+/obj/item/organ/brain/cybernetic/ai/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
+ undeploy()
+ . = ..()
+ organ_owner.remove_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP), ORGAN_TRAIT)
+ UnregisterSignal(organ_owner, list(COMSIG_LIVING_HEALTH_UPDATE, COMSIG_CLICK, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED))
+
+/obj/item/organ/brain/cybernetic/ai/proc/cancel_rolls(mob/living/source, datum/mind/mind, datum/antagonist/antagonist)
+ SIGNAL_HANDLER
+ if(ispath(antagonist, /datum/antagonist/malf_ai))
+ return
+ return CANCEL_ROLL
+
+/obj/item/organ/brain/cybernetic/ai/proc/get_status_tab_item(mob/living/source, list/items)
+ SIGNAL_HANDLER
+ if(!mainframe)
+ return
+ items += mainframe.get_status_tab_items()
+
+/obj/item/organ/brain/cybernetic/ai/proc/update_med_hud_status(mob/living/mob_parent)
+ SIGNAL_HANDLER
+ var/image/holder = mob_parent.hud_list?[STATUS_HUD]
+ if(isnull(holder))
+ return
+ var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir)
+ holder.pixel_y = size_check.Height() - ICON_SIZE_Y
+ if(mob_parent.stat == DEAD || HAS_TRAIT(mob_parent, TRAIT_FAKEDEATH) || isnull(mainframe))
+ holder.icon_state = "huddead2"
+ holder.pixel_x = -8 // new icon states? nuh uh
+ else
+ holder.icon_state = "hudtrackingai"
+ holder.pixel_x = -16
+
+// no thoughts only wifi
+/obj/item/organ/brain/cybernetic/ai/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE)
+ return FALSE
+
+/obj/item/organ/brain/cybernetic/ai/proc/owner_clicked(datum/source, atom/location, control, params, mob/user)
+ SIGNAL_HANDLER
+ if(!isAI(user))
+ return
+ var/list/lines = list()
+ lines += span_bold("[owner]")
+ lines += "Target is currently [!HAS_TRAIT(owner, TRAIT_INCAPACITATED) ? "functional" : "incapacitated"]"
+ lines += "Estimated organic/inorganic integrity: [owner.health]"
+ if(is_sufficiently_augmented())
+ lines += "[span_boldnotice("Take control?")]
"
+ else
+ lines += span_warning("Organic organs detected. Robotic organs only, cannot take over.")
+
+ to_chat(user, boxed_message(jointext(lines, "\n")), type = MESSAGE_TYPE_INFO)
+
+/obj/item/organ/brain/cybernetic/ai/Topic(href, href_list)
+ ..()
+ if(!href_list["ai_take_control"] || !is_sufficiently_augmented())
+ return
+ var/mob/living/silicon/ai/AI = locate(href_list["ai_take_control"]) in GLOB.silicon_mobs
+ if(isnull(AI))
+ return
+ if(AI.controlled_equipment)
+ to_chat(AI, span_warning("You are already loaded into an onboard computer!"))
+ return
+ if(!GLOB.cameranet.checkCameraVis(owner))
+ to_chat(AI, span_warning("Target is no longer near active cameras."))
+ return
+ if(!isturf(AI.loc))
+ to_chat(AI, span_warning("You aren't in your core!"))
+ return
+
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(undeploy))
+ AI.deployed_shell = owner
+ deploy_init(AI)
+ ADD_TRAIT(AI.mind, TRAIT_UNCONVERTABLE, ORGAN_TRAIT)
+ AI.mind.transfer_to(owner)
+
+/obj/item/organ/brain/cybernetic/ai/proc/deploy_init(mob/living/silicon/ai/AI)
+ //todo camera maybe
+ mainframe = AI
+ RegisterSignal(AI, COMSIG_QDELETING, PROC_REF(ai_deleted))
+ undeployment_action.Grant(owner)
+ update_med_hud_status(owner)
+ to_chat(owner, span_boldbig("You are still considered a silicon/cyborg/AI. Follow your laws."))
+
+/obj/item/organ/brain/cybernetic/ai/proc/undeploy(datum/source)
+ SIGNAL_HANDLER
+ if(!owner?.mind || !mainframe)
+ return
+ UnregisterSignal(src, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING))
+ mainframe.redeploy_action.Remove(mainframe)
+ mainframe.redeploy_action.last_used_shell = null
+ owner.mind.transfer_to(mainframe)
+ mainframe.deployed_shell = null
+ undeployment_action.Remove(owner)
+ if(mainframe.laws)
+ mainframe.laws.show_laws(mainframe)
+ if(mainframe.eyeobj)
+ mainframe.eyeobj.setLoc(loc)
+ REMOVE_TRAIT(mainframe.mind, TRAIT_UNCONVERTABLE, ORGAN_TRAIT)
+ mainframe = null
+ update_med_hud_status(owner)
+
+/obj/item/organ/brain/cybernetic/ai/proc/is_sufficiently_augmented()
+ var/mob/living/carbon/carb_owner = owner
+ . = TRUE
+ if(!istype(carb_owner))
+ return
+ for(var/obj/item/organ/organ as anything in carb_owner.organs)
+ if(organ.organ_flags & ORGAN_EXTERNAL)
+ continue
+ if(!IS_ROBOTIC_ORGAN(organ) && !istype(organ, /obj/item/organ/tongue)) //tongues are not in the exosuit fab and nobody is going to bother to find them so
+ return FALSE
+
+/obj/item/organ/brain/cybernetic/ai/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special)
+ SIGNAL_HANDLER
+ if(!is_sufficiently_augmented())
+ to_chat(owner, span_danger("Connection failure. Organics detected."))
+ undeploy()
+
+/obj/item/organ/brain/cybernetic/ai/proc/ai_deleted(datum/source)
+ SIGNAL_HANDLER
+ to_chat(owner, span_danger("Your core has been rendered inoperable..."))
+ undeploy()
diff --git a/code/modules/mob/living/basic/boss/boss.dm b/code/modules/mob/living/basic/boss/boss.dm
new file mode 100644
index 00000000000..57b28848e48
--- /dev/null
+++ b/code/modules/mob/living/basic/boss/boss.dm
@@ -0,0 +1,140 @@
+//not quite simple animal megafauna but close enough
+// port actual megafauna stuff once it gets used for lavaland megafauna
+//im using it for stuff both of them get
+/mob/living/basic/boss
+ combat_mode = TRUE
+ sentience_type = SENTIENCE_BOSS
+ mob_biotypes = MOB_ORGANIC|MOB_SPECIAL
+ faction = list(FACTION_MINING, FACTION_BOSS)
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
+ obj_damage = 400
+ unsuitable_cold_damage = 0
+ unsuitable_heat_damage = 0
+ unsuitable_atmos_damage = 0
+ move_force = MOVE_FORCE_OVERPOWERING
+ move_resist = MOVE_FORCE_OVERPOWERING
+ pull_force = MOVE_FORCE_OVERPOWERING
+ mob_size = MOB_SIZE_HUGE
+ layer = LARGE_MOB_LAYER
+ flags_1 = PREVENT_CONTENTS_EXPLOSION_1
+ /// List of loot if not killed by crusher.
+ var/list/loot
+ /// List of loot if killed by crusher.
+ var/list/crusher_loot
+ /// Achievement given to surrounding players when the megafauna is killed
+ var/achievement_type
+ /// Crusher achievement given to players when megafauna is killed
+ var/crusher_achievement_type
+ /// Score given to players when megafauna is killed
+ var/score_achievement_type
+ /// If the megafauna was actually killed (not just dying, then transforming into another type)
+ var/elimination = FALSE
+ /// Name for the GPS signal of the megafauna
+ var/gps_name = null
+ /// If this is a megafauna that is real (has achievements, gps signal)
+ var/true_spawn = TRUE
+
+/mob/living/basic/boss/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/wall_tearer, tear_time = 1 SECONDS)
+ if(gps_name && true_spawn)
+ AddComponent(/datum/component/gps, gps_name)
+ ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
+ add_traits(list(TRAIT_NO_TELEPORT, TRAIT_MARTIAL_ARTS_IMMUNE, TRAIT_LAVA_IMMUNE,TRAIT_ASHSTORM_IMMUNE, TRAIT_NO_FLOATING_ANIM), MEGAFAUNA_TRAIT)
+ AddComponent(/datum/component/seethrough_mob)
+ AddElement(/datum/element/simple_flying)
+
+/mob/living/basic/boss/gib()
+ if(health > 0)
+ return
+ return ..()
+
+/mob/living/basic/boss/dust(just_ash, drop_items, force)
+ if(!force && health > 0)
+ return
+ loot.Cut()
+ crusher_loot.Cut()
+ return ..()
+
+/mob/living/basic/boss/death(gibbed, list/force_grant)
+ if(gibbed) // in case they've been force dusted
+ return ..()
+
+ if(health > 0) // prevents instakills
+ return
+ var/datum/status_effect/crusher_damage/crusher_dmg = has_status_effect(/datum/status_effect/crusher_damage)
+ ///Whether we killed the megafauna with primarily crusher damage or not
+ var/crusher_kill = (crusher_dmg && (crusher_dmg.total_damage >= floor(maxHealth * 0.6)))
+ if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1))
+ var/tab = "megafauna_kills"
+ if(crusher_kill)
+ tab = "megafauna_kills_crusher"
+ if(!elimination) //used so the achievment only occurs for the last legion to die.
+ grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant)
+ SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]")
+
+ for(var/path in crusher_kill ? crusher_loot : loot) // using this instead of deathdrops and crusher_loot because we calculate differently and removing the element is ass
+ new path(drop_location())
+
+ return ..()
+
+/// Grants medals and achievements to surrounding players
+/mob/living/basic/boss/proc/grant_achievement(medaltype, scoretype, crusher_kill, list/grant_achievement = list())
+ if(!achievement_type || (flags_1 & ADMIN_SPAWNED_1) || !SSachievements.achievements_enabled) //Don't award medals if the medal type isn't set
+ return FALSE
+ if(!grant_achievement.len)
+ for(var/mob/living/victor in view(7,src))
+ grant_achievement += victor
+ for(var/mob/living/victor in grant_achievement)
+ if(victor.stat || !victor.client)
+ continue
+ victor.add_mob_memory(/datum/memory/megafauna_slayer, antagonist = src)
+ victor.client.give_award(/datum/award/achievement/boss/boss_killer, victor)
+ victor.client.give_award(achievement_type, victor)
+ if(crusher_kill && istype(victor.get_active_held_item(), /obj/item/kinetic_crusher))
+ victor.client.give_award(crusher_achievement_type, victor)
+ victor.client.give_award(/datum/award/score/boss_score, victor) //Score progression for bosses killed in general
+ victor.client.give_award(score_achievement_type, victor) //Score progression for specific boss killed
+ return TRUE
+
+/mob/living/basic/boss/early_melee_attack(mob/living/target, list/modifiers, ignore_cooldown)
+ . = ..()
+ if(!. || !istype(target))
+ return
+ if(target.stat == DEAD || (target.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(target, TRAIT_NODEATH)))
+ devour(target)
+
+/// Devours a target and restores health to the megafauna
+/mob/living/basic/boss/proc/devour(mob/living/victim)
+ if(isnull(victim) || victim.has_status_effect(/datum/status_effect/gutted))
+ return FALSE
+ celebrate_kill(victim)
+ if(!is_station_level(z) || client) //NPC monsters won't heal while on station
+ heal_overall_damage(victim.maxHealth * 0.5)
+ victim.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS)
+ if(iscarbon(victim))
+ qdel(victim.get_organ_slot(ORGAN_SLOT_LUNGS))
+ qdel(victim.get_organ_slot(ORGAN_SLOT_HEART))
+ qdel(victim.get_organ_slot(ORGAN_SLOT_LIVER))
+ victim.adjustBruteLoss(500)
+ victim.death() //make sure they die
+ victim.apply_status_effect(/datum/status_effect/gutted)
+ return TRUE
+
+/mob/living/basic/boss/proc/celebrate_kill(mob/living/poor_sap)
+ visible_message(
+ span_danger("[src] disembowels [poor_sap]!"),
+ span_userdanger("You feast on [poor_sap]'s organs, restoring your health!"))
+
+/mob/living/basic/boss/ex_act(severity, target)
+ switch (severity)
+ if (EXPLODE_DEVASTATE)
+ adjustBruteLoss(250)
+
+ if (EXPLODE_HEAVY)
+ adjustBruteLoss(100)
+
+ if (EXPLODE_LIGHT)
+ adjustBruteLoss(50)
+
+ return TRUE
diff --git a/code/modules/mob/living/basic/boss/thing/thing.dm b/code/modules/mob/living/basic/boss/thing/thing.dm
new file mode 100644
index 00000000000..7c0ac5b0123
--- /dev/null
+++ b/code/modules/mob/living/basic/boss/thing/thing.dm
@@ -0,0 +1,269 @@
+#define PHASEREGEN_FILTER "healing_glow"
+#define RUIN_QUEUE "the_thing_depleter"
+/mob/living/basic/boss/thing
+ name = "\improper Thing"
+ icon = 'icons/mob/simple/icemoon/thething.dmi'
+ icon_state = "p1"
+ icon_dead = "dead"
+ gender = NEUTER
+ maxHealth = 1800 //nicely divisible by three
+ health = 1800
+ armour_penetration = 40
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ sharpness = SHARP_EDGED
+ melee_attack_cooldown = CLICK_CD_SLOW
+ attack_verb_continuous = "eviscerates"
+ attack_verb_simple = "eviscerate"
+ attack_sound = 'sound/items/weapons/bladeslice.ogg'
+ attack_vis_effect = ATTACK_EFFECT_SLASH
+ speed = 3.5 //dont make this any faster PLEASE
+ gps_name = "L-4 Biohazard Beacon"
+ ai_controller = /datum/ai_controller/basic_controller/thing_boss
+ loot = list(/obj/item/keycard/thing_boss)
+ crusher_loot = list(/obj/item/keycard/thing_boss, /obj/item/crusher_trophy/flesh_glob)
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
+ /// Current phase of the boss fight
+ var/phase = 1
+ /// Time the Thing will be invulnerable between phases
+ var/phase_invul_time = 10 SECONDS
+ /// timer of phase invulnerability between phases
+ var/phase_invulnerability_timer
+
+ // ruin logic
+
+ /// if true, this boss may only be killed proper in its ruin by the associated machines as part of the bossfight. Turn off if admin shitspawn
+ var/maploaded = TRUE
+
+/mob/living/basic/boss/thing/Initialize(mapload)
+ . = ..()
+ var/static/list/innate_actions = list(
+ /datum/action/cooldown/mob_cooldown/the_thing/decimate = BB_THETHING_DECIMATE,
+ /datum/action/cooldown/mob_cooldown/charge/the_thing = BB_THETHING_CHARGE,
+ /datum/action/cooldown/mob_cooldown/the_thing/big_tendrils = BB_THETHING_BIGTENDRILS,
+ /datum/action/cooldown/mob_cooldown/the_thing/shriek = BB_THETHING_SHRIEK,
+ /datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils = BB_THETHING_CARDTENDRILS,
+ /datum/action/cooldown/mob_cooldown/the_thing/acid_spit = BB_THETHING_ACIDSPIT,
+ )
+ grant_actions_by_list(innate_actions)
+ AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.3 SECONDS)
+ maploaded = mapload
+ if(maploaded)
+ SSqueuelinks.add_to_queue(src, RUIN_QUEUE, 0)
+ return INITIALIZE_HINT_LATELOAD
+
+/mob/living/basic/boss/thing/LateInitialize()
+ SSqueuelinks.pop_link(RUIN_QUEUE)
+
+/mob/living/basic/boss/thing/update_icon_state()
+ . = ..()
+ if(stat)
+ icon_state = "dead"
+ return
+ icon_state = "p[phase]"
+ icon_living = icon_state
+
+/mob/living/basic/boss/thing/adjust_health(amount, updating_health = TRUE, forced = FALSE)
+ if(phase_invulnerability_timer || phase == 3 || stat || amount <= 0)
+ return ..()
+ var/potential_excess = bruteloss + amount - (maxHealth/3)*phase
+ if(potential_excess > 0)
+ amount -= potential_excess
+ . = ..()
+ if(bruteloss >= (maxHealth/3)*phase)
+ phase_health_depleted()
+
+/mob/living/basic/boss/thing/proc/phase_health_depleted()
+ if(phase_invulnerability_timer)
+ return //wtf?
+ if(!maploaded)
+ phase_successfully_depleted()
+ return
+ add_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT)
+ balloon_alert_to_viewers("invulnerable! overload the machines!")
+ visible_message(span_danger("[src] drops to the ground staggered, unable to keep up with injuries!"))
+ phase_invulnerability_timer = addtimer(CALLBACK(src, PROC_REF(phase_too_slow)), phase_invul_time, TIMER_STOPPABLE|TIMER_UNIQUE)
+ add_filter(PHASEREGEN_FILTER, 2, list("type" = "outline", "color" = COLOR_PALE_GREEN, "alpha" = 0, "size" = 1))
+ var/filter = get_filter(PHASEREGEN_FILTER)
+ animate(filter, alpha = 200, time = 0.5 SECONDS, loop = -1)
+ animate(alpha = 0, time = 0.5 SECONDS)
+ SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED)
+
+/// The Thing is successfully hit by incendiary fire while downed by damage (alternatively takes too much damage if not ruin spawned)
+/mob/living/basic/boss/thing/proc/phase_successfully_depleted()
+ playsound(src, 'sound/effects/pop_expl.ogg', 65)
+ ai_controller?.set_blackboard_key(BB_THETHING_NOAOE, FALSE)
+ remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT)
+ deltimer(phase_invulnerability_timer)
+ phase_invulnerability_timer = null
+ if(phase < 3) //after phase 3 we literally just die
+ phase++
+ emote("scream")
+ update_appearance()
+ var/filter = get_filter(PHASEREGEN_FILTER)
+ if(!isnull(filter))
+ animate(filter)
+ remove_filter(PHASEREGEN_FILTER)
+ SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED)
+ new /obj/effect/gibspawner/human/bodypartless(loc)
+
+/mob/living/basic/boss/thing/proc/phase_too_slow()
+ phase_invulnerability_timer = null
+ remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), MEGAFAUNA_TRAIT)
+ balloon_alert_to_viewers("recovers!")
+ visible_message(span_danger("[src] recovers from the damage! Too slow!"))
+ adjust_health(-(maxHealth/3) * 0.5) //half of a phase (which is a third of maxhealth)
+ var/filter = get_filter(PHASEREGEN_FILTER)
+ if(!isnull(filter))
+ animate(filter)
+ remove_filter(PHASEREGEN_FILTER)
+ emote("roar")
+ SEND_SIGNAL(src, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED)
+
+/mob/living/basic/boss/thing/vv_edit_var(vname, vval)
+ . = ..()
+ if(vname == NAMEOF(src, phase))
+ ai_controller?.set_blackboard_key(BB_THETHING_NOAOE, phase > 1 ? FALSE : TRUE)
+ update_appearance()
+
+/mob/living/basic/boss/thing/with_ruin_loot
+ loot = list(/obj/item/organ/brain/cybernetic/ai) // the main loot of the ruin, but if admin spawned the keycard is useless
+ crusher_loot = list(/obj/item/organ/brain/cybernetic/ai, /obj/item/crusher_trophy/flesh_glob)
+
+// special stuff for our ruin to make a cooler bossfight
+
+/obj/structure/thing_boss_phase_depleter
+ name = "Molecular Accelerator"
+ desc = "Weird-ass lab equipment."
+ icon_state = "thingdepleter"
+ anchored = TRUE
+ density = TRUE
+ move_resist = INFINITY
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ /// is this not broken yet
+ var/functional = TRUE
+ /// boss weakref
+ var/datum/weakref/boss_weakref
+
+/obj/structure/thing_boss_phase_depleter/Initialize(mapload)
+ . = ..()
+ go_in_floor()
+ SSqueuelinks.add_to_queue(src, RUIN_QUEUE, 0)
+
+/obj/structure/thing_boss_phase_depleter/MatchedLinks(id, list/partners)
+ if(id != RUIN_QUEUE)
+ return
+ var/mob/living/basic/boss/thing/thing = locate() in partners
+ if(isnull(thing))
+ qdel(src)
+ return
+ boss_weakref = WEAKREF(thing)
+ RegisterSignal(thing, COMSIG_MEGAFAUNA_THETHING_PHASEUPDATED, PROC_REF(thing_phaseupdated))
+
+/obj/structure/thing_boss_phase_depleter/proc/thing_phaseupdated(mob/living/basic/boss/thing/source)
+ SIGNAL_HANDLER
+ if(!functional)
+ return
+ if(source.phase_invulnerability_timer)
+ go_out_floor()
+ else
+ go_in_floor()
+
+/obj/structure/thing_boss_phase_depleter/examine(mob/user)
+ . = ..()
+ . += density ? span_boldnotice("It may be possible to overload this and destroy that things defenses...") : span_bolddanger("The machine is currently being restrained by tendrils.")
+
+/obj/structure/thing_boss_phase_depleter/proc/set_circuit_floor(state)
+ for(var/turf/open/floor/circuit/circuit in RANGE_TURFS(1, loc))
+ circuit.on = state
+ circuit.update_appearance()
+
+/obj/structure/thing_boss_phase_depleter/proc/go_in_floor()
+ if(!density)
+ return
+ density = FALSE
+ obj_flags &= ~CAN_BE_HIT
+ set_circuit_floor(FALSE)
+ name = "hatch"
+ icon_state = "thingdepleter_infloor"
+
+/obj/structure/thing_boss_phase_depleter/proc/go_out_floor()
+ if(density)
+ return
+ density = TRUE
+ obj_flags |= CAN_BE_HIT
+ set_circuit_floor(TRUE)
+ name = initial(name)
+ icon_state = "thingdepleter"
+ new /obj/effect/temp_visual/mook_dust(loc)
+
+/obj/structure/thing_boss_phase_depleter/interact(mob/user, list/modifiers)
+ var/mob/living/basic/boss/thing/the_thing = boss_weakref?.resolve()
+ if(!the_thing || !functional || !density)
+ return
+ if(!user.can_perform_action(src) || !user.can_interact_with(src))
+ return
+ balloon_alert_to_viewers("overloading...")
+ icon_state = "thingdepleter_overriding"
+ if(!do_after(user, 1 SECONDS, target = src))
+ if(density)
+ icon_state = "thingdepleter"
+ return
+ new /obj/effect/temp_visual/circle_wave/orange(loc)
+ playsound(src, 'sound/effects/explosion/explosion3.ogg', 100)
+ animate(src, transform = matrix()*1.5, time = 0.2 SECONDS)
+ animate(transform = matrix(), time = 0)
+ the_thing.phase_successfully_depleted()
+ functional = FALSE
+ go_in_floor()
+ icon_state = "thingdepleter_overriding"
+ addtimer(VARSET_CALLBACK(src, icon_state, "thingdepleter_broken"), 0.2 SECONDS)
+
+/obj/effect/temp_visual/circle_wave/orange
+ color = COLOR_ORANGE
+
+/obj/structure/aggro_gate
+ name = "biohazard gate"
+ desc = "A wall of solid light, only activating when a human is endangered by a biohazard, unfortunately that does little for safety as it locks you in with said biohazard. Virtually indestructible, you must evade (or kill) the threat."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "wave2"
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
+ move_resist = MOVE_FORCE_OVERPOWERING
+ opacity = FALSE
+ density = FALSE
+ invisibility = INVISIBILITY_MAXIMUM
+ anchored = TRUE
+ /// queue id
+ var/queue_id = RUIN_QUEUE
+ /// blackboard key for target
+ var/target_bb_key = BB_BASIC_MOB_CURRENT_TARGET
+
+/obj/structure/aggro_gate/Initialize(mapload)
+ . = ..()
+ SSqueuelinks.add_to_queue(src, queue_id)
+
+/obj/structure/aggro_gate/MatchedLinks(id, list/partners)
+ if(id != queue_id)
+ return
+ for(var/mob/living/partner in partners)
+ RegisterSignal(partner, COMSIG_AI_BLACKBOARD_KEY_SET(target_bb_key), PROC_REF(bar_the_gates))
+ RegisterSignals(partner, list(COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_bb_key), COMSIG_LIVING_DEATH, COMSIG_MOB_LOGIN), PROC_REF(open_gates))
+
+/obj/structure/aggro_gate/proc/bar_the_gates(mob/living/source)
+ SIGNAL_HANDLER
+ var/atom/target = source.ai_controller?.blackboard[target_bb_key]
+ if (QDELETED(target))
+ return
+ invisibility = INVISIBILITY_NONE
+ density = TRUE
+ playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
+ do_sparks(3, cardinal_only = FALSE, source = src)
+
+/obj/structure/aggro_gate/proc/open_gates(mob/living/source)
+ playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
+ do_sparks(3, cardinal_only = FALSE, source = src)
+ density = FALSE
+ invisibility = INVISIBILITY_MAXIMUM
+
+#undef PHASEREGEN_FILTER
+#undef RUIN_QUEUE
diff --git a/code/modules/mob/living/basic/boss/thing/thing_abilities.dm b/code/modules/mob/living/basic/boss/thing/thing_abilities.dm
new file mode 100644
index 00000000000..3bf466c148f
--- /dev/null
+++ b/code/modules/mob/living/basic/boss/thing/thing_abilities.dm
@@ -0,0 +1,202 @@
+/datum/action/cooldown/mob_cooldown/the_thing
+ shared_cooldown = MOB_SHARED_COOLDOWN_3
+ /// in what phases of The Thing bossfight is this available
+ var/list/available_in_phases = list(1,2,3)
+
+/datum/action/cooldown/mob_cooldown/the_thing/IsAvailable(feedback)
+ var/mob/living/basic/boss/thing/the_thing = owner
+ if(!istype(the_thing))
+ return ..()
+ return ..() && (the_thing.phase in available_in_phases)
+
+//decimate
+
+/datum/action/cooldown/mob_cooldown/the_thing/decimate
+ name = "Decimate"
+ desc = "Create spikes in a radius."
+ button_icon = 'icons/obj/weapons/stabby.dmi'
+ button_icon_state = "huntingknife"
+ click_to_activate = FALSE
+ cooldown_time = 10 SECONDS
+
+/datum/action/cooldown/mob_cooldown/the_thing/decimate/Activate(atom/caster)
+ if(HAS_TRAIT_FROM(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ . = ..()
+
+ ADD_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)
+ caster.Shake(1.4, 0.8, 0.3 SECONDS)
+ caster.visible_message(span_danger("[caster] shakes violently!"))
+
+ for(var/turf/open/target in RANGE_TURFS(2, caster) - caster.loc)
+ new /obj/effect/temp_visual/telegraphing/exclamation/animated(target, 1.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(make_spikes), caster), 1.5 SECONDS)
+
+/datum/action/cooldown/mob_cooldown/the_thing/decimate/proc/make_spikes(atom/caster)
+ REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)
+ for(var/turf/open/target in RANGE_TURFS(2, caster))
+ if(locate(/obj/structure/thing_boss_spike) in target)
+ continue
+ new /obj/structure/thing_boss_spike(target)
+
+// charge
+
+/datum/action/cooldown/mob_cooldown/charge/the_thing
+ shared_cooldown = NONE
+ charge_damage = 35
+ charge_past = 3
+
+/datum/action/cooldown/mob_cooldown/charge/the_thing/charge_sequence(atom/movable/charger, atom/target_atom, delay, past)
+ if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ var/mob/living/basic/boss/thing/the_thing = owner
+ var/charge_count = the_thing.phase != 3 ? 1 : 2
+ for(var/i in 1 to charge_count)
+ do_charge(owner, target_atom, charge_delay * i, charge_past)
+
+/datum/action/cooldown/mob_cooldown/charge/the_thing/do_charge_indicator(atom/charger, atom/charge_target)
+ var/turf/target_turf = get_turf(charge_target)
+ if(!target_turf)
+ return
+ new /obj/effect/temp_visual/telegraphing/exclamation/animated(target_turf)
+ var/obj/effect/temp_visual/decoy/decoy = new /obj/effect/temp_visual/decoy(charger.loc, charger)
+ animate(decoy, alpha = 0, color = COLOR_RED, transform = matrix()*2, time = 3)
+
+/datum/action/cooldown/mob_cooldown/charge/the_thing/hit_target(atom/movable/source, mob/living/target, damage_dealt)
+ target.visible_message(span_danger("[source] lunges into [target]!"), span_userdanger("[source] knocks you into the ground, slashing you in the process!"))
+ target.apply_damage(damage_dealt, BRUTE)
+ target.Knockdown(1 SECONDS)
+ playsound(get_turf(target), 'sound/items/weapons/rapierhit.ogg', 100, TRUE)
+ shake_camera(target, 4, 3)
+
+// square tendrils
+
+/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils
+ name = "Square Tendrils"
+ desc = "Create spikes in a square around the target."
+ button_icon = 'icons/obj/weapons/stabby.dmi'
+ button_icon_state = "huntingknife"
+ cooldown_time = 5 SECONDS
+ available_in_phases = list(2,3)
+
+/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils/Activate(atom/target)
+ if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ . = ..()
+ target = get_turf(target)
+ var/mob/living/living_owner = owner
+ var/delay = 1 SECONDS
+ if((living_owner.health <= living_owner.maxHealth/3) ? 2 : 1)
+ delay += 1 SECONDS
+ new /obj/effect/temp_visual/telegraphing/big(target, delay)
+ else
+ new /obj/effect/temp_visual/telegraphing/exclamation/animated(target)
+ addtimer(CALLBACK(src, PROC_REF(make_spikes), target), delay)
+
+/datum/action/cooldown/mob_cooldown/the_thing/big_tendrils/proc/make_spikes(atom/epicenter)
+ var/mob/living/living_owner = owner
+ var/radius = living_owner.health <= living_owner.maxHealth/3 ? 2 : 1
+ for(var/turf/open/target in RANGE_TURFS(radius, epicenter))
+ if(locate(/obj/structure/thing_boss_spike) in target)
+ continue
+ new /obj/effect/temp_visual/mook_dust(target)
+ new /obj/structure/thing_boss_spike(target)
+
+// shriek
+
+/datum/action/cooldown/mob_cooldown/the_thing/shriek
+ name = "Shriek"
+ desc = "Confuse in a radius."
+ button_icon = 'icons/obj/weapons/stabby.dmi'
+ button_icon_state = "huntingknife"
+ click_to_activate = FALSE
+ cooldown_time = 10 SECONDS
+ shared_cooldown = NONE
+ available_in_phases = list(2,3)
+
+/datum/action/cooldown/mob_cooldown/the_thing/shriek/Activate(atom/caster)
+ if(HAS_TRAIT_FROM(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ . = ..()
+ ADD_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)
+ caster.visible_message(span_danger("[caster][caster.p_s()] flesh starts becoming filled with holes!"))
+ for(var/turf/open/target in RANGE_TURFS(2, caster))
+ new /obj/effect/temp_visual/telegraphing/exclamation(target, 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(shriek), owner), 1 SECONDS)
+
+/datum/action/cooldown/mob_cooldown/the_thing/shriek/proc/shriek(atom/caster)
+ REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)
+ caster.visible_message(span_danger("[caster] shrieks! The sheer frequency of the sound makes your skin hurt and you feel like your brain is on fire!"))
+ SEND_SOUND(caster, sound('sound/effects/screech.ogg'))
+ for(var/mob/living/target in range(2, caster))
+ if(target == owner)
+ continue
+ target.set_confusion_if_lower(5 SECONDS)
+ target.set_jitter_if_lower(5 SECONDS)
+ var/mob/living/carbon/carbon_target = target
+ if(istype(carbon_target))
+ carbon_target.drop_all_held_items()
+ SEND_SOUND(target, sound('sound/effects/screech.ogg'))
+
+// card. tendrils
+
+/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils
+ name = "Cardinal Tendrils"
+ desc = "Create tendrils in all cardinal directions."
+ button_icon = 'icons/obj/weapons/stabby.dmi'
+ button_icon_state = "huntingknife"
+ cooldown_time = 10 SECONDS
+ available_in_phases = list(2,3)
+ click_to_activate = FALSE
+ /// range of tendril
+ var/range = 9
+
+/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/Activate(atom/targetted_turf)
+ if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ . = ..()
+ targetted_turf = get_turf(targetted_turf)
+ owner.Shake(1.4, 0.8, 0.3 SECONDS)
+ owner.visible_message(span_danger("[owner] shakes violently!"))
+ var/list/turf/target_turfs = find_turfs(targetted_turf)
+ for(var/turf/open/target in target_turfs)
+ new /obj/effect/temp_visual/telegraphing/exclamation/animated(target, 1.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(make_spikes), target_turfs, owner), 1.5 SECONDS)
+
+/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/proc/find_turfs(atom/caster)
+ . = list()
+ for(var/direction in GLOB.cardinals)
+ for(var/turf/potential_turf as anything in get_line(caster, get_ranged_target_turf(caster, direction, range)))
+ if(potential_turf.density)
+ break
+ . += potential_turf
+
+/datum/action/cooldown/mob_cooldown/the_thing/cardinal_tendrils/proc/make_spikes(list/target_turfs, atom/caster)
+ REMOVE_TRAIT(caster, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT)
+ for(var/turf/open/target as anything in target_turfs)
+ if(locate(/obj/structure/thing_boss_spike) in target)
+ continue
+ new /obj/effect/temp_visual/mook_dust(target)
+ new /obj/structure/thing_boss_spike(target)
+
+// acid
+
+/datum/action/cooldown/mob_cooldown/the_thing/acid_spit
+ name = "Acid Shower"
+ desc = "Spit patches of acid in a radius around you."
+ button_icon = 'icons/obj/weapons/stabby.dmi'
+ button_icon_state = "huntingknife"
+ cooldown_time = 10 SECONDS
+ click_to_activate = FALSE
+ available_in_phases = list(3)
+
+/datum/action/cooldown/mob_cooldown/the_thing/acid_spit/Activate(atom/target)
+ if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+ . = ..()
+ var/turf/owner_turf = get_turf(owner)
+ owner.visible_message(span_danger("[owner] spits acid!"))
+ var/list/potential = RANGE_TURFS(4, owner_turf)
+
+ for(var/i = 1 to rand(2,4))
+ new /obj/effect/temp_visual/incoming_thing_acid(pick(potential))
diff --git a/code/modules/mob/living/basic/boss/thing/thing_ai.dm b/code/modules/mob/living/basic/boss/thing/thing_ai.dm
new file mode 100644
index 00000000000..9d31d9c7698
--- /dev/null
+++ b/code/modules/mob/living/basic/boss/thing/thing_ai.dm
@@ -0,0 +1,70 @@
+/datum/ai_controller/basic_controller/thing_boss
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/no_gutted_mobs,
+ BB_TARGET_MINIMUM_STAT = DEAD, // Will attack dead ungutted mobs
+ BB_THETHING_ATTACKMODE = TRUE, //Whether we are using our melee abilities right now
+ BB_THETHING_NOAOE = TRUE, // Restricts us to only melee abilities
+ BB_THETHING_LASTAOE = null, // Last AOE ability key executed
+ BB_AGGRO_RANGE = 6, //lets not execute hearers for a 16 tile radius
+ )
+
+ ai_movement = /datum/ai_movement/basic_avoidance // dont need anything better because the arena is a square lol
+ idle_behavior = null
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/simple_find_target/increased_range, //aggros at 6, sees 16 tiles
+ /datum/ai_planning_subtree/thing_boss_aoe,
+ /datum/ai_planning_subtree/thing_boss_melee,
+ )
+
+/datum/ai_planning_subtree/thing_boss_aoe/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick)
+ var/mob/living/pawn = controller.pawn
+ if(HAS_TRAIT_FROM(pawn, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT) || (controller.blackboard[BB_THETHING_ATTACKMODE] || controller.blackboard[BB_THETHING_NOAOE]))
+ return
+ // our target
+ var/mob/living/shaft_miner = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
+ if(QDELETED(shaft_miner) || shaft_miner.stat == DEAD) //Dont use abilities on off z level targets, or dead shaft miners. We want to melee those.
+ return
+
+ controller.set_blackboard_key(BB_THETHING_ATTACKMODE, TRUE) // putting this here so we go to melee mode if we cant do any aoe
+ var/static/list/aoe_attacks = list(BB_THETHING_DECIMATE, BB_THETHING_BIGTENDRILS, BB_THETHING_CARDTENDRILS, BB_THETHING_ACIDSPIT)
+ var/list/possible_attacks = aoe_attacks.Copy() - controller.blackboard[BB_THETHING_LASTAOE]
+ for(var/bb_action_key in possible_attacks)
+ var/datum/action/action = controller.blackboard[bb_action_key]
+ if(!action?.IsAvailable())
+ possible_attacks -= bb_action_key
+ if(!length(possible_attacks))
+ return
+ var/current_aoe_key = pick(possible_attacks)
+ controller.set_blackboard_key(BB_THETHING_LASTAOE, current_aoe_key)
+ controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, current_aoe_key, BB_BASIC_MOB_CURRENT_TARGET)
+ if(prob(60) && shaft_miner.body_position != LYING_DOWN) //potential follow-up
+ controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_THETHING_CHARGE, BB_BASIC_MOB_CURRENT_TARGET)
+ return SUBTREE_RETURN_FINISH_PLANNING
+
+
+/datum/ai_planning_subtree/thing_boss_melee/SelectBehaviors(datum/ai_controller/monkey/controller, seconds_per_tick)
+ var/mob/living/pawn = controller.pawn
+ if(HAS_TRAIT_FROM(pawn, TRAIT_IMMOBILIZED, MEGAFAUNA_TRAIT))
+ return
+
+ // our target
+ var/mob/living/shaft_miner = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
+ if(QDELETED(shaft_miner))
+ return
+ var/target_dist = get_dist(pawn, shaft_miner)
+
+ var/datum/action/shriek = controller.blackboard[BB_THETHING_SHRIEK]
+ var/datum/action/charge = controller.blackboard[BB_THETHING_CHARGE]
+ if(isnull(shriek) || isnull(charge))
+ return // pray this never occurs
+
+ controller.set_blackboard_key(BB_THETHING_ATTACKMODE, FALSE)
+
+ if(shriek.IsAvailable() && target_dist <= 2 && shaft_miner.stat != DEAD)
+ controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/min_range/short, BB_THETHING_SHRIEK, BB_BASIC_MOB_CURRENT_TARGET)
+ return
+ else if(charge.IsAvailable() && target_dist >= 5) // While we cant hit prone targets, this helps to close the distance.
+ controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_THETHING_CHARGE, BB_BASIC_MOB_CURRENT_TARGET)
+ return
+
+ controller.queue_behavior(/datum/ai_behavior/basic_melee_attack, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
diff --git a/code/modules/mob/living/basic/boss/thing/thing_objects.dm b/code/modules/mob/living/basic/boss/thing/thing_objects.dm
new file mode 100644
index 00000000000..b1801b32164
--- /dev/null
+++ b/code/modules/mob/living/basic/boss/thing/thing_objects.dm
@@ -0,0 +1,130 @@
+/obj/structure/thing_boss_spike
+ name = "blades"
+ desc = "A sharp flurry of blades that have erupted from the ground."
+ icon_state = "thingspike"
+ density = FALSE //so ai considers it
+ anchored = TRUE
+ max_integrity = 1 // 1 hit
+ /// time before we fall apart
+ var/expiry_time = 10 SECONDS
+
+/obj/structure/thing_boss_spike/Initialize(mapload)
+ . = ..()
+ var/turf/our_turf = get_turf(src)
+#ifndef UNIT_TESTS //just in case
+ new /obj/effect/temp_visual/mook_dust(loc)
+#endif
+ var/hit_someone = FALSE
+ for(var/atom/movable/potential_target as anything in our_turf)
+ if (ismegafauna(potential_target) || potential_target == src)
+ continue
+ var/mob/living/living_victim = potential_target
+ if(isliving(living_victim))
+ hit_someone = TRUE
+ living_victim.apply_damage(40, damagetype = BRUTE, sharpness = SHARP_POINTY)
+ else if(potential_target.uses_integrity && !(potential_target.resistance_flags & INDESTRUCTIBLE) && !(initial(potential_target.density)) && !HAS_TRAIT(potential_target, TRAIT_UNDERFLOOR))
+ potential_target.take_damage(100, BRUTE)
+ if (hit_someone)
+ expiry_time /= 2
+ playsound(src, 'sound/items/weapons/slice.ogg', vol = 50, vary = TRUE, pressure_affected = FALSE)
+ else
+ playsound(src, 'sound/misc/splort.ogg', vol = 25, vary = TRUE, pressure_affected = FALSE)
+
+ QDEL_IN(src, expiry_time)
+
+/obj/structure/thing_boss_spike/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ if(damage_amount)
+ playsound(src, 'sound/effects/blob/blobattack.ogg', 50, TRUE)
+ else
+ playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE)
+
+/obj/structure/thing_boss_spike/CanAllowThrough(atom/movable/mover, border_dir)
+ . = ..()
+ if(!istype(mover, /mob/living/basic/boss/thing))
+ return FALSE
+
+/obj/structure/thing_boss_spike/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
+ if(!istype(pass_info.requester_ref?.resolve(), /mob/living/basic/boss/thing))
+ return FALSE
+ return ..()
+
+/obj/effect/temp_visual/telegraphing/exclamation
+ icon = 'icons/mob/telegraphing/telegraph.dmi'
+ icon_state = "exclamation"
+ duration = 1 SECONDS
+
+/obj/effect/temp_visual/telegraphing/exclamation/Initialize(mapload, duration)
+ if(!isnull(duration))
+ src.duration = duration
+ return ..()
+
+/obj/effect/temp_visual/telegraphing/exclamation/animated
+ alpha = 0
+
+/obj/effect/temp_visual/telegraphing/exclamation/animated/Initialize(mapload)
+ . = ..()
+ transform = matrix()*2
+ animate(src, alpha = 255, transform = matrix(), time = duration/3)
+
+/obj/effect/temp_visual/telegraphing/big
+ icon = 'icons/mob/telegraphing/telegraph_96x96.dmi'
+ icon_state = "target_largebox"
+ pixel_x = -32
+ pixel_y = -32
+ color = COLOR_RED
+ duration = 2 SECONDS
+
+/obj/effect/temp_visual/incoming_thing_acid
+ icon = 'icons/obj/weapons/guns/projectiles.dmi'
+ icon_state = "toxin"
+ name = "acid"
+ desc = "Get out of the way!"
+ layer = FLY_LAYER
+ plane = ABOVE_GAME_PLANE
+ randomdir = FALSE
+ duration = 0.9 SECONDS
+ pixel_z = 270
+
+/obj/effect/temp_visual/incoming_thing_acid/Initialize(mapload)
+ . = ..()
+ animate(src, pixel_z = 0, time = duration)
+ addtimer(CALLBACK(src, PROC_REF(make_acid)), 0.85 SECONDS)
+
+/obj/effect/temp_visual/incoming_thing_acid/proc/make_acid()
+ for(var/turf/open/open in RANGE_TURFS(1, loc))
+ new /obj/effect/thing_acid(open)
+
+/obj/effect/thing_acid
+ name = "stomach acid"
+ icon = 'icons/effects/acid.dmi'
+ icon_state = "default"
+ layer = BELOW_MOB_LAYER
+ plane = GAME_PLANE
+ anchored = TRUE
+ /// how long does the acid exist for
+ var/duration_time = 5 SECONDS
+
+/obj/effect/thing_acid/Initialize(mapload)
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+ QDEL_IN(src, duration_time)
+
+/obj/effect/thing_acid/proc/on_entered(datum/source, mob/living/victim)
+ SIGNAL_HANDLER
+ if(!istype(victim) || ismegafauna(victim))
+ return
+ for(var/zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ var/blocked = victim.run_armor_check(zone, ACID)
+ victim.apply_damage(25, BURN, def_zone = zone, blocked = blocked)
+ to_chat(victim, span_userdanger("You are burnt by the acid!"))
+ playsound(victim, 'sound/effects/wounds/sizzle1.ogg', vol = 50, vary = TRUE)
+ qdel(src)
+
+/obj/item/keycard/thing_boss
+ name = "Storage Room 2 Keycard"
+ desc = "A fancy keycard for storage room 2."
+ color = COLOR_PALE_GREEN
+ puzzle_id = "thingbosslootroom"
diff --git a/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm b/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm
new file mode 100644
index 00000000000..c27fd7f8d1c
--- /dev/null
+++ b/code/modules/mob/living/basic/ruin_defender/blob_of_flesh.dm
@@ -0,0 +1,72 @@
+/datum/ai_controller/basic_controller/fleshblob
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
+ BB_AGGRO_RANGE = 7,
+ BB_TARGET_MINIMUM_STAT = HARD_CRIT,
+ )
+
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_random_walk
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/simple_find_target,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ )
+
+/mob/living/basic/fleshblob
+ name = "mass of flesh"
+ desc = "A moving slithering mass of flesh, seems to be very much in pain. Better avoid. It has no mouth and it must scream."
+ icon = 'icons/mob/simple/animal.dmi'
+ icon_state = "fleshblob"
+ icon_living = "fleshblob"
+ mob_size = MOB_SIZE_LARGE
+ gender = NEUTER
+ basic_mob_flags = DEL_ON_DEATH
+ faction = list(FACTION_HOSTILE, FACTION_MINING)
+ melee_damage_lower = 3
+ melee_damage_upper = 3
+ health = 160
+ maxHealth = 160
+ attack_sound = 'sound/items/weapons/bite.ogg'
+ attack_vis_effect = ATTACK_EFFECT_SMASH
+ attack_verb_continuous = "attempts to assimilate"
+ attack_verb_simple = "attempt to assimilate"
+ mob_biotypes = MOB_ORGANIC
+ speed = 8
+ combat_mode = TRUE
+ ai_controller = /datum/ai_controller/basic_controller/fleshblob
+
+/mob/living/basic/fleshblob/Initialize(mapload, obj/item/bodypart/limb)
+ . = ..()
+ grant_actions_by_list(list(/datum/action/consume/fleshblob))
+ ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT)
+ AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic)))
+ AddComponent(\
+ /datum/component/blood_walk, \
+ blood_type = /obj/effect/decal/cleanable/blood/trails, \
+ target_dir_change = TRUE,\
+ )
+
+/mob/living/basic/fleshblob/container_resist_act(mob/living/user)
+ . = ..()
+ if(!do_after(user, 4 SECONDS, target = src, timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE|IGNORE_INCAPACITATED))
+ return FALSE
+ var/datum/action/consume/fleshblob/consume = locate() in actions
+ if(isnull(consume))
+ return
+ consume.stop_consuming()
+
+/mob/living/basic/fleshblob/melee_attack(mob/living/target, list/modifiers, ignore_cooldown = FALSE)
+ if(target.loc == src || pulling == target)
+ return FALSE
+ . = ..()
+ if(!istype(target) || isnull(.)) // we deal 0 damage
+ return
+ start_pulling(target, state = GRAB_AGGRESSIVE)
+ var/datum/action/consume/fleshblob/consume = locate() in actions
+ if(isnull(consume))
+ return
+ consume.Trigger() // subtrees wouldve spammed this shit repeatedly anyway
+
+/datum/action/consume/fleshblob
+ devour_verb = "assimilate"
+ devour_time = 3 SECONDS
diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm
index 77ccf3ea483..f8dd01ca3a0 100644
--- a/code/modules/mob/living/simple_animal/hostile/ooze.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm
@@ -202,6 +202,10 @@
button_icon = 'icons/mob/actions/actions_slime.dmi'
button_icon_state = "consume"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE|AB_CHECK_INCAPACITATED
+ /// What do we call devouring something
+ var/devour_verb = "devour"
+ /// how much time to eat someone
+ var/devour_time = 1.5 SECONDS
///The mob thats being consumed by this creature
var/mob/living/vored_mob
@@ -223,8 +227,8 @@
to_chat(src, span_warning("You need to be pulling a creature for this to work!"))
return FALSE
var/mob/living/eat_target = ooze.pulling
- owner.visible_message(span_warning("[ooze] starts attempting to devour [eat_target]!"), span_notice("You start attempting to devour [eat_target]."))
- if(!do_after(ooze, 1.5 SECONDS, eat_target))
+ owner.visible_message(span_warning("[ooze] starts attempting to [devour_verb] [eat_target]!"), span_notice("You start attempting to [devour_verb] [eat_target]."))
+ if(!do_after(ooze, devour_time, eat_target))
return FALSE
if(!(eat_target.mob_biotypes & MOB_ORGANIC) || eat_target.stat == DEAD)
@@ -238,7 +242,7 @@
vored_mob.forceMove(owner) ///AAAAAAAAAAAAAAAAAAAAAAHHH!!!
RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(stop_consuming))
playsound(owner,'sound/items/eatfood.ogg', rand(30,50), TRUE)
- owner.visible_message(span_warning("[src] devours [target]!"), span_notice("You devour [target]."))
+ owner.visible_message(span_warning("[owner] [devour_verb]s [target]!"), span_notice("You [devour_verb] [target]."))
START_PROCESSING(SSprocessing, src)
build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON)
@@ -260,7 +264,8 @@
var/mob/living/simple_animal/hostile/ooze/gelatinous/ooze = owner
vored_mob.adjustBruteLoss(5)
ooze.heal_ordered_damage((ooze.maxHealth * 0.03), list(BRUTE, BURN, OXY)) ///Heal 6% of these specific damage types each process
- ooze.adjust_ooze_nutrition(3)
+ if(istype(ooze))
+ ooze.adjust_ooze_nutrition(3)
///Dump 'em if they're dead.
if(vored_mob.stat == DEAD)
diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
index 1aac6e4c1ae..7b02f618081 100644
--- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
+++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm
@@ -315,6 +315,10 @@ All ShuttleMove procs go here
. = ..()
message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldT)] to [ADMIN_COORDJMP(loc)]")
+/mob/living/basic/boss/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock)
+ . = ..()
+ message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldT)] to [ADMIN_COORDJMP(loc)]")
+
/************************************Structure move procs************************************/
/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock)
diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi
index 62e36fad550..5c419b03cb8 100644
Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ
diff --git a/icons/mob/simple/icemoon/thething.dmi b/icons/mob/simple/icemoon/thething.dmi
new file mode 100644
index 00000000000..7486749471a
Binary files /dev/null and b/icons/mob/simple/icemoon/thething.dmi differ
diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi
index b1ff26a4a10..c655de326f7 100644
Binary files a/icons/mob/telegraphing/telegraph.dmi and b/icons/mob/telegraphing/telegraph.dmi differ
diff --git a/icons/obj/mining_zones/artefacts.dmi b/icons/obj/mining_zones/artefacts.dmi
index 968bbe5b621..a12fdb67042 100644
Binary files a/icons/obj/mining_zones/artefacts.dmi and b/icons/obj/mining_zones/artefacts.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 9c19b982c95..a77b88944cb 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 1fb53dae109..873e223754d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -391,6 +391,7 @@
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_guardian.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm"
+#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_megafauna.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_silicon.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_simple.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_spawner.dm"
@@ -4867,6 +4868,11 @@
#include "code\modules\mob\living\basic\blob_minions\blob_spore.dm"
#include "code\modules\mob\living\basic\blob_minions\blob_zombie.dm"
#include "code\modules\mob\living\basic\blob_minions\blobbernaut.dm"
+#include "code\modules\mob\living\basic\boss\boss.dm"
+#include "code\modules\mob\living\basic\boss\thing\thing.dm"
+#include "code\modules\mob\living\basic\boss\thing\thing_abilities.dm"
+#include "code\modules\mob\living\basic\boss\thing\thing_ai.dm"
+#include "code\modules\mob\living\basic\boss\thing\thing_objects.dm"
#include "code\modules\mob\living\basic\bots\_bots.dm"
#include "code\modules\mob\living\basic\bots\bot_ai.dm"
#include "code\modules\mob\living\basic\bots\bot_hud.dm"
@@ -5067,6 +5073,7 @@
#include "code\modules\mob\living\basic\pets\penguin\penguin_ai.dm"
#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_abilities.dm"
#include "code\modules\mob\living\basic\pets\pet_cult\pet_cult_ai.dm"
+#include "code\modules\mob\living\basic\ruin_defender\blob_of_flesh.dm"
#include "code\modules\mob\living\basic\ruin_defender\cybersun_aicore.dm"
#include "code\modules\mob\living\basic\ruin_defender\dark_wizard.dm"
#include "code\modules\mob\living\basic\ruin_defender\flesh.dm"