diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 19efdd3740ef..32c858c0e518 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -6115,14 +6115,17 @@
/turf/open/floor/iron/checker,
/area/station/service/hydroponics)
"aJz" = (
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 4
},
-/obj/effect/turf_decal/siding/wood{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/siding/dark_green{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"aJA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
@@ -11934,24 +11937,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"bpo" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/rack,
-/obj/item/storage/backpack/duffelbag/med{
- pixel_y = 5
- },
-/obj/item/reagent_containers/blood/random{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/reagent_containers/blood/random,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/warning/no_smoking/directional/north,
-/obj/effect/spawner/random/medical/memeorgans,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"bpq" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/north,
@@ -11988,14 +11973,9 @@
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
"bpD" = (
-/obj/structure/girder,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/structure/grille/broken,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/turf/open/floor/eighties,
+/area/station/commons/locker)
"bpF" = (
/obj/structure/sign/departments/cargo,
/turf/closed/wall,
@@ -12459,18 +12439,16 @@
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
"bve" = (
-/obj/structure/table,
-/obj/structure/sign/departments/medbay/alt/directional/east,
-/obj/structure/sign/poster/official/help_others/directional/south,
-/obj/item/storage/box/bodybags{
- pixel_y = 5
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 8
},
-/obj/item/clothing/glasses/eyepatch{
- pixel_y = 4
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
},
-/obj/item/clothing/mask/surgical,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/item/radio/intercom/directional/east,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/wood/parquet,
+/area/station/commons/locker)
"bvi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -15783,6 +15761,15 @@
/obj/structure/sign/warning/vacuum/external/directional/north,
/turf/open/floor/plating,
/area/station/construction/mining/aux_base)
+"bTk" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters{
+ dir = 2;
+ id = "virologysurgery";
+ name = "Virology Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/station/medical/virology)
"bTl" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -23405,7 +23392,7 @@
"cOn" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/station/commons/fitness/recreation/entertainment)
+/area/station/commons/lounge)
"cOp" = (
/obj/structure/sign/warning/docking,
/turf/closed/wall/rust,
@@ -23882,13 +23869,6 @@
/obj/effect/mapping_helpers/airlock/access/all/medical/surgery,
/turf/open/floor/iron/dark,
/area/station/medical/surgery/fore)
-"cVO" = (
-/obj/structure/flora/grass/jungle/a/style_random,
-/obj/structure/flora/bush/ferny/style_random,
-/mob/living/carbon/human/species/monkey,
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/grass,
-/area/station/medical/virology)
"cWg" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -23924,18 +23904,17 @@
/turf/closed/wall,
/area/station/commons/storage/primary)
"cWQ" = (
-/obj/effect/turf_decal/siding/wood/corner{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"cWW" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/bot,
@@ -27081,21 +27060,25 @@
},
/obj/item/storage/medkit/o2,
/obj/machinery/light/small/directional/south,
+/obj/item/storage/backpack/duffelbag/med{
+ pixel_y = 5
+ },
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
"eeg" = (
-/obj/structure/table,
/obj/machinery/firealarm/directional/east,
-/obj/effect/turf_decal/siding/wood/corner{
- dir = 1
- },
/obj/machinery/light/small/directional/south,
-/obj/item/ashtray{
- pixel_y = 6;
- pixel_x = 4
+/obj/machinery/sleeper/cryo{
+ dir = 8
},
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/dark_green{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"eej" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/neutral{
@@ -27883,7 +27866,7 @@
/area/station/service/kitchen/coldroom)
"epS" = (
/turf/closed/wall,
-/area/station/commons/fitness/recreation/entertainment)
+/area/station/commons/lounge)
"eqk" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/cmo)
@@ -28332,16 +28315,19 @@
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
"eyO" = (
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/status_display/ai/directional/north,
+/obj/machinery/light/small/directional/north,
+/obj/machinery/sleeper/cryo{
dir = 4
},
-/obj/machinery/status_display/ai/directional/north,
-/obj/effect/turf_decal/siding/wood{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/siding/dark_green{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"ezd" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -29374,15 +29360,15 @@
/turf/open/floor/grass,
/area/station/service/hydroponics)
"eRj" = (
-/obj/effect/turf_decal/siding/wood,
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"eRk" = (
/obj/effect/turf_decal/bot,
/obj/machinery/conveyor{
@@ -31599,6 +31585,16 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
/turf/open/floor/iron/dark,
/area/station/engineering/supermatter/room)
+"fBa" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"fBf" = (
/obj/effect/turf_decal/siding/dark_green{
dir = 4
@@ -31621,16 +31617,17 @@
/turf/open/floor/iron/dark,
/area/station/medical/virology)
"fBx" = (
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/status_display/evac/directional/north,
+/obj/machinery/light/small/directional/north,
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/status_display/evac/directional/north,
-/obj/effect/turf_decal/siding/wood{
+/obj/effect/turf_decal/siding/dark_green{
dir = 8
},
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"fBA" = (
/obj/machinery/chem_master,
/obj/effect/turf_decal/delivery,
@@ -33210,17 +33207,12 @@
},
/obj/item/storage/wallet,
/obj/item/razor,
+/obj/item/ashtray{
+ pixel_y = 6;
+ pixel_x = 4
+ },
/turf/open/floor/iron,
/area/station/commons/locker)
-"geB" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
-/turf/open/floor/iron/dark,
-/area/station/maintenance/department/medical/central)
"geJ" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 1
@@ -34005,6 +33997,9 @@
req_access = list("brig")
},
/obj/machinery/computer/security/telescreen/isolation/directional/north,
+/obj/machinery/sleeper/cryo{
+ dir = 4
+ },
/turf/open/floor/iron,
/area/station/security/prison)
"gtw" = (
@@ -35716,9 +35711,6 @@
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"gVM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
@@ -36639,6 +36631,16 @@
},
/turf/open/floor/iron,
/area/station/cargo/sorting)
+"hls" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"hma" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
@@ -38554,7 +38556,7 @@
},
/obj/effect/turf_decal/delivery,
/obj/structure/sign/poster/official/no_erp/directional/south,
-/obj/machinery/vending/coffee,
+/obj/machinery/vending/autodrobe/all_access,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"hUp" = (
@@ -38572,16 +38574,15 @@
/turf/closed/wall/r_wall,
/area/station/maintenance/department/bridge)
"hUE" = (
-/obj/effect/turf_decal/siding/wood/corner,
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
},
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"hUK" = (
/obj/item/radio{
pixel_x = 5;
@@ -39056,19 +39057,6 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/medbay/lobby)
-"icM" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Virology Maintenance"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/mapping_helpers/airlock/access/all/medical/virology,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
- cycle_id = "viromonkey"
- },
-/turf/open/floor/iron/dark,
-/area/station/maintenance/department/medical/central)
"icT" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -39624,7 +39612,6 @@
/obj/item/storage/backpack/satchel,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
-/obj/machinery/airalarm/directional/north,
/obj/effect/landmark/start/hangover/closet,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -41091,6 +41078,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
},
+/obj/machinery/airalarm/directional/east,
/turf/open/floor/grass,
/area/station/medical/virology)
"iJw" = (
@@ -44428,13 +44416,16 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"jRu" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 1
+/obj/machinery/door/airlock/public/glass{
+ name = "Arcade"
},
-/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
-/area/station/maintenance/department/medical/central)
+/area/station/commons/locker)
"jRw" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -45485,15 +45476,13 @@
/turf/open/floor/plating,
/area/station/engineering/atmos/pumproom)
"kkt" = (
-/obj/effect/turf_decal/stripes/corner{
+/obj/effect/turf_decal/siding/wood{
dir = 4
},
-/obj/structure/sign/warning/biohazard/directional/north,
-/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron/dark,
+/area/station/commons/locker)
"kkB" = (
/obj/structure/altar_of_gods,
/obj/item/book/bible,
@@ -46810,12 +46799,14 @@
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"kDD" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood/parquet,
+/area/station/commons/locker)
"kEg" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/neutral{
@@ -47366,18 +47357,18 @@
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
"kPO" = (
-/obj/structure/table,
/obj/item/radio/intercom/directional/west,
-/obj/effect/turf_decal/siding/wood/corner{
- dir = 4
- },
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/power_store/cell/high,
-/obj/item/screwdriver,
/obj/machinery/airalarm/directional/south,
/obj/machinery/light/small/directional/south,
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/dark_green{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"kPS" = (
/obj/structure/railing{
dir = 8
@@ -49372,10 +49363,12 @@
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
"lwU" = (
-/obj/structure/chair/stool/directional/east,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/eighties,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"lxe" = (
/turf/closed/wall/r_wall,
/area/station/security/prison)
@@ -51422,8 +51415,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/vending/autodrobe/all_access,
/obj/effect/turf_decal/delivery,
+/obj/machinery/vending/coffee,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"mlu" = (
@@ -54566,14 +54559,10 @@
/turf/open/floor/iron,
/area/station/security/brig)
"nmo" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/grille/broken,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/machinery/newscaster/directional/north,
+/turf/open/floor/eighties,
+/area/station/commons/locker)
"nmp" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -56949,15 +56938,15 @@
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
"ois" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Arcade"
- },
/obj/machinery/door/firedoor,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/door/airlock/public/glass{
+ name = "Crew Storage"
+ },
/turf/open/floor/iron,
-/area/station/commons/fitness/recreation/entertainment)
+/area/station/commons/lounge)
"oiw" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/broken_floor,
@@ -59128,8 +59117,11 @@
"oUk" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/eighties,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"oUl" = (
/obj/effect/spawner/random/vending/snackvend,
/obj/effect/turf_decal/tile/neutral{
@@ -60556,9 +60548,6 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"prF" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -61976,13 +61965,10 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"pPd" = (
-/obj/effect/turf_decal/bot,
-/obj/structure/bed/medical/emergency,
-/obj/machinery/light/small/directional/south,
-/obj/machinery/iv_drip,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/structure/chair/stool/directional/east,
+/turf/open/floor/eighties,
+/area/station/commons/locker)
"pPi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/neutral{
@@ -62147,9 +62133,6 @@
/area/station/engineering/supermatter)
"pRJ" = (
/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -65596,20 +65579,6 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/iron/white,
/area/station/medical/exam_room)
-"rdj" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/structure/sink/kitchen/directional/south{
- desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
- name = "old sink"
- },
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
"rdu" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -69571,8 +69540,14 @@
"siP" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
-/turf/open/floor/eighties,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"sjJ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -69633,6 +69608,8 @@
},
/obj/structure/table,
/obj/machinery/newscaster/directional/north,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/power_store/cell/high,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"sko" = (
@@ -71525,14 +71502,17 @@
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/storage/gas)
"sVw" = (
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 8
},
-/obj/effect/turf_decal/siding/wood{
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/wood/parquet,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/siding/dark_green{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/station/commons/lounge)
"sVE" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -73736,10 +73716,12 @@
/area/station/engineering/supermatter)
"tJn" = (
/obj/machinery/newscaster/directional/north,
-/obj/structure/chair/stool/directional/east,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/eighties,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"tJq" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -74892,11 +74874,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"ubj" = (
-/obj/effect/turf_decal/sand/plating,
-/mob/living/basic/bot/cleanbot/medbay,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"ubn" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/stripes/line{
@@ -80783,6 +80760,16 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/showroomfloor,
/area/station/security/lockers)
+"weW" = (
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood/parquet,
+/area/station/commons/locker)
"weX" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -81778,6 +81765,10 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard)
+"wzo" = (
+/obj/structure/chair/stool/directional/east,
+/turf/open/floor/eighties,
+/area/station/commons/locker)
"wzs" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -82585,10 +82576,14 @@
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
"wMe" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/medical/central)
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/dark,
+/area/station/commons/locker)
"wMg" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral{
@@ -83269,6 +83264,8 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"wWj" = (
@@ -83938,10 +83935,11 @@
/turf/closed/wall,
/area/station/engineering/storage/tech)
"xeI" = (
-/obj/structure/chair/stool/directional/west,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/eighties,
-/area/station/commons/fitness/recreation/entertainment)
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/obj/effect/turf_decal/tile/green/diagonal_edge,
+/obj/effect/turf_decal/tile/green/diagonal_centre,
+/turf/open/floor/iron/diagonal,
+/area/station/commons/lounge)
"xfj" = (
/obj/effect/turf_decal/siding/dark_green{
dir = 1
@@ -85925,6 +85923,7 @@
},
/obj/machinery/light/small/directional/north,
/obj/effect/landmark/start/hangover/closet,
+/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
"xKO" = (
@@ -104709,8 +104708,8 @@ asg
asX
beX
cnJ
-xeI
-xeI
+fBa
+lwU
xeI
hUE
cOn
@@ -104967,7 +104966,7 @@ cnL
edM
amA
siP
-oUk
+hls
oUk
eRj
ois
@@ -105998,7 +105997,7 @@ acm
oxC
acm
coy
-epS
+hBN
xKT
fZM
sRc
@@ -109850,8 +109849,8 @@ aUV
aTh
aTi
sOO
-cVO
-icM
+bAN
+bAN
nmo
bpD
tNZ
@@ -110107,11 +110106,11 @@ bAN
aTi
dKg
lGj
-aPf
-bAN
-rdj
+bTk
+wzo
pPd
-tNZ
+pPd
+xXg
imG
kcq
uFB
@@ -110365,7 +110364,7 @@ vhx
bAN
teb
bAN
-bpo
+weW
kDD
bve
wEY
@@ -110622,9 +110621,9 @@ bpt
wnU
bpM
boC
-boC
-geB
-boC
+tNZ
+xXg
+tNZ
tNZ
tNZ
ePs
@@ -114438,7 +114437,7 @@ aaa
acm
aaa
aaa
-ubj
+cmU
aUz
aeu
adH
diff --git a/_maps/map_files/LimaStation/LimaStation.dmm b/_maps/map_files/LimaStation/LimaStation.dmm
index 44b4fd0e9ca5..db4abb3d137a 100644
--- a/_maps/map_files/LimaStation/LimaStation.dmm
+++ b/_maps/map_files/LimaStation/LimaStation.dmm
@@ -132,6 +132,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"acU" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/sleeper/cryo{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/security/prison)
"adb" = (
/obj/machinery/firealarm/directional/south,
/obj/machinery/vending/tool,
@@ -1018,7 +1025,7 @@
},
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 8
},
/turf/open/floor/iron/freezer,
@@ -3565,7 +3572,7 @@
dir = 8
},
/obj/machinery/airalarm/directional/south,
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 4
},
/turf/open/floor/iron/freezer,
@@ -9774,14 +9781,14 @@
/turf/open/floor/wood/large,
/area/station/maintenance/old_rec)
"dmO" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/camera/directional/south{
c_tag = "Prison Wing - Foyer";
network = list("ss13", "prison")
},
+/obj/machinery/sleeper/cryo{
+ dir = 4
+ },
/turf/open/floor/iron,
/area/station/security/prison)
"dng" = (
@@ -16354,6 +16361,9 @@
/obj/machinery/light/directional/south,
/obj/effect/turf_decal/tile/neutral,
/obj/structure/noticeboard/directional/south,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
/turf/open/floor/iron,
/area/station/security/prison)
"fze" = (
@@ -36194,16 +36204,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/maintenance/port/lower)
-"lOt" = (
-/obj/effect/turf_decal/siding/wideplating{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/security/prison)
"lOB" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -37826,7 +37826,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 4
},
/turf/open/floor/iron/freezer,
@@ -52305,6 +52305,12 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"qMm" = (
+/obj/machinery/duct,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/checker,
+/area/station/security/prison)
"qMo" = (
/obj/effect/mapping_helpers/broken_floor,
/obj/effect/decal/cleanable/dirt,
@@ -71327,7 +71333,7 @@
},
/obj/structure/cable,
/obj/machinery/newscaster/directional/east,
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 8
},
/turf/open/floor/iron/freezer,
@@ -72785,6 +72791,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
/area/station/security/prison)
"xon" = (
@@ -73587,7 +73594,7 @@
},
/obj/structure/cable,
/obj/machinery/firealarm/directional/east,
-/obj/effect/spawner/random/entertainment/arcade{
+/obj/machinery/sleeper/cryo{
dir = 8
},
/turf/open/floor/iron/freezer,
@@ -94629,7 +94636,7 @@ iIy
sJB
sJB
qQq
-dzL
+acU
eyn
cYc
wOX
@@ -95396,7 +95403,7 @@ riq
vLL
hrv
xoh
-lhT
+qMm
aRO
aRO
mFV
@@ -95909,7 +95916,7 @@ bID
nkV
jzw
aJs
-lOt
+iQf
vis
dzL
dzL
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 77c4563aeabb..c60b81cdd8bc 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -8865,7 +8865,7 @@
department = "Dormitories";
name = "Dorms Requests Console"
},
-/obj/structure/tank_holder/extinguisher,
+/obj/machinery/vending/snack/blue,
/turf/open/floor/iron/corner{
dir = 1
},
@@ -34311,17 +34311,12 @@
/turf/open/floor/iron/edge,
/area/station/security/brig)
"emV" = (
-/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 4
},
/obj/machinery/status_display/evac/directional/west,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"enI" = (
-/obj/machinery/vending/cola/red,
-/turf/open/floor/iron/white/smooth_large,
-/area/station/commons/fitness/recreation)
"enO" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -39370,6 +39365,15 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/virology)
+"ibu" = (
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/machinery/sleeper/cryo{
+ dir = 8
+ },
+/turf/open/floor/iron/dark/side{
+ dir = 1
+ },
+/area/station/security/prison)
"ibw" = (
/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
dir = 4
@@ -43332,7 +43336,7 @@
/turf/open/floor/iron/smooth_half,
/area/station/science/robotics/mechbay)
"low" = (
-/obj/machinery/vending/snack/blue,
+/obj/machinery/sleeper/cryo,
/turf/open/floor/iron/white/smooth_large,
/area/station/commons/fitness/recreation)
"lpB" = (
@@ -43884,11 +43888,6 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
-"lJM" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/station/commons/fitness/recreation)
"lJR" = (
/obj/effect/turf_decal/tile/yellow/half{
dir = 1
@@ -48105,10 +48104,6 @@
"oMN" = (
/turf/open/floor/iron/stairs/left,
/area/station/service/abandoned_gambling_den)
-"oNs" = (
-/obj/machinery/vending/cigarette,
-/turf/open/floor/iron/white/smooth_large,
-/area/station/commons/fitness/recreation)
"oND" = (
/obj/machinery/meter,
/obj/effect/decal/cleanable/dirt,
@@ -56822,6 +56817,7 @@
/area/station/medical/medbay/central)
"uFi" = (
/obj/item/radio/intercom/directional/east,
+/obj/structure/tank_holder/extinguisher,
/turf/open/floor/iron/corner{
dir = 8
},
@@ -59327,7 +59323,7 @@
/turf/open/floor/plating,
/area/station/engineering/atmos)
"wwE" = (
-/obj/structure/table,
+/obj/machinery/vending/cola/red,
/turf/open/floor/iron/edge{
dir = 4
},
@@ -60110,7 +60106,6 @@
"wRG" = (
/obj/structure/closet/lasertag/red,
/obj/effect/turf_decal/tile/blue,
-/obj/machinery/door/firedoor,
/turf/open/floor/iron/white/corner{
dir = 4
},
@@ -84542,7 +84537,7 @@ aem
nud
iTv
agd
-agp
+ibu
ahp
agM
asA
@@ -103322,10 +103317,10 @@ sFK
sFK
sFK
aiS
-enI
+low
fVJ
lFK
-lJM
+lFK
duC
rrM
pcg
@@ -103579,7 +103574,7 @@ aiT
aiS
sFK
aiS
-oNs
+low
eHq
wKP
wRG
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 69ac863865b8..e13ffc00e6cb 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -168,3 +168,7 @@
#define UPPER_LIP "Upper"
#define MIDDLE_LIP "Middle"
#define LOWER_LIP "Lower"
+
+// Latejoin Spawnpoints
+#define SPAWNPOINT_CRYO "Cryogenic Storage"
+#define SPAWNPOINT_ARRIVALS "Arrivals Shuttle"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 4080ba37bf94..85d256f815d6 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -184,21 +184,21 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
*
* Checks that `user` does not move, change hands, get stunned, etc. for the
* given `delay`. Returns `TRUE` on success or `FALSE` on failure.
- *
+ *
* @param {mob} user - The mob performing the action.
- *
+ *
* @param {number} delay - The time in deciseconds. Use the SECONDS define for readability. `1 SECONDS` is 10 deciseconds.
- *
+ *
* @param {atom} target - The target of the action. This is where the progressbar will display.
- *
+ *
* @param {flag} timed_action_flags - Flags to control the behavior of the timed action.
- *
+ *
* @param {boolean} progress - Whether to display a progress bar / cogbar.
- *
+ *
* @param {datum/callback} extra_checks - Additional checks to perform before the action is executed.
- *
+ *
* @param {string} interaction_key - The assoc key under which the do_after is capped, with max_interact_count being the cap. Interaction key will default to target if not set.
- *
+ *
* @param {number} max_interact_count - The maximum amount of interactions allowed.
*/
/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index c2f12a66e821..b7bdc2d957a6 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -113,6 +113,10 @@
/// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master.
var/click_master = TRUE
+/atom/movable/screen/alert/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ if(mouse_over_pointer == MOUSE_HAND_POINTER)
+ add_filter("clickglow", 2, outline_filter(color = COLOR_GOLD, size = 1))
/atom/movable/screen/alert/MouseEntered(location,control,params)
. = ..()
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 1700abb0af1a..861e1a321ccb 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -90,6 +90,8 @@ GLOBAL_LIST_EMPTY(announcement_systems)
message = CompileText(newhead, user, rank)
else if(message_type == "ARRIVALS_BROKEN")
message = "The arrivals shuttle has been damaged. Docking for repairs..."
+ else if(message_type == "DESPAWN")
+ message = CompileText("%PERSON, %RANK, has entered cryogenic storage.", user, rank)
broadcast(message, channels)
diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm
index c6415bdd04a9..6c842761c9c5 100644
--- a/code/game/machinery/sleepers.dm
+++ b/code/game/machinery/sleepers.dm
@@ -24,6 +24,8 @@
///Message sent when a user enters the machine.
var/enter_message = span_boldnotice("You feel cool air surround you. You go numb as your senses turn inward.")
+ var/resist_time = 0 SECONDS
+
///List of currently available chems.
var/list/available_chems = list()
///Used when emagged to scramble which chem is used, eg: mutadone -> morphine
@@ -62,6 +64,13 @@
update_appearance()
reset_chem_buttons()
+/obj/machinery/sleeper/on_set_panel_open(old_value)
+ . = ..()
+ if(panel_open)
+ set_machine_stat(machine_stat | MAINT)
+ else
+ set_machine_stat(machine_stat & ~MAINT)
+
/obj/machinery/sleeper/RefreshParts()
. = ..()
var/matterbin_rating
@@ -72,7 +81,7 @@
available_chems.Cut()
for(var/datum/stock_part/servo/servos in component_parts)
- for(var/i in 1 to servos.tier)
+ for(var/i in 1 to min(servos.tier, length(possible_chems)))
available_chems |= possible_chems[i]
reset_chem_buttons()
@@ -82,8 +91,15 @@
return ..()
/obj/machinery/sleeper/container_resist_act(mob/living/user)
- visible_message(span_notice("[occupant] emerges from [src]!"),
- span_notice("You climb out of [src]!"))
+ if(resist_time > 0)
+ to_chat(user, span_notice("You pull at the release lever."))
+ if(!do_after(user, resist_time, src))
+ return
+ user.visible_message(
+ span_notice("[occupant] emerges from [src]!"),
+ span_notice("You climb out of [src]!"),
+ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
+ )
open_machine()
/obj/machinery/sleeper/Exited(atom/movable/gone, direction)
@@ -367,3 +383,178 @@
log_combat(user, occupant, "sprayed [chem] into", addition = "via [src]")
return TRUE
return ..()
+
+GLOBAL_LIST_INIT(cryo_sleepers, list())
+
+#define IS_SPAWNING "spawning"
+
+/obj/machinery/sleeper/cryo
+ name = "cryogenic pod"
+ desc = "An enclosed machine designed to put subjects in a state of suspended animation for long-term storage."
+ icon = 'maplestation_modules/icons/obj/machines/sleeper.dmi'
+ icon_state = "cryopod"
+ base_icon_state = "cryopod"
+ // circuit = /obj/item/circuitboard/machine/sleeper/cryo
+ enter_message = span_boldnotice("You feel a cold chill as you enter the pod. \
+ You feel your body go numb as you enter a state of suspended animation.")
+ possible_chems = null
+ state_open = FALSE
+ density = TRUE
+ resist_time = 0.5 SECONDS
+
+ var/throw_alert = TRUE
+
+/obj/machinery/sleeper/cryo/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/empprotection, EMP_PROTECT_ALL)
+ GLOB.cryo_sleepers += src
+ open_machine()
+
+/obj/machinery/sleeper/cryo/Destroy()
+ GLOB.cryo_sleepers -= src
+ return ..()
+
+/obj/machinery/sleeper/cryo/examine(mob/user)
+ . = ..()
+ if(isliving(occupant) && user != occupant)
+ var/mob/living/occupant_l = occupant
+ var/obj/item/card/id/their_id = occupant_l.get_idcard()
+ . += span_notice("Inside, you can see [occupant][their_id ? ", the [their_id.assignment]" : ""][HAS_TRAIT(occupant, TRAIT_KNOCKEDOUT) ? " - sound asleep" : ""].")
+
+/obj/machinery/sleeper/cryo/set_occupant(atom/movable/new_occupant)
+ var/mob/living/old_occupant = occupant
+ . = ..()
+ var/mob/living/new_occupant_l = new_occupant
+ var/skey = REF(src)
+ if(istype(old_occupant))
+ old_occupant.remove_status_effect(/datum/status_effect/grouped/stasis, skey)
+ // REMOVE_TRAIT(old_occupant, TRAIT_KNOCKEDOUT, IS_SPAWNING)
+ // REMOVE_TRAIT(old_occupant, TRAIT_MUTE, skey)
+ REMOVE_TRAIT(old_occupant, TRAIT_BLOCK_HEADSET_USE, skey)
+ REMOVE_TRAIT(old_occupant, TRAIT_SOFTSPOKEN, skey)
+ UnregisterSignal(old_occupant, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE)
+ if(throw_alert)
+ old_occupant.clear_alert(skey)
+ if(istype(new_occupant_l))
+ new_occupant_l.apply_status_effect(/datum/status_effect/grouped/stasis, skey)
+ // ADD_TRAIT(new_occupant_l, TRAIT_MUTE, skey)
+ ADD_TRAIT(new_occupant_l, TRAIT_BLOCK_HEADSET_USE, skey)
+ ADD_TRAIT(new_occupant_l, TRAIT_SOFTSPOKEN, skey)
+ RegisterSignal(new_occupant_l, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(early_move_check))
+ if(throw_alert)
+ new_occupant_l.throw_alert(skey, /atom/movable/screen/alert/cryosleep)
+
+/obj/machinery/sleeper/cryo/proc/early_move_check(mob/living/mob_occupant, new_loc, direct)
+ SIGNAL_HANDLER
+
+ if(mob_occupant.incapacitated(IGNORE_STASIS) || DOING_INTERACTION_WITH_TARGET(mob_occupant, src))
+ return NONE
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, relaymove), mob_occupant, direct)
+ return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE
+
+/obj/machinery/sleeper/cryo/close_machine(mob/user, density_to_set)
+ . = ..()
+ if(isliving(occupant))
+ playsound(src, 'sound/effects/spray.ogg', 5, TRUE, frequency = 0.5)
+
+/obj/machinery/sleeper/cryo/close_machine(mob/user, density_to_set)
+ . = ..()
+ if(isliving(occupant))
+ playsound(src, 'sound/machines/fan_stop.ogg', 50, TRUE)
+
+/obj/machinery/sleeper/cryo/JoinPlayerHere(mob/living/joining_mob, buckle)
+ if(occupant || !ishuman(joining_mob))
+ return ..()
+ throw_alert = FALSE
+ if(state_open)
+ close_machine()
+ set_occupant(joining_mob)
+ joining_mob.forceMove(src)
+ ADD_TRAIT(joining_mob, TRAIT_KNOCKEDOUT, IS_SPAWNING)
+ addtimer(TRAIT_CALLBACK_REMOVE(joining_mob, TRAIT_KNOCKEDOUT, IS_SPAWNING), rand(8, 12) * 1 SECONDS)
+ throw_alert = TRUE
+
+/obj/machinery/sleeper/cryo/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel = 0, custom_deconstruct = FALSE)
+ return FALSE
+
+/obj/machinery/sleeper/cryo/default_deconstruction_screwdriver(mob/living/user, icon_state, base_icon_state, obj/item/screwdriver)
+ return FALSE
+
+/obj/machinery/sleeper/cryo/default_change_direction_wrench(mob/living/user, obj/item/wrench)
+ return FALSE
+
+/obj/machinery/sleeper/cryo/open_machine(drop = TRUE, density_to_set = FALSE)
+ density_to_set = TRUE
+ return ..()
+
+/// Checks if this can generically be used as a latejoin spawnpoint
+/obj/machinery/sleeper/cryo/proc/can_latejoin(datum/job/joining)
+ if(!isnull(occupant))
+ return FALSE
+ if(istype(joining, /datum/job/prisoner))
+ if(!istype(get_area(src), /area/station/security/prison))
+ return FALSE
+ else
+ if(!istype(get_area(src), /area/station/commons))
+ return FALSE
+ return TRUE
+
+/// Checks if the passed item should avoid deletion when being despawned
+/obj/machinery/sleeper/cryo/proc/saveable_item(obj/item/save_me)
+ if(save_me.resistance_flags & INDESTRUCTIBLE)
+ return TRUE
+ if(GLOB.steal_item_handler.objectives_by_path[save_me.type])
+ return TRUE
+ return FALSE
+
+/obj/machinery/sleeper/cryo/proc/despawn_occupant()
+ if(!isliving(occupant))
+ return
+ var/drop_loc = drop_location()
+ var/mob/living/mob_occupant = occupant
+
+ set_occupant(null)
+ mob_occupant.ghostize(FALSE)
+
+ for(var/obj/item/save_me in mob_occupant.get_all_contents())
+ if(saveable_item(save_me))
+ mob_occupant.transferItemToLoc(save_me, drop_loc, force = TRUE, silent = TRUE)
+
+ qdel(mob_occupant)
+ open_machine()
+
+ var/datum/record/associated_record = find_record(mob_occupant.real_name)
+ var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
+ if(!QDELETED(associated_record) && !QDELETED(announcer))
+ announcer.announce("DESPAWN", mob_occupant.name, associated_record.rank, list())
+
+ deadchat_broadcast(
+ " has entered cryogenic storage.",
+ "[mob_occupant.real_name] ([associated_record?.rank || "Unknown"])",
+ turf_target = get_turf(src),
+ message_type = DEADCHAT_ARRIVALRATTLE,
+ )
+
+#undef IS_SPAWNING
+
+/atom/movable/screen/alert/cryosleep
+ name = "Cryosleep"
+ desc = "Click this button to despawn your character."
+ mouse_over_pointer = MOUSE_HAND_POINTER
+ icon_state = "cold"
+
+/atom/movable/screen/alert/cryosleep/Click(location, control, params)
+ . = ..()
+ if(!.)
+ return .
+ var/obj/machinery/sleeper/cryo/sleeper = owner.loc
+ if(!istype(sleeper))
+ stack_trace("[type] was clicked by [usr] without being in a sleeper.")
+ return FALSE
+
+ var/are_you_sure = tgui_alert(usr, "Are you sure you want to despawn your character?", "Despawn Character", list("Yes", "No"), 5 SECONDS)
+ if(are_you_sure != "Yes" || QDELETED(src) || QDELETED(sleeper) || sleeper.occupant != usr)
+ return FALSE
+
+ sleeper.despawn_occupant()
+ return TRUE
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index b94ccc2f9730..2c0598b65654 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -516,9 +516,16 @@
log_mapping("Job [title] ([type]) couldn't find a round start spawn point.")
/// Finds a valid latejoin spawn point, checking for events and special conditions.
-/datum/job/proc/get_latejoin_spawn_point()
+/datum/job/proc/get_latejoin_spawn_point(datum/preferences/prefs)
if(length(GLOB.jobspawn_overrides[title])) //We're doing something special today.
return pick(GLOB.jobspawn_overrides[title])
+ if(prefs?.read_preference(/datum/preference/choiced/preferred_latejoin_spawn) == SPAWNPOINT_CRYO)
+ var/list/common_sleepers = list()
+ for(var/obj/machinery/sleeper/cryo/sleeper as anything in GLOB.cryo_sleepers)
+ if(sleeper.can_latejoin(src))
+ common_sleepers += sleeper
+ if(length(common_sleepers))
+ return pick(common_sleepers)
if(length(SSjob.latejoin_trackers))
return pick(SSjob.latejoin_trackers)
return SSjob.get_last_resort_spawn_points()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 582f119bb037..c501d79d67f2 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -178,7 +178,7 @@
return FALSE
mind.late_joiner = TRUE
- var/atom/destination = mind.assigned_role.get_latejoin_spawn_point()
+ var/atom/destination = mind.assigned_role.get_latejoin_spawn_point(client.prefs)
if(!destination)
CRASH("Failed to find a latejoin spawn point.")
var/mob/living/character = create_character(destination)
diff --git a/maplestation.dme b/maplestation.dme
index d61fe738b457..ebd5f00edb2c 100644
--- a/maplestation.dme
+++ b/maplestation.dme
@@ -6397,6 +6397,7 @@
#include "maplestation_modules\code\modules\client\preferences\ready_anominity.dm"
#include "maplestation_modules\code\modules\client\preferences\runechat_color.dm"
#include "maplestation_modules\code\modules\client\preferences\sound_frequency.dm"
+#include "maplestation_modules\code\modules\client\preferences\spawn_location.dm"
#include "maplestation_modules\code\modules\client\preferences\toggle_radio.dm"
#include "maplestation_modules\code\modules\client\preferences\toggle_speech.dm"
#include "maplestation_modules\code\modules\client\preferences\species\lizard.dm"
diff --git a/maplestation_modules/code/modules/client/preferences/height.dm b/maplestation_modules/code/modules/client/preferences/height.dm
index 6df336f29f6a..e5d77e44fb1b 100644
--- a/maplestation_modules/code/modules/client/preferences/height.dm
+++ b/maplestation_modules/code/modules/client/preferences/height.dm
@@ -68,11 +68,7 @@
target.update_transform(resize_amount)
/datum/preference/choiced/mob_size/is_accessible(datum/preferences/preferences)
- if(!..(preferences))
- return FALSE
-
- var/datum/job/fav_job = preferences.get_highest_priority_job()
- return !istype(fav_job, /datum/job/ai) && !istype(fav_job, /datum/job/cyborg)
+ return ..() && !has_silicon_prioritized(preferences)
/datum/preference/choiced/mob_size/create_default_value(datum/preferences/preferences)
return HEIGHT_NO_CHANGE
@@ -118,11 +114,7 @@
target.set_mob_height(height_actual)
/datum/preference/choiced/mob_height/is_accessible(datum/preferences/preferences)
- if(!..(preferences))
- return FALSE
-
- var/datum/job/fav_job = preferences.get_highest_priority_job()
- return !istype(fav_job, /datum/job/ai) && !istype(fav_job, /datum/job/cyborg)
+ return ..() && !has_silicon_prioritized(preferences)
/datum/preference/choiced/mob_height/create_default_value(datum/preferences/preferences)
return DEFAULT_HEIGHT
@@ -158,3 +150,8 @@
return
return ..()
+
+/datum/preference/proc/has_silicon_prioritized(datum/preferences/preferences)
+ // If you have a silicon job, don't show the height preference
+ var/datum/job/fav_job = preferences.get_highest_priority_job()
+ return istype(fav_job, /datum/job/ai) || istype(fav_job, /datum/job/cyborg)
diff --git a/maplestation_modules/code/modules/client/preferences/spawn_location.dm b/maplestation_modules/code/modules/client/preferences/spawn_location.dm
new file mode 100644
index 000000000000..3b1f7c0e8b75
--- /dev/null
+++ b/maplestation_modules/code/modules/client/preferences/spawn_location.dm
@@ -0,0 +1,20 @@
+/datum/preference/choiced/preferred_latejoin_spawn
+ savefile_key = "preferred_latejoin_spawn"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ can_randomize = FALSE
+
+/datum/preference/choiced/preferred_latejoin_spawn/create_default_value()
+ return SPAWNPOINT_ARRIVALS
+
+/datum/preference/choiced/preferred_latejoin_spawn/init_possible_values()
+ return list(
+ SPAWNPOINT_ARRIVALS,
+ SPAWNPOINT_CRYO,
+ )
+
+/datum/preference/choiced/preferred_latejoin_spawn/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/choiced/preferred_latejoin_spawn/is_accessible(datum/preferences/preferences)
+ return ..() && !has_silicon_prioritized(preferences)
diff --git a/maplestation_modules/icons/obj/machines/sleeper.dmi b/maplestation_modules/icons/obj/machines/sleeper.dmi
new file mode 100644
index 000000000000..27388313bf1e
Binary files /dev/null and b/maplestation_modules/icons/obj/machines/sleeper.dmi differ
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/_latejoin_spawn.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/_latejoin_spawn.tsx
new file mode 100644
index 000000000000..920662e60b04
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/_latejoin_spawn.tsx
@@ -0,0 +1,11 @@
+import { FeatureChoiced } from '../base';
+import { FeatureDropdownInput } from '../dropdowns';
+
+export const preferred_latejoin_spawn: FeatureChoiced = {
+ name: 'Latejoin Preference',
+ description:
+ 'Determines the method of arrivals when joining midround. \
+ This indicates preference - it does not guarantee a specific spawn point, \
+ particularly for maps which may not support all options.',
+ component: FeatureDropdownInput,
+};
diff --git a/tgui/packages/tgui/interfaces/Sleeper.jsx b/tgui/packages/tgui/interfaces/Sleeper.jsx
index dd8501f47d43..0be5e8baa405 100644
--- a/tgui/packages/tgui/interfaces/Sleeper.jsx
+++ b/tgui/packages/tgui/interfaces/Sleeper.jsx
@@ -91,32 +91,34 @@ export const Sleeper = (props) => {
>
)}
- act('door')}
- />
- }
- >
- {chems.map((chem) => (
-
+ {chems.length > 0 && (
+ act('door')}
+ />
+ }
+ >
+ {chems.map((chem) => (
+
+ )}
);