diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..df7a79e3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+
+tgstation.int
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index cef639b7..3571f691 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -382,7 +382,7 @@
"ahr" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/structure/cable{icon_state = "1-4"},/turf/open/floor/plasteel/showroomfloor,/area/security/warden)
"ahs" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/plasteel/showroomfloor,/area/security/warden)
"aht" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/showroomfloor,/area/security/warden)
-"ahu" = (/obj/machinery/door/airlock/security/glass{name = "Brig Control"; req_access_txt = "3"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-4"},/obj/structure/cable{icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/showroomfloor,/area/security/warden)
+"ahu" = (/obj/machinery/door/airlock/security/glass{dir = 4; name = "Brig Control"; req_access_txt = "3"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-4"},/obj/structure/cable{icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel/showroomfloor,/area/security/warden)
"ahv" = (/obj/structure/disposalpipe/segment{dir = 6},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel,/area/security/main)
"ahw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/security/main)
"ahx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/turf/open/floor/plasteel,/area/security/main)
@@ -949,7 +949,7 @@
"asm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/security/vacantoffice/b)
"asn" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/turf/open/floor/plating,/area/security/vacantoffice/b)
"aso" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/plating,/area/maintenance/fore)
-"asp" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plating,/area/maintenance/fore)
+"asp" = (/obj/machinery/door/airlock/maintenance{dir = 4; name = "Law Office Maintenance"; req_access_txt = "38"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plating,/area/maintenance/fore)
"asq" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/wood,/area/lawoffice)
"asr" = (/obj/structure/chair/office/dark,/obj/effect/landmark/start/lawyer,/turf/open/floor/wood,/area/lawoffice)
"ass" = (/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/fore)
@@ -1568,7 +1568,7 @@
"aEh" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel,/area/security/checkpoint/auxiliary)
"aEi" = (/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/security/checkpoint/auxiliary)
"aEj" = (/obj/structure/table/glass,/obj/item/reagent_containers/food/snacks/grown/wheat,/obj/item/reagent_containers/food/snacks/grown/watermelon,/obj/item/reagent_containers/food/snacks/grown/watermelon,/obj/item/reagent_containers/food/snacks/grown/watermelon,/obj/item/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/reagent_containers/food/snacks/grown/grapes,/obj/item/reagent_containers/food/snacks/grown/cocoapod,/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 4},/turf/open/floor/plasteel,/area/hydroponics/garden)
-"aEk" = (/obj/machinery/door/airlock{name = "Garden"},/turf/open/floor/plasteel,/area/hydroponics/garden)
+"aEk" = (/obj/machinery/door/airlock{dir = 4; name = "Garden"},/turf/open/floor/plasteel,/area/hydroponics/garden)
"aEl" = (/turf/open/floor/plasteel,/area/storage/primary)
"aEm" = (/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel,/area/storage/primary)
"aEn" = (/obj/effect/turf_decal/bot_white/right,/obj/structure/closet/crate/goldcrate,/obj/effect/turf_decal/tile/neutral{dir = 1},/obj/effect/turf_decal/tile/neutral,/obj/effect/turf_decal/tile/neutral{dir = 4},/obj/effect/turf_decal/tile/neutral{dir = 8},/turf/open/floor/plasteel/dark,/area/ai_monitored/nuke_storage)
@@ -2535,7 +2535,7 @@
"aWM" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/sorting/mail/flip{dir = 2; sortType = 16},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"aWN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/airalarm{pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"aWO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
-"aWP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Library"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
+"aWP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Library"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
"aWQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
"aWR" = (/obj/structure/disposalpipe/segment{dir = 9},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
"aWS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
@@ -2624,7 +2624,7 @@
"aYx" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/closed/wall,/area/hydroponics)
"aYy" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"aYz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
-"aYA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Library"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
+"aYA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Library"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
"aYB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/library)
"aYC" = (/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/carpet,/area/library)
"aYD" = (/obj/machinery/holopad,/turf/open/floor/carpet,/area/library)
@@ -3193,7 +3193,7 @@
"bju" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/radio/intercom{pixel_y = 20},/turf/open/floor/plasteel,/area/quartermaster/storage)
"bjv" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/machinery/vending/wardrobe/cargo_wardrobe,/turf/open/floor/plasteel,/area/quartermaster/storage)
"bjw" = (/turf/open/floor/plasteel,/area/quartermaster/storage)
-"bjx" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/plasteel,/area/quartermaster/storage)
+"bjx" = (/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/plasteel,/area/quartermaster/storage)
"bjy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/quartermaster/storage)
"bjz" = (/obj/machinery/button/door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "31"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel,/area/quartermaster/storage)
"bjA" = (/obj/machinery/photocopier,/obj/item/radio/intercom{pixel_y = 20},/turf/open/floor/plasteel,/area/quartermaster/office)
@@ -3267,7 +3267,7 @@
"bkQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/turf_decal/tile/brown{dir = 8},/turf/open/floor/plasteel,/area/quartermaster/office)
"bkR" = (/obj/structure/disposalpipe/segment{dir = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/quartermaster/office)
"bkS" = (/obj/structure/disposalpipe/sorting/mail/flip{dir = 1; sortType = 2},/obj/structure/noticeboard{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/plasteel,/area/quartermaster/office)
-"bkT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining/glass{name = "Cargo Office"; req_access_txt = "50"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/quartermaster/sorting)
+"bkT" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/open/floor/plasteel,/area/quartermaster/storage)
"bkU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/quartermaster/sorting)
"bkV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/quartermaster/sorting)
"bkW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/quartermaster/sorting)
@@ -3650,7 +3650,7 @@
"bsj" = (/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/quartermaster/storage)
"bsk" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 8; freq = 1400; location = "QM #1"},/obj/effect/turf_decal/bot,/mob/living/simple_animal/bot/mulebot{beacon_freq = 1400; home_destination = "QM #1"; suffix = "#1"},/turf/open/floor/plasteel,/area/quartermaster/storage)
"bsl" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30},/obj/item/multitool,/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4},/turf/open/floor/plasteel,/area/quartermaster/office)
-"bsm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining/glass{dir = 4; name = "Cargo Office"; req_access_txt = "50"},/turf/open/floor/plasteel,/area/quartermaster/office)
+"bsm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining/glass{dir = 4; name = "Cargo Office"; req_access_txt = "50"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel,/area/quartermaster/sorting)
"bsn" = (/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel,/area/quartermaster/office)
"bso" = (/obj/effect/landmark/event_spawn,/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/hallway/primary/central)
"bsp" = (/obj/structure/sign/warning/electricshock{pixel_y = -32},/obj/structure/cable{icon_state = "0-4"},/obj/structure/cable,/obj/machinery/door/poddoor/shutters/preopen{id = "hop"; name = "Privacy Shutters"},/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/crew_quarters/heads/hop)
@@ -4205,6 +4205,7 @@
"bCS" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access_txt = "26"},/obj/structure/disposalpipe/segment,/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel,/area/janitor)
"bCT" = (/turf/closed/wall,/area/maintenance/aft)
"bCU" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/open/floor/plating,/area/maintenance/aft)
+"bCV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining/glass{dir = 4; name = "Cargo Office"; req_access_txt = "50"},/turf/open/floor/plasteel,/area/quartermaster/office)
"bCW" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/surgicaldrill,/turf/open/floor/plasteel,/area/medical/sleeper)
"bCX" = (/obj/structure/table,/obj/item/hemostat,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/white/side{dir = 2},/area/medical/sleeper)
"bCY" = (/obj/structure/table,/obj/item/scalpel{pixel_y = 12},/obj/item/circular_saw,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white,/area/medical/sleeper)
@@ -4542,7 +4543,7 @@
"bJs" = (/obj/structure/chair,/obj/effect/turf_decal/stripes/line{dir = 5},/turf/open/floor/plating/airless,/area/science/test_area)
"bJt" = (/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7},/turf/open/space/basic,/area/space)
"bJu" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 4},/obj/machinery/door/airlock/external{name = "Mining Dock Airlock"; req_access_txt = "48"; shuttledocked = 1},/turf/open/floor/plating,/area/quartermaster/miningdock)
-"bJv" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 8},/obj/machinery/door/airlock/mining/glass{name = "Mining Dock"; req_access_txt = "48"},/turf/open/floor/plasteel,/area/quartermaster/miningdock)
+"bJv" = (/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 8},/obj/machinery/door/airlock/mining/glass{dir = 4; name = "Mining Dock"; req_access_txt = "48"},/turf/open/floor/plasteel,/area/quartermaster/miningdock)
"bJw" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 1},/turf/open/floor/plasteel,/area/quartermaster/miningdock)
"bJx" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plating,/area/maintenance/port/aft)
"bJy" = (/obj/structure/closet/firecloset,/turf/open/floor/plating,/area/maintenance/port/aft)
@@ -5001,7 +5002,7 @@
"bSj" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/turf/open/floor/plasteel,/area/engine/atmos)
"bSk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 6},/obj/structure/cable{icon_state = "1-2"},/turf/open/floor/plasteel,/area/engine/atmos)
"bSl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/open/floor/plasteel,/area/engine/atmos)
-"bSm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos/glass{name = "Distribution Loop"; req_access_txt = "24"},/turf/open/floor/plasteel,/area/engine/atmos)
+"bSm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos/glass{dir = 4; name = "Distribution Loop"; req_access_txt = "24"},/turf/open/floor/plasteel,/area/engine/atmos)
"bSn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 9},/turf/open/floor/plasteel,/area/engine/atmos)
"bSo" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 9},/turf/open/floor/plasteel,/area/engine/atmos)
"bSp" = (/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "Pure to Mix"},/turf/open/floor/plasteel,/area/engine/atmos)
@@ -5154,7 +5155,7 @@
"bVg" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/turf_decal/tile/yellow{dir = 8},/turf/open/floor/plasteel/dark/corner{dir = 1},/area/engine/atmos)
"bVh" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/engine/atmos)
"bVi" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/effect/turf_decal/tile/yellow{dir = 4},/turf/open/floor/plasteel/dark/corner,/area/engine/atmos)
-"bVj" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/turf/open/floor/plasteel,/area/engine/atmos)
+"bVj" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/atmos{dir = 4; name = "Atmospherics"; req_access_txt = "24"},/turf/open/floor/plasteel,/area/engine/atmos)
"bVk" = (/obj/machinery/atmospherics/components/binary/pump/on{dir = 8; name = "Air to External"},/turf/open/floor/plasteel,/area/engine/atmos)
"bVl" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/turf/open/floor/plasteel,/area/engine/atmos)
"bVm" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/open/floor/plasteel,/area/engine/atmos)
@@ -6476,7 +6477,7 @@
"cuC" = (/obj/structure/piano{icon_state = "piano"},/turf/open/floor/wood,/area/crew_quarters/bar)
"cuD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/plasteel,/area/engine/engineering)
"cuE" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/engine/engineering)
-"cuF" = (/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/engine/engineering)
+"cuF" = (/obj/machinery/door/airlock/command{dir = 4; name = "MiniSat Access"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/engine/engineering)
"cuG" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel,/area/engine/engineering)
"cuH" = (/obj/structure/transit_tube_pod,/obj/structure/transit_tube/station/reverse/flipped{dir = 4},/obj/effect/turf_decal/stripes/line{dir = 8},/turf/open/floor/plating,/area/engine/engineering)
"cuI" = (/obj/structure/cable{icon_state = "2-4"},/obj/structure/cable{icon_state = "1-4"},/obj/structure/lattice/catwalk,/turf/open/space,/area/solar/starboard/aft)
@@ -7036,13 +7037,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweayUbexayUayWaxBaxBayXayUbeyayUayYbezbeAbeAbdrbeBbeCbeDbeEbeFbdtbeGbeHbeIbeIbeJbeKaXpaXpaXpbeLbeMaXpaPjaPjaPjaPjbeNbeObePbeQbeObeRaZibeSbeTaZjaZlaZmbeUbeVbeWbeXbeXbeXbeXbeYbeZbeVbBKaIPbbZaZvbaJbfbbfcbfdbfebffbcQbfgbfhaXYbfibfjbfkbfkbfkbflbfmaYdbfnbfobfpbfqbfrbfsbftbbabfuaZDbsJaIPcCcbfvbfvbfvbfvbfvbfvbfvbfwbfxbfxbfxbfybfzbfwbfAbfAbfAbfAbfAbfBbfBbfBbfCbfBbfBbfBbfBbfDbaaberbfEbfFbfGbfHbfIbfJbfJbfJbfKbfLbfLbfLbfLbfLbfMbfNbfNbBPbBQbfNbBRbBSbfNbfNbfRbfSbfSbfSbfSbfTbfUbfVbfWaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAaauSaAbaxyayUaAcaAdbfXbfYayUaxyaAbayUauSaAaawebdrbfZbgabgabgabgbbgcbgdbgebeObeObgfbggaXpaYWbghbeLbgiaXpbgjbgjaRTbgkbglbgmbgnbgmbgmbgobgpbgqaZkbgrbgsaZmaRTbgtbgubeVbgvbgwbgxbgyaPNbgAbBTbgCbBUaZvbgEaZybgFbgGbgHbgIbcQbgJaZvaadbgKbgLbgLbgLbgLbgLbgMaadaZDbgNbgObgPbgQbbabgRbbabgSaZDbsJaIPbBWbfvbgUbgVbgWbgXbgYbfvbgZbrtbrtbrtbhbbhccBMbhdbhebhfbhgbfAbhhbhibhjbhkbhibhlbhmbfBbfFbhnbfFbfFbfFbhobhpbhqbhrbhsbhtbhubhvbhwbhxbhybfLbhzbhAbhzbfLbhBbhCbhBbfSbhDbhEbhDbfSbhFbhGbfSbhHbhIaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaadaadaadaadayUbhJayUayUayUayUayUayUbhKayUaadaadaadaaabdrbhLbdrbhMbgabhNbhObdraRTaTfbhPbhQbhRbhSbhSbhSbhSbhSbhSbhTbhUbhVbhWbhXbhYbhYbhYbhYbhYbhYaZmbhZaZiaZmbhYbhYbiabibbicbidbiebifbiebigbihbfaaIPbBXaZvbijaZyaZyaZyaZybgIbcQbikaZvaadbgKbgLbilbimbinbgLbgMaadaZDbiobbObipbiqbbabftbbabbaaZDbsJaIPcCcbfvbirbisbitbitbiubivbhcbiwbhcbhcbhbbhcbhcbhdbixbiybizbfAbiAbhibhibiBbiAbiCbhibfBbiDbiEbiFbfFbiGbiHbfHbiIbiJbiKbiLbiMbiNbiObiPbiQbiRbiSbiTbiUbfLbiVbiWbiXbfSbiYbiZbiYbjabjbbjbbfSbjcbhIaaaaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaabdrbjebjfbjgbjhbjhbjibjjbjkbjlaPjbjmbjnbjobjobjobjpbjpbjpbjpbjpbjpbjqbjrbhYbjsbjtbjubjvbjwbjxbjybjzbhYbjAbjBbjCbeVbeVbjDbjEbjFbjEbjGbjHbjIbjJbbZbjKbjLbjMbjNbjOaZybjPbcQaZvaZvaadbgKbgLbimbgLbimbgLbgMaadaZDaZDbjQbbPbjRbbabjSbjTbjUaZDbsJaIPcCcbfvbjVbisbjWbjXbjYbjZbhcbkabkbbkcbkdbkebkfbhdbkgbkhbkibfAbiAbhibhibiBbiAbiCbkjbfBbkkbklbkmbfFbknbkobfHbkpbkqbkrbksbkpbiNbktbkubiPbiPbiPbiPbkvbfLbkwbkxbkybfSbkzbjbbjbbkAbkBbkCbfSbjcbhIbkDbkDbkDbkDaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbkEbdrbkFbkGbkGbkHbdrbkIbkIaPjbkJbkKbkJbkJbkJbkKbkJaPjaPjbhYbhYbkLbkMbhYbjwbjwbjwbjwbjwbjwbkNbkObkPbkQbkRbkSbkTbkUbkVbkUbkWbkXbkYbihbfabkZblablbblcbldbleblfaZybgIbcQaZvaadaadblgblhbinblibilbljblkaadaadaZDbllblmaZDaZDaZDaZDblnaZDburaIPcBJbfvblpblqblrbitbiublsbhcbltblublvblwblxblybfAblzblAblBbfAbiAbhibhibiBbiAblCblDbfBbfFbfFbfFbfFblEbkobfHblFbiJblGbiLblHbiNblIblJblKblLblMblNblObfLblPbkxblQbfSblRblSblTblUblVblWbfSbjcblXblYblZbmabmbaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaabdrbjebjfbjgbjhbjhbjibjjbjkbjlaPjbjmbjnbjobjobjobjpbjpbjpbjpbjpbjpbjqbjrbhYbjsbjtbjubjvbjxbkTbjybjzbhYbjAbjBbjCbeVbeVbjDbjEbjFbjEbjGbjHbjIbjJbbZbjKbjLbjMbjNbjOaZybjPbcQaZvaZvaadbgKbgLbimbgLbimbgLbgMaadaZDaZDbjQbbPbjRbbabjSbjTbjUaZDbsJaIPcCcbfvbjVbisbjWbjXbjYbjZbhcbkabkbbkcbkdbkebkfbhdbkgbkhbkibfAbiAbhibhibiBbiAbiCbkjbfBbkkbklbkmbfFbknbkobfHbkpbkqbkrbksbkpbiNbktbkubiPbiPbiPbiPbkvbfLbkwbkxbkybfSbkzbjbbjbbkAbkBbkCbfSbjcbhIbkDbkDbkDbkDaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbkEbdrbkFbkGbkGbkHbdrbkIbkIaPjbkJbkKbkJbkJbkJbkKbkJaPjaPjbhYbhYbkLbkMbhYbjwbjwbjwbjwbjwbjwbkNbkObkPbkQbkRbkSbsmbkUbkVbkUbkWbkXbkYbihbfabkZblablbblcbldbleblfaZybgIbcQaZvaadaadblgblhbinblibilbljblkaadaadaZDbllblmaZDaZDaZDaZDblnaZDburaIPcBJbfvblpblqblrbitbiublsbhcbltblublvblwblxblybfAblzblAblBbfAbiAbhibhibiBbiAblCblDbfBbfFbfFbfFbfFblEbkobfHblFbiJblGbiLblHbiNblIblJblKblLblMblNblObfLblPbkxblQbfSblRblSblTblUblVblWbfSbjcblXblYblZbmabmbaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbmcbjfbmdbkGbmebmfbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmgbmhbmibmjbmkbmlbjwbjwbjwbmmbjwbjwbmnbwgbmpbmqbmrbmsbmtbmubihbmvbeVbeVbeVbmwbmxaLzbjKbmybmzbmzbmzbmzbmAbmBbmCaadaaabgKbmDbgLbgLbgLbmEbgMaaaaadbmFbmGbmHbmIbufbmKaZDbmLaZDbrlaIPcBKbfvbmObmPbmQbmRbmSbfvbmTbltblubmUbmVbhcbmWbfAbmXbmYbmZbfAbnabnbbncbndbnebnfbnebngbnhbnibnhbnhbnhbnjbfHbnkbnlbnmbnnbnobnpbnqbnrbnsbntbnubnvaRhbfLbnxbnybnzbfSbnAbnBbnCbnDbjbaSvbfSbnFbnGbnHbnIbnIbnIbnIbnIbnIbnJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdrbnKbjfbjfbjfbdrbdrbdraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmgbnLbnMbnNbnObnObnObnObnObnObnObnObnObnPbnQbnRbnSbnTbnUbnVbnWbnXbnYbnZboabfabobbocbjKbjKbmCbodboebofbogbohbmCaaaaaabgKboibojbokbojbolbgMaaaaaabmFbombonboobmFbopaZDboqaZDbrlaIPcCdcCDbosbmPbotbitboubfvbovbowboxboybozbhcboAbfAbhdboBboCbfAbfBboDbfBboEboFboGboHboHboHboHboHboHboHboIboJbfIbfIbfIbfIbfIboKboLbiPboMbnvbnvboNboOboKboPboQboRboSboTboUboVboWboXboYbfSboZbpabpbbpcbpcbpcbpcbpcbpdbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpebmgbmgbpfbnMbjybjwbpgbpgbpgbpgbjwbjwbjwbjwbphbpibpjbpkbplbpmbpnbpobppbnXbnXboabpqbprbpsbptbpubpvbpwbpxbpybpzbpAbmCaadaaabgKbpBbpCbpCbpCbpDbgMaaaaadbmFbpEbpFbpGbmFbpHaZDbmLaZDbrlaIPcCdbfvbpJbmPbpKbpLbpMbfvbpNbltbhbboybpObpPbovbovbpQbpRbpSbpTbpUbpVbpWbpXbpYbpZbqabqbbqcbqdbqebqfbqgbkobqhbqibqjbqkbqlbqmbqnbqobqpbqqbqrbqsbnvbqtbqubqvbqwaSxboSbqybqzbqAbqBbjbbqCbqDbqEbfSbqFbqFbqFbqFbqFbqFbjcbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqGbqHbqGbqIbqJbqKbqLbqMbjwbjwbjwbjwbjwbqNbhYbhYbqObnXbqPbqQbqRbnVbqSbnXbqTbnXbqUbmMbobbqVbqWbqXbqYbqZbrabrbbpzbrcbmCaaaaaabgKbrdbrebrfbrebrgbgMaaaaaabrhbribrjbrhbrhbrhbrhbrkbrhcBUaLzcCebfvbfvbrnbrobrpbfvbfvbrqbrrbrsbsebsgbsebuqbsebrubrvbrwbrwbrwbrxbrwbrybpYbpZbrzbrAbrBbrCbrDbrEbqgbrFbrGbrHbrIbrIbrIbrJbrKbrLbrMbrNbrObrPbrQbrRbrSbrTbkxbrUboSboSbrVbrWbrXbrVboSbfSbfSbfSbrYbrZbsabsbbscbqFbsdbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrfbsfbutbshbjwbjybjwbpgbpgbsibpgbjwbjwbsjbskbhYbslbnXbqPbqQbnXbsmbnXbnXbsnbnXbqUbmMbobaIPbqWbsobspbsqbsrbsrbssbstbmCaadaadbsubsvbswbsxbsybszbsAaadaadbsBbsCbsDbsEbsFbsGbsHbsIbrhcBVaIPbsKbsLbsMbsNbsObsPbsQbsRbsSbsTbsUbsVbsVbsVbsVbsVbsWbsXbsVbsVbsVbsYbkfbsZbtabpZbtbbtcbtdbtdbtebqfbqgbkobqhbtfbtgbthbtibtjbtkbtlbiPbtmbiPbiPbiPbtnboKbtobtpbtqbtrbtsbttbtubtvbtwbtxbtybtzbtAbtBbtCbtCbtCbtDbtEbtFbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrfbsfbutbshbjwbjybjwbpgbpgbsibpgbjwbjwbsjbskbhYbslbnXbqPbqQbnXbCVbnXbnXbsnbnXbqUbmMbobaIPbqWbsobspbsqbsrbsrbssbstbmCaadaadbsubsvbswbsxbsybszbsAaadaadbsBbsCbsDbsEbsFbsGbsHbsIbrhcBVaIPbsKbsLbsMbsNbsObsPbsQbsRbsSbsTbsUbsVbsVbsVbsVbsVbsWbsXbsVbsVbsVbsYbkfbsZbtabpZbtbbtcbtdbtdbtebqfbqgbkobqhbtfbtgbthbtibtjbtkbtlbiPbtmbiPbiPbiPbtnboKbtobtpbtqbtrbtsbttbtubtvbtwbtxbtybtzbtAbtBbtCbtCbtCbtDbtEbtFbhIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpebmgbmgbtGbjwbjybjwbjwbjwbjwbjwbjwbjwbsjbtHbhYbtIbtJbtKbtLbtMbtNbtObtPbnXbtQboabtRbobaIPbqWbqXbmCbtSbtTbtUbtVbtWbmCaaaaaaaadbgKbtXbtYbtXbgMaadaaaaaabsBbtZbuabubbucbudbudbuebydbugbuhaMXbuibujbukbulbumbunbuobunbunbupbzBbApbAubAubAuckqcksbhcbhcbuubuvbuvbuwbpZbpZbpZbuxbuybuzbrDbqfbqgbuAbqhbfLboKboKboKboKboKboKboKboKboKbuBbuCbuBboKbuDbuEbuFbuGbuGbuGbuHbuIbuJbuKbuLbuMbuNbuObuPbuQbuRbuSbuTbuUbuVbkDbuWbuWbkDaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuXcrfbsfbutbnLbuYbkNbuZbmlbjwbuYbjwbjwbjwbsjbvabhYbvbbnXbqPbvcbvdbvebnXbnXbnXbvfboabtRbobaXNbqWbvgbmCbvhbvibvjbvkbohbmCaaaaaaaadbvlbvmbpCbvnbvoaadaaaaaabsBbvpbvqbvrbvsbvtbvubvvbrhcCfaIPcCcbovbovbvxbvybrubvzbvAbvBbvCbvCbvBbvAbvBbvAbvBbvAbvBbvAbfzbfzbuvbvDbtdbvEbvFbpZbuxbvGbvHbvIbvJbqgbvKbvLbvMbvNbvObuGbuGbvPbuGbuGbvQbvRbvSbvTbvUbuGbvVbvWbvXbvYbvYbvYbvZbvZbvZbvZbvZbwabwbbwcbwdbwcbwebwcbqFbwfbEnbwhbwibwjbkDaadaaaaaaaaaaaaaaaaaaaadaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbwlbwkbwmbwnbwmbwmbwmbwmbwmbwobwpbjwbsjbwqbhYbwrbwsbwtbwubwvbwwbwxbwxbwxbwwbwwcCgbobaKebwzbqXbmCbwAbwBbwCbwDbwEbmCaaaaaaaadbwFbwGbsxbwHbwIaadaaaaaabsBbwJbwKbwLbwMbvtbvubvvbrhbziaIPcCcbwObwPbwQbvybwRbwSbvAbwTbwUbwVbwWbwXbwYbwZbxabwZbxbbvAbhccribuvbxcbtdbxdbxebxfbxgbxhbxibxibxjbxkbxlbxmbxnbxobxpbxqbxrbxqbxqbxsbxqbxqbxtbxubxqbxqbxvbxwbxxbvYbxybxzbxAbxBbxCbxDbvZbxEbxFbxGbxHbxIbxFbxJbqFbwfbhIbxKbxLbxMbkDaaaaaaaaaaaaaaaaaaaaaaadbxNaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 3cd64af8..fb4718d4 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -72,6 +72,7 @@
#define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute.
+#define STATUS_EFFECT_STASIS /datum/status_effect/incapacitating/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc
/////////////
// NEUTRAL //
/////////////
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 80c33f2f..7d930c6d 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -72,6 +72,8 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
if(!GLOB.moth_wings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
+ if(!GLOB.moth_markings_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
//CIT CHANGES - genitals and such
if(!GLOB.cock_shapes_list.len)
@@ -145,6 +147,7 @@
"legs" = pick("Normal Legs","Digitigrade Legs"),
"caps" = pick(GLOB.caps_list),
"moth_wings" = pick(GLOB.moth_wings_list),
+ "moth_markings" = pick(GLOB.moth_markings_list),
"taur" = "None",
"mam_body_markings" = pick(snowflake_markings_list),
"mam_ears" = pick(snowflake_ears_list),
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index 82b2b903..4362f33a 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -20,6 +20,11 @@
/proc/SQLtime(timevar)
return time2text(timevar || world.timeofday, "YYYY-MM-DD hh:mm:ss")
+/proc/station_time(display_only = FALSE, wtime=world.time)
+ return ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0)
+
+/proc/station_time_timestamp(format = "hh:mm:ss", wtime)
+ return time2text(station_time(TRUE, wtime), format)
GLOBAL_VAR_INIT(midnight_rollovers, 0)
GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 6700fbad..a9615d7c 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -35,6 +35,7 @@ GLOBAL_LIST_EMPTY(wings_list)
GLOBAL_LIST_EMPTY(wings_open_list)
GLOBAL_LIST_EMPTY(r_wings_list)
GLOBAL_LIST_EMPTY(moth_wings_list)
+GLOBAL_LIST_EMPTY(moth_markings_list)
GLOBAL_LIST_EMPTY(caps_list)
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm
index 435414a8..07c786b1 100644
--- a/code/controllers/subsystem/vis_overlays.dm
+++ b/code/controllers/subsystem/vis_overlays.dm
@@ -5,11 +5,13 @@ SUBSYSTEM_DEF(vis_overlays)
init_order = INIT_ORDER_VIS
var/list/vis_overlay_cache
+ var/list/unique_vis_overlays
var/list/currentrun
var/datum/callback/rotate_cb
/datum/controller/subsystem/vis_overlays/Initialize()
vis_overlay_cache = list()
+ unique_vis_overlays = list()
rotate_cb = CALLBACK(src, .proc/rotate_vis_overlay)
return ..()
@@ -31,20 +33,23 @@ SUBSYSTEM_DEF(vis_overlays)
return
//the "thing" var can be anything with vis_contents which includes images
-/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha=255)
- . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]"
- var/obj/effect/overlay/vis/overlay = vis_overlay_cache[.]
- if(!overlay)
- overlay = new
- overlay.icon = icon
- overlay.icon_state = iconstate
- overlay.layer = layer
- overlay.plane = plane
- overlay.dir = dir
- overlay.alpha = alpha
- vis_overlay_cache[.] = overlay
+/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE, unique = FALSE)
+ var/obj/effect/overlay/vis/overlay
+ if(!unique)
+ . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]"
+ overlay = vis_overlay_cache[.]
+ if(!overlay)
+ overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags)
+ vis_overlay_cache[.] = overlay
+ else
+ overlay.unused = 0
else
- overlay.unused = 0
+ overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags)
+ overlay.cache_expiration = -1
+ var/cache_id = "\ref[overlay]@{[world.time]}"
+ unique_vis_overlays += overlay
+ vis_overlay_cache[cache_id] = overlay
+ . = overlay
thing.vis_contents += overlay
if(!isatom(thing)) // Automatic rotation is not supported on non atoms
@@ -56,6 +61,17 @@ SUBSYSTEM_DEF(vis_overlays)
else
thing.managed_vis_overlays += overlay
+/datum/controller/subsystem/vis_overlays/proc/_create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags)
+ var/obj/effect/overlay/vis/overlay = new
+ overlay.icon = icon
+ overlay.icon_state = iconstate
+ overlay.layer = layer
+ overlay.plane = plane
+ overlay.dir = dir
+ overlay.alpha = alpha
+ overlay.appearance_flags |= add_appearance_flags
+ return overlay
+
/datum/controller/subsystem/vis_overlays/proc/remove_vis_overlay(atom/movable/thing, list/overlays)
thing.vis_contents -= overlays
if(!isatom(thing))
@@ -68,8 +84,11 @@ SUBSYSTEM_DEF(vis_overlays)
/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir)
var/rotation = dir2angle(old_dir) - dir2angle(new_dir)
var/list/overlays_to_remove = list()
- for(var/i in thing.managed_vis_overlays)
+ for(var/i in thing.managed_vis_overlays - unique_vis_overlays)
var/obj/effect/overlay/vis/overlay = i
add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation))
overlays_to_remove += overlay
+ for(var/i in thing.managed_vis_overlays & unique_vis_overlays)
+ var/obj/effect/overlay/vis/overlay = i
+ overlay.dir = turn(overlay.dir, rotation)
remove_vis_overlay(thing, overlays_to_remove)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index e930c77c..a470f814 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -80,6 +80,44 @@
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
icon_state = "asleep"
+//STASIS
+/datum/status_effect/incapacitating/stasis
+ id = "stasis"
+ duration = -1
+ tick_interval = 10
+ alert_type = /obj/screen/alert/status_effect/stasis
+ var/last_dead_time
+
+/datum/status_effect/incapacitating/stasis/proc/update_time_of_death()
+ if(last_dead_time)
+ var/delta = world.time - last_dead_time
+ var/new_timeofdeath = owner.timeofdeath + delta
+ owner.timeofdeath = new_timeofdeath
+ owner.tod = station_time_timestamp(wtime=new_timeofdeath)
+ last_dead_time = null
+ if(owner.stat == DEAD)
+ last_dead_time = world.time
+
+/datum/status_effect/incapacitating/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove)
+ . = ..()
+ update_time_of_death()
+
+/datum/status_effect/incapacitating/stasis/tick()
+ update_time_of_death()
+
+/datum/status_effect/incapacitating/stasis/on_remove()
+ update_time_of_death()
+ return ..()
+
+/datum/status_effect/incapacitating/stasis/be_replaced()
+ update_time_of_death()
+ return ..()
+
+/obj/screen/alert/status_effect/stasis
+ name = "Stasis"
+ desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring."
+ icon_state = "stasis"
+
//OTHER DEBUFFS
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
id = "his_wrath"
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index d8027a2c..cbda257f 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -88,11 +88,13 @@
if(istype(AM,/mob/living))
var/mob/living/AMob = AM
AMob.grabbedby(src)
+
return TRUE
stop_pulling()
if(AM.pulledby)
log_combat(AM, AM.pulledby, "pulled from", src)
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+
pulling = AM
AM.pulledby = src
grab_state = gs
@@ -102,19 +104,44 @@
var/mob/M = AM
log_combat(src, M, "grabbed", addition="passive grab")
visible_message("[src] has grabbed [M] passively.")
-
return TRUE
+//move character into tile whos grabbing you
+/atom/movable/proc/adjust_position()
+
+ var/pull_dir = get_dir(src, pulledby)
+ if (pulledby <> null)
+ switch(pull_dir)
+ if(NORTH)
+ animate(src, pixel_x=0, pixel_y=8, time=5)
+ if(NORTHEAST)
+ animate(src, pixel_x=8, pixel_y=8, time=5)
+ if(NORTHWEST)
+ animate(src, pixel_x=-8, pixel_y=8, time=5)
+ if(SOUTHEAST)
+ animate(src, pixel_x=8, pixel_y=-8, time=5)
+ if(SOUTHWEST)
+ animate(src, pixel_x=-8, pixel_y=-8, time=5)
+ if(SOUTH)
+ animate(src, pixel_x=0, pixel_y=-8, time=5)
+ if(WEST)
+ animate(src, pixel_x=-8, pixel_y=0, time=5)
+ if(EAST)
+ animate(src, pixel_x=8, pixel_y=0, time=5)
+
+
/atom/movable/proc/stop_pulling()
if(pulling)
pulling.pulledby = null
var/mob/living/ex_pulled = pulling
pulling = null
grab_state = 0
+
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_canmove()// mob gets up if it was lyng down in a chokehold
+
/atom/movable/proc/Move_Pulled(atom/A)
if(!pulling)
return
@@ -132,9 +159,12 @@
return
step(pulling, get_dir(pulling.loc, A))
+
+
/atom/movable/proc/check_pulling()
if(pulling)
var/atom/movable/pullee = pulling
+
if(pullee && get_dist(src, pullee) > 1)
stop_pulling()
return
@@ -149,6 +179,11 @@
stop_pulling()
return
+
+
+
+
+
////////////////////////////////////////
// Here's where we rewrite how byond handles movement except slightly different
// To be removed on step_ conversion
@@ -220,6 +255,7 @@
// place due to a Crossed, Bumped, etc. call will interrupt
// the second half of the diagonal movement, or the second attempt
// at a first half if step() fails because we hit something.
+
if (direct & NORTH)
if (direct & EAST)
if (step(src, NORTH) && moving_diagonally)
@@ -276,6 +312,7 @@
if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move.
if(pulling.anchored)
stop_pulling()
+
else
var/pull_dir = get_dir(src, pulling)
//puller and pullee more than one tile away or in diagonal position
@@ -283,6 +320,7 @@
pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up
stop_pulling()
+
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index b0e4c699..9cd7b436 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -179,12 +179,15 @@ Class Procs:
L.update_canmove()
occupant = null
+/obj/machinery/proc/can_be_occupant(atom/movable/am)
+ return occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am)
+
/obj/machinery/proc/close_machine(atom/movable/target = null)
state_open = FALSE
density = TRUE
if(!target)
for(var/am in loc)
- if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am)))
+ if (!(can_be_occupant(am)))
continue
var/atom/movable/AM = am
if(AM.has_buckled_mobs())
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index b217c14e..54b42a14 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -13,8 +13,8 @@
var/obj/item/reagent_containers/beaker = null
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
- /obj/item/reagent_containers/glass))
-
+ /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/chem_pack))
/obj/machinery/iv_drip/Initialize()
. = ..()
update_icon()
diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm
new file mode 100644
index 00000000..f24b2f4f
--- /dev/null
+++ b/code/game/machinery/stasis.dm
@@ -0,0 +1,137 @@
+#define STASIS_TOGGLE_COOLDOWN 50
+/obj/machinery/stasis
+ name = "Lifeform Stasis Unit"
+ desc = "A not so comfortable looking bed with some nozzles at the top and bottom. It will keep someone in stasis."
+ icon = 'icons/obj/machines/stasis.dmi'
+ icon_state = "stasis"
+ density = FALSE
+ can_buckle = TRUE
+ buckle_lying = 90
+ circuit = /obj/item/circuitboard/machine/stasis
+ idle_power_usage = 40
+ active_power_usage = 340
+ var/stasis_enabled = TRUE
+ var/last_stasis_sound = FALSE
+ var/stasis_can_toggle = 0
+ var/mattress_state = "stasis_on"
+ var/obj/effect/overlay/vis/mattress_on
+
+/obj/machinery/stasis/examine(mob/user)
+ ..()
+ var/turn_on_or_off = stasis_enabled ? "turn off" : "turn on"
+ to_chat(user, "Alt-click to [turn_on_or_off] the machine.")
+
+/obj/machinery/stasis/proc/play_power_sound()
+ var/_running = stasis_running()
+ if(last_stasis_sound != _running)
+ var/sound_freq = rand(5120, 8800)
+ if(_running)
+ playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, frequency = sound_freq)
+ else
+ playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = sound_freq)
+ last_stasis_sound = _running
+
+/obj/machinery/stasis/AltClick(mob/user)
+ if(world.time >= stasis_can_toggle && user.canUseTopic(src))
+ stasis_enabled = !stasis_enabled
+ stasis_can_toggle = world.time + STASIS_TOGGLE_COOLDOWN
+ playsound(src, 'sound/machines/click.ogg', 60, TRUE)
+ play_power_sound()
+ update_icon()
+
+/obj/machinery/stasis/Exited(atom/movable/AM, atom/newloc)
+ if(AM == occupant)
+ var/mob/living/L = AM
+ if(L.IsInStasis())
+ thaw_them(L)
+ . = ..()
+
+/obj/machinery/stasis/proc/stasis_running()
+ return stasis_enabled && is_operational()
+
+/obj/machinery/stasis/update_icon()
+ . = ..()
+ var/_running = stasis_running()
+ var/list/overlays_to_remove = managed_vis_overlays
+
+ if(mattress_state)
+ if(!mattress_on || !managed_vis_overlays)
+ mattress_on = SSvis_overlays.add_vis_overlay(src, icon, mattress_state, layer, plane, dir, alpha = 0, unique = TRUE)
+
+ if(mattress_on.alpha ? !_running : _running) //check the inverse of _running compared to truthy alpha, to see if they differ
+ var/new_alpha = _running ? 255 : 0
+ var/easing_direction = _running ? EASE_OUT : EASE_IN
+ animate(mattress_on, alpha = new_alpha, time = 50, easing = CUBIC_EASING|easing_direction)
+
+ overlays_to_remove = managed_vis_overlays - mattress_on
+
+ SSvis_overlays.remove_vis_overlay(src, overlays_to_remove)
+
+ if(occupant)
+ SSvis_overlays.add_vis_overlay(src, 'icons/obj/machines/stasis.dmi', "tubes", LYING_MOB_LAYER + 0.1, plane, dir) //using vis_overlays instead of normal overlays for mouse_opacity here
+
+ if(stat & BROKEN)
+ icon_state = "stasis_broken"
+ return
+ if(panel_open || stat & MAINT)
+ icon_state = "stasis_maintenance"
+ return
+ icon_state = "stasis"
+
+/obj/machinery/stasis/obj_break(damage_flag)
+ . = ..()
+ play_power_sound()
+ update_icon()
+
+/obj/machinery/stasis/power_change()
+ . = ..()
+ play_power_sound()
+ update_icon()
+
+/obj/machinery/stasis/proc/chill_out(mob/living/target)
+ if(target != occupant)
+ return
+ var/freq = rand(24750, 26550)
+ playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq)
+ target.SetStasis(TRUE)
+ target.ExtinguishMob()
+ use_power = ACTIVE_POWER_USE
+
+/obj/machinery/stasis/proc/thaw_them(mob/living/target)
+ target.SetStasis(FALSE)
+ if(target == occupant)
+ use_power = IDLE_POWER_USE
+
+/obj/machinery/stasis/post_buckle_mob(mob/living/L)
+ if(!can_be_occupant(L))
+ return
+ occupant = L
+ if(stasis_running())
+ chill_out(L)
+ update_icon()
+
+/obj/machinery/stasis/post_unbuckle_mob(mob/living/L)
+ thaw_them(L)
+ if(L == occupant)
+ occupant = null
+ update_icon()
+
+/obj/machinery/stasis/process()
+ if( !( occupant && isliving(occupant)) )
+ use_power = IDLE_POWER_USE
+ return
+ var/mob/living/L_occupant = occupant
+ if(stasis_running())
+ if(!L_occupant.IsInStasis())
+ chill_out(L_occupant)
+ else if(L_occupant.IsInStasis())
+ thaw_them(L_occupant)
+
+/obj/machinery/stasis/screwdriver_act(mob/living/user, obj/item/I)
+ . = default_deconstruction_screwdriver(user, "stasis_maintenance", "stasis", I)
+ update_icon()
+
+/obj/machinery/stasis/crowbar_act(mob/living/user, obj/item/I)
+ return default_deconstruction_crowbar(I)
+
+#undef STASIS_TOGGLE_COOLDOWN
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index b9b6e3af..a5293500 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -419,6 +419,7 @@
"name" = "[customsender]",
"job" = "[customjob]",
"message" = custommessage,
+ "emoji_message" = emoji_parse(custommessage),
"targets" = list("[customrecepient.owner] ([customrecepient.ownjob])")
))
// this will log the signal and transmit it to the target
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 19600808..0cf356ad 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -106,10 +106,11 @@
return "Everyone"
return data["targets"][1]
-/datum/signal/subspace/pda/proc/format_message()
+/datum/signal/subspace/pda/proc/format_message(emojify = FALSE)
+ var/message = emojify ? data["emoji_message"] : data["message"]
if (logged && data["photo"])
- return "\"[data["message"]]\" (Photo)"
- return "\"[data["message"]]\""
+ return "\"[message]\" (Photo)"
+ return "\"[message]\""
/datum/signal/subspace/pda/broadcast()
if (!logged) // Can only go through if a message server logs it
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 2a01a7e1..36d85edb 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -7,6 +7,14 @@
/obj/item/stack/cable_coil = 1,
/obj/item/stack/sheet/glass = 2)
+/obj/item/circuitboard/machine/stasis
+ name = "Lifeform Stasis Unit (Machine Board)"
+ build_path = /obj/machinery/stasis
+ req_components = list(
+ /obj/item/stack/cable_coil = 3,
+ /obj/item/stock_parts/manipulator = 1,
+ /obj/item/stock_parts/capacitor = 1)
+
/obj/item/circuitboard/machine/vr_sleeper
name = "VR Sleeper (Machine Board)"
build_path = /obj/machinery/vr_sleeper
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 1533fdfc..505d2c07 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -714,6 +714,7 @@ GLOBAL_LIST_EMPTY(PDAs)
return
if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY))
return
+ var/emoji_message = emoji_parse(message)
if(prob(1))
message += "\nSent from my PDA"
// Send the signal
@@ -734,7 +735,8 @@ GLOBAL_LIST_EMPTY(PDAs)
"name" = "[owner]",
"job" = "[ownjob]",
"message" = message,
- "targets" = string_targets
+ "targets" = string_targets,
+ "emoji_message" = emoji_message
))
if (picture)
signal.data["photo"] = picture
@@ -751,13 +753,13 @@ GLOBAL_LIST_EMPTY(PDAs)
// Log it in our logs
tnote += "→ To [target_text]:
[signal.format_message()]
"
// Show it to ghosts
- var/ghost_message = "[owner] PDA Message --> [target_text]: "
+ var/ghost_message = "[owner] PDA Message --> [target_text]: "
for(var/mob/M in GLOB.player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
to_chat(M, "[FOLLOW_LINK(M, user)] [ghost_message]")
// Log in the talk log
user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]")
- to_chat(user, "Message sent to [target_text]: \"[message]\"")
+ to_chat(user, "Message sent to [target_text]: \"[emoji_message]\"")
if (!silent)
playsound(src, 'sound/machines/terminal_success.ogg', 15, 1)
// Reset the photo
@@ -787,7 +789,7 @@ GLOBAL_LIST_EMPTY(PDAs)
hrefstart = ""
hrefend = ""
- to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [signal.format_message()] (Reply)")
+ to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [signal.format_message(TRUE)] (Reply)")
update_icon(TRUE)
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index 4e719625..7ab85084 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -364,7 +364,7 @@
STR.max_combined_w_class = 200
STR.max_items = 50
STR.insert_preposition = "in"
- STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle))
+ STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/chem_pack))
/*
* Biowaste bag (mostly for xenobiologists)
diff --git a/code/game/world.dm b/code/game/world.dm
index b4c18f38..d3491903 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -259,8 +259,8 @@ GLOBAL_VAR(restart_counter)
s += "[station_name()]";
s += " ("
- s += "" //Change this to wherever you want the hub to link to. CIT CHANGE - links to cit's website on the hub
- s += "Citadel" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
+ s += "" //Change this to wherever you want the hub to link to. CIT CHANGE - links to cit's website on the hub
+ s += "Website" //Replace this with something else. Or ever better, delete it and uncomment the game version. CIT CHANGE - modifies the hub entry link
s += ""
s += ")\]" //CIT CHANGE - encloses the server title in brackets to make the hub entry fancier
s += "
[CONFIG_GET(string/servertagline)]
" //CIT CHANGE - adds a tagline!
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f0348a19..9b1da634 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -104,6 +104,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"body_markings" = "None",
"legs" = "Normal Legs",
"moth_wings" = "Plain",
+ "moth_markings" = "None",
"mcolor2" = "FFF",
"mcolor3" = "FFF",
"mam_body_markings" = "Plain",
@@ -459,6 +460,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
+
+ if("moth_markings" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "