diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm
new file mode 100644
index 0000000000000..d35fc52db02b4
--- /dev/null
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm
@@ -0,0 +1,4641 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ac" = (
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"aw" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/floor,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"aA" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"aE" = (
+/obj/item/shovel,
+/obj/structure/rack,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/obj/item/shovel{
+ pixel_x = -5;
+ pixel_y = 1
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"aU" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"be" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"bs" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"bR" = (
+/obj/structure/railing{
+ dir = 8;
+ color = "#beada5"
+ },
+/obj/structure/railing{
+ dir = 4;
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/iron/stairs{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"bV" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"bX" = (
+/obj/structure/table,
+/obj/machinery/gibber,
+/obj/machinery/light/warm/directional/south,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"ca" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"cy" = (
+/obj/structure/chair/wood/wings{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"cC" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/plastic,
+/obj/effect/decal/cleanable/dirt,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"cJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/kitchenspike,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"cO" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"cQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/coffee{
+ pixel_x = 6;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/food_or_drink/jelly_donuts{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"cS" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 5
+ },
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"dc" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = 2;
+ pixel_y = -4
+ },
+/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 5
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"dr" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/machinery/light/floor,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"du" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"dC" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"dP" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/machinery/light/small/dim/directional/west,
+/obj/structure/railing{
+ dir = 5;
+ color = "#beada5"
+ },
+/obj/structure/railing/corner{
+ color = "#beada5"
+ },
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"dQ" = (
+/obj/effect/decal/cleanable/wrapping,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/mob_spawn/corpse/human/assistant,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"eh" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/warm/directional/south,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"ej" = (
+/obj/effect/decal/cleanable/blood/gibs/limb,
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"et" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/kirbyplants/random,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"eB" = (
+/turf/open/floor/iron/stairs/left{
+ color = "#5d341f";
+ dir = 1
+ },
+/area/ruin/huntinglodge)
+"eD" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 8;
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"eE" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 5;
+ pixel_y = 6
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/obj/item/chair/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"eQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"eX" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"fb" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 1
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"fe" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"fi" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"fB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"fK" = (
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"fO" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -4;
+ pixel_y = -3
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/chem_pile,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"fP" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"gu" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = -6;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/entertainment/toy,
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = -14;
+ pixel_y = 0
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"gA" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 2
+ },
+/obj/structure/chair/comfy/brown,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/mob_spawn/corpse/human/minesite/overseer,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"gB" = (
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 11;
+ pixel_y = -13
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/light/warm/directional/north,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"gM" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"gS" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = -4;
+ pixel_y = -7
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"gY" = (
+/turf/open/floor/light/colour_cycle/dancefloor_b,
+/area/ruin/huntinglodge)
+"gZ" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"hb" = (
+/obj/structure/railing{
+ dir = 10;
+ color = "#beada5"
+ },
+/obj/structure/hedge,
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"hf" = (
+/obj/structure/chair/wood/wings{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/blood/gibs/core,
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"hl" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/ash,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -3;
+ pixel_y = -8
+ },
+/obj/item/gun/ballistic/shotgun/riot,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"hm" = (
+/turf/open/floor/iron/stairs/right{
+ color = "#5d341f";
+ dir = 8
+ },
+/area/ruin/huntinglodge)
+"hE" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"hK" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"hP" = (
+/obj/structure/table/wood,
+/obj/item/paper{
+ pixel_x = 3;
+ pixel_y = 6
+ },
+/obj/item/pen/fountain{
+ pixel_x = -10;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/siding/wood/end,
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"hV" = (
+/obj/effect/spawner/structure/window/reinforced{
+ color = "#beada5"
+ },
+/obj/structure/curtain/cloth/fancy,
+/obj/effect/decal/cleanable/blood/splatter/over_window,
+/obj/effect/mapping_helpers/damaged_window,
+/turf/open/floor/plating,
+/area/ruin/huntinglodge)
+"hZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/item/ammo_casing/c45{
+ pixel_x = 7;
+ pixel_y = -5
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"ic" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent,
+/obj/item/gift{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/decal/cleanable/blood/gibs/body,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"if" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"iq" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"iZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/gift,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"jl" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = 2;
+ pixel_y = -3
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"jp" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/item/bodypart/head/ethereal,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/item/chair/stool,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"jr" = (
+/obj/structure/fermenting_barrel,
+/obj/item/reagent_containers/cup/bucket/wooden{
+ pixel_x = 1;
+ pixel_y = 13
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"jF" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"jK" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"jN" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"jQ" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"kf" = (
+/obj/structure/bookcase/random,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"kk" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"kl" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/ash,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"kn" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/turf/open/misc/hay/icemoon,
+/area/icemoon/surface/outdoors/nospawn)
+"kD" = (
+/mob/living/basic/viscerator,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"kH" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"kI" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/chair/stool{
+ pixel_x = -10;
+ pixel_y = -14
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"kJ" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"kP" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"kR" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"lc" = (
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"lv" = (
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/ruin/huntinglodge)
+"lC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"lE" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/blood/gibs/down,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"lJ" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = 11;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = 11;
+ pixel_y = 0
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"lL" = (
+/obj/structure/table/wood,
+/obj/item/toy/talking/ai{
+ pixel_x = -2;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = -18;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/entertainment/plushie,
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = -9;
+ pixel_y = 10
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"lO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood/corner,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"lU" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"mb" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 10
+ },
+/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"mm" = (
+/obj/structure/table/wood,
+/obj/item/storage/cans/sixbeer,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"mo" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"mq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/mob_spawn/corpse/human,
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"mr" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/item/bedsheet/rainbow{
+ dir = 1
+ },
+/obj/effect/mob_spawn/corpse/human/miner/explorer,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"mA" = (
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/ruin/huntinglodge)
+"mG" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/stool/directional/north,
+/obj/item/gun/ballistic/shotgun/riot,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"mX" = (
+/obj/structure/dresser,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"nt" = (
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"nC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -9;
+ pixel_y = -2
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"nI" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/flora/tree/pine/xmas/presentless{
+ pixel_x = -15;
+ pixel_y = 10
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"nK" = (
+/obj/structure/ore_container/food_trough/raptor_trough,
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"nX" = (
+/obj/structure/table/wood/fancy,
+/obj/item/bodypart/head/ethereal,
+/obj/machinery/light/warm/directional/east,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"og" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"oF" = (
+/obj/structure/bookcase/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"oT" = (
+/obj/machinery/computer/security/wooden_tv,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"oW" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"oY" = (
+/obj/structure/railing{
+ dir = 10;
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"pl" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 0;
+ pixel_y = -2
+ },
+/obj/effect/decal/cleanable/chem_pile,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"pr" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/chair/stool{
+ dir = 4;
+ pixel_x = 0;
+ pixel_y = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"pE" = (
+/obj/structure/rack,
+/obj/item/reagent_containers/cup/bucket/wooden{
+ pixel_x = 3;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/bucket/wooden{
+ pixel_x = -7;
+ pixel_y = 3
+ },
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"pF" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"pJ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"pN" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/machinery/light/small/dim/directional/west,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/confetti,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"pU" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/secure_closet/freezer/fridge/all_access,
+/obj/item/food/grown/carrot{
+ pixel_x = 1;
+ pixel_y = 2
+ },
+/obj/item/food/grown/carrot{
+ pixel_x = 6;
+ pixel_y = -2
+ },
+/obj/structure/sink/kitchen/directional/west,
+/obj/machinery/light/warm/directional/north,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"pX" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/decal/cleanable/blood/gibs/down,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"qp" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/item/paper/crumpled/bloody,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"qH" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 9
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"qL" = (
+/obj/structure/table/wood/fancy/orange,
+/obj/item/trash/tray{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/obj/item/bodypart/head{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"qO" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -4;
+ pixel_y = -13
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"qU" = (
+/obj/item/hatchet/wooden{
+ pixel_x = -8;
+ pixel_y = 17
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"qW" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/item/chair/stool,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"qZ" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"ry" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"rI" = (
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"rS" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"sU" = (
+/obj/item/ammo_casing/c45,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"sX" = (
+/obj/structure/table/wood/fancy/royalblack,
+/obj/effect/spawner/random/food_or_drink/jelly_donuts{
+ pixel_x = 6;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/food_or_drink/jelly_donuts{
+ pixel_x = -5;
+ pixel_y = 11
+ },
+/obj/effect/spawner/random/food_or_drink/jelly_donuts{
+ pixel_x = -14;
+ pixel_y = 0
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"ta" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"td" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"tk" = (
+/obj/effect/turf_decal/siding/wood/end,
+/obj/structure/rack,
+/obj/item/clothing/suit/hooded/wintercoat,
+/obj/item/clothing/suit/hooded/wintercoat{
+ pixel_x = -3;
+ pixel_y = 0
+ },
+/obj/item/clothing/suit/hooded/wintercoat{
+ pixel_x = -6;
+ pixel_y = 0
+ },
+/obj/item/pickaxe,
+/obj/item/pickaxe{
+ pixel_x = 5;
+ pixel_y = -2
+ },
+/obj/item/pickaxe{
+ pixel_x = 2;
+ pixel_y = -1
+ },
+/obj/item/flashlight{
+ pixel_x = 0;
+ pixel_y = -2
+ },
+/obj/item/flashlight{
+ pixel_x = 5;
+ pixel_y = -4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"tq" = (
+/obj/machinery/jukebox,
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"tT" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"tY" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/item/gift{
+ pixel_x = 0;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"uc" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mob_spawn/corpse/human/cook,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"uU" = (
+/obj/structure/barricade/wooden/crude/snow,
+/obj/machinery/door/airlock/wood,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"uZ" = (
+/obj/machinery/light/warm/directional/north,
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"vc" = (
+/obj/item/knife/combat/bone{
+ pixel_x = -19;
+ pixel_y = -2
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"vg" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/vomit,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"vr" = (
+/obj/structure/chair/wood/wings{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"vv" = (
+/obj/structure/railing{
+ dir = 10;
+ color = "#beada5"
+ },
+/obj/structure/hedge,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"vH" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"vK" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"vO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/table/wood/fancy,
+/obj/item/gift{
+ pixel_x = 0;
+ pixel_y = 1
+ },
+/obj/item/gift{
+ pixel_x = 5;
+ pixel_y = 10
+ },
+/obj/item/gift{
+ pixel_x = -12;
+ pixel_y = 11
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"vW" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 5
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"wd" = (
+/obj/structure/table/wood/fancy,
+/obj/item/flashlight/lamp/green{
+ pixel_x = 0;
+ pixel_y = 6
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"ws" = (
+/obj/structure/musician/piano{
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"ww" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/vending/dinnerware,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"wC" = (
+/obj/structure/chair/wood/wings{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"wI" = (
+/obj/structure/noticeboard/directional/north,
+/obj/item/gun/ballistic/shotgun/riot{
+ pixel_x = 1;
+ pixel_y = 27
+ },
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green{
+ pixel_x = -1;
+ pixel_y = 5
+ },
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"wO" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"wP" = (
+/obj/effect/decal/cleanable/blood/gibs/up,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"wV" = (
+/obj/structure/fireplace,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"xh" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"xv" = (
+/obj/effect/decal/cleanable/blood/gibs/down,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"xy" = (
+/obj/structure/chair/sofa/bench/left{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"xz" = (
+/obj/effect/decal/cleanable/blood/gibs/body,
+/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"xB" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"xE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/structure/table/wood/fancy,
+/obj/item/gift{
+ pixel_x = -5;
+ pixel_y = 8
+ },
+/obj/item/gift{
+ pixel_x = 4;
+ pixel_y = 9
+ },
+/obj/item/gift{
+ pixel_x = 2;
+ pixel_y = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"xG" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/structure/railing{
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/siding/thinplating{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"xH" = (
+/obj/effect/decal/cleanable/insectguts,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"xM" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/structure/table/wood/fancy/royalblack,
+/obj/machinery/light/warm/directional/west,
+/obj/item/reagent_containers/cup/glass/coffee{
+ pixel_x = -6;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/cup/glass/coffee{
+ pixel_x = 8;
+ pixel_y = 9
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"xQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"ye" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = -17;
+ pixel_y = -1
+ },
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = 1;
+ pixel_y = 2
+ },
+/obj/effect/spawner/random/entertainment/musical_instrument,
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"yk" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"yt" = (
+/obj/structure/chair/wood/wings{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"yB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"yG" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/mob_spawn/corpse/human/miner/explorer,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"yN" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"yO" = (
+/obj/effect/decal/cleanable/garbage,
+/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 2
+ },
+/obj/effect/decal/cleanable/dirt,
+/mob/living/basic/viscerator,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"yR" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = 7;
+ pixel_y = 3
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = -10;
+ pixel_y = -9
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = 1;
+ pixel_y = -7
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/effect/decal/cleanable/ash,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"yW" = (
+/obj/structure/railing/corner{
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"zr" = (
+/obj/effect/decal/cleanable/blood/splatter/over_window,
+/obj/effect/spawner/structure/window/reinforced{
+ color = "#beada5"
+ },
+/obj/structure/curtain/cloth/fancy,
+/turf/open/floor/plating,
+/area/ruin/huntinglodge)
+"zM" = (
+/obj/item/chair/stool/bamboo{
+ dir = 8;
+ color = "#463934"
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"zN" = (
+/turf/open/floor/iron/stairs{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"Ah" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Ao" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = -10;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = 3;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Ar" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/gibs/core,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"As" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 5
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Aw" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"AF" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 10
+ },
+/turf/open/misc/hay/icemoon,
+/area/icemoon/surface/outdoors/nospawn)
+"AG" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 10
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"AV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/oven/range,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"AX" = (
+/obj/structure/table/wood,
+/obj/item/clothing/suit/space/santa,
+/obj/item/storage/backpack/santabag{
+ pixel_x = -9;
+ pixel_y = 3
+ },
+/obj/item/clothing/head/costume/santa{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/ammo_box/magazine/m45{
+ pixel_x = 8;
+ pixel_y = 0
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Bl" = (
+/obj/structure/railing{
+ dir = 6;
+ color = "#beada5"
+ },
+/obj/structure/hedge,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Bm" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = -5;
+ pixel_y = -4
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = -4;
+ pixel_y = 0
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"BE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood/fancy/orange,
+/obj/item/plate/small{
+ pixel_x = -6;
+ pixel_y = 8
+ },
+/obj/item/plate/small{
+ pixel_x = 7;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/cup/glass{
+ pixel_x = 7;
+ pixel_y = 17
+ },
+/obj/item/food/meat/steak/plain/human{
+ pixel_x = -6;
+ pixel_y = 10
+ },
+/obj/item/food/meat/steak/plain/human{
+ pixel_x = 7;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/cup/glass{
+ pixel_x = -8;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"BI" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Cv" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/turf/open/misc/hay/icemoon,
+/area/icemoon/surface/outdoors/nospawn)
+"Cy" = (
+/obj/structure/noticeboard/directional/north,
+/obj/item/bodypart/head{
+ pixel_x = -1;
+ pixel_y = 25
+ },
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/item/paper/crumpled/bloody,
+/obj/machinery/coffeemaker/impressa,
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"CA" = (
+/turf/closed/mineral/snowmountain/cavern/icemoon,
+/area/icemoon/surface/outdoors/nospawn)
+"CC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/chair/stool/directional/west,
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/warm/dim/directional/east,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"CD" = (
+/turf/open/floor/iron/stairs/right{
+ color = "#5d341f";
+ dir = 1
+ },
+/area/ruin/huntinglodge)
+"CE" = (
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/ruin/huntinglodge)
+"CL" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood/fancy,
+/obj/item/gift{
+ pixel_x = -18;
+ pixel_y = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/flashlight/lamp/green{
+ pixel_x = -1;
+ pixel_y = 4
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"CS" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Dc" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Dp" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Dq" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Ds" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"DE" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = -9;
+ pixel_y = -2
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"DF" = (
+/obj/structure/flora/tree/pine/style_2,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"DH" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/machinery/light/warm/directional/east,
+/obj/structure/table/wood,
+/obj/item/clothing/shoes/winterboots/ice_boots,
+/obj/item/clothing/shoes/winterboots/ice_boots{
+ pixel_x = -5;
+ pixel_y = 11
+ },
+/obj/item/clothing/shoes/winterboots/ice_boots{
+ pixel_x = 6;
+ pixel_y = 9
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"DM" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"DO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 8;
+ pixel_y = -7
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"DX" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Ea" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/effect/decal/cleanable/blood/splatter/over_window{
+ pixel_x = -32;
+ pixel_y = 0
+ },
+/obj/item/gift{
+ pixel_x = 7;
+ pixel_y = 3
+ },
+/obj/item/gift{
+ pixel_x = -6;
+ pixel_y = -1
+ },
+/obj/item/gift{
+ pixel_x = -5;
+ pixel_y = 15
+ },
+/obj/item/gift{
+ pixel_x = 4;
+ pixel_y = 13
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Ei" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_casing/c45{
+ pixel_x = -5;
+ pixel_y = -4
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Ej" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Es" = (
+/obj/structure/table/wood/fancy,
+/obj/item/gift{
+ pixel_x = -1;
+ pixel_y = -11
+ },
+/obj/item/gift{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/gift{
+ pixel_x = 9;
+ pixel_y = -11
+ },
+/obj/item/gift{
+ pixel_x = 10;
+ pixel_y = 0
+ },
+/obj/item/gift{
+ pixel_x = 6;
+ pixel_y = 12
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"EB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/gibs/torso,
+/obj/effect/decal/cleanable/chem_pile,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"EG" = (
+/obj/structure/bed,
+/obj/item/bedsheet/gondola,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/mob_spawn/corpse/human/miner/explorer,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"EJ" = (
+/turf/template_noop,
+/area/template_noop)
+"EK" = (
+/obj/effect/decal/cleanable/ash,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -28;
+ pixel_y = 10
+ },
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"EY" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Fw" = (
+/obj/structure/railing{
+ dir = 6;
+ color = "#beada5"
+ },
+/obj/structure/hedge,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Fz" = (
+/obj/item/chair/stool/bamboo{
+ dir = 4;
+ color = "#463934"
+ },
+/obj/item/flashlight/lantern/on{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"FN" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/garbage,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"FX" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -9;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/light/warm/directional/north,
+/obj/effect/decal/cleanable/blood,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 0;
+ pixel_y = -7
+ },
+/obj/effect/decal/cleanable/chem_pile,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Gj" = (
+/obj/structure/bed/double{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/bedsheet/patriot/double{
+ dir = 4
+ },
+/obj/effect/mob_spawn/corpse/human/laborer,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Gl" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/obj/structure/railing/corner/end{
+ dir = 4;
+ color = "#beada5"
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Gn" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Gp" = (
+/obj/effect/spawner/structure/window/reinforced{
+ color = "#beada5"
+ },
+/obj/structure/curtain/cloth/fancy,
+/turf/open/floor/plating,
+/area/ruin/huntinglodge)
+"Gy" = (
+/obj/structure/falsewall/wood,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"GA" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"GD" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent,
+/obj/item/gift{
+ pixel_x = -6;
+ pixel_y = 11
+ },
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"GF" = (
+/obj/structure/chair/sofa/bench{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"GN" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = 3;
+ pixel_y = -4
+ },
+/obj/item/ammo_casing/c45{
+ pixel_x = -5;
+ pixel_y = 0
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"GU" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Hi" = (
+/obj/structure/table/wood/fancy,
+/obj/effect/turf_decal/siding/wood,
+/obj/item/stack/wrapping_paper,
+/obj/item/stack/wrapping_paper{
+ pixel_x = 0;
+ pixel_y = 12
+ },
+/obj/item/gift{
+ pixel_x = -10;
+ pixel_y = 8
+ },
+/obj/item/gift{
+ pixel_x = 0;
+ pixel_y = 14
+ },
+/obj/item/gift{
+ pixel_x = -7;
+ pixel_y = 1
+ },
+/obj/item/gift{
+ pixel_x = 7;
+ pixel_y = 7
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Hm" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Ho" = (
+/obj/structure/closet/crate/trashcart,
+/obj/item/storage/cans/sixbeer,
+/obj/item/knife/hunting{
+ pixel_x = -1;
+ pixel_y = -4
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Hq" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Hr" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Hv" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Hw" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/trash/candle,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Hx" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/decal/cleanable/blood/gibs/core,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"HC" = (
+/obj/structure/chair/wood/wings{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"HK" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"HL" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = 7;
+ pixel_y = 9
+ },
+/obj/effect/spawner/random/entertainment/toy,
+/obj/item/clothing/mask/facehugger/toy{
+ pixel_x = -13;
+ pixel_y = 5
+ },
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Ia" = (
+/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"If" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"Ig" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -6;
+ pixel_y = -1
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Ip" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Iq" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = -9;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Iw" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 4;
+ pixel_y = 7
+ },
+/obj/effect/decal/cleanable/vomit,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Iz" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 2
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"IH" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/wood,
+/obj/item/storage/cans/sixbeer,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"IZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Jb" = (
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/ruin/huntinglodge)
+"Jj" = (
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Jk" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/noticeboard/directional/north,
+/obj/structure/sign/poster/contraband/blood_geometer/directional/east,
+/obj/structure/table/wood,
+/obj/item/paper{
+ pixel_x = 3;
+ pixel_y = 6
+ },
+/obj/machinery/light/small/dim/directional/east,
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Jo" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"JQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/effect/decal/cleanable/blood{
+ icon_state = "floor6-old"
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"JZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Kc" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Kl" = (
+/obj/structure/railing/corner{
+ dir = 8;
+ color = "#beada5"
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"KB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/blood/gibs/limb,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"KU" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Lt" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Lv" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = -7;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = 7;
+ pixel_y = 6
+ },
+/obj/item/dualsaber/toy{
+ pixel_x = -16;
+ pixel_y = 0
+ },
+/obj/item/toy/toy_dagger{
+ pixel_x = 4;
+ pixel_y = -9
+ },
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"LQ" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/item/chair/wood/wings,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Mb" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Mc" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Mf" = (
+/obj/machinery/light/warm/directional/west,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/ruin/huntinglodge)
+"Mw" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/paper/crumpled,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"MJ" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/chair/stool/directional/south,
+/obj/effect/decal/cleanable/plastic,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"MQ" = (
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Nj" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/basic/viscerator,
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Nl" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/stool/directional/north,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Nu" = (
+/turf/open/floor/light/colour_cycle/dancefloor_a,
+/area/ruin/huntinglodge)
+"Nw" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_casing/c45{
+ pixel_x = -5;
+ pixel_y = -4
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"NE" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"NL" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 15;
+ pixel_y = 9
+ },
+/obj/machinery/light/small/dim/directional/south,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"NN" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"NP" = (
+/obj/structure/fermenting_barrel,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"NW" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Oa" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/machinery/light/warm/directional/south,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/brimdust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Of" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/blood/gibs/body,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Ok" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Oq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/brimdust,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Ot" = (
+/obj/structure/table/wood/fancy,
+/obj/item/gift{
+ pixel_x = -4;
+ pixel_y = 9
+ },
+/obj/item/gift{
+ pixel_x = 7;
+ pixel_y = 3
+ },
+/obj/item/gift{
+ pixel_x = -4;
+ pixel_y = -1
+ },
+/obj/item/gift{
+ pixel_x = 2;
+ pixel_y = 10
+ },
+/obj/item/gift{
+ pixel_x = 7;
+ pixel_y = -3
+ },
+/obj/item/gift{
+ pixel_x = 7;
+ pixel_y = 17
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Oz" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/musical_instrument{
+ pixel_x = 3;
+ pixel_y = 2
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"OA" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"OH" = (
+/obj/structure/noticeboard/directional/north,
+/obj/item/paper/crumpled/bloody,
+/obj/item/paper/crumpled/bloody,
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"ON" = (
+/obj/item/flashlight/lantern/on,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"OY" = (
+/obj/machinery/light/small/dim/directional/south,
+/obj/structure/table/wood,
+/obj/item/flashlight/lamp/green{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"OZ" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Pa" = (
+/obj/effect/decal/cleanable/blood/gibs/up,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Pd" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Pi" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/item/ammo_casing/c45{
+ pixel_x = 7;
+ pixel_y = -5
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/structure/closet/crate/bin,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"PK" = (
+/obj/structure/railing{
+ dir = 9;
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 9
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"PS" = (
+/obj/effect/spawner/structure/window/reinforced{
+ color = "#beada5"
+ },
+/obj/structure/curtain/cloth/fancy,
+/obj/effect/decal/cleanable/blood/splatter/over_window,
+/turf/open/floor/plating,
+/area/ruin/huntinglodge)
+"PU" = (
+/turf/open/floor/iron/stairs/medium{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"Qp" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/table/wood/fancy/orange,
+/obj/item/plate/small{
+ pixel_x = -5;
+ pixel_y = 0
+ },
+/obj/item/plate/small{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/cup/glass{
+ pixel_x = -7;
+ pixel_y = 15
+ },
+/obj/item/food/meat/steak/plain/human{
+ pixel_x = -6;
+ pixel_y = 0
+ },
+/obj/item/food/meat/steak/plain/human{
+ pixel_x = 6;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/cup/glass{
+ pixel_x = 9;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet/lone/star,
+/area/ruin/huntinglodge)
+"Qy" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/gibs/limb,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"QB" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"QG" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"QS" = (
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Rg" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Rl" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"RB" = (
+/obj/effect/decal/cleanable/blood/gibs/body,
+/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"RH" = (
+/obj/effect/turf_decal/siding/thinplating{
+ color = "#beada5"
+ },
+/obj/structure/railing{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Sf" = (
+/obj/structure/rack,
+/obj/item/gps/mining,
+/obj/item/gps/mining{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"Sg" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Sl" = (
+/obj/structure/chair/sofa/bench/right{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"So" = (
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Sp" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/gift{
+ pixel_x = -10;
+ pixel_y = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"SK" = (
+/obj/structure/table/wood,
+/obj/item/toy/talking{
+ pixel_x = 1;
+ pixel_y = 10
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"SL" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/chem_pile,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"SN" = (
+/mob/living/basic/raptor/green,
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"SO" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/effect/decal/cleanable/garbage,
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"SS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"SW" = (
+/obj/item/flashlight/lantern/on,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Th" = (
+/obj/effect/decal/cleanable/blood/gibs,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Tp" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Tv" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"TC" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 2
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/gift{
+ pixel_x = -10;
+ pixel_y = -6
+ },
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"TI" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/gun/ballistic/shotgun/doublebarrel,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"TN" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/structure/chair/comfy/brown,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"TO" = (
+/turf/open/floor/iron/stairs/right{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"TV" = (
+/mob/living/basic/migo/hatsune,
+/turf/open/floor/light/colour_cycle,
+/area/ruin/huntinglodge)
+"Uv" = (
+/obj/effect/decal/cleanable/blood/gibs/down,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Ux" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table,
+/obj/item/knife/butcher,
+/obj/item/chainsaw{
+ pixel_x = 1;
+ pixel_y = 2
+ },
+/obj/item/knife,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"UB" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/item/bedsheet/rainbow{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/mob_spawn/corpse/human/miner/explorer,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"UJ" = (
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"US" = (
+/obj/structure/railing{
+ color = "#beada5"
+ },
+/obj/effect/turf_decal/siding/thinplating{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Vb" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_casing/c45{
+ pixel_x = -5;
+ pixel_y = -11
+ },
+/obj/effect/decal/cleanable/glass,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Vk" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/north,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"VC" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 2
+ },
+/obj/item/gift,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"VE" = (
+/turf/open/floor/iron/stairs/left{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"VO" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"VW" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/item/storage/cans/sixbeer{
+ pixel_x = -4;
+ pixel_y = -15
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Wn" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/obj/effect/decal/cleanable/blood/innards,
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/basic/viscerator,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"Ws" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"WC" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"WX" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent{
+ pixel_x = 7;
+ pixel_y = -1
+ },
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/item/gift,
+/turf/open/floor/carpet/green,
+/area/ruin/huntinglodge)
+"Xa" = (
+/obj/effect/decal/cleanable/blood/gibs/up,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"Xd" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Xf" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner,
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"Xk" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Xl" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/flashlight/lamp/green{
+ pixel_x = 0;
+ pixel_y = 4
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"Xs" = (
+/obj/structure/railing{
+ dir = 4;
+ color = "#beada5"
+ },
+/obj/structure/railing{
+ dir = 8;
+ color = "#beada5"
+ },
+/turf/open/floor/iron/stairs{
+ color = "#5d341f"
+ },
+/area/ruin/huntinglodge)
+"Xu" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"XF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/machinery/griddle,
+/turf/open/floor/iron/checker,
+/area/ruin/huntinglodge)
+"XL" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/floor,
+/obj/effect/decal/cleanable/chem_pile,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"XN" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/blood,
+/obj/machinery/light/warm/dim/directional/south,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"XY" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/machinery/light/floor,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/wood/large,
+/area/ruin/huntinglodge)
+"Yr" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Yu" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Yy" = (
+/obj/item/ammo_casing/c45{
+ pixel_x = -1;
+ pixel_y = -1
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"YD" = (
+/obj/effect/spawner/structure/window/reinforced{
+ color = "#beada5"
+ },
+/obj/structure/curtain/cloth/fancy/mechanical/start_closed,
+/turf/open/floor/plating,
+/area/ruin/huntinglodge)
+"YQ" = (
+/turf/open/misc/hay/icemoon,
+/area/ruin/huntinglodge)
+"YR" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"YZ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/mob/living/basic/viscerator,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/huntinglodge)
+"Zg" = (
+/obj/machinery/door/airlock/wood{
+ color = "#beada5"
+ },
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/structure/fans/tiny,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+"Zi" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/ammo_casing/shotgun/buckshot/spent,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/dim/directional/west,
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/tile,
+/area/ruin/huntinglodge)
+"Zk" = (
+/obj/effect/mob_spawn/corpse/human/skeleton/cultist,
+/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
+/area/icemoon/surface/outdoors/nospawn)
+"Zs" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 9
+ },
+/turf/open/floor/stone,
+/area/icemoon/surface/outdoors/nospawn)
+"ZA" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/stone,
+/area/ruin/huntinglodge)
+"ZB" = (
+/obj/structure/table/wood/fancy,
+/obj/item/storage/fancy/candle_box{
+ pixel_x = -1;
+ pixel_y = 5
+ },
+/obj/effect/spawner/random/entertainment/lighter{
+ pixel_x = 6;
+ pixel_y = -1
+ },
+/turf/open/floor/carpet,
+/area/ruin/huntinglodge)
+"ZI" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/item/bodypart/head/ethereal,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/bin,
+/turf/open/floor/wood,
+/area/ruin/huntinglodge)
+"ZN" = (
+/turf/open/floor/iron/stairs/left{
+ color = "#5d341f";
+ dir = 8
+ },
+/area/ruin/huntinglodge)
+"ZT" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy{
+ pixel_x = 5;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = -4;
+ pixel_y = 6
+ },
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = -10;
+ pixel_y = 4
+ },
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"ZV" = (
+/obj/structure/table/wood,
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = 2;
+ pixel_y = 7
+ },
+/obj/effect/spawner/random/entertainment/toy_figure{
+ pixel_x = -5;
+ pixel_y = 0
+ },
+/obj/effect/spawner/random/entertainment/plushie{
+ pixel_x = 8;
+ pixel_y = 1
+ },
+/obj/item/stack/wrapping_paper,
+/turf/open/floor/carpet/red,
+/area/ruin/huntinglodge)
+"ZW" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/dark/herringbone,
+/area/ruin/huntinglodge)
+
+(1,1,1) = {"
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(2,1,1) = {"
+EJ
+EJ
+CA
+CA
+fK
+EJ
+EJ
+EJ
+fK
+DF
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+Zs
+HK
+wO
+HK
+wO
+wO
+gZ
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(3,1,1) = {"
+EJ
+CA
+CA
+fK
+fK
+fK
+fK
+fK
+fK
+fK
+fK
+EJ
+EJ
+EJ
+Zs
+wO
+oW
+fK
+ON
+fK
+Th
+fb
+EY
+bV
+So
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(4,1,1) = {"
+EJ
+CA
+CA
+fK
+ta
+fK
+Jb
+hV
+Gp
+Jb
+fK
+fK
+Zs
+HK
+be
+ta
+fK
+Jb
+Gp
+Jb
+fK
+fK
+Mb
+As
+ry
+gZ
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(5,1,1) = {"
+EJ
+CA
+fK
+DF
+fK
+Jb
+Jb
+Gj
+AX
+Jb
+Jb
+fK
+NW
+fK
+fK
+fK
+Jb
+Jb
+eE
+Jb
+Gp
+Gp
+Jb
+fK
+hE
+ry
+fe
+gZ
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(6,1,1) = {"
+EJ
+EJ
+fK
+fK
+mA
+Jb
+mX
+dc
+KB
+oF
+Jb
+fP
+ZA
+fK
+DF
+fK
+Jb
+Jk
+dQ
+Iz
+og
+Mc
+Jb
+Jb
+fK
+fK
+fK
+NW
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(7,1,1) = {"
+EJ
+EJ
+EJ
+fK
+fK
+Jb
+oT
+Vb
+Bm
+OY
+Jb
+dC
+Jb
+fK
+fK
+Jb
+Jb
+Jb
+Jb
+Jb
+TC
+lc
+Dp
+Jb
+Jb
+Jb
+fK
+NW
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(8,1,1) = {"
+EJ
+EJ
+EJ
+fK
+fK
+Jb
+Jb
+Hm
+Jb
+Jb
+Jb
+mo
+Jb
+Jb
+fK
+Jb
+TN
+xM
+xQ
+Jb
+DX
+Sp
+Ig
+mq
+kJ
+Gp
+aU
+NW
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(9,1,1) = {"
+EJ
+EJ
+fK
+fK
+Jb
+Jb
+Oq
+BI
+Gn
+Jb
+Jb
+Vk
+tk
+Jb
+Jb
+Jb
+lU
+sX
+Ds
+Jb
+gB
+NN
+xv
+qZ
+Hi
+zr
+fK
+NW
+DF
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(10,1,1) = {"
+EJ
+EJ
+ta
+Jb
+Jb
+XY
+eX
+Ip
+xB
+vH
+Jb
+Yr
+Jb
+Jb
+Jb
+iZ
+pl
+IZ
+Iw
+Jb
+QS
+MQ
+lO
+Pa
+YR
+Gp
+fK
+NW
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(11,1,1) = {"
+EJ
+EJ
+mA
+Jb
+wI
+Ei
+yt
+wC
+cy
+SL
+Yr
+Hq
+zN
+Hq
+VE
+DO
+rS
+yB
+tY
+Kc
+kD
+fO
+EK
+Jb
+Jb
+Jb
+fK
+ry
+gZ
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(12,1,1) = {"
+EJ
+EJ
+fK
+Jb
+wV
+yR
+BE
+qL
+Qp
+Oa
+Jb
+Iq
+Jb
+FX
+PU
+hZ
+eQ
+nI
+Lt
+Uv
+Sg
+Hr
+tT
+Jb
+fK
+fK
+fK
+fK
+NW
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(13,1,1) = {"
+EJ
+EJ
+fK
+Jb
+Cy
+Nw
+vr
+hf
+HC
+Tp
+QB
+xh
+zN
+nt
+TO
+VC
+If
+jN
+NL
+Jb
+xH
+LQ
+kH
+Jb
+CA
+fK
+fK
+Zs
+fi
+sU
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(14,1,1) = {"
+EJ
+fK
+DF
+Jb
+Jb
+dr
+gM
+if
+Ar
+yk
+Jb
+Jb
+Jb
+Jb
+Jb
+qp
+hl
+WX
+Pi
+Jb
+YD
+Yr
+YD
+Jb
+CA
+CA
+Zs
+be
+Fz
+Xu
+jl
+EJ
+EJ
+EJ
+EJ
+"}
+(15,1,1) = {"
+EJ
+EJ
+fK
+CA
+Jb
+Jb
+vW
+AG
+fB
+Jb
+Jb
+Nu
+TV
+gY
+Jb
+Jb
+Jj
+pF
+Jb
+Jb
+Xl
+wP
+kf
+Jb
+Jb
+CA
+NW
+fK
+DF
+jr
+du
+EJ
+EJ
+EJ
+EJ
+"}
+(16,1,1) = {"
+EJ
+EJ
+fK
+CA
+CA
+Jb
+Jb
+Zg
+Jb
+Jb
+Jb
+Gy
+Jb
+Jb
+Jb
+Jb
+ZN
+hm
+Jb
+kf
+ca
+xz
+gA
+hP
+Jb
+CA
+ry
+gZ
+zM
+qH
+be
+EJ
+EJ
+EJ
+EJ
+"}
+(17,1,1) = {"
+EJ
+fK
+fK
+fK
+ta
+Mf
+aE
+Dq
+NP
+Jb
+et
+yW
+Xs
+KU
+Jb
+Bl
+kR
+YZ
+Jb
+kf
+SS
+ej
+kf
+Jb
+Jb
+CA
+fK
+Yy
+gS
+be
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(18,1,1) = {"
+EJ
+fK
+fK
+fK
+fK
+fK
+fK
+Tv
+fK
+PS
+Oz
+US
+xE
+TI
+Gp
+Hw
+Qy
+XN
+Jb
+Jb
+Jb
+uU
+Jb
+Jb
+fK
+fK
+fK
+Ho
+NW
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(19,1,1) = {"
+EJ
+DF
+Jb
+Jb
+Jb
+fK
+fK
+yN
+fK
+Gp
+ws
+RH
+CL
+kP
+Yr
+Pd
+Xd
+Yu
+Gp
+fK
+dP
+ac
+VO
+fK
+fK
+fK
+fK
+Zs
+be
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(20,1,1) = {"
+EJ
+Jb
+Jb
+YQ
+Jb
+Jb
+fK
+NW
+fK
+Gp
+CC
+xG
+vO
+ZW
+Gp
+Xk
+Rg
+kl
+hV
+GN
+Zk
+EY
+rI
+Aw
+GU
+fe
+wO
+be
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(21,1,1) = {"
+EJ
+Jb
+nK
+SN
+YQ
+Jb
+fK
+vK
+mA
+Jb
+Jb
+eD
+bR
+NE
+Jb
+vv
+jF
+aA
+Gp
+DE
+vc
+fK
+ta
+fK
+OZ
+fK
+fK
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(22,1,1) = {"
+EJ
+Jb
+Sf
+YQ
+YQ
+YQ
+kn
+Xf
+fK
+fK
+Jb
+Gp
+Jb
+Jb
+Jb
+Jb
+ZN
+hm
+Jb
+Jb
+fK
+DF
+fK
+fK
+Gl
+fK
+fK
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(23,1,1) = {"
+EJ
+Jb
+uZ
+YQ
+Jb
+OH
+Cv
+cO
+fK
+ta
+lv
+fK
+fK
+Jb
+Jb
+Zi
+kk
+JQ
+pN
+Jb
+Jb
+fK
+fK
+PK
+Kl
+oY
+fK
+fK
+DF
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(24,1,1) = {"
+EJ
+Jb
+pE
+cS
+UJ
+YQ
+AF
+ry
+gZ
+fK
+fK
+DF
+fK
+Jb
+GA
+qO
+nC
+vg
+jp
+IH
+Jb
+Jb
+Gp
+Gp
+bs
+Gp
+Jb
+fK
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(25,1,1) = {"
+EJ
+Jb
+nK
+SN
+YQ
+Jb
+QG
+fK
+Hv
+fe
+gZ
+fK
+Jb
+Jb
+XL
+MJ
+lJ
+SK
+Rl
+yG
+Jb
+Fw
+UB
+Ea
+Ej
+mr
+Jb
+Jb
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(26,1,1) = {"
+EJ
+Jb
+Jb
+YQ
+Jb
+Jb
+QG
+fK
+Xf
+DF
+NW
+fK
+Gp
+ZB
+kI
+Ok
+ZV
+lL
+Nl
+lE
+CS
+eB
+SO
+GD
+Wn
+Ia
+mm
+Jb
+CE
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(27,1,1) = {"
+EJ
+CA
+Jb
+Jb
+Jb
+fK
+QG
+SW
+ry
+wO
+VW
+fK
+Gp
+tq
+Mw
+Dc
+Lv
+ye
+JZ
+pr
+hK
+CD
+mb
+Nj
+iq
+ic
+ZI
+Jb
+fK
+DF
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(28,1,1) = {"
+CA
+CA
+fK
+fK
+fK
+fK
+Zk
+qU
+Sl
+GF
+xy
+fK
+Gp
+wd
+Ah
+Jo
+Ao
+HL
+qW
+Of
+Jb
+hb
+EG
+EB
+DH
+EG
+Jb
+Jb
+fK
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+"}
+(29,1,1) = {"
+CA
+CA
+CA
+fK
+fK
+DF
+fK
+fK
+DF
+fK
+fK
+DF
+Jb
+Jb
+aw
+cC
+gu
+ZT
+mG
+eh
+Jb
+Jb
+Jb
+Yr
+Jb
+Jb
+Jb
+fK
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(30,1,1) = {"
+EJ
+CA
+CA
+fK
+fK
+fK
+fK
+fK
+fK
+DF
+fK
+fK
+CA
+Jb
+lC
+WC
+td
+OA
+pX
+cQ
+Jb
+AV
+Xa
+jQ
+ww
+Jb
+fK
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(31,1,1) = {"
+EJ
+CA
+CA
+CA
+CA
+CA
+fK
+fK
+fK
+fK
+DF
+CA
+CA
+Jb
+Jb
+jK
+FN
+DM
+pJ
+Jb
+Jb
+XF
+RB
+yO
+bX
+Jb
+CE
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(32,1,1) = {"
+EJ
+EJ
+CA
+CA
+CA
+CA
+CA
+CA
+CA
+fK
+fK
+CA
+CA
+CA
+Jb
+Es
+nX
+Ot
+Ot
+Jb
+pU
+uc
+jQ
+Hx
+cJ
+Jb
+fK
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(33,1,1) = {"
+EJ
+EJ
+EJ
+EJ
+CA
+CA
+CA
+CA
+CA
+CA
+CA
+CA
+CA
+CA
+Jb
+Gp
+Gp
+Gp
+Gp
+Jb
+Jb
+Ux
+jQ
+Ws
+Jb
+Jb
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(34,1,1) = {"
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+CA
+CA
+CA
+CA
+fK
+lv
+EJ
+EJ
+EJ
+EJ
+lv
+Jb
+Jb
+dC
+Jb
+Jb
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
+(35,1,1) = {"
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm
new file mode 100644
index 0000000000000..994589f0e51e0
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_lowtech.dmm
@@ -0,0 +1,283 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/marker_beacon/burgundy,
+/turf/template_noop,
+/area/space/nearstation)
+"d" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"j" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/space/nearstation)
+"m" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"n" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 4
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"o" = (
+/obj/structure/fluff/sat_dish{
+ pixel_y = -15;
+ pixel_x = -11
+ },
+/obj/structure/fluff/sat_dish{
+ pixel_y = -9;
+ pixel_x = 12
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"p" = (
+/obj/structure/fluff/tram_rail/end,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"s" = (
+/obj/structure/fluff/sat_dish{
+ pixel_x = 15;
+ dir = 8;
+ pixel_y = -7
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"t" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"x" = (
+/obj/structure/fluff/tram_rail/anchor,
+/turf/template_noop,
+/area/space/nearstation)
+"z" = (
+/obj/structure/fluff/commsbuoy_broadcaster,
+/turf/open/floor/iron/recharge_floor/Airless,
+/area/space/nearstation)
+"C" = (
+/obj/structure/fluff/sat_dish{
+ pixel_y = 11;
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"D" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"E" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"F" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"G" = (
+/turf/template_noop,
+/area/space/nearstation)
+"I" = (
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"K" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"L" = (
+/turf/closed/wall/mineral/titanium,
+/area/space/nearstation)
+"M" = (
+/turf/closed/wall/mineral/titanium,
+/area/ruin/space/unpowered)
+"N" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/ruin/space/unpowered)
+"O" = (
+/obj/structure/fluff/commsbuoy_receiver,
+/turf/open/floor/iron/recharge_floor/Airless,
+/area/space/nearstation)
+"P" = (
+/obj/structure/fluff/tram_rail/end,
+/turf/template_noop,
+/area/space/nearstation)
+"S" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"U" = (
+/obj/structure/fluff/commsbuoy_processor,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"X" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"Y" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/fluff/sat_dish{
+ pixel_y = 9;
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/fluff/sat_dish{
+ pixel_y = 15;
+ dir = 1;
+ pixel_x = -11
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"Z" = (
+/turf/open/floor/iron/solarpanel/airless,
+/area/space/nearstation)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+n
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+n
+o
+N
+C
+K
+a
+a
+a
+"}
+(3,1,1) = {"
+m
+K
+s
+N
+X
+O
+Z
+Z
+a
+"}
+(4,1,1) = {"
+I
+S
+M
+N
+c
+L
+j
+Z
+Z
+"}
+(5,1,1) = {"
+I
+F
+N
+N
+G
+p
+a
+a
+a
+"}
+(6,1,1) = {"
+x
+U
+j
+N
+M
+D
+a
+a
+a
+"}
+(7,1,1) = {"
+x
+t
+X
+N
+N
+Y
+Z
+Z
+a
+"}
+(8,1,1) = {"
+I
+d
+a
+N
+j
+X
+Z
+Z
+Z
+"}
+(9,1,1) = {"
+P
+P
+a
+z
+a
+a
+a
+a
+a
+"}
+(10,1,1) = {"
+a
+a
+a
+E
+a
+a
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+P
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm
new file mode 100644
index 0000000000000..4fa47033077dc
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm
@@ -0,0 +1,1209 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aJ" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Comms Buoy Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cutaiwire,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"aL" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"bj" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/ruin/space/nt_commsbuoy)
+"dO" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/space/nt_commsbuoy)
+"dX" = (
+/obj/machinery/computer/terminal/nt_commsbuoy,
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"et" = (
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"ew" = (
+/obj/structure/fluff{
+ name = "telecommunication hub";
+ desc = "A mighty piece of hardware used to send/receive massive amounts of data.";
+ icon = 'icons/obj/machines/telecomms.dmi';
+ icon_state = "hub"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"eX" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/space/nearstation)
+"fx" = (
+/obj/structure/fluff{
+ icon = 'icons/obj/machines/wallmounts.dmi';
+ icon_state = "pod_off";
+ name = "radio dish controller";
+ desc = "A console for adjusting the satellite's radio dishes manually. The screen won't even power on without proper authorization, which you know you're never getting.";
+ pixel_y = 30
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"fJ" = (
+/turf/template_noop,
+/area/template_noop)
+"gw" = (
+/obj/structure/sign/nanotrasen{
+ pixel_x = -32
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"hb" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/end,
+/turf/template_noop,
+/area/space/nearstation)
+"hk" = (
+/obj/structure/table,
+/obj/item/paper/fluff/ruins/nt_commsbuoy/inspection{
+ pixel_y = 3;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/cup/glass/mug/nanotrasen{
+ pixel_y = 5;
+ pixel_x = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"hn" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"hH" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/space{
+ pixel_y = 5;
+ pixel_x = -10
+ },
+/obj/item/clothing/suit/space{
+ pixel_y = 1;
+ pixel_x = 5
+ },
+/obj/item/clothing/head/helmet/space{
+ pixel_x = -7;
+ pixel_y = -5
+ },
+/obj/item/clothing/head/helmet/space{
+ pixel_y = -10;
+ pixel_x = 8
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"in" = (
+/obj/structure/fluff{
+ icon = 'icons/obj/machines/wallmounts.dmi';
+ icon_state = "pod_off";
+ name = "radio dish controller";
+ desc = "A console for adjusting the satellite's radio dishes manually. The screen won't even power on without proper authorization, which you know you're never getting.";
+ pixel_y = 30
+ },
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/mob_spawn/corpse/human/engineer,
+/obj/item/keycard/nt_commsbuoy{
+ pixel_y = 9;
+ pixel_x = 3
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"io" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"it" = (
+/obj/machinery/computer/terminal/nt_commsbuoy/blackbox,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"iv" = (
+/obj/item/stock_parts/subspace/treatment,
+/obj/item/stock_parts/subspace/transmitter,
+/obj/item/stock_parts/subspace/filter,
+/obj/item/stock_parts/subspace/crystal,
+/obj/item/stock_parts/subspace/ansible,
+/obj/item/stock_parts/subspace/analyzer,
+/obj/item/stock_parts/subspace/amplifier,
+/obj/structure/closet/crate/centcom,
+/obj/item/storage/box/lights/bulbs,
+/obj/effect/spawner/random/exotic/technology,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"jy" = (
+/obj/structure/sign/nanotrasen{
+ pixel_y = -32
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"jz" = (
+/obj/structure/sign/nanotrasen{
+ pixel_y = 32
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"kZ" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"lu" = (
+/obj/machinery/porta_turret/syndicate/energy,
+/turf/open/floor/mineral/titanium/yellow,
+/area/ruin/space/nt_commsbuoy)
+"lB" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"lT" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"lY" = (
+/obj/structure/table,
+/obj/structure/noticeboard/directional/north,
+/obj/item/paper/fluff/ruins/nt_commsbuoy/table_of_contents,
+/obj/machinery/light/small/directional/east,
+/obj/item/gps/spaceruin{
+ pixel_y = 4;
+ pixel_x = 5
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"mu" = (
+/obj/structure/fluff/fake_camera{
+ dir = 9
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"nn" = (
+/obj/structure/frame/computer{
+ dir = 1
+ },
+/obj/item/shard,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"oA" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"pC" = (
+/obj/machinery/door/puzzle/keycard/nt_commsbuoy,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"pR" = (
+/turf/open/floor/mineral/titanium/white/airless,
+/area/space/nearstation)
+"qi" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"ri" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"rl" = (
+/obj/structure/fluff{
+ icon = 'icons/mob/simple/hivebot.dmi';
+ icon_state = "def_radar-off";
+ name = "radio dish component";
+ desc = "Remarkable Nanotrasen technology. This does... something to make the radio dish work.";
+ pixel_y = 16
+ },
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"tq" = (
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 9
+ },
+/obj/structure/rack,
+/obj/effect/spawner/random/engineering/tool_advanced,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"tx" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/space/nearstation)
+"tO" = (
+/obj/structure/fluff{
+ icon = 'icons/obj/machines/wallmounts.dmi';
+ icon_state = "airlock_control_standby";
+ name = "radio dish component";
+ desc = "Remarkable Nanotrasen technology. This does... something to make the radio dish work.";
+ pixel_y = 32;
+ pixel_x = 6
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"uG" = (
+/obj/structure/fluff/commsbuoy_receiver,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"uH" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail/end{
+ dir = 4
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"vr" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Comms Buoy External Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"wS" = (
+/obj/structure/lattice,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"xI" = (
+/obj/structure/cable,
+/obj/machinery/power/smes/full,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"yk" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 4
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"zt" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/mapping_helpers/airlock/cutaiwire,
+/obj/machinery/door/airlock/titanium{
+ name = "Comms Buoy Airlock"
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"zA" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail/anchor{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"zO" = (
+/obj/structure/lattice,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"Ad" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"AA" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"AD" = (
+/obj/machinery/computer/terminal/nt_commsbuoy/relay{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"AE" = (
+/obj/structure/sign/warning/vacuum/external/directional/east,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"Br" = (
+/obj/structure/cable,
+/turf/open/floor/mineral/titanium/yellow,
+/area/ruin/space/nt_commsbuoy)
+"CN" = (
+/obj/effect/mob_spawn/corpse/human/nanotrasensoldier,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"DW" = (
+/obj/structure/fluff/sat_dish{
+ dir = 8;
+ pixel_y = -5;
+ pixel_x = 17
+ },
+/obj/structure/fluff/sat_dish{
+ pixel_y = -10;
+ pixel_x = -5
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"EA" = (
+/obj/structure/closet/firecloset/full,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"EQ" = (
+/obj/structure/fluff/sat_dish{
+ pixel_y = -18;
+ pixel_x = 6
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"ES" = (
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/space/nt_commsbuoy)
+"FC" = (
+/turf/closed/wall/mineral/iron,
+/area/ruin/space/nt_commsbuoy)
+"FH" = (
+/obj/structure/sign/nanotrasen{
+ pixel_x = -32
+ },
+/obj/structure/rack,
+/obj/item/clothing/suit/space/syndicate/orange{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/space/syndicate/orange{
+ pixel_x = 9;
+ pixel_y = -5
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"FK" = (
+/obj/structure/fluff/tram_rail/end,
+/turf/template_noop,
+/area/space/nearstation)
+"Gd" = (
+/obj/structure/fluff/commsbuoy_processor,
+/obj/structure/sign/nanotrasen{
+ pixel_x = 32
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"Gq" = (
+/obj/structure/sign/warning/radiation/directional/south,
+/turf/open/floor/mineral/titanium/yellow,
+/area/ruin/space/nt_commsbuoy)
+"Gw" = (
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/effect/mapping_helpers/apc/cell_5k,
+/obj/effect/mapping_helpers/apc/full_charge,
+/obj/effect/mapping_helpers/apc/unlocked,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"HC" = (
+/obj/structure/fluff/commsbuoy_broadcaster,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"II" = (
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"Jp" = (
+/obj/structure/cable,
+/obj/machinery/power/rtg/advanced,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"Jv" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"Kr" = (
+/obj/machinery/power/rtg/advanced,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"Lc" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"LI" = (
+/obj/machinery/telecomms/relay/preset/telecomms,
+/obj/structure/fluff/fake_camera{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"Mc" = (
+/obj/effect/decal/cleanable/greenglow/radioactive,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"Mp" = (
+/obj/structure/fluff/fake_camera{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"Qb" = (
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/cutaiwire,
+/obj/machinery/door/airlock/titanium{
+ name = "Comms Buoy Airlock"
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/ruin/space/nt_commsbuoy)
+"Qd" = (
+/obj/effect/decal/cleanable/blood/trails{
+ dir = 6
+ },
+/obj/item/paper/fluff/ruins/nt_commsbuoy/torn_page,
+/obj/structure/fluff/fake_camera{
+ dir = 5
+ },
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"Re" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"RY" = (
+/obj/structure/fluff/tram_rail,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"TS" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/end,
+/turf/template_noop,
+/area/space/nearstation)
+"UR" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"Vg" = (
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"VI" = (
+/obj/structure/fluff/fake_camera{
+ dir = 8
+ },
+/turf/template_noop,
+/area/template_noop)
+"Ws" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"WI" = (
+/obj/structure/fluff{
+ name = "comms buoy blackbox recorder";
+ desc = "A recording device that logs recent events and communications in the event of a catastrophic failiure or accident. This one is haphazardly adjusted to print the readout onto the accompanying console.";
+ icon = 'icons/obj/machines/telecomms.dmi';
+ icon_state = "blackbox"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/ruin/space/nt_commsbuoy)
+"Xi" = (
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"Yp" = (
+/obj/structure/fluff/fake_camera{
+ dir = 5
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"Yr" = (
+/turf/closed/wall/mineral/titanium,
+/area/ruin/space/nt_commsbuoy)
+"YN" = (
+/obj/structure/cable,
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+"YY" = (
+/turf/open/floor/plating,
+/area/ruin/space/nt_commsbuoy)
+
+(1,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(2,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+uG
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(3,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+hn
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(4,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+fJ
+hn
+fJ
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(5,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+Yr
+pR
+Yr
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(6,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(7,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+FC
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(8,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+bj
+bj
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(9,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+fx
+Mp
+hk
+bj
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(10,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+dX
+et
+AD
+bj
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(11,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+bj
+aJ
+bj
+bj
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(12,1,1) = {"
+fJ
+yk
+fJ
+fJ
+fJ
+fJ
+bj
+tq
+gw
+et
+EA
+bj
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(13,1,1) = {"
+fJ
+UR
+fJ
+fJ
+fJ
+DW
+bj
+it
+et
+et
+bj
+bj
+bj
+Yr
+fJ
+fJ
+fJ
+fJ
+"}
+(14,1,1) = {"
+fJ
+aL
+fJ
+yk
+EQ
+Yr
+bj
+WI
+et
+Gq
+bj
+YY
+iv
+bj
+fJ
+fJ
+yk
+fJ
+"}
+(15,1,1) = {"
+fJ
+wS
+hn
+zO
+hn
+bj
+bj
+ew
+et
+Br
+Qb
+Xi
+xI
+bj
+fJ
+fJ
+lT
+fJ
+"}
+(16,1,1) = {"
+fJ
+ri
+yk
+UR
+fJ
+eX
+bj
+LI
+et
+Br
+bj
+Mc
+YN
+bj
+fJ
+oA
+lT
+fJ
+"}
+(17,1,1) = {"
+fJ
+FK
+zO
+wS
+fJ
+hn
+bj
+Gd
+io
+Gw
+bj
+Kr
+Jp
+bj
+fJ
+Vg
+Ad
+fJ
+"}
+(18,1,1) = {"
+fJ
+fJ
+lT
+hb
+fJ
+fJ
+Yr
+bj
+bj
+pC
+bj
+bj
+bj
+Yr
+fJ
+Vg
+Jv
+fJ
+"}
+(19,1,1) = {"
+fJ
+fJ
+Re
+fJ
+fJ
+fJ
+fJ
+bj
+et
+et
+et
+EA
+bj
+fJ
+fJ
+Vg
+aL
+fJ
+"}
+(20,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+jz
+ES
+ES
+jy
+bj
+fJ
+fJ
+uH
+TS
+fJ
+"}
+(21,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+mu
+ES
+ES
+et
+bj
+fJ
+fJ
+qi
+lT
+fJ
+"}
+(22,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+et
+ES
+ES
+et
+bj
+Yr
+fJ
+qi
+UR
+fJ
+"}
+(23,1,1) = {"
+fJ
+fJ
+Yr
+Yr
+fJ
+fJ
+bj
+lu
+et
+ES
+ES
+et
+lu
+bj
+fJ
+HC
+aL
+fJ
+"}
+(24,1,1) = {"
+fJ
+fJ
+fJ
+Yr
+Yr
+fJ
+bj
+tO
+et
+ES
+ES
+et
+Lc
+bj
+eX
+tx
+zA
+fJ
+"}
+(25,1,1) = {"
+fJ
+rl
+hn
+pR
+bj
+FC
+bj
+in
+et
+ES
+ES
+et
+nn
+bj
+Ws
+tx
+RY
+fJ
+"}
+(26,1,1) = {"
+fJ
+fJ
+fJ
+Yr
+Yr
+fJ
+bj
+dX
+CN
+ES
+dO
+Yp
+bj
+bj
+fJ
+tx
+zA
+fJ
+"}
+(27,1,1) = {"
+fJ
+fJ
+Yr
+Yr
+fJ
+fJ
+bj
+lY
+kZ
+AE
+lB
+et
+bj
+fJ
+fJ
+qi
+aL
+fJ
+"}
+(28,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+bj
+bj
+zt
+bj
+Yr
+fJ
+fJ
+AA
+TS
+fJ
+"}
+(29,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+FH
+CN
+Qd
+bj
+fJ
+fJ
+fJ
+Vg
+Re
+fJ
+"}
+(30,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+bj
+II
+YY
+hH
+bj
+fJ
+fJ
+fJ
+FK
+fJ
+fJ
+"}
+(31,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+Yr
+bj
+vr
+bj
+Yr
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
+(32,1,1) = {"
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+VI
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+fJ
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm
new file mode 100644
index 0000000000000..18f2117135c4d
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_pirate.dmm
@@ -0,0 +1,299 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 4
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"d" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"f" = (
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"g" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ruin/space/unpowered)
+"h" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"i" = (
+/obj/structure/lattice,
+/obj/structure/sign/poster/contraband/self_ai_liberation/directional/north,
+/turf/template_noop,
+/area/space/nearstation)
+"j" = (
+/obj/structure/sign/poster/contraband/syndicate_recruitment/directional/west,
+/obj/structure/fluff/commsbuoy_broadcaster,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"m" = (
+/obj/structure/billboard/nanotrasen/defaced,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"o" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"r" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"s" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/marker_beacon/burgundy,
+/turf/template_noop,
+/area/space/nearstation)
+"u" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/sign/poster/contraband/free_key/directional/south,
+/turf/template_noop,
+/area/space/nearstation)
+"v" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"w" = (
+/obj/structure/fluff/tram_rail/anchor{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/end{
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"x" = (
+/obj/structure/fluff/tram_rail/end,
+/turf/template_noop,
+/area/space/nearstation)
+"B" = (
+/obj/structure/fluff/commsbuoy_processor,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"C" = (
+/obj/structure/fluff/sat_dish{
+ pixel_y = -15;
+ pixel_x = -11
+ },
+/obj/structure/fluff/sat_dish{
+ pixel_y = -9;
+ pixel_x = 12
+ },
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"D" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"E" = (
+/turf/open/floor/iron/solarpanel/airless,
+/area/space/nearstation)
+"F" = (
+/obj/structure/lattice,
+/obj/structure/fluff/tram_rail{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"G" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"J" = (
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"K" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/space/unpowered)
+"O" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/space/nearstation)
+"P" = (
+/obj/structure/fluff/commsbuoy_receiver,
+/turf/open/floor/plating/reinforced/airless,
+/area/space/nearstation)
+"Q" = (
+/obj/structure/fluff/tram_rail,
+/turf/template_noop,
+/area/space/nearstation)
+"S" = (
+/obj/structure/fluff/sat_dish{
+ pixel_y = 11;
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"T" = (
+/obj/structure/fluff/sat_dish{
+ pixel_x = 17;
+ dir = 8;
+ pixel_y = -8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"W" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/space/nearstation)
+"X" = (
+/obj/structure/fluff/tram_rail/end{
+ dir = 1
+ },
+/obj/structure/fluff/tram_rail/anchor,
+/turf/template_noop,
+/area/space/nearstation)
+"Y" = (
+/obj/structure/fluff/tram_rail/anchor,
+/turf/template_noop,
+/area/space/nearstation)
+"Z" = (
+/obj/structure/fluff/tram_rail/anchor{
+ dir = 1
+ },
+/turf/template_noop,
+/area/space/nearstation)
+
+(1,1,1) = {"
+a
+c
+a
+a
+a
+c
+a
+a
+"}
+(2,1,1) = {"
+a
+F
+C
+K
+S
+o
+a
+a
+"}
+(3,1,1) = {"
+h
+f
+T
+K
+i
+P
+E
+a
+"}
+(4,1,1) = {"
+Y
+w
+g
+K
+s
+O
+E
+E
+"}
+(5,1,1) = {"
+x
+d
+K
+K
+g
+G
+W
+E
+"}
+(6,1,1) = {"
+h
+B
+u
+K
+K
+m
+E
+E
+"}
+(7,1,1) = {"
+Y
+r
+v
+K
+K
+v
+W
+E
+"}
+(8,1,1) = {"
+Q
+D
+a
+K
+g
+J
+E
+E
+"}
+(9,1,1) = {"
+Q
+x
+a
+j
+c
+E
+E
+a
+"}
+(10,1,1) = {"
+x
+a
+a
+X
+Z
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+x
+f
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+a
+a
+G
+a
+a
+a
+"}
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 096cf003ac4eb..ded3dcd76d24e 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -26151,6 +26151,7 @@
},
/obj/structure/closet/secure_closet/captains,
/obj/machinery/firealarm/directional/north,
+/obj/item/storage/lockbox/medal,
/turf/open/floor/carpet/royalblue,
/area/station/command/heads_quarters/captain/private)
"jpe" = (
@@ -38292,7 +38293,7 @@
},
/obj/structure/cable,
/obj/effect/mapping_helpers/apc/cell_5k,
-/turf/open/floor/circuit/green,
+/turf/open/floor/circuit/green/telecomms/mainframe,
/area/station/ai_monitored/turret_protected/ai)
"nAa" = (
/obj/machinery/door/firedoor/border_only{
@@ -41519,7 +41520,7 @@
name = "AI Core Shutters"
},
/obj/structure/cable,
-/turf/open/floor/circuit/green,
+/turf/open/floor/circuit/green/telecomms/mainframe,
/area/station/ai_monitored/turret_protected/ai)
"oOb" = (
/obj/effect/turf_decal/tile/neutral{
diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index 4f1cf4b746ac6..a6dccb5e2268e 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -58,6 +58,7 @@
#define MEDAL_SISYPHUS "Sisyphus"
#define MEDAL_ARCHMAGE "Archmage"
#define MEDAL_CIGARETTES "Cigarettes"
+#define MEDAL_SHARKDRAGON "Sharkdragon"
#define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits"
//Skill medal hub IDs
diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm
index e6f4feb259a59..17db402c6c04d 100644
--- a/code/__DEFINES/alerts.dm
+++ b/code/__DEFINES/alerts.dm
@@ -19,7 +19,6 @@
#define ALERT_BUCKLED "buckled"
#define ALERT_HANDCUFFED "handcuffed"
#define ALERT_LEGCUFFED "legcuffed"
-#define ALERT_WOUNDED "wound"
#define ALERT_IRRADIATED "irradiated"
#define ALERT_EMBEDDED_OBJECT "embeddedobject"
#define ALERT_SHOES_KNOT "shoealert"
diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm
index 477bed243c1a2..39db31f794685 100644
--- a/code/__DEFINES/configuration.dm
+++ b/code/__DEFINES/configuration.dm
@@ -28,3 +28,9 @@
#define RESPAWN_FLAG_FREE 1
/// Can respawn, but not as the same character
#define RESPAWN_FLAG_NEW_CHARACTER 2
+
+// Human authority defines
+#define HUMAN_AUTHORITY_DISABLED "DISABLED"
+#define HUMAN_AUTHORITY_HUMAN_WHITELIST "HUMAN_WHITELIST"
+#define HUMAN_AUTHORITY_NON_HUMAN_WHITELIST "NON_HUMAN_WHITELIST"
+#define HUMAN_AUTHORITY_ENFORCED "ENFORCED"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
index b95ffba607fd3..80c6f89a10884 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
@@ -42,8 +42,8 @@
/// Called from update_health_hud, whenever a bodypart is being updated on the health doll
#define COMSIG_BODYPART_UPDATING_HEALTH_HUD "bodypart_updating_health_hud"
- /// Return to override that bodypart's health hud with your own icon
- #define COMPONENT_OVERRIDE_BODYPART_HEALTH_HUD (1<<0)
+ /// Return to override that bodypart's health hud with whatever is returned by the list
+ #define OVERRIDE_BODYPART_HEALTH_HUD (1<<0)
/// Called from /obj/item/bodypart/check_for_injuries (mob/living/carbon/examiner, list/check_list)
#define COMSIG_BODYPART_CHECKED_FOR_INJURY "bodypart_injury_checked"
diff --git a/code/__DEFINES/gravity.dm b/code/__DEFINES/gravity.dm
index f61734cd55fc9..da81c0465cabc 100644
--- a/code/__DEFINES/gravity.dm
+++ b/code/__DEFINES/gravity.dm
@@ -12,6 +12,34 @@
/// Singularity is stage 6 (11x11)
#define STAGE_SIX 11 //From supermatter shard
+// Minimum energy needed to reach a stage
+/// Singularity stage 1 energy requirement
+#define STAGE_ONE_ENERGY_REQUIREMENT 1
+/// Singularity stage 2 energy requirement
+#define STAGE_TWO_ENERGY_REQUIREMENT 200
+/// Singularity stage 3 energy requirement
+#define STAGE_THREE_ENERGY_REQUIREMENT 500
+/// Singularity stage 4 energy requirement
+#define STAGE_FOUR_ENERGY_REQUIREMENT 1000
+/// Singularity stage 5 energy requirement
+#define STAGE_FIVE_ENERGY_REQUIREMENT 2000
+/// Singularity stage 6 energy requirement (also needs to consume a SM shard)
+#define STAGE_SIX_ENERGY_REQUIREMENT 3000
+
+// These values get the median number between two stages to prevent expansion/shrinkage immediately
+/// Singularity stage 1
+#define STAGE_ONE_ENERGY ((STAGE_TWO_ENERGY_REQUIREMENT - STAGE_ONE_ENERGY_REQUIREMENT) * 0.5) + STAGE_ONE_ENERGY_REQUIREMENT
+/// Singularity stage 2
+#define STAGE_TWO_ENERGY ((STAGE_THREE_ENERGY_REQUIREMENT - STAGE_TWO_ENERGY_REQUIREMENT) * 0.5) + STAGE_TWO_ENERGY_REQUIREMENT
+/// Singularity stage 3
+#define STAGE_THREE_ENERGY ((STAGE_FOUR_ENERGY_REQUIREMENT - STAGE_THREE_ENERGY_REQUIREMENT) * 0.5) + STAGE_THREE_ENERGY_REQUIREMENT
+/// Singularity stage 4
+#define STAGE_FOUR_ENERGY ((STAGE_FIVE_ENERGY_REQUIREMENT - STAGE_FOUR_ENERGY_REQUIREMENT) * 0.5) + STAGE_FOUR_ENERGY_REQUIREMENT
+/// Singularity stage 5
+#define STAGE_FIVE_ENERGY ((STAGE_SIX_ENERGY_REQUIREMENT - STAGE_FIVE_ENERGY_REQUIREMENT) * 0.5) + STAGE_FIVE_ENERGY_REQUIREMENT
+/// Singularity stage 6 (hardcoded at 4000 since there is no stage 7)
+#define STAGE_SIX_ENERGY 4000
+
/**
* The point where gravity is negative enough to pull you upwards.
* That means walking checks for a ceiling instead of a floor, and you can fall "upwards"
diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index 953e7648009b8..b0b8993a22357 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -12,6 +12,11 @@
/// Used when the `get_job_unavailable_error_message` proc can't make sense of a given code.
#define GENERIC_JOB_UNAVAILABLE_ERROR "Error: Unknown job availability."
+// Human authority settings
+// If you want to add another setting, make sure to also add it to the if chain in /datum/job_config_type/human_authority/validate_value()
+#define JOB_AUTHORITY_HUMANS_ONLY "HUMANS_ONLY"
+#define JOB_AUTHORITY_NON_HUMANS_ALLOWED "NON_HUMANS_ALLOWED"
+
#define DEFAULT_RELIGION "Christianity"
#define DEFAULT_DEITY "Space Jesus"
#define DEFAULT_BIBLE "Default Bible Name"
@@ -25,6 +30,7 @@
#define JOB_CONFIG_REQUIRED_CHARACTER_AGE "Required Character Age"
#define JOB_CONFIG_SPAWN_POSITIONS "Spawn Positions"
#define JOB_CONFIG_TOTAL_POSITIONS "Total Positions"
+#define JOB_CONFIG_HUMAN_AUTHORITY "Human Authority Whitelist Setting"
/**
* =======================
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index f27e5473778d6..0fbdc0d44b2b6 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -187,3 +187,5 @@ GLOBAL_LIST_INIT(announcer_keys, list(
#define SFX_CAT_MEOW "cat_meow"
#define SFX_CAT_PURR "cat_purr"
#define SFX_LIQUID_POUR "liquid_pour"
+#define SFX_SNORE_FEMALE "snore_female"
+#define SFX_SNORE_MALE "snore_male"
diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm
index 5dee00db3103a..61be539749e1c 100644
--- a/code/__DEFINES/supermatter.dm
+++ b/code/__DEFINES/supermatter.dm
@@ -69,6 +69,15 @@
#define SLIGHTLY_CHARGED_ZAP_ICON_STATE "sm_arc_supercharged"
#define OVER_9000_ZAP_ICON_STATE "sm_arc_dbz_referance" //Witty I know
+// Zap energy accumulation keys.
+/// Normal zap energy accumulation key from normal operations.
+#define ZAP_ENERGY_ACCUMULATION_NORMAL "normal"
+/// High energy zap energy accumulation key from high energy extra effects.
+#define ZAP_ENERGY_ACCUMULATION_HIGH_ENERGY "high"
+
+/// Zap energy discharge portion per tick.
+#define ZAP_ENERGY_DISCHARGE_PORTION 0.1
+
#define SUPERMATTER_DEFAULT_BULLET_ENERGY 2
#define SUPERMATTER_CASCADE_PERCENT 80
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 4fdf598f65977..06f1bd6764b2a 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -963,6 +963,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///A trait for mechs that were created through the normal construction process, and not spawned by map or other effects.
#define TRAIT_MECHA_CREATED_NORMALLY "trait_mecha_created_normally"
+/// Stops a movable from being removed from the mob it's in by the content_barfer component.
+#define TRAIT_NOT_BARFABLE "not_barfable"
+
///fish traits
#define TRAIT_FISH_STASIS "fish_stasis"
#define TRAIT_FISH_FLOPPING "fish_flopping"
diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm
index 131e530ce82ac..e112d376adf5d 100644
--- a/code/_globalvars/phobias.dm
+++ b/code/_globalvars/phobias.dm
@@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list(
)),
"carps" = typecacheof(list(
/mob/living/basic/carp,
+ /mob/living/basic/space_dragon,
)),
"conspiracies" = typecacheof(list(
/mob/living/basic/drone,
@@ -247,6 +248,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/clothing/mask/gas/carp,
/obj/item/cigarette/carp,
/obj/item/clothing/under/suit/carpskin,
+ /obj/item/fish/baby_carp,
/obj/item/food/cubancarp,
/obj/item/food/fishmeat/carp,
/obj/item/grenade/clusterbuster/spawner_spesscarp,
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index dad143c4279db..29e3ea84f1465 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -57,11 +57,13 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING,
"TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN,
"TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING,
- "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE,
+ "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN,
"TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM,
"TRAIT_NO_MANIFEST_CONTENTS_ERROR" = TRAIT_NO_MANIFEST_CONTENTS_ERROR,
"TRAIT_NO_MISSING_ITEM_ERROR" = TRAIT_NO_MISSING_ITEM_ERROR,
"TRAIT_NO_THROW_HITPUSH" = TRAIT_NO_THROW_HITPUSH,
+ "TRAIT_NOT_BARFABLE" = TRAIT_NOT_BARFABLE,
+ "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE,
"TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT,
"TRAIT_ON_HIT_EFFECT" = TRAIT_ON_HIT_EFFECT,
"TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN,
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 2f15e52ff31f6..a25b85637b140 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
var/atom/movable/screen/healths
var/atom/movable/screen/stamina
- var/atom/movable/screen/healthdoll
+ var/atom/movable/screen/healthdoll/healthdoll
var/atom/movable/screen/spacesuit
var/atom/movable/screen/hunger
// subtypes can override this to force a specific UI style
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 0ab0f022ca22e..3372fcc9be155 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -276,7 +276,7 @@
hunger = new /atom/movable/screen/hunger(null, src)
infodisplay += hunger
- healthdoll = new /atom/movable/screen/healthdoll(null, src)
+ healthdoll = new /atom/movable/screen/healthdoll/human(null, src)
infodisplay += healthdoll
stamina = new /atom/movable/screen/stamina(null, src)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 31390c62cbb91..efc7f1c3cfedf 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -724,6 +724,88 @@
screen_loc = ui_living_healthdoll
var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update
+/atom/movable/screen/healthdoll/human
+ /// Tracks components of our doll, each limb is a separate atom in our vis_contents
+ VAR_PRIVATE/list/atom/movable/screen/limbs
+ /// Lazylist, tracks all body zones that are wounded currently
+ /// Used so we can sync animations should the list be updated
+ VAR_PRIVATE/list/animated_zones
+
+/atom/movable/screen/healthdoll/human/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ limbs = list()
+ for(var/i in GLOB.all_body_zones)
+ var/atom/movable/screen/healthdoll_limb/limb = new(src, null)
+ // layer chest above other limbs, it's the center after all
+ limb.layer = i == BODY_ZONE_CHEST ? layer + 0.05 : layer
+ limbs[i] = limb
+ // why viscontents? why not overlays? - because i want to animate filters
+ vis_contents += limb
+ update_appearance()
+
+/atom/movable/screen/healthdoll/human/Destroy()
+ QDEL_LIST_ASSOC_VAL(limbs)
+ vis_contents.Cut()
+ return ..()
+
+/atom/movable/screen/healthdoll/human/update_icon_state()
+ . = ..()
+ var/mob/living/carbon/human/owner = hud?.mymob
+ if(isnull(owner))
+ return
+ if(owner.stat == DEAD)
+ for(var/limb in limbs)
+ limbs[limb].icon_state = "[limb]DEAD"
+ return
+
+ var/list/current_animated = LAZYLISTDUPLICATE(animated_zones)
+
+ for(var/obj/item/bodypart/body_part as anything in owner.bodyparts)
+ var/icon_key = 0
+ var/part_zone = body_part.body_zone
+
+ var/list/overridable_key = list(icon_key)
+ if(body_part.bodypart_disabled)
+ icon_key = 7
+ else if(owner.stat == DEAD)
+ icon_key = "DEAD"
+ else if(SEND_SIGNAL(body_part, COMSIG_BODYPART_UPDATING_HEALTH_HUD, owner, overridable_key) & OVERRIDE_BODYPART_HEALTH_HUD)
+ icon_key = overridable_key[1] // thanks i hate it
+ else if(!owner.has_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy))
+ var/damage = body_part.get_damage() / body_part.max_damage
+ // calculate what icon state (1-5, or 0 if undamaged) to use based on damage
+ icon_key = clamp(ceil(damage * 5), 0, 5)
+
+ if(length(body_part.wounds))
+ LAZYSET(animated_zones, part_zone, TRUE)
+ else
+ LAZYREMOVE(animated_zones, part_zone)
+ limbs[part_zone].icon_state = "[part_zone][icon_key]"
+ // handle leftovers
+ for(var/missing_zone in owner.get_missing_limbs())
+ limbs[missing_zone].icon_state = "[missing_zone]6"
+ LAZYREMOVE(animated_zones, missing_zone)
+ // time to re-sync animations, something changed
+ if(animated_zones ~! current_animated)
+ for(var/animated_zone in animated_zones)
+ var/atom/wounded_zone = limbs[animated_zone]
+ var/existing_filter = wounded_zone.get_filter("wound_outline")
+ if(existing_filter)
+ animate(existing_filter) // stop animation so we can resync
+ else
+ wounded_zone.add_filter("wound_outline", 1, list("type" = "outline", "color" = "#FF0033", "alpha" = 0, "size" = 1.2))
+ existing_filter = wounded_zone.get_filter("wound_outline")
+ animate(existing_filter, alpha = 200, time = 1.5 SECONDS, loop = -1)
+ animate(alpha = 0, time = 1.5 SECONDS)
+ if(LAZYLEN(current_animated)) // avoid null - list() runtimes please
+ for(var/lost_zone in current_animated - animated_zones)
+ limbs[lost_zone].remove_filter("wound_outline")
+
+// Basically just holds an icon we can put a filter on
+/atom/movable/screen/healthdoll_limb
+ screen_loc = ui_living_healthdoll
+ vis_flags = VIS_INHERIT_ID | VIS_INHERIT_PLANE
+
/atom/movable/screen/mood
name = "mood"
icon_state = "mood5"
@@ -904,7 +986,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash)
animate(get_filter("hunger_outline"), alpha = 200, time = 1.5 SECONDS, loop = -1)
animate(alpha = 0, time = 1.5 SECONDS)
- else if(get_filter("hunger_outline"))
+ else
remove_filter("hunger_outline")
// Update color of the food
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 72df7ceeb9777..08c6ae681655a 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -107,9 +107,22 @@
/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other
-/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff
+/datum/config_entry/string/human_authority //Controls how to enforce human authority
+ default = "HUMAN_WHITELIST"
-/datum/config_entry/flag/enforce_human_authority_on_everyone //If non-human species are barred from joining as a head of staff, including jobs flagged as allowed for non-humans, ie. Quartermaster.
+/////////////////////////////////////////////////Outdated human authority settings
+/datum/config_entry/flag/enforce_human_authority
+ deprecated_by = /datum/config_entry/string/human_authority
+
+/datum/config_entry/flag/enforce_human_authority/DeprecationUpdate(value)
+ return value ? HUMAN_AUTHORITY_NON_HUMAN_WHITELIST : HUMAN_AUTHORITY_DISABLED
+
+/datum/config_entry/flag/enforce_human_authority_on_everyone
+ deprecated_by = /datum/config_entry/string/human_authority
+
+/datum/config_entry/flag/enforce_human_authority_on_everyone/DeprecationUpdate(value)
+ return value ? HUMAN_AUTHORITY_ENFORCED : HUMAN_AUTHORITY_DISABLED
+/////////////////////////////////////////////////
/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling
diff --git a/code/controllers/configuration/entries/jobs.dm b/code/controllers/configuration/entries/jobs.dm
index 06563e01a8e3d..d25ae3964eb1f 100644
--- a/code/controllers/configuration/entries/jobs.dm
+++ b/code/controllers/configuration/entries/jobs.dm
@@ -133,6 +133,11 @@
var/list/working_list = list()
for(var/config_datum_key in job_config_datum_singletons)
var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key]
+
+ // Dont make the entry if it doesn't apply to this job
+ if(!config_datum.validate_entry(occupation))
+ continue
+
var/config_read_value = job_config[job_key][config_datum_key]
if(!config_datum.validate_value(config_read_value))
working_list += list(
@@ -155,6 +160,11 @@
var/returnable_list = list()
for(var/config_datum_key in job_config_datum_singletons)
var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key]
+
+ // Dont make the entry if it doesn't apply to this job
+ if(!config_datum.validate_entry(new_occupation))
+ continue
+
// Remember, every time we write the TOML from scratch, we want to have it commented out by default.
// This is to ensure that the server operator knows that they are overriding codebase defaults when they remove the comment.
// Having comments mean that we allow server operators to defer to codebase standards when they deem acceptable. They must uncomment to override the codebase default.
@@ -171,6 +181,11 @@
var/list/datums_to_read = job_config_datum_singletons - list(JOB_CONFIG_TOTAL_POSITIONS, JOB_CONFIG_SPAWN_POSITIONS)
for(var/config_datum_key in datums_to_read)
var/datum/job_config_type/config_datum = job_config_datum_singletons[config_datum_key]
+
+ // Dont make the entry if it doesn't apply to this job
+ if(!config_datum.validate_entry(new_occupation))
+ continue
+
returnable_list += list(
"# [config_datum_key]" = config_datum.get_current_value(new_occupation),
)
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 08c1df969003f..9af14f226ace5 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -73,10 +73,11 @@ SUBSYSTEM_DEF(job)
/// This is just the message we prepen and put into all of the config files to ensure documentation. We use this in more than one place, so let's put it in the SS to make life a bit easier.
var/config_documentation = "## This is the configuration file for the job system.\n## This will only be enabled when the config flag LOAD_JOBS_FROM_TXT is enabled.\n\
- ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) five different variables in this file.\n\
+ ## We use a system of keys here that directly correlate to the job, just to ensure they don't desync if we choose to change the name of a job.\n## You are able to change (as of now) five (six if the job is a command head) different variables in this file.\n\
## Total Positions are how many job slots you get in a shift, Spawn Positions are how many you get that load in at spawn. If you set this to -1, it is unrestricted.\n## Playtime Requirements is in minutes, and the job will unlock when a player reaches that amount of time.\n\
## However, that can be superseded by Required Account Age, which is a time in days that you need to have had an account on the server for.\n\
- ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job.\n\n\
+ ## Also there is a required character age in years. It prevents player from joining as this job, if their character's age as is lower than required. Setting it to 0 means it is turned off for this job.\n\
+ ## Lastly there's Human Authority Whitelist Setting. You can set it to either \"HUMANS_ONLY\" or \"NON_HUMANS_ALLOWED\". Check the \"Human Authority\" setting on the game_options file to know which you should choose. Note that this entry only appears on jobs that are marked as heads of staff.\n\n\
## As time goes on, more config options may be added to this file.\n\
## You can use the admin verb 'Generate Job Configuration' in-game to auto-regenerate this config as a downloadable file without having to manually edit this file if we add more jobs or more things you can edit here.\n\
## It will always respect prior-existing values in the config, but will appropriately add more fields when they generate.\n## It's strongly advised you create your own version of this file rather than use the one provisioned on the codebase.\n\n\
diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm
index b237edd3870b6..409f59bbff247 100644
--- a/code/controllers/subsystem/polling.dm
+++ b/code/controllers/subsystem/polling.dm
@@ -280,7 +280,7 @@ SUBSYSTEM_DEF(polling)
return FALSE
if(check_jobban)
- if(is_banned_from(potential_candidate.ckey, list(check_jobban, ROLE_SYNDICATE)))
+ if(is_banned_from(potential_candidate.ckey, list(ROLE_SYNDICATE) + check_jobban))
return FALSE
return TRUE
diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm
index bd1719783e12a..4e37400d51d69 100644
--- a/code/datums/achievements/misc_achievements.dm
+++ b/code/datums/achievements/misc_achievements.dm
@@ -234,7 +234,13 @@
icon_state = "sisyphus"
/datum/award/achievement/misc/cigarettes
- name = "Unhealthy snacks"
+ name = "Unhealthy Snacks"
desc = "You were curious to taste it. And then another. You must have more!"
database_id = MEDAL_CIGARETTES
icon_state = "cigarettes"
+
+/datum/award/achievement/misc/sharkdragon
+ name = "You're What You Eat"
+ desc = "Nutritionists often recommend a balanced and varied diet. However that clearly isn't the case for some creatures."
+ database_id = MEDAL_SHARKDRAGON
+ icon_state = "dragon_plus_fish"
diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm
index 873c1646adbe1..843f611e5ff3e 100644
--- a/code/datums/components/food_storage.dm
+++ b/code/datums/components/food_storage.dm
@@ -18,7 +18,7 @@
/datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100)
- RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(try_inserting_item))
+ RegisterSignal(parent, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(try_inserting_item))
RegisterSignal(parent, COMSIG_CLICK_CTRL, PROC_REF(try_removing_item))
RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage))
RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item))
@@ -48,34 +48,34 @@
* inserted_item - the item being placed into the food
* user - the person inserting the item
*/
-/datum/component/food_storage/proc/try_inserting_item(datum/source, obj/item/inserted_item, mob/living/user, params)
+/datum/component/food_storage/proc/try_inserting_item(datum/source, mob/living/user, obj/item/inserted_item, list/modifiers)
SIGNAL_HANDLER
// No matryoshka-ing food storage
if(istype(inserted_item, /obj/item/storage) || IS_EDIBLE(inserted_item))
- return
+ return NONE
//Harm intent will bypass inserting for injecting food with syringes and such
if(user.combat_mode)
- return
+ return NONE
if(inserted_item.w_class > minimum_weight_class)
to_chat(user, span_warning("\The [inserted_item.name] won't fit in \the [parent]."))
- return
+ return ITEM_INTERACT_BLOCKING
if(!QDELETED(stored_item))
to_chat(user, span_warning("There's something in \the [parent]."))
- return
+ return ITEM_INTERACT_BLOCKING
if(HAS_TRAIT(inserted_item, TRAIT_NODROP))
to_chat(user, span_warning("\the [inserted_item] is stuck to your hand, you can't put into \the [parent]!"))
- return
+ return ITEM_INTERACT_BLOCKING
user.visible_message(span_notice("[user.name] begins inserting [inserted_item.name] into \the [parent]."), \
span_notice("You start to insert the [inserted_item.name] into \the [parent]."))
INVOKE_ASYNC(src, PROC_REF(insert_item), inserted_item, user)
- return COMPONENT_CANCEL_ATTACK_CHAIN
+ return ITEM_INTERACT_SUCCESS
/** Begins the process of attempting to remove the stored item.
*
@@ -108,15 +108,17 @@
* user - the person inserting the item.
*/
/datum/component/food_storage/proc/insert_item(obj/item/inserted_item, mob/user)
- if(do_after(user, 1.5 SECONDS, target = parent))
- var/atom/food = parent
- to_chat(user, span_notice("You slip [inserted_item.name] inside \the [parent]."))
- inserted_item.forceMove(food)
- user.log_message("inserted [inserted_item] into [parent].", LOG_ATTACK)
- food.add_fingerprint(user)
- inserted_item.add_fingerprint(user)
-
- stored_item = inserted_item
+ if(!do_after(user, 1.5 SECONDS, target = parent))
+ return
+
+ var/atom/food = parent
+ to_chat(user, span_notice("You slip [inserted_item.name] inside \the [parent]."))
+ inserted_item.forceMove(food)
+ user.log_message("inserted [inserted_item] into [parent].", LOG_ATTACK)
+ food.add_fingerprint(user)
+ inserted_item.add_fingerprint(user)
+
+ stored_item = inserted_item
/** Removes the item from the food, after a do_after.
*
diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm
index 61f6543bd12bf..9638af4a8f2c2 100644
--- a/code/datums/components/profound_fisher.dm
+++ b/code/datums/components/profound_fisher.dm
@@ -9,6 +9,7 @@
return COMPONENT_INCOMPATIBLE
src.our_rod = our_rod || new(parent)
src.our_rod.internal = TRUE
+ ADD_TRAIT(src.our_rod, TRAIT_NOT_BARFABLE, REF(src))
RegisterSignal(src.our_rod, COMSIG_QDELETING, PROC_REF(on_rod_qdel))
if(!isgloves)
@@ -43,6 +44,7 @@
/datum/component/profound_fisher/Destroy()
our_rod.internal = FALSE
UnregisterSignal(our_rod, COMSIG_QDELETING)
+ REMOVE_TRAIT(our_rod, TRAIT_NOT_BARFABLE, REF(src))
our_rod = null
return ..()
diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm
index 2e9ee73c32a06..bb3054aea6ae6 100644
--- a/code/datums/components/shell.dm
+++ b/code/datums/components/shell.dm
@@ -173,7 +173,7 @@
if(istype(item, /obj/item/inducer))
var/obj/item/inducer/inducer = item
- INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_atom), attached_circuit || parent, attacker, list())
+ INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, interact_with_atom), attached_circuit || parent, attacker, list())
return COMPONENT_NO_AFTERATTACK
if(attached_circuit)
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index d170aeca8522e..d4abc7c69adc3 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -408,10 +408,15 @@
var/list/names = islist(name_or_names) ? name_or_names : list(name_or_names)
+ . = FALSE
for(var/name in names)
if(filter_data[name])
filter_data -= name
- update_filters()
+ . = TRUE
+
+ if(.)
+ update_filters()
+ return .
/datum/proc/clear_filters()
ASSERT(isatom(src) || isimage(src))
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 966987828bd54..4a359ca1f2dc0 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -230,7 +230,7 @@
/datum/disease/transformation/slime
name = "Advanced Mutation Transformation"
- cure_text = "frost oil"
+ cure_text = "Frost oil"
cures = list(/datum/reagent/consumable/frostoil)
cure_chance = 55
agent = "Advanced Mutation Toxin"
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index f16cf5bc50cf0..df3fbd2654d77 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -150,9 +150,19 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
SEND_SIGNAL(holder, COMSIG_CARBON_GAIN_MUTATION, mutation_type, class)
return force_give(new mutation_type (class, time, copymut = mutation))
-/datum/dna/proc/remove_mutation(mutation_type)
+/datum/dna/proc/remove_mutation(datum/mutation/human/mutation_type, mutadone)
+
+ var/datum/mutation/human/actual_mutation = get_mutation(mutation_type)
+
+ if(!actual_mutation)
+ return FALSE
+
+ // Check that it exists first before trying to remove it with mutadone
+ if(actual_mutation.mutadone_proof && mutadone)
+ return FALSE
+
SEND_SIGNAL(holder, COMSIG_CARBON_LOSE_MUTATION, mutation_type)
- return force_lose(get_mutation(mutation_type))
+ return force_lose(actual_mutation)
/datum/dna/proc/check_mutation(mutation_type)
return get_mutation(mutation_type)
@@ -479,7 +489,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
/datum/dna/stored/add_mutation(mutation_name) //no mutation changes on stored dna.
return
-/datum/dna/stored/remove_mutation(mutation_name)
+/datum/dna/stored/remove_mutation(mutation_name, mutadone)
return
/datum/dna/stored/check_mutation(mutation_name)
diff --git a/code/datums/elements/content_barfer.dm b/code/datums/elements/content_barfer.dm
index e30294bc08a7f..533a88503e21e 100644
--- a/code/datums/elements/content_barfer.dm
+++ b/code/datums/elements/content_barfer.dm
@@ -20,7 +20,9 @@
/datum/element/content_barfer/proc/barf_contents(mob/living/target)
SIGNAL_HANDLER
- for(var/atom/movable/barfed_out in target)
+ for(var/atom/movable/barfed_out as anything in target)
+ if(HAS_TRAIT(barfed_out, TRAIT_NOT_BARFABLE))
+ continue
barfed_out.forceMove(target.loc)
if(prob(90))
step(barfed_out, pick(GLOB.alldirs))
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 732323d28655c..c6e8236e55964 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -87,6 +87,6 @@
msg += "
Current Informational Settings:"
msg += "Protect Authority Roles From Traitor: [CONFIG_GET(flag/protect_roles_from_antagonist)]"
msg += "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]"
- msg += "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]"
+ msg += "Enforce Human Authority: [CONFIG_GET(string/human_authority)]"
msg += "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]"
to_chat(src, span_infoplain(msg.Join("
")))
diff --git a/code/datums/job_configs/_job_configs.dm b/code/datums/job_configs/_job_configs.dm
index 84e2cb4ec0a41..b3a32cd8a2b83 100644
--- a/code/datums/job_configs/_job_configs.dm
+++ b/code/datums/job_configs/_job_configs.dm
@@ -33,6 +33,12 @@
stack_trace("Attempted to validate value for the default job config! You're doing something wrong!!")
return FALSE
+/// Check if the config entry should be made for a specific job
+/// By default returns TRUE, meaning that by default every job will have the config entry created by the datum
+/// An example of what this could be used for is: A value that only appears if the job is a head of staff
+/datum/job_config_type/proc/validate_entry(datum/job/occupation)
+ return TRUE
+
/// This is the proc that we actually invoke to set the config-based values for each job. Is also intended to handle all in-depth logic checks pertient to the job datum itself.
/// Return TRUE if the value was set successfully (or if expected behavior did indeed occur), FALSE if it was not.
/datum/job_config_type/proc/set_current_value(datum/job/occupation, value)
diff --git a/code/datums/job_configs/human_authority.dm b/code/datums/job_configs/human_authority.dm
new file mode 100644
index 0000000000000..68b6c64f95cfa
--- /dev/null
+++ b/code/datums/job_configs/human_authority.dm
@@ -0,0 +1,17 @@
+/// Whether if the job should whitelist humans, whitelist nonhumans, or neither
+/datum/job_config_type/human_authority
+ name = JOB_CONFIG_HUMAN_AUTHORITY
+ datum_var_name = "human_authority"
+
+/datum/job_config_type/human_authority/validate_value(value)
+ if(value == JOB_AUTHORITY_HUMANS_ONLY)
+ return TRUE
+
+ if(value == JOB_AUTHORITY_NON_HUMANS_ALLOWED)
+ return TRUE
+
+ return FALSE
+
+/datum/job_config_type/human_authority/validate_entry(datum/job/occupation)
+ return occupation.job_flags & JOB_HEAD_OF_STAFF
+
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index d6317b12ab15c..86e4dda381421 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -61,6 +61,12 @@
description = "Moffuchi's Family Pizzeria chain has a reputation for providing affordable artisanal meals of questionable edibility. This particular pizzeria seems to have been abandoned for some time."
suffix = "icemoon_surface_pizza.dmm"
+/datum/map_template/ruin/icemoon/Lodge
+ name = "Ice-Ruin Hunters Lodge"
+ id = "lodge"
+ description = "An old hunting hunting lodge. I wonder if anyone is still home?"
+ suffix = "icemoon_surface_lodge.dmm"
+
/datum/map_template/ruin/icemoon/frozen_phonebooth
name = "Ice-Ruin Frozen Phonebooth"
id = "frozen_phonebooth"
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 790ae33ade4b1..f2d76d9b86e6e 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -513,3 +513,25 @@
suffix = "hauntedtradingpost.dmm"
name = "Space-Ruin Donk Co. Interstellar Trading Post 6016"
description = "A small station for trading ships to dock at. It's been abandoned for some time, but its security systems have kept looters away. Rumored to be haunted."
+
+/datum/map_template/ruin/space/commsbuoy
+ id = "commsbuoy"
+ suffix = "commsbuoy_lowtech.dmm"
+ name = "Kosmokomm Communications Buoy"
+ description = "One of the SSC's many Comms Buoys, acting as a broadcaster, receiver and relay for interstellar communications. Due to the \
+ shoddy tech available, it does not enable local communications."
+
+/datum/map_template/ruin/space/commsbuoy_pirate
+ id = "commsbuoy_pirate"
+ suffix = "commsbuoy_pirate.dmm"
+ name = "Pirated Communications Buoy"
+ description = "A Comms Buoy satellite that has been hijacked by local criminal elements, acting as a broadcaster, receiver and relay for \
+ evil interstellar communications. Due to the shoddy tech available, it does not enable local communications."
+
+/datum/map_template/ruin/space/commsbuoy_nt
+ id = "commsbuoy_nt"
+ suffix = "commsbuoy_nt.dmm"
+ name = "Nanotrasen Model-7 Communications Buoy"
+ description = "One of Nanotrasen's highly advanced Communication Buoys. Besides acting as a broadcaster, receiver and relay for interstellar \
+ communications, the satellite also includes a Local-Network array and two multi-function satellite dishes, providing the local sector with \
+ connectivity - as long as you have your Employee ID handy. Though, this one has been reported to have some recent malfunctions."
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index 865e9869ebeea..5dab783eb37a0 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -245,7 +245,7 @@
var/mob/living/carbon/carbon_owner = owner
carbon_owner.handle_dreams()
- if(prob(2) && owner.health > owner.crit_threshold)
+ if(prob(8) && owner.health > owner.crit_threshold)
owner.emote("snore")
/atom/movable/screen/alert/status_effect/asleep
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index fc3f3140593ea..30361dc9cf1a1 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -124,19 +124,6 @@
//////// WOUNDS /////////
/////////////////////////
-// wound alert
-/atom/movable/screen/alert/status_effect/wound
- name = "Wounded"
- desc = "Your body has sustained serious damage, click here to inspect yourself."
-
-/atom/movable/screen/alert/status_effect/wound/Click()
- . = ..()
- if(!.)
- return
-
- var/mob/living/carbon/carbon_owner = owner
- carbon_owner.check_self_for_injuries()
-
// wound status effect base
/datum/status_effect/wound
id = "wound"
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 5e5258c86deb9..fdecc89680a54 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -203,8 +203,7 @@
if(status_effect_type)
victim.apply_status_effect(status_effect_type, src)
SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb)
- if(!victim.alerts[ALERT_WOUNDED]) // only one alert is shared between all of the wounds
- victim.throw_alert(ALERT_WOUNDED, /atom/movable/screen/alert/status_effect/wound)
+ victim.update_health_hud()
var/demoted
if(old_wound)
@@ -348,13 +347,13 @@
if (ismob(old_victim))
var/mob/mob_victim = old_victim
SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced)
+ if(!replaced && !limb)
+ mob_victim.update_health_hud()
/datum/wound/proc/remove_wound_from_victim()
if(!victim)
return
LAZYREMOVE(victim.all_wounds, src)
- if(!victim.all_wounds)
- victim.clear_alert(ALERT_WOUNDED)
SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb)
/**
diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm
index 061bd8f06d209..fa87fa832a1fb 100644
--- a/code/game/area/areas/ruins/icemoon.dm
+++ b/code/game/area/areas/ruins/icemoon.dm
@@ -57,6 +57,11 @@
/area/ruin/planetengi
name = "\improper Engineering Outpost"
+/area/ruin/huntinglodge
+ name = "\improper Hunting Lodge"
+ mood_bonus = -5
+ mood_message = "Something feels off..."
+
/area/ruin/smoking_room/house
name = "\improper Tobacco House"
sound_environment = SOUND_ENVIRONMENT_CITY
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 67b2346c2eeaa..45b77efdb1f4c 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1630,8 +1630,14 @@
/* End language procs */
-//Returns an atom's power cell, if it has one. Overload for individual items.
-/atom/movable/proc/get_cell()
+/**
+ * Returns an atom's power cell, if it has one. Overload for individual items.
+ * Args
+ *
+ * * /atom/movable/interface - the atom that is trying to interact with this cell
+ * * mob/user - the mob that is holding the interface
+ */
+/atom/movable/proc/get_cell(atom/movable/interface, mob/user)
return
/atom/movable/proc/can_be_pulled(user, grab_state, force)
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 58de43525357c..95732d38437ef 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -440,7 +440,7 @@
// GUARD CHECK - Can we genetically modify the occupant? Includes scanner
// operational guard checks.
// GUARD CHECK - Is scramble DNA actually ready?
- if(!can_modify_occupant() || !(scramble_ready < world.time))
+ if(!can_modify_occupant() || !(scramble_ready < world.time) || HAS_TRAIT(scanner_occupant, TRAIT_NO_DNA_SCRAMBLE))
return
scanner_occupant.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA))
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index c9ed74caa02a9..97ac006bcd500 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -11,10 +11,12 @@
density = TRUE
layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS
verb_say = "states"
- var/cooldown = 0
+ /// Cooldown each time singularity is pulled in our direction
+ COOLDOWN_DECLARE(singularity_beacon_cd)
var/active = FALSE
var/icontype = "beacon"
+ var/energy_used = 1.5 KILO JOULES
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
@@ -42,11 +44,9 @@
if(user)
to_chat(user, span_notice("You deactivate the beacon."))
-
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
return
-
/obj/machinery/power/singularity_beacon/attack_hand(mob/user, list/modifiers)
. = ..()
if(.)
@@ -93,10 +93,10 @@
if(!active)
return
- if(surplus() >= 1500)
- add_load(1500)
- if(cooldown <= world.time)
- cooldown = world.time + 80
+ if(surplus() >= energy_used)
+ add_load(energy_used)
+ if(COOLDOWN_FINISHED(src, singularity_beacon_cd))
+ COOLDOWN_START(src, singularity_beacon_cd, 8 SECONDS)
for(var/_singulo_component in GLOB.singularities)
var/datum/component/singularity/singulo_component = _singulo_component
var/atom/singulo = singulo_component.parent
@@ -106,6 +106,95 @@
Deactivate()
say("Insufficient charge detected - powering down")
+// Used for the No Escape final objective that attracts a singularity to the escape shuttle
+// needs to be charged with an inducer to work
+/obj/machinery/power/singularity_beacon/syndicate/no_escape
+ name = "ominous beacon"
+ desc = "This looks very suspicious..."
+ processing_flags = START_PROCESSING_MANUALLY
+ /// The cell we spawn with
+ var/obj/item/stock_parts/power_store/cell/cell = /obj/item/stock_parts/power_store/cell/super/empty
+ /// The black hole shuttle event that is triggered
+ var/datum/shuttle_event/simple_spawner/black_hole/no_escape/no_escape_event
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/Initialize(mapload)
+ . = ..()
+ cell = new cell(src)
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/Destroy()
+ if(active)
+ Deactivate()
+ QDEL_NULL(cell)
+ // destroying the beacon doesn't automatically stop the event
+ no_escape_event = null
+ return ..()
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/examine(mob/user)
+ . = ..()
+ . += "\The [src] is [active ? "on" : "off"]."
+ if(cell)
+ . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/get_cell()
+ return cell
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/attack_hand(mob/user, list/modifiers)
+ return active ? Deactivate(user) : Activate(user)
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/Activate(mob/user = null)
+ if(!cell.charge())
+ say("Insufficient charge detected")
+ return
+
+ icon_state = "[icontype]1"
+ active = TRUE
+ begin_processing()
+ if(user)
+ to_chat(user, span_notice("You activate the beacon."))
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/Deactivate(mob/user = null)
+ icon_state = "[icontype]0"
+ active = FALSE
+ end_processing()
+ if(user)
+ to_chat(user, span_notice("You deactivate the beacon."))
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/wrench_act(mob/living/user, obj/item/tool)
+ . = TRUE
+
+ tool.play_tool_sound(src, 50)
+ if(anchored)
+ set_anchored(FALSE)
+ to_chat(user, span_notice("You unbolt \the [src] from the floor."))
+ return
+ else
+ set_anchored(TRUE)
+ to_chat(user, span_notice("You bolt \the [src] to the floor."))
+ return
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/screwdriver_act(mob/living/user, obj/item/tool)
+ return
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/emp_act(severity)
+ . = ..()
+ if(machine_stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_CONTENTS)
+ return
+ cell?.emp_act(severity)
+
+/obj/machinery/power/singularity_beacon/syndicate/no_escape/process()
+ if(cell.charge())
+ cell.use(energy_used, force = TRUE)
+
+ if(!no_escape_event)
+ var/area/escape_shuttle_area = get_area(src)
+ // beacon must be on the traveling escape shuttle (not a pod)
+ if(istype(escape_shuttle_area, /area/shuttle/escape) && (SSshuttle.emergency.mode == SHUTTLE_ESCAPE) && SSshuttle.emergency.is_in_shuttle_bounds(src))
+ var/obj/docking_port/mobile/port = SSshuttle.emergency
+ no_escape_event = port.add_shuttle_event(/datum/shuttle_event/simple_spawner/black_hole/no_escape)
+ no_escape_event.beacon = src
+ else
+ Deactivate()
+ say("Insufficient charge detected - powering down")
/obj/machinery/power/singularity_beacon/syndicate
icontype = "beaconsynd"
@@ -131,6 +220,10 @@
qdel(src)
return
+/obj/item/sbeacondrop/no_escape
+ name = "very suspicious beacon"
+ droptype = /obj/machinery/power/singularity_beacon/syndicate/no_escape
+
/obj/item/sbeacondrop/bomb
desc = "A label on it reads: Warning: Activating this device will send a high-ordinance explosive to your location."
droptype = /obj/machinery/syndicatebomb
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index 88a3a98a5bb26..e863f09ecde5b 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -71,3 +71,6 @@
UnregisterSignal(owner, COMSIG_QDELETING)
owner = null
+
+/obj/item/toy/plush/carpplushie/dehy_carp/peaceful
+ mobtype = /mob/living/basic/carp/passive
diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm
index 852a105de350f..bb23779fafec6 100644
--- a/code/game/objects/items/devices/aicard_evil.dm
+++ b/code/game/objects/items/devices/aicard_evil.dm
@@ -35,7 +35,7 @@
balloon_alert(user, "invalid access!")
return
var/mob/chosen_one = SSpolling.poll_ghosts_for_target(
- check_jobban = ROLE_OPERATIVE,
+ check_jobban = list(ROLE_OPERATIVE, JOB_AI),
poll_time = 20 SECONDS,
checked_target = src,
ignore_category = POLL_IGNORE_SYNDICATE,
@@ -47,12 +47,12 @@
/// Poll has concluded with a ghost, create the AI
/obj/item/aicard/syndie/loaded/proc/on_poll_concluded(mob/user, datum/antagonist/nukeop/op_datum, mob/dead/observer/ghost)
- if(isnull(ghost))
+ if(!ismob(ghost))
to_chat(user, span_warning("Unable to connect to S.E.L.F. dispatch. Please wait and try again later or use the intelliCard on your uplink to get your points refunded."))
return
// pick ghost, create AI and transfer
- var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(get_turf(src), new /datum/ai_laws/syndicate_override, ghost)
+ var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(null, new /datum/ai_laws/syndicate_override, ghost)
// create and apply syndie datum
var/datum/antagonist/nukeop/nuke_datum = new()
nuke_datum.send_to_spawnpoint = FALSE
diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm
index 9bda586b2693f..770b6f8bf3124 100644
--- a/code/game/objects/items/food/meatdish.dm
+++ b/code/game/objects/items/food/meatdish.dm
@@ -88,6 +88,13 @@
cell_line = null
starting_reagent_purity = 0.3
+///carp fillet, but without the toxin. Used by baby carps (fish item), which have a trait that handles the toxin already.
+/obj/item/food/fishmeat/carp/no_tox
+
+/obj/item/food/fishmeat/carp/no_tox/Initialize(mapload)
+ food_reagents -= /datum/reagent/toxin/carpotoxin
+ return ..()
+
/obj/item/food/fishmeat/moonfish
name = "moonfish fillet"
desc = "A fillet of moonfish."
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 2404974d69970..0f66cd4b6d108 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -7,212 +7,219 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
force = 7
+
/// Multiplier that determines the speed at which this inducer works at.
var/power_transfer_multiplier = 1
+ /// Is the battery hatch opened
var/opened = FALSE
- var/cell_type = /obj/item/stock_parts/power_store/battery/high
- var/obj/item/stock_parts/power_store/powerdevice
+ /// The cell for used in recharging cycles
+ var/obj/item/stock_parts/power_store/powerdevice = /obj/item/stock_parts/power_store/battery/high
+ /// Are we in the process of recharging something
var/recharging = FALSE
/obj/item/inducer/Initialize(mapload)
. = ..()
- if(!powerdevice && cell_type)
- powerdevice = new cell_type
-/obj/item/inducer/proc/induce(obj/item/stock_parts/power_store/target, coefficient)
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
- var/rating_base = target.rating_base
- var/totransfer = min(our_cell.charge, (rating_base * coefficient * power_transfer_multiplier))
- var/transferred = target.give(totransfer)
+ if(ispath(powerdevice))
+ powerdevice = new powerdevice(src)
- our_cell.use(transferred)
- our_cell.update_appearance()
- target.update_appearance()
+ register_context()
-/obj/item/inducer/get_cell()
- return powerdevice
+ update_appearance(UPDATE_OVERLAYS)
-/obj/item/inducer/emp_act(severity)
+/obj/item/inducer/Destroy(force)
+ QDEL_NULL(powerdevice)
. = ..()
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
- if(!isnull(our_cell) && !(. & EMP_PROTECT_CONTENTS))
- our_cell.emp_act(severity)
-/obj/item/inducer/attack_atom(obj/target, mob/living/carbon/user, params)
- if(user.combat_mode)
- return ..()
+/obj/item/inducer/Exited(atom/movable/gone, direction)
+ . = ..()
+ if(gone == powerdevice)
+ powerdevice = null
- if(cantbeused(user))
- return
+/obj/item/inducer/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = NONE
- if(recharge(target, user))
+ if(isnull(held_item))
+ if(opened && !QDELETED(powerdevice))
+ context[SCREENTIP_CONTEXT_LMB] = "Remove Cell"
+ . = CONTEXTUAL_SCREENTIP_SET
return
- return ..()
+ if(opened)
+ if(istype(held_item, /obj/item/stock_parts/power_store) && QDELETED(powerdevice))
+ context[SCREENTIP_CONTEXT_LMB] = "Insert cell"
+ return CONTEXTUAL_SCREENTIP_SET
-/obj/item/inducer/proc/cantbeused(mob/user)
- if(!ISADVANCEDTOOLUSER(user))
- to_chat(user, span_warning("You don't have the dexterity to use [src]!"))
- return TRUE
+ if(istype(held_item, /obj/item/stack/sheet/mineral/plasma) && !QDELETED(powerdevice))
+ context[SCREENTIP_CONTEXT_LMB] = "Charge cell"
+ return CONTEXTUAL_SCREENTIP_SET
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
+ if(held_item.tool_behaviour == TOOL_SCREWDRIVER)
+ context[SCREENTIP_CONTEXT_LMB] = "[opened ? "Close" : "Open"] Panel"
+ return CONTEXTUAL_SCREENTIP_SET
- if(isnull(our_cell))
- balloon_alert(user, "no cell installed!")
- return TRUE
+/obj/item/inducer/examine(mob/living/user)
+ . = ..()
- if(!our_cell.charge)
- balloon_alert(user, "no charge!")
- return TRUE
- return FALSE
+ if(!QDELETED(powerdevice))
+ . += span_notice("Its display shows: [display_energy(powerdevice.charge)].")
+ if(opened)
+ . += span_notice("The cell can be removed with an empty hand.")
+ . += span_notice("Plasma sheets can be used to recharge the cell.")
+ else
+ . += span_warning("It's missing a power cell.")
-/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool)
- . = TRUE
- tool.play_tool_sound(src)
+ . += span_notice("Its battery compartment can be [EXAMINE_HINT("screwed")] [opened ? "shut" : "open"].")
+
+/obj/item/inducer/update_overlays()
+ . = ..()
if(!opened)
- to_chat(user, span_notice("You unscrew the battery compartment."))
- opened = TRUE
- update_appearance()
return
- else
- to_chat(user, span_notice("You close the battery compartment."))
- opened = FALSE
- update_appearance()
+ . += "inducer-[!QDELETED(powerdevice) ? "bat" : "nobat"]"
+
+/obj/item/inducer/get_cell()
+ return powerdevice
+
+/obj/item/inducer/emp_act(severity)
+ . = ..()
+ if(!QDELETED(powerdevice) && !(. & EMP_PROTECT_CONTENTS))
+ powerdevice.emp_act(severity)
+
+/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool)
+ . = NONE
+
+ if(!tool.use_tool(src, user, delay = 0))
return
-/obj/item/inducer/attackby(obj/item/used_item, mob/user)
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
- if(istype(used_item, /obj/item/stock_parts/power_store))
- if(opened)
- if(isnull(our_cell))
- if(!user.transferItemToLoc(used_item, src))
- return
- to_chat(user, span_notice("You insert [used_item] into [src]."))
- powerdevice = used_item
- update_appearance()
- return
- else
- to_chat(user, span_warning("[src] already has \a [our_cell] installed!"))
- return
-
- if (istype(used_item, /obj/item/stack/sheet/mineral/plasma) && !isnull(our_cell))
- if(our_cell.charge == our_cell.maxcharge)
- balloon_alert(user, "already fully charged!")
- return
- used_item.use(1)
- our_cell.give(1.5 * STANDARD_CELL_CHARGE)
+ opened = !opened
+ to_chat(user, span_notice("You [opened ? "open" : "close"] the battery compartment."))
+ update_appearance(UPDATE_OVERLAYS)
+
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/inducer/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ . = NONE
+ if(user.combat_mode || !istype(tool) || tool.flags_1 & HOLOGRAM_1 || tool.item_flags & ABSTRACT)
+ return ITEM_INTERACT_SKIP_TO_ATTACK
+
+ if(!opened)
+ balloon_alert(user, "open first!")
+ return ITEM_INTERACT_FAILURE
+
+ if(istype(tool, /obj/item/stock_parts/power_store))
+ if(!QDELETED(powerdevice))
+ balloon_alert(user, "cell already installed!")
+ return ITEM_INTERACT_FAILURE
+
+ if(!user.transferItemToLoc(tool, src))
+ balloon_alert(user, "stuck in hand!")
+ return ITEM_INTERACT_FAILURE
+
+ powerdevice = tool
+ return ITEM_INTERACT_SUCCESS
+
+ if(istype(tool, /obj/item/stack/sheet/mineral/plasma) && !QDELETED(powerdevice))
+ if(!powerdevice.used_charge())
+ balloon_alert(user, "fully charged!")
+ return ITEM_INTERACT_FAILURE
+
+ tool.use(1)
+ powerdevice.give(1.5 * STANDARD_CELL_CHARGE)
balloon_alert(user, "cell recharged")
- return
- if(cantbeused(user))
- return
+ return ITEM_INTERACT_SUCCESS
- if(recharge(used_item, user))
- return
+/obj/item/inducer/interact_with_atom(atom/movable/interacting_with, mob/living/user, list/modifiers)
+ . = NONE
+ if(user.combat_mode || !istype(interacting_with) || interacting_with.flags_1 & HOLOGRAM_1)
+ return ITEM_INTERACT_SKIP_TO_ATTACK
+
+ //basic checks
+ if(opened)
+ balloon_alert(user, "close first!")
+ return ITEM_INTERACT_FAILURE
- return ..()
+ if(recharging || (!isturf(interacting_with) && user.loc == interacting_with))
+ return ITEM_INTERACT_FAILURE
-/obj/item/inducer/proc/recharge(atom/movable/target, mob/user)
- if(!isturf(target) && user.loc == target)
- return FALSE
- if(recharging)
- return TRUE
+ if(!ISADVANCEDTOOLUSER(user))
+ to_chat(user, span_warning("You don't have the dexterity to use [src]!"))
+ return ITEM_INTERACT_FAILURE
+ if(QDELETED(powerdevice))
+ balloon_alert(user, "no cell installed!")
+ return ITEM_INTERACT_FAILURE
+
+ if(!powerdevice.charge)
+ balloon_alert(user, "no charge!")
+ return ITEM_INTERACT_FAILURE
+
+ var/obj/item/stock_parts/power_store/target_cell = interacting_with.get_cell(src, user)
+
+ if(QDELETED(target_cell))
+ return ITEM_INTERACT_FAILURE
+
+ if(!target_cell.used_charge())
+ balloon_alert(user, "fully charged!")
+ return ITEM_INTERACT_FAILURE
+
+ //begin recharging
recharging = TRUE
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
- var/obj/item/stock_parts/power_store/target_cell = target.get_cell()
- var/obj/target_as_object = target
- var/coefficient = 1
-
- if(istype(target, /obj/item/gun/energy) || istype(target, /obj/item/clothing/suit/space))
- to_chat(user, span_alert("Error: unable to interface with device."))
- return FALSE
-
- if(target_cell)
- var/done_any = FALSE
- if(target_cell.charge >= target_cell.maxcharge)
- balloon_alert(user, "it's fully charged!")
- recharging = FALSE
- return TRUE
-
- user.visible_message(span_notice("[user] starts recharging [target] with [src]."), span_notice("You start recharging [target] with [src]."))
-
- while(target_cell.charge < target_cell.maxcharge)
- if(do_after(user, 1 SECONDS, target = user) && our_cell.charge)
- done_any = TRUE
- induce(target_cell, coefficient)
- do_sparks(1, FALSE, target)
- if(istype(target_as_object))
- target_as_object.update_appearance()
- else
- break
- if(done_any) // Only show a message if we succeeded at least once
- user.visible_message(span_notice("[user] recharged [target]!"), span_notice("You recharged [target]!"))
- recharging = FALSE
- return TRUE
- recharging = FALSE
+ user.visible_message(span_notice("[user] starts recharging [interacting_with] with [src]."), span_notice("You start recharging [interacting_with] with [src]."))
+ var/done_any = FALSE
+ while(target_cell.used_charge())
+ if(!do_after(user, 1 SECONDS, target = user))
+ break
-/obj/item/inducer/attack(mob/target, mob/living/user)
- if(user.combat_mode)
- return ..()
+ //transfer of charge
+ var/transferred = min(powerdevice.charge, target_cell.used_charge(), (target_cell.rating_base * target_cell.rating * power_transfer_multiplier))
+ if(!transferred)
+ break
+ powerdevice.use(target_cell.give(transferred))
- if(cantbeused(user))
- return
+ //update all appearances
+ powerdevice.update_appearance()
+ target_cell.update_appearance()
+ interacting_with.update_appearance()
- if(recharge(target, user))
- return
+ //sparks & update
+ do_sparks(1, FALSE, interacting_with)
+ done_any = TRUE
- return ..()
+ recharging = FALSE
+ // Only show a message if we succeeded at least once
+ if(done_any)
+ user.visible_message(span_notice("[user] recharges [interacting_with]!"), span_notice("You recharge [interacting_with]!"))
+
+ return ITEM_INTERACT_SUCCESS
/obj/item/inducer/attack_self(mob/user)
- if(opened && powerdevice)
+ if(opened && !QDELETED(powerdevice))
user.visible_message(span_notice("[user] removes [powerdevice] from [src]!"), span_notice("You remove [powerdevice]."))
powerdevice.update_appearance()
user.put_in_hands(powerdevice)
- powerdevice = null
- update_appearance()
-
-
-/obj/item/inducer/examine(mob/living/user)
- . = ..()
- var/obj/item/stock_parts/power_store/our_cell = get_cell()
- if(!isnull(our_cell))
- . += span_notice("Its display shows: [display_energy(our_cell.charge)].")
- else
- . += span_notice("Its display is dark.")
- if(opened)
- . += span_notice("Its battery compartment is open.")
-
-/obj/item/inducer/update_overlays()
- . = ..()
- if(!opened)
- return
- . += "inducer-[!isnull(get_cell()) ? "bat" : "nobat"]"
+ update_appearance(UPDATE_OVERLAYS)
/obj/item/inducer/empty
- cell_type = null
+ powerdevice = null
opened = TRUE
/obj/item/inducer/orderable
- cell_type = /obj/item/stock_parts/power_store/battery/upgraded
+ powerdevice = /obj/item/stock_parts/power_store/battery/upgraded
opened = FALSE
/obj/item/inducer/sci
icon_state = "inducer-sci"
inhand_icon_state = "inducer-sci"
desc = "A tool for inductively charging internal power cells. This one has a science color scheme, and is less potent than its engineering counterpart."
- cell_type = null
+ powerdevice = null
opened = TRUE
-/obj/item/inducer/sci/Initialize(mapload)
- . = ..()
- update_appearance()
-
/obj/item/inducer/syndicate
icon_state = "inducer-syndi"
inhand_icon_state = "inducer-syndi"
desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate."
power_transfer_multiplier = 2 // 2x the base speed
- cell_type = /obj/item/stock_parts/power_store/cell/super
+ powerdevice = /obj/item/stock_parts/power_store/battery/super
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 4b210c47e9fca..2e7682eda1fd1 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -648,7 +648,7 @@
name = "Internal inducer"
icon = 'icons/obj/tools.dmi'
icon_state = "inducer-engi"
- cell_type = null
+ powerdevice = null
/obj/item/inducer/cyborg/get_cell()
var/obj/item/robot_model/possible_model = loc
@@ -657,7 +657,7 @@
. = silicon_friend.cell
/obj/item/inducer/cyborg/screwdriver_act(mob/living/user, obj/item/tool)
- return FALSE
+ return NONE
/obj/item/borg/upgrade/pinpointer
name = "medical cyborg crew pinpointer"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 58e99dc8839aa..7a3fcef368ada 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -134,7 +134,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets)
if(isnull(card_reader_choices))
card_reader_choices = list(
"Personal",
- "Departmental",
+ "Job",
"None"
)
if(access_choices)
@@ -800,11 +800,11 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets)
switch(choice)
if("Personal") //only the player who swiped their id has access.
id_card = WEAKREF(id)
- name = "[id.registered_name] locker"
- desc = "now owned by [id.registered_name]. [initial(desc)]"
- if("Departmental") //anyone who has the same access permissions as this id has access
- name = "[id.assignment] closet"
- desc = "Its a [id.assignment] closet. [initial(desc)]"
+ name = "[id.registered_name]'s locker"
+ desc += " It has been ID locked to [id.registered_name]."
+ if("Job") //anyone who has the same access permissions as this id has access. Does NOT apply to the whole department.
+ name = "[id.assignment]'s locker"
+ desc += " It has been access locked to [id.assignment]s."
set_access(id.GetAccess())
if("None") //free for all
name = initial(name)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index a464f41827678..f5e63bcf23bba 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -452,6 +452,10 @@
desc = "A wondrous decorated Christmas tree."
icon_state = "pine_c"
+/obj/structure/flora/tree/pine/xmas/presentless
+ icon_state = "pinepresents"
+ desc = "A wondrous decorated Christmas tree. It has presents, though none of them seem to have your name on them."
+
/obj/structure/flora/tree/pine/xmas/presents
icon_state = "pinepresents"
desc = "A wondrous decorated Christmas tree. It has presents!"
diff --git a/code/game/sound.dm b/code/game/sound.dm
index ee91eebffa140..0b388d810903b 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -525,6 +525,22 @@
'sound/effects/liquid_pour/liquid_pour2.ogg',
'sound/effects/liquid_pour/liquid_pour3.ogg',
)
+ if(SFX_SNORE_FEMALE)
+ soundin = pick_weight(list(
+ 'sound/mobs/humanoids/human/snore/snore_female1.ogg' = 33,
+ 'sound/mobs/humanoids/human/snore/snore_female2.ogg' = 33,
+ 'sound/mobs/humanoids/human/snore/snore_female3.ogg' = 33,
+ 'sound/mobs/humanoids/human/snore/snore_mimimi1.ogg' = 1,
+ ))
+ if(SFX_SNORE_MALE)
+ soundin = pick_weight(list(
+ 'sound/mobs/humanoids/human/snore/snore_male1.ogg' = 20,
+ 'sound/mobs/humanoids/human/snore/snore_male2.ogg' = 20,
+ 'sound/mobs/humanoids/human/snore/snore_male3.ogg' = 20,
+ 'sound/mobs/humanoids/human/snore/snore_male3.ogg' = 20,
+ 'sound/mobs/humanoids/human/snore/snore_male5.ogg' = 20,
+ 'sound/mobs/humanoids/human/snore/snore_mimimi2.ogg' = 1,
+ ))
if(SFX_CAT_MEOW)
soundin = pick_weight(list(
'sound/creatures/cat/cat_meow1.ogg' = 33,
diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm
index 23f1627503e06..71722eb6d64ab 100644
--- a/code/modules/admin/verbs/ert.dm
+++ b/code/modules/admin/verbs/ert.dm
@@ -77,6 +77,8 @@
else
ertemplate = new /datum/ert/centcom_official
+ var/human_authority_setting = CONFIG_GET(string/human_authority)
+
var/list/settings = list(
"preview_callback" = CALLBACK(src, PROC_REF(makeERTPreviewIcon)),
"mainsettings" = list(
@@ -84,7 +86,7 @@
"teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize),
"mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission),
"polldesc" = list("desc" = "Ghost poll description", "type" = "string", "value" = ertemplate.polldesc),
- "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"),
+ "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(human_authority_setting == HUMAN_AUTHORITY_ENFORCED ? "Yes" : "No")]"),
"open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"),
"leader_experience" = list("desc" = "Pick an experienced leader", "type" = "boolean", "value" = "[(ertemplate.leader_experience ? "Yes" : "No")]"),
"random_names" = list("desc" = "Randomize names", "type" = "boolean", "value" = "[(ertemplate.random_names ? "Yes" : "No")]"),
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 27c1fd5a0ea89..741bdeeed7b7c 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -381,7 +381,10 @@
if(ishuman(spawned_mob))
var/mob/living/carbon/human/human_mob = spawned_mob
- human_mob.set_species(species_type)
+ // ignore if it's already the same
+ if(human_mob.dna.species != species_type)
+ human_mob.set_species(species_type)
+
human_mob.equipOutfit(outfit)
op_mind.special_role = role_to_play
@@ -411,6 +414,7 @@
desc = "Call up some backup from ARC for monkey mayhem."
icon = 'icons/obj/devices/voice.dmi'
icon_state = "walkietalkie"
+ spawn_type = /mob/living/carbon/human/species/monkey
species_type = /datum/species/monkey
outfit = /datum/outfit/syndicate_monkey
antag_datum = /datum/antagonist/syndicate_monkey
@@ -424,13 +428,26 @@
monkey_man.fully_replace_character_name(monkey_man.real_name, pick(GLOB.syndicate_monkey_names))
- monkey_man.make_clever_and_no_dna_scramble()
+ monkey_man.crewlike_monkify()
+
+ // fuck you i am no longer playing around. this goes against the entire soul of the item
+ RegisterSignal(monkey_man, COMSIG_SPECIES_GAIN, PROC_REF(allergy))
+
monkey_man.mind.enslave_mind_to_creator(user)
var/obj/item/implant/explosive/imp = new(src)
imp.implant(monkey_man, user)
+/obj/item/antag_spawner/loadout/monkey_man/proc/allergy(mob/living/second_lifer, datum/species/folly_species)
+ SIGNAL_HANDLER
+ if(is_simian(second_lifer))
+ return
+ // timer is long to let them panic and consider their folly, and because allergies take a while
+ second_lifer.visible_message(span_bolddanger("[second_lifer] starts swelling unhealthily in size. It looks like they had an allergic reaction to becoming a [folly_species]!"), span_userdanger("As your monkey features morph, you feel your allergies coming in. Oh no."))
+ // no brain or items. organs are funny though
+ second_lifer.inflate_gib(drop_bitflags = DROP_ORGANS|DROP_BODYPARTS, gib_time = 25 SECONDS, anim_time = 40 SECONDS)
+
/datum/outfit/syndicate_monkey
name = "Syndicate Monkey Agent Kit"
diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm
index 5491251d1aa53..20eccc6977900 100644
--- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm
+++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm
@@ -249,7 +249,7 @@
/obj/item/clothing/mask/chameleon = 20,
/obj/item/language_manual/codespeak_manual/unlimited = 10,
/obj/item/storage/mail_counterfeit_device = 10,
- /obj/item/traitor_machine_trapper = 10,
+ /obj/item/clothing/glasses/thermal = 10,
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher = 10,
))
diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm
index 6038c5e6820b7..6299bde9275cd 100644
--- a/code/modules/antagonists/space_dragon/carp_rift.dm
+++ b/code/modules/antagonists/space_dragon/carp_rift.dm
@@ -111,6 +111,8 @@
healing_color = COLOR_BLUE, \
)
+ AddComponent(/datum/component/fishing_spot, /datum/fish_source/carp_rift)
+
gravity_aura = new(
/* host = */src,
/* range = */15,
diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm
index 090c8f66dc82e..74b0c60a872ce 100644
--- a/code/modules/antagonists/space_dragon/space_dragon.dm
+++ b/code/modules/antagonists/space_dragon/space_dragon.dm
@@ -112,7 +112,7 @@
var/icon/icon = icon('icons/mob/nonhuman-player/spacedragon.dmi', "spacedragon")
icon.Blend(COLOR_STRONG_VIOLET, ICON_MULTIPLY)
- icon.Blend(icon('icons/mob/nonhuman-player/spacedragon.dmi', "overlay_base"), ICON_OVERLAY)
+ icon.Blend(icon('icons/mob/nonhuman-player/spacedragon.dmi', "spacedragon_overlay_base"), ICON_OVERLAY)
icon.Crop(10, 9, 54, 53)
icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
index 6e722b1515eb4..3367540239703 100644
--- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
+++ b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
@@ -7,6 +7,7 @@
/datum/traitor_objective/ultimate/infect_ai = 1,
/datum/traitor_objective/ultimate/romerol = 1,
/datum/traitor_objective/ultimate/supermatter_cascade = 1,
+ /datum/traitor_objective/ultimate/no_escape = 1,
)
weight = 100
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm b/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm
new file mode 100644
index 0000000000000..12cbdcf2d01fa
--- /dev/null
+++ b/code/modules/antagonists/traitor/objectives/final_objective/no_escape.dm
@@ -0,0 +1,48 @@
+/datum/traitor_objective/ultimate/no_escape
+ name = "Attach a beacon to the escape shuttle that will attract a singularity to consume everything."
+ description = "Go to %AREA%, and receive the smuggled beacon. Set up the beacon anywhere on the shuttle, \
+ and charge it using an inducer then, IT COMES. Warning: The singularity will consume all in it's path, you included."
+
+ ///area type the objective owner must be in to receive the satellites
+ var/area/beacon_spawn_area_type
+ ///checker on whether we have sent the beacon yet
+ var/sent_beacon = FALSE
+
+/datum/traitor_objective/ultimate/no_escape/generate_objective(datum/mind/generating_for, list/possible_duplicates)
+ var/list/possible_areas = GLOB.the_station_areas.Copy()
+ for(var/area/possible_area as anything in possible_areas)
+ if(!ispath(possible_area, /area/station/maintenance/solars) && !ispath(possible_area, /area/station/solars))
+ possible_areas -= possible_area
+ if(length(possible_areas) == 0)
+ return FALSE
+ beacon_spawn_area_type = pick(possible_areas)
+ replace_in_name("%AREA%", initial(beacon_spawn_area_type.name))
+ return TRUE
+
+/datum/traitor_objective/ultimate/no_escape/generate_ui_buttons(mob/user)
+ var/list/buttons = list()
+ if(!sent_beacon)
+ buttons += add_ui_button("", "Pressing this will call down a pod with the smuggled beacon.", "beacon", "beacon")
+ return buttons
+
+/datum/traitor_objective/ultimate/no_escape/ui_perform_action(mob/living/user, action)
+ . = ..()
+ switch(action)
+ if("beacon")
+ if(sent_beacon)
+ return
+ var/area/delivery_area = get_area(user)
+ if(delivery_area.type != beacon_spawn_area_type)
+ to_chat(user, span_warning("You must be in [initial(beacon_spawn_area_type.name)] to receive the smuggled beacon."))
+ return
+ sent_beacon = TRUE
+ podspawn(list(
+ "target" = get_turf(user),
+ "style" = /datum/pod_style/syndicate,
+ "spawn" = list(
+ /obj/item/sbeacondrop/no_escape,
+ /obj/item/inducer/syndicate,
+ /obj/item/wrench
+ )
+ ))
+
diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm
index a0e927c631938..d6ab89cb8a855 100644
--- a/code/modules/clothing/outfits/plasmaman.dm
+++ b/code/modules/clothing/outfits/plasmaman.dm
@@ -4,7 +4,7 @@
uniform = /obj/item/clothing/under/plasmaman
gloves = /obj/item/clothing/gloves/color/plasmaman
head = /obj/item/clothing/head/helmet/space/plasmaman
- r_hand= /obj/item/tank/internals/plasmaman/belt/full
+ r_hand = /obj/item/tank/internals/plasmaman/belt/full
internals_slot = ITEM_SLOT_HANDS
/datum/outfit/plasmaman/security
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 124dfcee41c0b..cd646d1df9ac2 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -93,6 +93,12 @@
if(fishing_modifier)
AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier)
+/obj/item/clothing/suit/space/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
+ . = ..()
+ if(isnull(cell))
+ return
+ toggle_spacesuit(toggler = null, manual_toggle = FALSE) //turn on the thermal regulator by default.
+
/// Start Processing on the space suit when it is worn to heat the wearer
/obj/item/clothing/suit/space/equipped(mob/living/user, slot)
. = ..()
@@ -161,7 +167,10 @@
thermal_on = FALSE
// support for items that interact with the cell
-/obj/item/clothing/suit/space/get_cell()
+/obj/item/clothing/suit/space/get_cell(atom/movable/interface, mob/user)
+ if(istype(interface, /obj/item/inducer))
+ to_chat(user, span_alert("Error: unable to interface with [interface]."))
+ return null
return cell
// Show the status of the suit and the cell
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 5b7cceb72b196..c5bd80e5d7174 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -1304,6 +1304,10 @@
/obj/item/fish/proc/undo_petted()
fish_flags &= ~FISH_FLAG_PETTED
+/obj/item/fish/update_atom_colour()
+ . = ..()
+ aquarium_vc_color = color || initial(aquarium_vc_color)
+
/// Returns random fish, using random_case_rarity probabilities.
/proc/random_fish_type(required_fluid)
var/static/probability_table
diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm
index c9ab3325af367..b0eec9d58f29e 100644
--- a/code/modules/fishing/fish/fish_traits.dm
+++ b/code/modules/fishing/fish/fish_traits.dm
@@ -427,6 +427,8 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits())
catalog_description = "This fish contains toxins. Feeding it to predatory fishes or people is not recommended."
diff_traits_inheritability = 25
reagents_to_add = list(/datum/reagent/toxin/tetrodotoxin = 1)
+ ///The amount of venom injected if the fish has a stinger is multiplied by this value.
+ var/venom_mult = 1
/datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish)
. = ..()
@@ -438,13 +440,13 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits())
SIGNAL_HANDLER
if(!HAS_TRAIT(source, TRAIT_FISH_STINGER))
return
- add_venom(source, /datum/reagent/toxin/tetrodotoxin, new_weight, mult = source.status == FISH_DEAD ? 0.1 : 0.25)
+ add_venom(source, reagents_to_add[1], new_weight, mult = (source.status == FISH_DEAD ? 0.1 : 0.25) * venom_mult)
/datum/fish_trait/toxic/proc/on_status_change(obj/item/fish/source)
SIGNAL_HANDLER
if(!HAS_TRAIT(source, TRAIT_FISH_STINGER))
return
- change_venom_on_death(source, /datum/reagent/toxin/tetrodotoxin, 0.25, 0.1)
+ change_venom_on_death(source, reagents_to_add[1], 0.25 * venom_mult, 0.1 * venom_mult)
/datum/fish_trait/toxic/proc/on_eaten(obj/item/fish/source, obj/item/fish/predator)
if(HAS_TRAIT(predator, TRAIT_FISH_TOXIN_IMMUNE))
@@ -463,7 +465,14 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits())
/datum/fish_trait/toxic/apply_to_mob(mob/living/basic/mob)
. = ..()
- mob.AddElement(/datum/element/venomous, /datum/reagent/toxin/tetrodotoxin, 0.5 * mob.mob_size)
+ mob.AddElement(/datum/element/venomous, reagents_to_add[1], 0.5 * mob.mob_size * venom_mult)
+
+/datum/fish_trait/toxic/carpotoxin
+ name = "Carpotoxic"
+ catalog_description = "This fish contains carpotoxin. Definitely not safe for consumption."
+ diff_traits_inheritability = 50
+ reagents_to_add = list(/datum/reagent/toxin/carpotoxin = 4)
+ venom_mult = 6
/datum/fish_trait/toxin_immunity
name = "Toxin Immunity"
diff --git a/code/modules/fishing/fish/types/air_space.dm b/code/modules/fishing/fish/types/air_space.dm
index dda3794ff4e1c..177ae9c6e0e7d 100644
--- a/code/modules/fishing/fish/types/air_space.dm
+++ b/code/modules/fishing/fish/types/air_space.dm
@@ -99,3 +99,85 @@
///It spins, and dimly glows in the dark.
/obj/item/fish/starfish/flop_animation()
DO_FLOATING_ANIM(src)
+
+/obj/item/fish/baby_carp
+ name = "baby space carp"
+ desc = "A juvenile spawn of the dreaded space carp. Don't let the innocent looks fool you, they're aggressive little bastards."
+ icon_state = "baby_carp"
+ sprite_height = 3
+ sprite_width = 5
+ average_size = 35
+ average_weight = 550
+ stable_population = 7
+ required_fluid_type = AQUARIUM_FLUID_ANY_WATER
+ random_case_rarity = FISH_RARITY_VERY_RARE
+ required_temperature_min = 0
+ required_temperature_max = MIN_AQUARIUM_TEMP+200
+ safe_air_limits = null
+ fillet_type = /obj/item/food/fishmeat/carp/no_tox
+ fish_traits = list(
+ /datum/fish_trait/carnivore,
+ /datum/fish_trait/aggressive,
+ /datum/fish_trait/predator,
+ /datum/fish_trait/necrophage,
+ /datum/fish_trait/no_mating,
+ /datum/fish_trait/toxic/carpotoxin,
+ )
+ favorite_bait = list(
+ list(
+ FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE,
+ FISH_BAIT_VALUE = MEAT,
+ ),
+ )
+ disliked_bait = list(
+ list(
+ FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE,
+ FISH_BAIT_VALUE = GRAIN|DAIRY,
+ ),
+ )
+ beauty = FISH_BEAUTY_GREAT
+
+/obj/item/fish/baby_carp/Initialize(mapload, apply_qualities = TRUE)
+ color = pick_weight(GLOB.carp_colors)
+ . = ..()
+ RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks))
+ RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth))
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/item/fish/baby_carp/update_overlays()
+ . = ..()
+ var/mutable_appearance/eyes = mutable_appearance(icon, "baby_carp_eyes")
+ if(status == FISH_DEAD)
+ eyes.icon_state += "_dead"
+ else
+ eyes.appearance_flags = RESET_COLOR
+ . += eyes
+
+///Determines the speed at which the carp grows based on how big it's
+/obj/item/fish/baby_carp/update_size_and_weight(new_size = average_size, new_weight = average_weight)
+ . = ..()
+ var/growth_rate = 4.5 MINUTES
+ growth_rate *= clamp(size/average_size, 0.5, 2)
+ growth_rate *= clamp(weight/average_weight, 0.5, 2)
+
+ AddComponent(/datum/component/fish_growth, /mob/living/basic/carp/advanced, growth_rate)
+
+/obj/item/fish/baby_carp/proc/growth_checks(datum/source, seconds_per_tick)
+ SIGNAL_HANDLER
+ var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency)
+ if(health <= initial(health) * 0.6 || hunger >= 0.6) //if too hurt or hungry, don't grow.
+ return COMPONENT_DONT_GROW
+
+ if(!isaquarium(loc))
+ return
+
+ var/obj/structure/aquarium/aquarium = loc
+ if(!aquarium.reproduction_and_growth) //the aquarium has breeding disabled
+ return COMPONENT_DONT_GROW
+ if(length(aquarium.get_fishes()) > AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate.
+ return COMPONENT_DONT_GROW
+
+/obj/item/fish/baby_carp/proc/on_growth(datum/source, mob/living/basic/carp/result)
+ SIGNAL_HANDLER
+ //yes, this means that if we use a spraycan on the fish, the resulting space carp will be of spraycan color
+ result.set_greyscale(colors = list(color))
diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm
index 38455068ce22e..c2db0a43fc9b5 100644
--- a/code/modules/fishing/sources/_fish_source.dm
+++ b/code/modules/fishing/sources/_fish_source.dm
@@ -41,6 +41,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons())
/obj/item/fish/stingray = FISH_ICON_WEAPON,
/obj/item/fish/swordfish = FISH_ICON_WEAPON,
/obj/item/fish/zipzap = FISH_ICON_ELECTRIC,
+ /obj/item/knife/carp = FISH_ICON_WEAPON,
/obj/item/seeds/grass = FISH_ICON_SEED,
/obj/item/seeds/random = FISH_ICON_SEED,
/obj/item/storage/wallet = FISH_ICON_COIN,
diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm
index 2f56ffaad3cd1..f182287040082 100644
--- a/code/modules/fishing/sources/source_types.dm
+++ b/code/modules/fishing/sources/source_types.dm
@@ -193,6 +193,7 @@
fish_table = list(
FISHING_DUD = 5,
/obj/item/fish/starfish = 6,
+ /obj/item/fish/baby_carp = 6,
/obj/item/stack/ore/bluespace_crystal = 2,
/mob/living/basic/carp = 2,
)
@@ -580,6 +581,25 @@
var/picked_path = pick(seeds_to_draw_from)
return new picked_path(get_turf(fishing_spot))
+/datum/fish_source/carp_rift
+ catalog_description = "Space Dragon Rifts"
+ radial_state = "carp"
+ fish_table = list(
+ FISHING_DUD = 3,
+ /obj/item/fish/baby_carp = 5,
+ /mob/living/basic/carp = 1,
+ /mob/living/basic/carp/passive = 1,
+ /mob/living/basic/carp/mega = 1,
+ /obj/item/clothing/head/fedora/carpskin = 1,
+ /obj/item/toy/plush/carpplushie = 1,
+ /obj/item/toy/plush/carpplushie/dehy_carp/peaceful = 1,
+ /obj/item/knife/carp = 1,
+ )
+ fish_counts = list(
+ /mob/living/basic/carp/mega = 2,
+ )
+ fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 18
+
/datum/fish_source/deepfryer
catalog_description = "Deep Fryers"
radial_state = "fryer"
diff --git a/code/modules/hallucination/screwy_health_doll.dm b/code/modules/hallucination/screwy_health_doll.dm
index 7bab267563c74..2a8eeba16e2b3 100644
--- a/code/modules/hallucination/screwy_health_doll.dm
+++ b/code/modules/hallucination/screwy_health_doll.dm
@@ -66,12 +66,11 @@
bodyparts -= source
/// Whenever a bodypart we're tracking has their health hud updated, override it with our fake overlay
-/datum/hallucination/fake_health_doll/proc/on_bodypart_hud_update(obj/item/bodypart/source, mob/living/carbon/human/owner)
+/datum/hallucination/fake_health_doll/proc/on_bodypart_hud_update(obj/item/bodypart/source, mob/living/carbon/human/owner, list/overridable_key)
SIGNAL_HANDLER
- var/mutable_appearance/fake_overlay = mutable_appearance('icons/hud/screen_gen.dmi', "[source.body_zone][bodyparts[source]]")
- owner.hud_used.healthdoll.add_overlay(fake_overlay)
- return COMPONENT_OVERRIDE_BODYPART_HEALTH_HUD
+ overridable_key[1] = bodyparts[source]
+ return OVERRIDE_BODYPART_HEALTH_HUD
/// Signal proc for [COMSIG_BODYPART_CHECKED_FOR_INJURY]. Our bodyparts look a lot more wounded than they actually are.
/datum/hallucination/fake_health_doll/proc/on_bodypart_checked(obj/item/bodypart/source, mob/living/carbon/examiner, list/check_list, list/limb_damage)
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 41ff0c058cebc..c086dce7c8156 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -120,8 +120,7 @@
/// Alternate titles to register as pointing to this job.
var/list/alternate_titles
- /// Does this job ignore human authority?
- var/ignore_human_authority = FALSE
+ var/human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
/// String key to track any variables we want to tie to this job in config, so we can avoid using the job title. We CAPITALIZE it in order to ensure it's unique and resistant to trivial formatting changes.
/// You'll probably break someone's config if you change this, so it's best to not to.
@@ -531,11 +530,28 @@
if(!player_client)
return // Disconnected while checking for the appearance ban.
- var/require_human = CONFIG_GET(flag/enforce_human_authority) && (job.job_flags & JOB_HEAD_OF_STAFF)
- if(require_human)
- var/all_authority_require_human = CONFIG_GET(flag/enforce_human_authority_on_everyone)
- if(!all_authority_require_human && job.ignore_human_authority)
- require_human = FALSE
+ var/human_authority_setting = CONFIG_GET(string/human_authority)
+ var/require_human = FALSE
+
+ // If the job in question is a head of staff,
+ // check the config to see if we should force the player onto a human character or not
+ if(job.job_flags & JOB_HEAD_OF_STAFF)
+ switch(human_authority_setting)
+
+ // If non-humans are the norm and jobs must be forced to be only for humans
+ // then we only force the player to be a human if the job exclusively allows humans
+ if(HUMAN_AUTHORITY_HUMAN_WHITELIST)
+ require_human = job.human_authority == JOB_AUTHORITY_HUMANS_ONLY
+
+ // If humans are the norm and jobs must be allowed to be played by non-humans
+ // then we only force the player to be a human if the job doesn't allow for non-humans to play it
+ if(HUMAN_AUTHORITY_NON_HUMAN_WHITELIST)
+ require_human = job.human_authority != JOB_AUTHORITY_NON_HUMANS_ALLOWED
+
+ // If humans are the norm and there is no chance that a non-human can be a head of staff
+ // always return true, since there is no chance that a non-human can be a head of staff.
+ if(HUMAN_AUTHORITY_ENFORCED)
+ require_human = TRUE
src.job = job.title
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 5b82c9adb7116..99bc35bb60320 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -46,6 +46,8 @@
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
rpg_title = "Star Duke"
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 7ac1b6e29af9b..f85c2c54973b9 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -46,6 +46,8 @@
rpg_title = "Head Crystallomancer"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 3f580b8e932a5..c9f126bb750bc 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -43,6 +43,8 @@
rpg_title = "High Cleric"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index e863a782d9b0c..1b8480f0d0b57 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -41,6 +41,9 @@
family_heirlooms = list(/obj/item/reagent_containers/cup/glass/trophy/silver_cup)
rpg_title = "Guild Questgiver"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
+
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index f3627c3c2a257..b9560708114be 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -37,6 +37,8 @@
rpg_title = "Guard Leader"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 858ce8b645536..32053daa5d8c8 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -36,7 +36,7 @@
rpg_title = "Steward"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
voice_of_god_power = 1.4 //Command staff has authority
- ignore_human_authority = TRUE
+ human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
/datum/outfit/job/quartermaster
name = "Quartermaster"
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 5d3c620322759..420138a6b9fba 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -44,6 +44,8 @@
rpg_title = "Archmagister"
job_flags = STATION_JOB_FLAGS | HEAD_OF_STAFF_JOB_FLAGS
+ human_authority = JOB_AUTHORITY_HUMANS_ONLY
+
voice_of_god_power = 1.4 //Command staff has authority
diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
index b1ae57de1ffe6..d776ae6251f7f 100644
--- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
+++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm
@@ -33,7 +33,7 @@
rpg_title = "Royal Guard"
allow_bureaucratic_error = FALSE
job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS
- ignore_human_authority = TRUE
+ human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED
/datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client)
. = ..()
diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm
index a6e77d77a510c..d6f89357b4489 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -40,7 +40,7 @@
random_spawns_possible = FALSE
allow_bureaucratic_error = FALSE
job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS
- ignore_human_authority = TRUE //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI.
+ human_authority = JOB_AUTHORITY_NON_HUMANS_ALLOWED //we can safely assume NT doesn't care what species AIs are made of, much less if they can't even afford an AI.
/datum/job/human_ai/get_roundstart_spawn_point()
return get_latejoin_spawn_point()
@@ -111,6 +111,18 @@
l_hand = /obj/item/paper/default_lawset_list
+/datum/outfit/job/human_ai/pre_equip(mob/living/carbon/human/equipped, visualsOnly)
+ . = ..()
+ if(visualsOnly)
+ return
+ if(is_safe_turf(equipped.loc, dense_atoms = TRUE)) //skip this if it's safe. We allow dense atoms because we spawn out of the inactive core.
+ return
+ if(isnull(equipped.dna.species.outfit_important_for_life)) //custom species stuff will handle this for us.
+ internals_slot = ITEM_SLOT_SUITSTORE
+ suit_store = /obj/item/tank/internals/oxygen
+ suit = /obj/item/clothing/suit/space/nasavoid
+ head = /obj/item/clothing/head/helmet/space/nasavoid
+
/datum/outfit/job/human_ai/post_equip(mob/living/carbon/human/equipped, visualsOnly)
. = ..()
if(visualsOnly)
@@ -122,9 +134,6 @@
ADD_TRAIT(equipped, TRAIT_COMMISSIONED, INNATE_TRAIT)
equipped.faction |= list(FACTION_SILICON, FACTION_TURRET)
- var/static/list/allowed_areas = typecacheof(list(/area/station/ai_monitored))
- equipped.AddComponent(/datum/component/hazard_area, area_whitelist = allowed_areas)
-
/obj/item/paper/default_lawset_list
name = "Lawset Note"
desc = "A note explaining the lawset, quickly written yet everso important."
diff --git a/code/modules/jobs/job_types/station_trait/pun_pun.dm b/code/modules/jobs/job_types/station_trait/pun_pun.dm
index eca4861e77ef0..b6ac7b813bffc 100644
--- a/code/modules/jobs/job_types/station_trait/pun_pun.dm
+++ b/code/modules/jobs/job_types/station_trait/pun_pun.dm
@@ -37,7 +37,7 @@
/datum/job/pun_pun/after_spawn(mob/living/carbon/human/monkey, client/player_client)
. = ..()
- monkey.make_clever_and_no_dna_scramble()
+ monkey.crewlike_monkify()
/datum/outfit/job/pun_pun
name = "Pun Pun"
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm
new file mode 100644
index 0000000000000..895200d487a1b
--- /dev/null
+++ b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm
@@ -0,0 +1,267 @@
+/obj/structure/fluff/commsbuoy_receiver
+ name = "interstellar receiver"
+ desc = "A dish-shaped component of the Comms Buoy used to detect and record interstellar signals."
+ icon = 'icons/obj/machines/telecomms.dmi'
+ icon_state = "broadcast receiver"
+
+/obj/structure/fluff/commsbuoy_processor
+ name = "comms buoy processor unit"
+ desc = "This machine is used to process and unscramble interstellar transmissions, to then be relayed and broadcast."
+ icon = 'icons/obj/machines/telecomms.dmi'
+ icon_state = "processor"
+
+/obj/structure/fluff/commsbuoy_broadcaster
+ name = "interstellar broadcaster"
+ desc = "A dish-shaped component of the Comms Buoy used to broadcast processed interstellar signals."
+ icon = 'icons/obj/machines/telecomms.dmi'
+ icon_state = "broadcaster"
+
+/obj/structure/fluff/sat_dish
+ name = "satellite dish"
+ desc = "I wonder if they get any sports channels out here."
+ density = FALSE
+ deconstructible = TRUE
+ icon = 'icons/obj/fluff/general.dmi'
+ icon_state = "sat_dish"
+
+/obj/item/keycard/nt_commsbuoy
+ name = "Nanotrasen comms buoy keycard"
+ desc = "A keycard with the NT logo prominently displayed. The last user broke off the end; the card can still swipe, but this won't insert \
+ into any chip readers now. On the back, mostly obscured by dried blood, the text \"SPINWARD\" is printed, followed by an illegible ID string."
+ color = "#4c80b1"
+ puzzle_id = "nt_commsbuoy"
+
+/obj/machinery/door/puzzle/keycard/nt_commsbuoy
+ name = "secure airlock"
+ puzzle_id = "nt_commsbuoy"
+
+/area/ruin/space/nt_commsbuoy
+ name = "\improper Nanotrasen Comms Buoy"
+ sound_environment = SOUND_AREA_SMALL_ENCLOSED
+ has_gravity = FALSE
+ ambientsounds = list(
+ 'sound/ambience/engineering/ambisin2.ogg',
+ 'sound/ambience/misc/signal.ogg',
+ 'sound/ambience/misc/signal.ogg',
+ 'sound/ambience/general/ambigen9.ogg',
+ 'sound/ambience/engineering/ambitech.ogg',
+ 'sound/ambience/engineering/ambitech2.ogg',
+ 'sound/ambience/engineering/ambitech3.ogg',
+ 'sound/ambience/misc/ambimystery.ogg',
+ ) //same ambience as tcommsat
+
+/obj/item/paper/fluff/ruins/nt_commsbuoy
+ color = COLOR_BLUE_GRAY
+
+/obj/item/paper/fluff/ruins/nt_commsbuoy/table_of_contents
+ name = "Table of Contents: NT-EBCB Model 7"
+ desc = "The Table of Contents page, text mostly faded. Rest of handbook not included."
+ default_raw_text = {"
+