diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 4c553c8f..c1ef5370 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -697,7 +697,7 @@
"anu" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/turf/open/floor/plasteel,/area/hallway/primary/fore)
"anv" = (/obj/machinery/holopad,/turf/open/floor/plasteel,/area/hallway/primary/fore)
"anw" = (/obj/machinery/atmospherics/components/unary/vent_pump/on,/turf/open/floor/plasteel,/area/hallway/primary/fore)
-"anx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Courtroom"},/turf/open/floor/plasteel/dark,/area/security/courtroom)
+"anx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Courtroom"},/turf/open/floor/plasteel/dark,/area/security/courtroom)
"any" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 1},/turf/open/floor/plasteel/dark,/area/security/courtroom)
"anz" = (/obj/machinery/light/small,/turf/open/floor/plasteel/dark,/area/security/courtroom)
"anA" = (/obj/machinery/airalarm{dir = 1; pixel_y = -22},/turf/open/floor/plasteel/dark,/area/security/courtroom)
@@ -1016,8 +1016,8 @@
"atB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 4},/turf/open/floor/plasteel/dark,/area/crew_quarters/fitness)
"atC" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"atD" = (/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
-"atE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Holodeck Door"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
-"atF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
+"atE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Holodeck Door"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
+"atF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"atG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"atH" = (/obj/machinery/camera{c_tag = "Holodeck"},/obj/machinery/airalarm{pixel_y = 24},/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"atI" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/crew_quarters/fitness)
@@ -1123,7 +1123,7 @@
"avE" = (/obj/structure/chair/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/dorms)
"avF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/crew_quarters/dorms)
"avG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/open/floor/plasteel,/area/crew_quarters/dorms)
-"avH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Fitness"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
+"avH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Fitness"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"avI" = (/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"avJ" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"avK" = (/obj/effect/landmark/event_spawn,/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/crew_quarters/fitness)
@@ -1194,14 +1194,14 @@
"awX" = (/obj/structure/chair/stool{pixel_y = 8},/obj/effect/landmark/start/assistant,/turf/open/floor/plasteel,/area/crew_quarters/dorms)
"awY" = (/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 1},/turf/open/floor/plasteel,/area/crew_quarters/dorms)
"awZ" = (/obj/structure/cable{icon_state = "2-4"},/turf/open/floor/plasteel,/area/crew_quarters/dorms)
-"axa" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Fitness"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
+"axa" = (/obj/structure/cable{icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Fitness"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axb" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axc" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/cable{icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel/dark,/area/crew_quarters/fitness)
"axe" = (/obj/structure/window/reinforced,/turf/open/floor/plasteel/dark,/area/crew_quarters/fitness)
"axf" = (/obj/machinery/door/window/eastright{base_state = "left"; icon_state = "left"; name = "Fitness Ring"},/obj/structure/window/reinforced,/turf/open/floor/plasteel/dark,/area/crew_quarters/fitness)
"axg" = (/obj/effect/turf_decal/tile/green,/obj/effect/turf_decal/tile/green{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
-"axh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
+"axh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Holodeck Door"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axj" = (/obj/machinery/atmospherics/components/unary/vent_pump/on{dir = 8},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
"axk" = (/obj/machinery/door/airlock/maintenance{dir = 4; req_access_txt = "12"},/turf/open/floor/plating,/area/crew_quarters/fitness)
@@ -2022,7 +2022,7 @@
"aMT" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/hallway/primary/port)
"aMU" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/turf/open/floor/plasteel,/area/hallway/primary/port)
"aMV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/port)
-"aMW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
+"aMW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aMX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aMY" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/open/floor/plasteel,/area/hallway/primary/central)
"aMZ" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/plasteel,/area/hallway/primary/central)
@@ -2091,7 +2091,7 @@
"aOk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/port)
"aOl" = (/obj/structure/sign/directions/security{dir = 4; pixel_x = 32; pixel_y = -24},/obj/structure/sign/directions/evac{dir = 4; pixel_x = 32; pixel_y = -32},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/port)
"aOm" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/port)
-"aOn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
+"aOn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aOo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aOp" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aOq" = (/obj/effect/turf_decal/tile/blue{dir = 8},/obj/effect/turf_decal/loading_area{dir = 2; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central)
@@ -2540,11 +2540,11 @@
"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)
"aWT" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/turf/open/floor/carpet,/area/library)
-"aWU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Chapel"},/turf/open/floor/carpet,/area/chapel/main)
+"aWU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/primary/central)
"aWV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/open/floor/carpet,/area/chapel/main)
"aWW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/carpet,/area/chapel/main)
"aWX" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/open/floor/carpet,/area/chapel/main)
-"aWY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/chapel/main)
+"aWY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Chapel"},/turf/open/floor/carpet,/area/chapel/main)
"aWZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel/white/corner{dir = 1},/area/hallway/secondary/exit)
"aXa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/secondary/exit)
"aXb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark/event_spawn,/turf/open/floor/plasteel,/area/hallway/secondary/exit)
@@ -2632,7 +2632,7 @@
"aYF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/chapel/main)
"aYG" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/open/floor/carpet,/area/chapel/main)
"aYH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/carpet,/area/chapel/main)
-"aYI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/chapel/main)
+"aYI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/open/floor/carpet,/area/chapel/main)
"aYJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/turf/open/floor/plasteel/white/corner{dir = 1},/area/hallway/secondary/exit)
"aYK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/secondary/exit)
"aYL" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/hallway/secondary/exit)
@@ -2916,7 +2916,7 @@
"bed" = (/obj/effect/turf_decal/loading_area{dir = 2; icon_state = "drain"; name = "drain"},/obj/machinery/light,/turf/open/floor/plasteel,/area/hallway/primary/central)
"bee" = (/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bef" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/turf_decal/tile/blue,/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
-"beg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Central Access"},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
+"beg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Chapel"},/turf/open/floor/carpet,/area/chapel/main)
"beh" = (/obj/machinery/door/firedoor,/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bei" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway"; dir = 2},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bej" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel/white/side{dir = 2},/area/hallway/primary/starboard)
@@ -3188,7 +3188,7 @@
"bjp" = (/obj/machinery/vending/snack/random,/turf/open/floor/plasteel,/area/crew_quarters/bar)
"bjq" = (/obj/machinery/door/airlock/maintenance{dir = 4; name = "Detective Maintenance"; req_access_txt = "4"},/turf/open/floor/plating,/area/maintenance/port)
"bjr" = (/obj/machinery/camera{c_tag = "Central Hallway East"; dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/status_display{pixel_x = -32},/obj/effect/turf_decal/tile/blue{dir = 8},/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/central)
-"bjs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Central Access"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
+"bjs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/carpet,/area/chapel/main)
"bjt" = (/obj/machinery/door/firedoor,/obj/effect/turf_decal/loading_area{dir = 2; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bju" = (/obj/machinery/light,/obj/effect/turf_decal/tile/blue{dir = 8},/obj/effect/turf_decal/loading_area{dir = 2; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bjv" = (/obj/effect/landmark/event_spawn,/obj/effect/turf_decal/loading_area{dir = 2; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
@@ -4376,6 +4376,7 @@
"bGh" = (/obj/machinery/computer/card/minor/cmo{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo)
"bGi" = (/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 8},/obj/machinery/computer/security/telescreen/cmo{dir = 1; pixel_y = -24},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo)
"bGj" = (/obj/structure/closet/secure_closet/CMO,/obj/machinery/light{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 4},/obj/effect/turf_decal/tile/blue{dir = 8},/turf/open/floor/plasteel/cafeteria,/area/crew_quarters/heads/cmo)
+"bGk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/obj/effect/turf_decal/loading_area{dir = 1; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bGl" = (/turf/open/floor/engine,/area/science/xenobiology)
"bGm" = (/obj/machinery/camera{c_tag = "Xenobiology Test Chamber"; dir = 2; network = list("xeno","rd")},/obj/machinery/light{dir = 1; pixel_y = 16},/turf/open/floor/engine,/area/science/xenobiology)
"bGn" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/science/storage)
@@ -4449,6 +4450,8 @@
"bHD" = (/obj/structure/table,/obj/item/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/storage/box/syringes,/obj/item/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/reagent_containers/glass/bottle/morphine{pixel_x = 8; pixel_y = -3},/obj/item/reagent_containers/syringe{pixel_x = 6; pixel_y = -3},/obj/item/radio/intercom{freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 30},/turf/open/floor/plasteel/white,/area/medical/sleeper)
"bHE" = (/obj/item/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = -30},/obj/machinery/camera{c_tag = "Medbay South"; network = list("ss13","medbay"); dir = 4},/turf/open/floor/plasteel/white,/area/medical/medbay/central)
"bHF" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/unary/vent_scrubber/on,/turf/open/floor/plasteel/white,/area/medical/medbay/central)
+"bHG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
+"bHH" = (/obj/machinery/door/airlock/public/glass{dir = 4; name = "Central Access"},/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"bHJ" = (/obj/machinery/airalarm{dir = 4; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel,/area/science/storage)
"bHK" = (/turf/open/floor/plasteel,/area/science/storage)
"bHL" = (/obj/effect/decal/cleanable/oil,/obj/item/cigbutt,/obj/machinery/atmospherics/components/unary/vent_scrubber/on{dir = 4},/turf/open/floor/plasteel,/area/science/storage)
@@ -7061,21 +7064,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGQayUayWaGRaBeaBeaGSaGTaGUaGTaBeazcazcazcazcaGVaCFaGWaGXazcaGYaCIaElaElaElaGZaElaElaCPaHaaBqaaaaAxaAxaHbaHcaHbaAxaAxaaaaxYaxZayaaHdaHeaHfaHgaHhayaaqsaHiayqaHjayoaHkaFLaHlayoaHmayqaAQaAQayqaHnayqaHoaHpaHqahfanDaASaASaASaASaASaHraHsazFaHtaHuazFaHvazFaHxazFaGdaGhaHJaGhaHAaHGbiBbiCaHEaHFaHIaHIaIYaIZaJcaKmaHIaHKaHLaHMaxpaxpaxpaHNaHOaHPaHQaHRamIaHSaHSaHSaHTaHUaFbaHVaHWaHXaHYaHZaIaaFcaIbaIcaFcaIdaIeaIfaIgaGIaIhaFfaFgaDYaIiaIjaGPaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayWaxBaIkaIlaImaIlaInaxBaIoaIpaIqaIrazcaIsaCFaCFaItazcaIuaCIaElaIvaIwaIxaIyaIzaIAaIBaBqaaaaadaaaaICaIDaICaaaaadaaaaxYaxZayaaIEaIFaIGaFGaIHayaaqsapyayqaIIayoaFLaFLaFLaIJaIKayqaaaaaaaILaIMaINaIOaIPaIQaIRaISaILaaaaaaaITaIUaIVaIWazFaIXaHuaHuaHuaHuaHuazFaJaaJbaJdaJeaJdaJdaNtaPQbiDaBTaBTaJfaKhaKiaKjaKkaJiaJiaJjaJkaJlaJiaJmaHSaHSaJnaHTaHSaHSaHSaJoaJpaHTaHUaFbaJqaJraJsaJtaJuaJvaFcaJwaJxaJyaJzaJAaJBaJCaJDaIhaFfaJEaDYaGNaJFaGPaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayWaxBaJGaJHaJIaJHaJJaJHaJHaJHaJKaxBazcaJLaJMaJLazcazcaJNaJOaJNaBnaBnaBnaBnaJNaJPaJQaBqaJRaJSaJSaJTaJUaJVaJSaJSaJWaxYaJXayaaJYayaaJZaKaaKbayaarjaoJayqayqayqaAQaKcaAQayqayqayqaILaILaILaKdaIPaIPaIPaIPaIPaKeaILaILaILaITaKfaIVaKgazFaLMazFazFazFazFazFaJdaGaaKsbiEaKtbgUaKoaMcaLQaLcaLTaBTaKpaKraKraKjaLSaJiaLUaKuaKvaKwaJiaKxaKyaKzaKAaKBaKCaKDaKEaKFaKGaHTaHUaFbaKHaKIaKJaJtaJuaKKaFcaKLaKMaKNaKOaKPaKQaKRaFcaFcaKSaFgaDYaIiaIjaGPaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSaKTaxBaKUaKVaKWaKXaKYaKZaweaLaaLbaxBaLjaLdaLeaLeaLfaLeaLeaLgaLeaLeaLeaLeaLeaLeaLhaLiaLqaLkaLlaLmaLmaLnaLmaLmaLmaLmaLoaLpaLxaLraLmaLsaLmaLtaHpaLuaLvaLwaLRalSaIRaIRaIRaLNaLPaLPbiFaLPaLPaLAaLBaLCaLDaLEaLFaLGaLPaLPbiFaLHaLIaLJaLKaPJbcXaNKbiGaLPbiHbiIaOCaLVaKsaLWaWHaLXaLYaOvaNjaNlaNnaBTaLZaMaaMbaNkaNmaJiaMdaKuaMeaMfaJiaJiaMgaMhaMiaMjaMkaMlaMmaMnaMoaHTaHUaFbaMpaMpaMqaMraMpaMpaFcaMsaMtaFcaMuaKRaKRaKRaFcaMvaMwaMxaDYaCwaCwaCwaMyaMyaMyaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayVayUayUayUayUayUayUayVayUaaaauSaBdaMAaKUaMBaMCaMDaMEaMFaweaMGaLbaMHaIkaLdaMIaMJaMKaMLaMLaMMaLeaLeaLeaLeaLeaLeaLeaLiaLeaLdaMNaLeaLeaMOaMPaMQaMQaMQaMRaMSaMQaMTaMQaMUaMQaMVaMWaMXaMYaMZaIPaKlaIPaIPaIPaIPaIPaIPaLzaIPaIPaNaaNbaNcaNdaNeaNfaNgaIPaIPaLzaIPaNhaIPaIPaIPaIPaIPaIPaIPaNiaIPaOCaNoaNpaNqaNraStaNsbiJaOwaOxaOyaBTaNuaOuaOuaHBaOzaJiaNvaKuaNwaNxaNyaJiaHSaHSaNzaHSaHSaHSaNAaNBaNAaHTaHUaFbaNCaMpaMpaNDaMpaNEaFcaFcaFcaFcaFcaFcaFcaNFaFcaFfaFfaFgaDYaNGaNHaCwaNIaNJaRkaNLaNMaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSaAaauSayUaxyayUaNNaNOaNPaNQayUaxyayUayUauSayWaxBaKUaNRaNSaMDaMEaMFaweaNTaLbaxBaIkaLdaLeaNUaNVaNVaNVaNWaNXaNYaNVaNZaNVaNVaNVaOaaNVaObaNVaNVaNVaOcaOdaOeaOfaOfaOfaOgaOhaOiaOjaOkaOlaOmaOnaOoaOpaIPaOqaOqaOqaOraOqaOqaOqaOqaOsaOqaOqaOqaOqaOqaOqaOtaOqaOqaOqaOqaPPaOqaOqaOqaOqaOqaOqaOtaOqaIPaIPaIPaJdaPLaStaStaStaStaRiaMcaLQaPOaNnaBTaBTaPKaBTaBTaBTaJiaOAaOBaODaWFaOEaJiaHSaOFaOGaOHaOIaOHaOHaOJaOKaHTaHUaFbaOLaOLaOMaONaOOaOOaOPaFbaOQaORaOSaCwaFfaGNaOTaFfaFfaOUaOVaCwaOWaCwaOXaOYaOZaPaaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSaKTaxBaKUaKVaKWaKXaKYaKZaweaLaaLbaxBaLjaLdaLeaLeaLfaLeaLeaLgaLeaLeaLeaLeaLeaLeaLhaLiaLqaLkaLlaLmaLmaLnaLmaLmaLmaLmaLoaLpaLxaLraLmaLsaLmaLtaMWaLuaLvaLwaLRalSaIRaIRaIRaLNaLPaLPbiFaLPaLPaLAaLBaLCaLDaLEaLFaLGaLPaLPbiFaLHaLIaLJaLKaPJbcXaNKbiGaLPbiHbiIaOCaLVaKsaLWaWHaLXaLYaOvaNjaNlaNnaBTaLZaMaaMbaNkaNmaJiaMdaKuaMeaMfaJiaJiaMgaMhaMiaMjaMkaMlaMmaMnaMoaHTaHUaFbaMpaMpaMqaMraMpaMpaFcaMsaMtaFcaMuaKRaKRaKRaFcaMvaMwaMxaDYaCwaCwaCwaMyaMyaMyaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayVayUayUayUayUayUayUayVayUaaaauSaBdaMAaKUaMBaMCaMDaMEaMFaweaMGaLbaMHaIkaLdaMIaMJaMKaMLaMLaMMaLeaLeaLeaLeaLeaLeaLeaLiaLeaLdaMNaLeaLeaMOaMPaMQaMQaMQaMRaMSaMQaMTaMQaMUaMQaMVaOnaMXaMYaMZaIPaKlaIPaIPaIPaIPaIPaIPaLzaIPaIPaNaaNbaNcaNdaNeaNfaNgaIPaIPaLzaIPaNhaIPaIPaIPaIPaIPaIPaIPaNiaIPaOCaNoaNpaNqaNraStaNsbiJaOwaOxaOyaBTaNuaOuaOuaHBaOzaJiaNvaKuaNwaNxaNyaJiaHSaHSaNzaHSaHSaHSaNAaNBaNAaHTaHUaFbaNCaMpaMpaNDaMpaNEaFcaFcaFcaFcaFcaFcaFcaNFaFcaFfaFfaFgaDYaNGaNHaCwaNIaNJaRkaNLaNMaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSaAaauSayUaxyayUaNNaNOaNPaNQayUaxyayUayUauSayWaxBaKUaNRaNSaMDaMEaMFaweaNTaLbaxBaIkaLdaLeaNUaNVaNVaNVaNWaNXaNYaNVaNZaNVaNVaNVaOaaNVaObaNVaNVaNVaOcaOdaOeaOfaOfaOfaOgaOhaOiaOjaOkaOlaOmaWUaOoaOpaIPaOqaOqaOqaOraOqaOqaOqaOqaOsaOqaOqaOqaOqaOqaOqaOtaOqaOqaOqaOqaPPaOqaOqaOqaOqaOqaOqaOtaOqaIPaIPaIPaJdaPLaStaStaStaStaRiaMcaLQaPOaNnaBTaBTaPKaBTaBTaBTaJiaOAaOBaODaWFaOEaJiaHSaOFaOGaOHaOIaOHaOHaOJaOKaHTaHUaFbaOLaOLaOMaONaOOaOOaOPaFbaOQaORaOSaCwaFfaGNaOTaFfaFfaOUaOVaCwaOWaCwaOXaOYaOZaPaaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweawfaweayUaBcayUayWaxBaxBayXayUaBcayUaPcaPdaPeaxBaKUaPfaPgaKXaPhaKZaweaPiaLbaxBaPjaPjaPjaPkaPlaPlaPlaPlaPlaPlaPmaPnaPlaPoaPlaPlaPlaPpaPqaPraPqaPsaPtaPuaLeaLeaPvaPwaPxaLeaPyaPzaLeaPAaPAaPMaRgaRmaILaILaILaILaILaILaILaILaPCaPDaPEaPFaPEaPEaPEaPGaPEaPHaPEaPIaPCaILaILaILaILaILaILaILaILaPMaTSaUTaJdaVjaRiaRiaRiaRiaKsaMcaLQaRjaKsaRsaKsaKsaVnaJiaRnaJiaJiaPRaJkaJiaJiaJiaJiaOHaPSaPTaPTaPTaPTaPUaOHaHTaHUaFbaPVaMpaOMaONaMpaMpaPWaFbaPXaPYaPZaCwaFfaIiaQaaQbaQbaQcaQdaQeaQfaCwaQgaQhaQiaQjaQjaQkaQlaQlaQmaQlaQnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQoaaaaaaaaaaxwaXfaxyaxzaQpaxBaQqaPeaxBaxBaQraQqaxBaQpaPeaxBaxBaxBaQsaQtaQuaQvaQwaQxaQxaQyaQzaxBaPjaQAaPjaQBaPlaQCbiKaQEaQFaQGaQDaQHaQIaQJaQKaQLaQMaPpaQNaQOaQPaPsaQQaPuaPuaQRaPuaPuaPAaPAaQSaQTaPAaPAaPAaQUbiLbbeaILaaaaaaaaaaaaaaaaaaaaaaPCaKnaQVaQWaQXaQYaQZaRaaRbaRcaRdaReaPCaaaaaaaaaaaaaaaaaaaaaaILaIOaIPaIPbiMaKsaKsaKsaRlaKsaKsaRfaSfaRjaKsaSraKsaKsaKsbaEaSBaRoaRpaRqaRraRtaRuaSuaJiaOHaRvaVsbiNbiNbiOaRxaOHaHTaRyaFbaRzaRzaOMaONaRAaRAaRBaFbaFbaRCaFbaCwaRDaGNaOTaREaRFaOUaOVaCwaCwaCwaMzaRGaRHaMzaMzaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaweaRJawgaRKaRLaRLaRLaRLaRLaRLaRLaRLaRKaRLaRMaxBaxBaIkaxBaRNaROaxBaRPaxBaRQaRRaRSaPjaRTaPjaQBaPlaRUaQDaQDaQDaQDaQDaQHaQDaQDaQDaQDaQMaPpaRVaQOaQOaPsaQQaPuaRWaRXaRXaRYaPAaRZaSaaSbaScaSdaSeaIPbiLbbeaILaaaaaaaaaaaaaPCaPCaPCaPCaSgaShaSiaSjaSkaSlaSmaSnaSoaSpaSvaPCaPCaPCaPCaaaaaaaaaaaaaILaIOaIPaIPaSqaKsaKsaSsaStaSwbiPaSzaSAaRjaSsaTTaSwaKsaTUaJiaWKaSCaSDaSEaSFaSGaSHaSBaSIaSJaSKbiQaSLaSMbiRaSNaOHaHTaHUaFbaMpaMpaOMaONaRAaRAaMpaSOaSPaMpaSQaCwaKSaSRaSSaREaREaSTaSUaSVaCwaSWaSXaQhaQiaQjaQjaSYaQlaQlaQlaQlaSZaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauSauSauSauSayUayUayUayUayUayUayUayUauSauSaweaIkaTbaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcaPjaRTaTfaTgaPlaThaQDaTiaTjaTkaTlaTmaTnaToaQDaQDaTpaPpaTqaTraTsaPsaQQaPuaTtaTuaTvaTwaPAaTxaTyaSbaTzaTAaSeaIPaPBbbeaILaILaTBaPCaPCaPCaTCaTDaTEaTFaTGaTHaTIaTJaTHaTKaTHaTLaTMaTNaTOaTPaTQaPCaPCaPCaTBaILaILaLzaLzbbfaJdaKsaKsaSsaVmaSwbiSaWIaTVaKqaSsbiTaSwaKsaKsaVoaSBaSBaWJaTXaTYaTZaUaaSBaUbaUcaUdbiQaUeaUfbiRaUgaUhaHTaHUaFbaUiaUiaOMaONaUjaMpaMpaUkaMpaUlaUmaCwaUnaUoaUpaREaREaUqaUraFfaCwaUsaQjaQhaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUaAcazaaUtaTcaUuaUvaUwaUxaUwaUyaUzaUwaTcaRTaRTaUAaUBaPlaUCaUDaUEaUFaUGaUHaUIaUJaUKaULaUMaQMaPpaPpaPpaPpaPsaQQaPuaPuaPuaPuaPuaPAaUNaUOaUPaTzaUQaSeaIPaIPaLyaIRaIRaURaUSaZQaPCaUUaUVaUWaUXaUYaUXaUZaVaaVbaVcaVdaVeaVfaVdaVgaVhaViaPCaZRaUSaVkaVlaIRaIOaIPaxxaJdaSyaKsaSsbiUaSwaKsaZMaZMaKsaSsaStaSwaKsaKsaVoaSBaSBbgZbiVaVpaVpaUaaWLaJiaVraUdbiWbiXbiXbiYaUgaVtaHTaVuaFbaFbaFbaOMaONaVvaVwaMpaVxaVyaKJaVzaCwaFfaSRaSSaREaREaVAaSUaVBaCwaVCaQjaQhaQiaQjaPbaMzaZNaZOaZPaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVDayUayUayWaxBaTcaVEaVFaVGaUuaVHaVIaUzaUwaTcaVJaVKaVLaPjaPlaVMaVNaVOaVPaVQaVQaVRaVQaVQaVQaVSaVTaPlaVUaVVaVWaVXaVYaVZaWaaWbaWcaWdaWdaWdaWdaWdaWdaWdaWdbbVaIPaIPaIPaIPaWeaWfaWgaWhaWiaWjaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaWuaWvaWkaWwaWxaWyaWzaWAaWBaWCaWDaWEaIPaIPbbXbiZaKsaKsaKsaKsbjaaZMaZMaKsaSsaStaSwaKsaKsaVoaSBaSBaSBaSBaSBaSBaUaaYoaJiaOHaUdaRwaRwaRwaRwaUgaOHaHTaWMaWNaWOaWPaWQaWRaWSaWSaWTaOMaOMaOMaOMaWUaREaREaREaREaREaWVaWWaWXaWYaWZaXaaXbaXcaPaaXdaMzaZPaZOaZOaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXeaXgaxybhaaxBaxBaTcaXhaXiaXjaXkaXkaXlaXmaXnaTcaXoaRTaVLaXpaXpaXpaXqaXraXpaXsaXtaXuaXvaXwaXwaXxaXyaPlaXzaXAaXBaXCaXDaXEaXBaXFaXGaXGaXHaXIaXJaXKaXLaXMaWdbbVaIPaXNaXOaXPaXQaXRaXSaPCaXTaXUaXVaXWaXXaXYaXYaXZaYaaYbaYcaYdaYeaYfaXVaYgaXTaPCaXSaXRaYhaYiaXOaYjaIPaIPbebbbXbiZaKsaKsaKsaKsaKsaKsaKsaRlbjbaKsaKsaKsaJiaYpaYqaSBaSBaYraSBaYXbhyaJiaYsaYtaRwaYuaYuaYvaYtaYwaYxaYyaYzaYzaYAaYBaYCaOMaOMaYDaOMaOMaOMaOMaWUaYEaYFaYFaYFaYFaYFaYGaYHaYIaYJaYKaYLaYMaQjaYNaMzbjhaZOaZNaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVDayUayUayWaxBaTcaVEaVFaVGaUuaVHaVIaUzaUwaTcaVJaVKaVLaPjaPlaVMaVNaVOaVPaVQaVQaVRaVQaVQaVQaVSaVTaPlaVUaVVaVWaVXaVYaVZaWaaWbaWcaWdaWdaWdaWdaWdaWdaWdaWdbbVaIPaIPaIPaIPaWeaWfaWgaWhaWiaWjaWkaWlaWmaWnaWoaWpaWqaWraWsaWtaWuaWvaWkaWwaWxaWyaWzaWAaWBaWCaWDaWEaIPaIPbbXbiZaKsaKsaKsaKsbjaaZMaZMaKsaSsaStaSwaKsaKsaVoaSBaSBaSBaSBaSBaSBaUaaYoaJiaOHaUdaRwaRwaRwaRwaUgaOHaHTaWMaWNaWOaWPaWQaWRaWSaWSaWTaOMaOMaOMaOMaWYaREaREaREaREaREaWVaWWaWXaYIaWZaXaaXbaXcaPaaXdaMzaZPaZOaZOaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXeaXgaxybhaaxBaxBaTcaXhaXiaXjaXkaXkaXlaXmaXnaTcaXoaRTaVLaXpaXpaXpaXqaXraXpaXsaXtaXuaXvaXwaXwaXxaXyaPlaXzaXAaXBaXCaXDaXEaXBaXFaXGaXGaXHaXIaXJaXKaXLaXMaWdbbVaIPaXNaXOaXPaXQaXRaXSaPCaXTaXUaXVaXWaXXaXYaXYaXZaYaaYbaYcaYdaYeaYfaXVaYgaXTaPCaXSaXRaYhaYiaXOaYjaIPaIPbebbbXbiZaKsaKsaKsaKsaKsaKsaKsaRlbjbaKsaKsaKsaJiaYpaYqaSBaSBaYraSBaYXbhyaJiaYsaYtaRwaYuaYuaYvaYtaYwaYxaYyaYzaYzaYAaYBaYCaOMaOMaYDaOMaOMaOMaOMbegaYEaYFaYFaYFaYFaYFaYGaYHbjsaYJaYKaYLaYMaQjaYNaMzbjhaZOaZNaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUayUayUayWaYOaYPaYQaYRaYSaYSaYSaYSaYTaUuaTcaYUaYVaVLaXpaYWbaKaYYaYZaXpaZaaZbaZcaPlaZdaZeaZfaZgaPlaZhaZiaZjaZkaZjaZlaZmaZnaWdaZoaZpaZpaZqaZraZsaZtaWdbbYaLzaZuaZvaZvaZvaZvaZvaZvaZwaZxaZyaXXaXZaZzaZAaZAaZBaZAaZAaZCaYbaYeaZDaZEaZFaZDaZDaZDaZDaZDaZDbjiaIPaIPbgTbjjbbXbiZbjkaSwbjlaKsaKsaKsaWGaKsaKsbjmaYkaJibjnaJiaZSaYlaZTaZTaJiaJiaJiaZUaRwaRwaZVaZWaZXaZYaZWaHTaZZbaababaFbbacbadbaeaVwaMpbafaUkaVwbagaCwbahaFfbaiaREaREbaiaFfbajaCwbakbalbamaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUbanaPebaoaTcaUwaVFaUwaUubapaUwbaqaUwaTcbarbasbataXpaXpaXpbaubavaXpaZbbawaZbaPlaZdaZeaZfaZgaPlaZhaZibaxbayaZjbazaZmaZnaWdbaAaZpaZpaZGbaBaZpbaDbbxaIPaIPbbZaZvbaFbaGbaHbaIbaJbcebaLbaMbaNbaOaZAaZAbaPbaQbaPaZAaZAbaRbaSbaCbaTbaUbaXbaYbbzbaVbaWaZDbjoaIPaIPbgTbgTbjpbbXaJdaJdaJdbbbaSqbbbaJdbbcaJdaJdaJdaJibcbbdZbbdbbdbbdbbdbcfbdHaJiaZWbbgbbgaZWbaabaabaabaaaHTaZZbaababaFbaFbaFbbbhaFbbbhaFbbbhaFbaFbaCwaCwbbibbibbibbibbibbiaCwaCwbbjaQjbbkaQiaQjaQjbblaQlaQlaQlaQlaSZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadauSauSayUayUayUayUayUayUayUayUauSauSaweaxBaxBaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcbbmbbnbboaXpaYWbbpbaubbqaXpbbrbbsbbraPlaZdaZeaZfaZgaPlbbtaZiaZjbbubbvbbwaZmaZnbjqaZsbbybaZbbabbAaZpbaDbbCaIPaIPaXNbbDbbEbaJbbFbbGbbGbbHbbIbbJbaNbbKaZAaZAbaPbbLbaPaZAaZAbbMbaSbbBbbNbpdbbRbbSbcWbaWbbOaZDbjobbUaIPaIPbaabaabaabecbegbehbaabaabaabeibembembembembeobaabaabaabaabaabaabaabaabehbaabaabaabaabaabaabaabcabepbccbcdbaabesbembembaabembaabembaabembekbeobfObaabaabaabaabaabaabbWbcgaSXaQjbchbcibcjbckaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUawhawiawiawiawiawiawiawiawiawhawibclaxDaxDbcmbcnbcobcpbcpbcpbcqbcrbcsaPjbctbcubcvaXpaXpaXpbcwbcxaXpaPlaPlaPlaPlaZdaZebcybczaPlaZhaZiaZjbcAbcBbcCbcDbcEbcFbcGbcGbcGbcHbcIaZsbcJaWdaQUaNhaXNbcKbcLbaJbcMbcNbcObcPbcQbcRbaNbcSbaPaZAbcTbcUbcTaZAbaPaZCbaSbbPbbNbpdbbRbdVbcWbaWbaWaZDbjraIPaIPaIPbaabaabaabaabjsbbWbaabaabaabaabcYbaabaabaabaabaabcZaYzaYzaYzaYzbdabaabbWbaabaabaabaabaabaabdbbdcbddbdebdfbdfbdfbdgbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdhbdibdjbdkbdkbdlaQibdmaQjbdnaQlaQlbdoaQlbdpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadayUaxAaxBaxAazaaxBaxBbdqaxAaxBaxAazaaxBaxBaxBbdrbdsbdrbdrbdrbdrbdtbduaPjaPjaPjbdvaVLaXpaYWbdwbdxbbqaXpbdybdzbdyaPlaPlaPlbdAbdBaPlaZhaZibdCbdDbdEbdFaZmaPjaWdaWdaWdaWdaWdaWdaWdbdGaWdbfPaIPaXNbcKbdIbaJbcMbdJbdKbcPbcQbaJbaNbdLbdMaZAbdNbdObdPaZAbdQbdRbaSbbQbbTbcVbdWbdXbjdbaWbdSaZDbjobeaaIPbedbgBbgBbgBbiibjsbjtbeebeebeebfAbefbeebeebjubgBbgBbgBbgBbgBbjvbjwbejbjxbjtbgBbgBbaabaabaabelbjybenbjzbjAbeqbeqbeqbaabgBbgDbjBbgBbgBbaabaabaabaabaabaabaabaabaabaabaabbWbetbeubevbewaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadauSauSayUayUayUayUayUayUayUayUauSauSaweaxBaxBaTcaTcaTdaTcaTcaTcaTcaTeaTcaTcbbmbbnbboaXpaYWbbpbaubbqaXpbbrbbsbbraPlaZdaZeaZfaZgaPlbbtaZiaZjbbubbvbbwaZmaZnbjqaZsbbybaZbbabbAaZpbaDbbCaIPaIPaXNbbDbbEbaJbbFbbGbbGbbHbbIbbJbaNbbKaZAaZAbaPbbLbaPaZAaZAbbMbaSbbBbbNbpdbbRbbSbcWbaWbbOaZDbjobbUaIPaIPbaabaabaabecbGkbehbaabaabaabeibembembembembeobaabaabaabaabaabaabaabaabehbaabaabaabaabaabaabaabcabepbccbcdbaabesbembembaabembaabembaabembekbeobfObaabaabaabaabaabaabbWbcgaSXaQjbchbcibcjbckaMzaMzaMzaMzaMzaRIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayUawhawiawiawiawiawiawiawiawiawhawibclaxDaxDbcmbcnbcobcpbcpbcpbcqbcrbcsaPjbctbcubcvaXpaXpaXpbcwbcxaXpaPlaPlaPlaPlaZdaZebcybczaPlaZhaZiaZjbcAbcBbcCbcDbcEbcFbcGbcGbcGbcHbcIaZsbcJaWdaQUaNhaXNbcKbcLbaJbcMbcNbcObcPbcQbcRbaNbcSbaPaZAbcTbcUbcTaZAbaPaZCbaSbbPbbNbpdbbRbdVbcWbaWbaWaZDbjraIPaIPaIPbaabaabaabaabHGbbWbaabaabaabaabcYbaabaabaabaabaabcZaYzaYzaYzaYzbdabaabbWbaabaabaabaabaabaabdbbdcbddbdebdfbdfbdfbdgbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdfbdhbdibdjbdkbdkbdlaQibdmaQjbdnaQlaQlbdoaQlbdpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadayUaxAaxBaxAazaaxBaxBbdqaxAaxBaxAazaaxBaxBaxBbdrbdsbdrbdrbdrbdrbdtbduaPjaPjaPjbdvaVLaXpaYWbdwbdxbbqaXpbdybdzbdyaPlaPlaPlbdAbdBaPlaZhaZibdCbdDbdEbdFaZmaPjaWdaWdaWdaWdaWdaWdaWdbdGaWdbfPaIPaXNbcKbdIbaJbcMbdJbdKbcPbcQbaJbaNbdLbdMaZAbdNbdObdPaZAbdQbdRbaSbbQbbTbcVbdWbdXbjdbaWbdSaZDbjobeaaIPbedbgBbgBbgBbiibHHbjtbeebeebeebfAbefbeebeebjubgBbgBbgBbgBbgBbjvbjwbejbjxbjtbgBbgBbaabaabaabelbjybenbjzbjAbeqbeqbeqbaabgBbgDbjBbgBbgBbaabaabaabaabaabaabaabaabaabaabaabbWbetbeubevbewaQiaQjaPbaMzaMzaMzaMzaMzaMzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaweayUbexayUayWaxBaxBayXayUbeyayUayYbezbeAbeAbdrbeBbeCbeDbeEbeFbdtbeGbeHbeIbeIbeJbeKaXpaXpaXpbeLbeMaXpaPjaPjaPjaPjbeNbeObePbeQbeObeRaZibeSbeTaZjaZlaZmbeUbeVbeWbeXbeXbeXbeXbeYbeZbeVbjCaIPbbZaZvbaJbfbbfcbfdbfebffbcQbfgbfhaXYbfibfjbfkbfkbfkbflbfmaYdbfnbdTbdUbdYbpxbfobjdbaWbfpaZDbjoaIPbjDbfvbfvbfvbfvbfvbfvbfvbfwbfxbfxbfxbfybfzbfzbfwbjEbjEbjEberberberberberbfBbfBbfBbfCbfBbfBbfBbfBbfBbfGbfHbfIbfJbfJbfJbfKbfLbfLbfLbfLbfLbfMbfNbfNbjFbjGbfNbjHbjIbfNbfNbfRbfSbfSbfSbfSbfTbfUbfVbfWaMzaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaAaauSaAbaxyayUaAcaAdbfXbfYayUaxyaAbayUauSaAaawebdrbfZbgabgabgabgbbgcbgdbgebeObeObgfbggaXpaYWbghbeLbgiaXpbgjbgjaRTbgkbglbgmbgnbgmbgmbgobgpbgqaZkbgrbgsaZmaRTbgtbgubeVbgvbgwbgxbgyaPNbgAbjJbgCbjKaZvbgEaZybgFbgGbgHbgIbcQbgJaZvaadbgKbjLbjMbjMbjMbjNbgMaadaZDbfqbfrbfsbftbaWbfubaWbgNaZDbjoaIPbjObfvbjPbgVbgWbgXbgYbfvbhfbjQbjQbjQbhbbhcbhcbhdbhebjRbhgbfDbfEbfFbhhberbhlbhibhjbhkbhibhmbhnbfBbfBbhobhpbhqbhrbhsbhtbhubhvbhwbhxbjSbfLbhzbhAbhzbfLbhBbhCbhBbfSbhDbhEbhDbfSbhFbhGbfSbhHbhIaMzaMzaMzaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaadaadaadaadayUbhJayUayUayUayUayUayUbhKayUaadaadaadaaabdrbhLbdrbhMbgabhNbhObdraRTaTfbhPbhQbhRbhSbhSbhSbhSbhSbhSbhTbhUbhVbhWbhXbhYbhYbhYbhYbhYbhYaZmbhZaZiaZmbhYbhYbiabibbicbidbiebifbiebigbihbfaaIPbjTaZvbijaZyaZyaZyaZybgIbcQbikaZvaadbgKbjUbilbimbinbjVbgMaadaZDbgObbNbgPbgQbaWbjdbaWbaWaZDbjoaIPbjDbfvbirbisbitbitbiubivbhcbiwbhcbhcbhbbjWbhcbhcbhcbhcbixbfDbjXbjYbjZberbkabhibhibkbbkabkcbhibfBbkdbkebfHbkfbkgbkhbkibkjbkkbklbkmbknbkobkpbkqbkrbfLbksbktbkubfSbgRbgSbgRbiobgRbgRbfSbkzbhIaaaaadaaaaadaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/shuttles/emergency_construction.dmm b/_maps/shuttles/emergency_construction.dmm
new file mode 100644
index 00000000..3c3ab4cf
--- /dev/null
+++ b/_maps/shuttles/emergency_construction.dmm
@@ -0,0 +1,598 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"c" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"d" = (
+/obj/structure/window/reinforced,
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"e" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"f" = (
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"g" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"h" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"i" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency/shuttle_build{
+ dwidth = 9;
+ height = 15;
+ name = "Shuttle Under Construction";
+ port_direction = 4;
+ preferred_direction = 2;
+ width = 26
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"j" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 3;
+ pixel_y = 10
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/item/airlock_painter,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"k" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical,
+/obj/item/clothing/gloves/color/yellow{
+ pixel_y = 8
+ },
+/obj/item/storage/toolbox/electrical,
+/obj/item/multitool{
+ pixel_x = 2;
+ pixel_y = -4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"l" = (
+/obj/structure/table,
+/obj/item/storage/box/lights/mixed{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/electronics/airalarm{
+ pixel_x = 8
+ },
+/obj/item/electronics/airalarm{
+ pixel_x = 8
+ },
+/obj/item/electronics/airalarm{
+ pixel_x = 8
+ },
+/obj/item/electronics/airalarm{
+ pixel_x = 8
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/electronics/airlock{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"m" = (
+/obj/structure/table,
+/obj/item/stack/sheet/metal/fifty{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/metal/fifty{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/item/stack/rods/fifty,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"n" = (
+/obj/structure/table,
+/obj/item/stack/sheet/mineral/titanium/fifty{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/mineral/titanium/fifty{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"o" = (
+/obj/structure/table,
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/titaniumglass{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"p" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+a
+c
+e
+e
+h
+e
+e
+g
+e
+i
+e
+e
+h
+e
+e
+g
+e
+g
+e
+p
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+p
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+c
+c
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+e
+h
+h
+h
+a
+"}
+(5,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+h
+"}
+(6,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+"}
+(7,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+j
+m
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+"}
+(8,1,1) = {"
+c
+c
+f
+f
+f
+f
+f
+f
+f
+f
+k
+n
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+"}
+(9,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+l
+o
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+"}
+(10,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+"}
+(11,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+h
+h
+"}
+(12,1,1) = {"
+c
+c
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+e
+h
+h
+h
+a
+"}
+(13,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+a
+a
+a
+a
+a
+"}
+(14,1,1) = {"
+b
+d
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+f
+e
+p
+a
+a
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+c
+e
+e
+h
+e
+e
+e
+h
+e
+e
+e
+h
+e
+e
+e
+h
+e
+e
+p
+a
+a
+a
+a
+a
+a
+"}
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index b72bd9a9..e1d54064 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -44,6 +44,10 @@
#define EXAMINE_POSITION_BEFORE 2
//End positions
#define COMPONENT_EXNAME_CHANGED 1
+#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon"
+ #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1
+ #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 //from base of atom/update_icon(): ()
+#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays)
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMPONENT_ATOM_BLOCK_EXIT 1
@@ -150,6 +154,7 @@
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
+#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation)
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index c0aac364..5d63de6d 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -31,3 +31,5 @@
#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER"
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
+
+#define MOVESPEED_ID_TASED_STATUS "TASED"
\ No newline at end of file
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index fa7e35f4..a2f57313 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -30,6 +30,7 @@
#define CHAT_GHOSTPDA (1<<8)
#define CHAT_GHOSTRADIO (1<<9)
#define CHAT_LOOC (1<<10)
+#define SHOW_TYPING (1<<11)
#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC)
diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm
index b7526263..99ff5ec3 100644
--- a/code/__DEFINES/reactions.dm
+++ b/code/__DEFINES/reactions.dm
@@ -40,4 +40,5 @@
#define PARTICLE_CHANCE_CONSTANT (-20000000)
#define FUSION_RAD_MAX 2000
#define FUSION_RAD_COEFFICIENT (-1000)
-#define FUSION_INSTABILITY_ENDOTHERMALITY 2
\ No newline at end of file
+#define FUSION_INSTABILITY_ENDOTHERMALITY 2
+#define FUSION_MAXIMUM_TEMPERATURE 1e8
\ No newline at end of file
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index b876e463..581bb2bc 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -3,12 +3,12 @@
#define CHANNEL_ADMIN 1023
#define CHANNEL_VOX 1022
#define CHANNEL_JUKEBOX 1021
-#define CHANNEL_JUKEBOX_START 1020
-#define CHANNEL_JUSTICAR_ARK 1019
-#define CHANNEL_HEARTBEAT 1018 //sound channel for heartbeats
-#define CHANNEL_AMBIENCE 1017
-#define CHANNEL_BUZZ 1016
-#define CHANNEL_BICYCLE 1015
+#define CHANNEL_JUKEBOX_START 1016 //The gap between this and CHANNEL_JUKEBOX determines the amount of free jukebox channels. This currently allows 6 jukebox channels to exist.
+#define CHANNEL_JUSTICAR_ARK 1015
+#define CHANNEL_HEARTBEAT 1014 //sound channel for heartbeats
+#define CHANNEL_AMBIENCE 1013
+#define CHANNEL_BUZZ 1012
+#define CHANNEL_BICYCLE 1011
//CIT CHANNELS - TRY NOT TO REGRESS
#define CHANNEL_PRED 1010
diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm
new file mode 100644
index 00000000..e590a30f
--- /dev/null
+++ b/code/__DEFINES/spaceman_dmm.dm
@@ -0,0 +1,13 @@
+// Interfaces for the SpacemanDMM linter, define'd to nothing when the linter
+// is not in use.
+
+// The SPACEMAN_DMM define is set by the linter and other tooling when it runs.
+#ifdef SPACEMAN_DMM
+ #define RETURN_TYPE(X) set SpacemanDMM_return_type = X
+ #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
+ #define UNLINT(X) SpacemanDMM_unlint(X)
+#else
+ #define RETURN_TYPE(X)
+ #define SHOULD_CALL_PARENT(X)
+ #define UNLINT(X) X
+#endif
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index f5256122..444c8f6c 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -44,6 +44,8 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
+#define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control
+
#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 1bdf6233..5d562622 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -396,6 +396,12 @@ GLOBAL_LIST_EMPTY(species_list)
. = 0
break
+ if(isliving(user))
+ var/mob/living/L = user
+ if(L.recoveringstam)
+ . = 0
+ break
+
if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
if((Uloc != Tloc || Tloc != user) && !drifting)
. = 0
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 8a6fce0d..351411ce 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -101,6 +101,7 @@
else
return trim(html_encode(name), max_length)
+
//Filters out undesirable characters from names
/proc/reject_bad_name(t_in, allow_numbers=0, max_length=MAX_NAME_LEN)
if(!t_in || length(t_in) > max_length)
diff --git a/code/controllers/subsystem/jukeboxes.dm b/code/controllers/subsystem/jukeboxes.dm
index d0001603..1532a3f4 100644
--- a/code/controllers/subsystem/jukeboxes.dm
+++ b/code/controllers/subsystem/jukeboxes.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jukeboxes)
wait = 5
var/list/songs = list()
var/list/activejukeboxes = list()
+ var/list/freejukeboxchannels = list()
/datum/track
var/song_name = "generic"
@@ -21,23 +22,39 @@ SUBSYSTEM_DEF(jukeboxes)
/datum/controller/subsystem/jukeboxes/proc/addjukebox(obj/jukebox, datum/track/T, jukefalloff = 1)
if(!istype(T))
CRASH("[src] tried to play a song with a nonexistant track")
- var/channeltoreserve = CHANNEL_JUKEBOX_START + activejukeboxes.len - 1
- if(channeltoreserve > CHANNEL_JUKEBOX)
+ var/channeltoreserve = pick(freejukeboxchannels)
+ if(!channeltoreserve)
return FALSE
+ freejukeboxchannels -= channeltoreserve
+ var/list/youvegotafreejukebox = list(T, channeltoreserve, jukebox, jukefalloff)
activejukeboxes.len++
- activejukeboxes[activejukeboxes.len] = list(T, channeltoreserve, jukebox, jukefalloff)
+ activejukeboxes[activejukeboxes.len] = youvegotafreejukebox
+
+ //Due to changes in later versions of 512, SOUND_UPDATE no longer properly plays audio when a file is defined in the sound datum. As such, we are now required to init the audio before we can actually do anything with it.
+ //Downsides to this? This means that you can *only* hear the jukebox audio if you were present on the server when it started playing, and it means that it's now impossible to add loops to the jukebox track list.
+ var/sound/song_to_init = sound(T.song_path)
+ song_to_init.status = SOUND_MUTE
+ for(var/mob/M in GLOB.player_list)
+ if(!M.client)
+ continue
+ if(!(M.client.prefs.toggles & SOUND_INSTRUMENTS))
+ continue
+
+ M.playsound_local(M, null, 100, channel = youvegotafreejukebox[2], S = song_to_init)
return activejukeboxes.len
/datum/controller/subsystem/jukeboxes/proc/removejukebox(IDtoremove)
if(islist(activejukeboxes[IDtoremove]))
+ var/jukechannel = activejukeboxes[IDtoremove][2]
for(var/mob/M in GLOB.player_list)
if(!M.client)
continue
- M.stop_sound_channel(activejukeboxes[IDtoremove][2])
+ M.stop_sound_channel(jukechannel)
+ freejukeboxchannels |= jukechannel
activejukeboxes.Cut(IDtoremove, IDtoremove+1)
return TRUE
else
- to_chat(world, "If you see this, screenshot it and send it to a dev. Tried to remove jukebox with invalid ID")
+ CRASH("Tried to remove jukebox with invalid ID")
/datum/controller/subsystem/jukeboxes/proc/findjukeboxindex(obj/jukebox)
if(activejukeboxes.len)
@@ -57,6 +74,8 @@ SUBSYSTEM_DEF(jukeboxes)
T.song_beat = text2num(L[3])
T.song_associated_id = L[4]
songs |= T
+ for(var/i in CHANNEL_JUKEBOX_START to CHANNEL_JUKEBOX)
+ freejukeboxchannels |= i
return ..()
/datum/controller/subsystem/jukeboxes/fire()
@@ -64,14 +83,15 @@ SUBSYSTEM_DEF(jukeboxes)
return
for(var/list/jukeinfo in activejukeboxes)
if(!jukeinfo.len)
- to_chat(world, "If you see this, screenshot it and send it to a dev. Active jukebox without any associated metadata")
+ EXCEPTION("Active jukebox without any associated metadata.")
+ continue
var/datum/track/juketrack = jukeinfo[1]
if(!istype(juketrack))
- to_chat(world, "If you see this, screenshot it and send it to a dev. After jukebox track grabbing")
+ EXCEPTION("Invalid jukebox track datum.")
continue
var/obj/jukebox = jukeinfo[3]
if(!istype(jukebox))
- to_chat(world, "If you see this, screenshot it and send it to a dev. Nonexistant or invalid jukebox in active jukebox list")
+ EXCEPTION("Nonexistant or invalid object associated with jukebox.")
continue
var/sound/song_played = sound(juketrack.song_path)
var/area/currentarea = get_area(jukebox)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index fd33ef79..8e57ee84 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -245,6 +245,14 @@
/datum/action/item_action/toggle_helmet_light
name = "Toggle Helmet Light"
+/datum/action/item_action/toggle_welding_screen/plasmaman
+ name = "Toggle Welding Screen"
+
+/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger()
+ var/obj/item/clothing/head/helmet/space/plasmaman/H = target
+ if(istype(H))
+ H.toggle_welding_screen(owner)
+
/datum/action/item_action/toggle_headphones
name = "Toggle Headphones"
desc = "UNTZ UNTZ UNTZ"
diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm
index 8b9ecf5a..e4317408 100644
--- a/code/datums/components/storage/concrete/bag_of_holding.dm
+++ b/code/datums/components/storage/concrete/bag_of_holding.dm
@@ -19,7 +19,7 @@
qdel(W)
playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1)
user.gib(TRUE, TRUE, TRUE)
- for(var/turf/T in range(6,loccheck))
+ for(var/turf/T in range(2,loccheck))
if(istype(T, /turf/open/space/transit))
continue
for(var/mob/living/M in T)
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index e6147297..fb7bfa76 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -174,16 +174,16 @@
name = "Backup Shuttle"
can_be_bought = FALSE
-/datum/map_template/shuttle/emergency/airless
- suffix = "airless"
+/datum/map_template/shuttle/emergency/construction
+ suffix = "construction"
name = "Build your own shuttle kit"
- description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and atmosphere not included."
- admin_notes = "No brig, no medical facilities, no air."
- credit_cost = -7500
+ description = "For the enterprising shuttle engineer! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Comes stocked with construction materials."
+ admin_notes = "No brig, no medical facilities, no shuttle console."
+ credit_cost = 2500
/datum/map_template/shuttle/emergency/airless/prerequisites_met()
- // first 10 minutes only
- return world.time - SSticker.round_start_time < 6000
+ // first 30 minutes only
+ return world.time - SSticker.round_start_time < 18000
/datum/map_template/shuttle/emergency/airless/on_bought()
//enable buying engines from cargo
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index c4a80c19..4e1fe01e 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -80,6 +80,36 @@
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"
+//TASER
+/datum/status_effect/electrode
+ id = "tased"
+ blocks_combatmode = TRUE
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+
+/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration)
+ if(isnum(set_duration))
+ duration = set_duration
+ . = ..()
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ if(C.combatmode)
+ C.toggle_combat_mode(TRUE)
+ C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8)
+
+/datum/status_effect/electrode/on_remove()
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS)
+ . = ..()
+
+/datum/status_effect/electrode/tick()
+ if(owner)
+ owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing.
+
+/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y
+ return 2
+
//STASIS
/datum/status_effect/incapacitating/stasis
id = "stasis"
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index c8bcd831..bc1cfba1 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -11,6 +11,7 @@
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
+ var/blocks_combatmode //Does this status effect prevent the user from toggling combat mode?
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/datum/status_effect/New(list/arguments)
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index d0fff8da..13ce3197 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -18,7 +18,7 @@
area_type = /area
protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer,
- /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle)
+ /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/survivalpod)
target_trait = ZTRAIT_STATION
immunity_type = "rad"
@@ -63,4 +63,4 @@
signal.data["command"] = "shuttle"
var/atom/movable/virtualspeaker/virt = new(null)
- frequency.post_signal(virt, signal)
+ frequency.post_signal(virt, signal)
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 09897e29..9e8756bb 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -24,7 +24,7 @@
var/list/add_overlays // a very temporary list of overlays to add
var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
-
+ var/list/managed_overlays
var/datum/proximity_monitor/proximity_monitor
var/buckle_message_cooldown = 0
var/fingerprintslast
@@ -255,6 +255,28 @@
/atom/proc/get_examine_string(mob/user, thats = FALSE)
. = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
+/atom/proc/update_icon_state()
+
+/atom/proc/update_overlaysb()
+ SHOULD_CALL_PARENT(1)
+ . = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
+
+/atom/proc/update_iconb()
+ var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
+ update_icon_state()
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
+ var/list/new_overlays = update_overlaysb()
+ if(managed_overlays)
+ cut_overlay(managed_overlays)
+ managed_overlays = null
+ if(length(new_overlays))
+ managed_overlays = new_overlays
+ add_overlay(new_overlays)
+
/atom/proc/examine(mob/user)
to_chat(user, get_examine_string(user, TRUE))
@@ -709,4 +731,4 @@ Proc for attack log creation, because really why not
if(filter_data[name])
filter_data -= name
update_filters()
- return TRUE
+ return TRUE
\ No newline at end of file
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index a1afbae2..4a060bdd 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -40,6 +40,8 @@
var/stun_projectile = null //stun mode projectile type
var/stun_projectile_sound
+ var/nonlethal_projectile //projectile to use in stun mode when the target is resting, if any
+ var/nonlethal_projectile_sound
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
@@ -533,13 +535,21 @@
T = closer
break
+ var/mob/living/carbon/C
+ if(iscarbon(target))
+ C = target
update_icon()
var/obj/item/projectile/A
//any emagged turrets drains 2x power and uses a different projectile?
if(mode == TURRET_STUN)
- use_power(reqpower)
- A = new stun_projectile(T)
- playsound(loc, stun_projectile_sound, 75, 1)
+ if(nonlethal_projectile && C && C.resting)
+ use_power(reqpower*0.5)
+ A = new nonlethal_projectile(T)
+ playsound(loc, nonlethal_projectile_sound, 75, 1)
+ else
+ use_power(reqpower)
+ A = new stun_projectile(T)
+ playsound(loc, stun_projectile_sound, 75, 1)
else
use_power(reqpower * 2)
A = new lethal_projectile(T)
@@ -651,6 +661,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser
lethal_projectile_sound = 'sound/weapons/laser.ogg'
desc = "An energy blaster auto-turret."
@@ -660,6 +672,8 @@
base_icon_state = "standard"
stun_projectile = /obj/item/projectile/energy/electrode
stun_projectile_sound = 'sound/weapons/taser.ogg'
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
lethal_projectile = /obj/item/projectile/beam/laser/heavylaser
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
desc = "An energy blaster auto-turret."
@@ -679,6 +693,8 @@
/obj/machinery/porta_turret/ai
faction = list("silicon")
+ nonlethal_projectile = /obj/item/projectile/beam/disabler
+ nonlethal_projectile_sound = 'sound/weapons/taser2.ogg'
/obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp)
return 10 //AI turrets shoot at everything not in their faction
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index cf89b354..5b7becb5 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -1746,7 +1746,6 @@
"back_key" = TOOL_CROWBAR,
"desc" = "Peripherals control module is installed."
),
-
//9
list(
"key" = /obj/item/stock_parts/scanning_module,
@@ -1784,40 +1783,37 @@
"back_key" = TOOL_SCREWDRIVER,
"desc" = "Capacitor is secured."
),
- //14
+
+ //11
list(
"key" = TOOL_SCREWDRIVER,
"back_key" = TOOL_CROWBAR,
"desc" = "The power cell is installed."
- //15
),
+
+ //12
list(
"key" = /obj/item/stack/sheet/metal,
"amount" = 5,
"back_key" = TOOL_SCREWDRIVER,
"desc" = "The power cell is secured."
),
- //16
- list(
- "key" = TOOL_SCREWDRIVER,
- "back_key" = TOOL_CROWBAR,
- "desc" = "The power cell is installed."
- ),
- //17
+
+ //13
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "Internal armor is installed."
),
- //18
+ //14
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "Internal armor is wrenched."
),
- //19
+ //15
list(
"key" = /obj/item/stack/sheet/plasteel,
"amount" = 5,
@@ -1825,21 +1821,20 @@
"desc" = "Internal armor is welded."
),
- //20
+ //16
list(
"key" = TOOL_WRENCH,
"back_key" = TOOL_CROWBAR,
"desc" = "External armor is installed."
),
- //21
+ //17
list(
"key" = TOOL_WELDER,
"back_key" = TOOL_WRENCH,
"desc" = "External armor is wrenched."
),
)
-
/datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff)
if(!..())
return FALSE
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index fb6eda84..e9fd4a06 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -304,6 +304,15 @@ GENE SCANNER
for(var/obj/item/bodypart/org in damaged)
msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n"
+ //Bones broken report! Hyperstation 13
+ if(iscarbon(M) && mode == 1)
+ var/mob/living/carbon/C = M
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/LB = X
+ var/broken = LB.broken
+ if(broken == 1)
+ msg += "\tSubjects [LB.name] is fractured!\n"
+
//Organ damages report
if(ishuman(M))
var/mob/living/carbon/human/H = M
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 7807c026..0debc38f 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -926,6 +926,16 @@
item_state = "marie"
attack_verb = list("awoo'd", "shoved", "bonked")
+/obj/item/toy/plush/mammal/marisol
+ desc = "An adorable stuffed toy resembling a demi-wolf security officer. That a baton, or is she happy to see you..?"
+ icon_state = "marisol"
+ item_state = "marisol"
+
+/obj/item/toy/plush/mammal/marilyn
+ desc = "A cute stuffed fox toy. Now, about that sponge bath..."
+ icon_state = "marilyn"
+ item_state = "marilyn"
+
/obj/item/toy/plush/catgirl
name = "feline plushie"
desc = "An adorable stuffed toy that resembles a feline."
@@ -940,7 +950,7 @@
item_state = "mikeel"
/obj/item/toy/plush/catgirl/skylar
- desc = "An adorable stuffed toy that resembles a degenerate."
+ desc = "An adorable stuffed toy that resembles a pure and good cat boy."
icon_state = "skylar"
item_state = "skylar"
attack_verb = list("powergamed", "merged", "tabled")
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 3490cf22..2a8f0806 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -744,3 +744,204 @@
..()
hud = new /obj/item/clothing/glasses/hud/security(src)
return
+
+
+/**********************************************************************
+ Borg apparatus
+***********************************************************************/
+//These are tools that can hold only specific items. For example, the mediborg gets one that can only hold beakers and bottles.
+
+/obj/item/borg/apparatus/
+ name = "unknown storage apparatus"
+ desc = "This device seems nonfunctional."
+ icon = 'icons/mob/robot_items.dmi'
+ icon_state = "hugmodule"
+ var/obj/item/stored
+ var/list/storable = list()
+
+/obj/item/borg/apparatus/Initialize()
+ . = ..()
+ RegisterSignal(loc.loc, COMSIG_BORG_SAFE_DECONSTRUCT, .proc/safedecon)
+
+/obj/item/borg/apparatus/Destroy()
+ if(stored)
+ qdel(stored)
+ . = ..()
+
+///If we're safely deconstructed, we put the item neatly onto the ground, rather than deleting it.
+/obj/item/borg/apparatus/proc/safedecon()
+ if(stored)
+ stored.forceMove(get_turf(src))
+ stored = null
+
+/obj/item/borg/apparatus/Exited(atom/A)
+ if(A == stored) //sanity check
+ UnregisterSignal(stored, COMSIG_ATOM_UPDATE_ICON)
+ stored = null
+ update_icon()
+ . = ..()
+
+///A right-click verb, for those not using hotkey mode.
+/obj/item/borg/apparatus/verb/verb_dropHeld()
+ set category = "Object"
+ set name = "Drop"
+
+ if(usr != loc || !stored)
+ return
+ stored.forceMove(get_turf(usr))
+ return
+
+/obj/item/borg/apparatus/attack_self(mob/living/silicon/robot/user)
+ if(!stored)
+ return ..()
+ if(user.client?.keys_held["Alt"])
+ stored.forceMove(get_turf(user))
+ return
+ stored.attack_self(user)
+
+/obj/item/borg/apparatus/pre_attack(atom/A, mob/living/user, params)
+ if(!stored)
+ var/itemcheck = FALSE
+ for(var/i in storable)
+ if(istype(A, i))
+ itemcheck = TRUE
+ break
+ if(itemcheck)
+ var/obj/item/O = A
+ O.forceMove(src)
+ stored = O
+ RegisterSignal(stored, COMSIG_ATOM_UPDATE_ICON, /atom/.proc/update_iconb)
+ update_icon()
+ return
+ else
+ stored.melee_attack_chain(user, A, params)
+ return
+ . = ..()
+
+/obj/item/borg/apparatus/attackby(obj/item/W, mob/user, params)
+ if(stored)
+ W.melee_attack_chain(user, stored, params)
+ return
+ . = ..()
+
+/////////////////
+//beaker holder//
+/////////////////
+
+/obj/item/borg/apparatus/beaker
+ name = "beaker storage apparatus"
+ desc = "A special apparatus for carrying beakers without spilling the contents. Alt-Z or right-click to drop the beaker."
+ icon_state = "borg_beaker_apparatus"
+ storable = list(/obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/glass/bottle)
+
+/obj/item/borg/apparatus/beaker/Initialize()
+ . = ..()
+ stored = new /obj/item/reagent_containers/glass/beaker/large(src)
+ RegisterSignal(stored, COMSIG_ATOM_UPDATE_ICON, /atom/.proc/update_iconb)
+ update_icon()
+
+/obj/item/borg/apparatus/beaker/Destroy()
+ if(stored)
+ var/obj/item/reagent_containers/C = stored
+ C.SplashReagents(get_turf(src))
+ qdel(stored)
+ . = ..()
+
+/obj/item/borg/apparatus/beaker/examine()
+ . = ..()
+ if(stored)
+ var/obj/item/reagent_containers/C = stored
+ . += "The apparatus currently has [C] secured, which contains:"
+ if(length(C.reagents.reagent_list))
+ for(var/datum/reagent/R in C.reagents.reagent_list)
+ . += "[R.volume] units of [R.name]"
+ else
+ . += "Nothing."
+
+/obj/item/borg/apparatus/beaker/update_icon()
+ cut_overlays()
+ if(stored)
+ COMPILE_OVERLAYS(stored)
+ stored.pixel_x = 0
+ stored.pixel_y = 0
+ var/image/img = image("icon"=stored, "layer"=FLOAT_LAYER)
+ var/image/arm = image("icon"="borg_beaker_apparatus_arm", "layer"=FLOAT_LAYER)
+ if(istype(stored, /obj/item/reagent_containers/glass/beaker))
+ arm.pixel_y = arm.pixel_y - 3
+ img.plane = FLOAT_PLANE
+ add_overlay(img)
+ add_overlay(arm)
+ else
+ var/image/arm = image("icon"="borg_beaker_apparatus_arm", "layer"=FLOAT_LAYER)
+ arm.pixel_y = arm.pixel_y - 5
+ add_overlay(arm)
+
+/obj/item/borg/apparatus/beaker/attack_self(mob/living/silicon/robot/user)
+ if(stored && !user.client?.keys_held["Alt"] && user.a_intent != "help")
+ var/obj/item/reagent_containers/C = stored
+ C.SplashReagents(get_turf(user))
+ loc.visible_message("[user] spills the contents of the [C] all over the floor.")
+ return
+ . = ..()
+
+/obj/item/borg/apparatus/beaker/extra
+ name = "secondary beaker storage apparatus"
+ desc = "A supplementary beaker storage apparatus."
+
+/obj/item/borg/apparatus/beaker/service
+ name = "beverage storage apparatus"
+ desc = "A special apparatus for carrying drinks without spilling the contents. Alt-Z or right-click to drop the beaker."
+ icon_state = "borg_beaker_apparatus"
+ storable = list(/obj/item/reagent_containers/food/drinks/,
+ /obj/item/reagent_containers/food/condiment)
+
+/obj/item/borg/apparatus/beaker/service/Initialize()
+ . = ..()
+ stored = new /obj/item/reagent_containers/food/drinks/drinkingglass(src)
+ RegisterSignal(stored, COMSIG_ATOM_UPDATE_ICON, /atom/.proc/update_iconb)
+ update_icon()
+
+////////////////////
+//engi part holder//
+////////////////////
+
+/obj/item/borg/apparatus/circuit
+ name = "circuit manipulation apparatus"
+ desc = "A special apparatus for carrying and manipulating circuit boards. Alt-Z or right-click to drop the stored object."
+ icon_state = "borg_hardware_apparatus"
+ storable = list(/obj/item/circuitboard,
+ /obj/item/electronics)
+
+/obj/item/borg/apparatus/circuit/Initialize()
+ . = ..()
+ update_icon()
+
+/obj/item/borg/apparatus/circuit/update_icon()
+ cut_overlays()
+ if(stored)
+ COMPILE_OVERLAYS(stored)
+ stored.pixel_x = -3
+ stored.pixel_y = 0
+ var/image/arm
+ if(istype(stored, /obj/item/circuitboard))
+ arm = image("icon"="borg_hardware_apparatus_arm1", "layer"=FLOAT_LAYER)
+ else
+ arm = image("icon"="borg_hardware_apparatus_arm2", "layer"=FLOAT_LAYER)
+ var/image/img = image("icon"=stored, "layer"=FLOAT_LAYER)
+ img.plane = FLOAT_PLANE
+ add_overlay(arm)
+ add_overlay(img)
+ else
+ var/image/arm = image("icon"="borg_hardware_apparatus_arm1", "layer"=FLOAT_LAYER)
+ add_overlay(arm)
+
+/obj/item/borg/apparatus/circuit/examine()
+ . = ..()
+ if(stored)
+ . += "The apparatus currently has [stored] secured."
+
+/obj/item/borg/apparatus/circuit/pre_attack(atom/A, mob/living/user, params)
+ . = ..()
+ if(istype(A, /obj/item/aiModule) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails
+ to_chat(user, "This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.")
\ No newline at end of file
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index d7dbcecd..7fcd7eff 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -514,7 +514,7 @@
/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical,
/obj/item/robot_module/medihound,
- /obj/item/robot_module/borgi)
+ /obj/item/robot_module/borgi)
/obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -620,6 +620,32 @@
if (RPED)
R.module.remove_module(RPED, TRUE)
+/obj/item/borg/upgrade/circuit_app
+ name = "circuit manipulation apparatus"
+ desc = "An engineering cyborg upgrade allowing for manipulation of circuit boards."
+ icon_state = "cyborg_upgrade3"
+ require_module = TRUE
+ module_type = list(/obj/item/robot_module/engineering)
+
+/obj/item/borg/upgrade/circuit_app/action(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if(.)
+ var/obj/item/borg/apparatus/circuit/C = locate() in R.module.modules
+ if(C)
+ to_chat(user, "This unit is already equipped with a circuit apparatus!")
+ return FALSE
+
+ C = new(R.module)
+ R.module.basic_modules += C
+ R.module.add_module(C, FALSE, TRUE)
+
+/obj/item/borg/upgrade/circuit_app/deactivate(mob/living/silicon/robot/R, user = usr)
+ . = ..()
+ if (.)
+ var/obj/item/borg/apparatus/circuit/C = locate() in R.module.modules
+ if (C)
+ R.module.remove_module(C, TRUE)
+
/obj/item/borg/upgrade/pinpointer
name = "medical cyborg crew pinpointer"
desc = "A crew pinpointer module for the medical cyborg."
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 745974cc..794e3e76 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -15,6 +15,7 @@
var/heal_burn = 0
var/stop_bleeding = 0
var/self_delay = 50
+ var/fix_bone= 0
/obj/item/stack/medical/attack(mob/living/M, mob/user)
@@ -93,6 +94,9 @@
if(affecting.status == BODYPART_ORGANIC) //Limb must be organic to be healed - RR
if(affecting.heal_damage(heal_brute, heal_burn))
C.update_damage_overlays()
+ if (fix_bone) //Fix broken bones on targeted limb
+ affecting.broken = 0
+ affecting.disabled = 0
else
to_chat(user, "Medicine won't work on a robotic limb!")
else
@@ -100,7 +104,19 @@
use(1)
+/obj/item/stack/medical/plaster_gauze
+ name = "plaster gauze"
+ gender = PLURAL
+ singular_name = "plaster gauze"
+ desc = "A roll of plaster of paris that is extremely effective at aiding bone fratcutres, but does not heal wounds."
+ icon_state = "pgauze"
+ self_delay = 300
+ max_amount = 10
+ fix_bone = 1
+/obj/item/stack/medical/plaster_gauze/suicide_act(mob/user)
+ user.visible_message("[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return (BRUTELOSS)
/obj/item/stack/medical/bruise_pack
name = "bruise pack"
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e1f82e4a..068468b7 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -285,6 +285,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
//Durathread fuck slash-asterisk comments
GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40),
+ new/datum/stack_recipe("durathread jumpskirt", /obj/item/clothing/under/durathread/skirt, 4, time = 40), \
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 312ef354..6afa6541 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -30,6 +30,7 @@
/obj/item/storage/firstaid/regular/PopulateContents()
if(empty)
return
+ new /obj/item/stack/medical/plaster_gauze(src)
new /obj/item/stack/medical/gauze(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
@@ -337,7 +338,7 @@
/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/penis_enlargement(src)
-
+
/obj/item/storage/pill_bottle/breast_enlargement
name = "breast enlargement pills"
desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time."
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index c42d59fd..dffc6237 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -23,3 +23,4 @@
new /obj/item/circuitboard/machine/techfab/department/cargo(src)
new /obj/item/storage/photo_album/QM(src)
new /obj/item/circuitboard/machine/ore_silo(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/qm(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 96afe90b..1a2f6b80 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -33,6 +33,7 @@
new /obj/item/extinguisher/advanced(src)
new /obj/item/storage/photo_album/CE(src)
new /obj/item/storage/lockbox/medal/engineering(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/ce(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index f42d9dfd..9adf0906 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -81,6 +81,7 @@
new /obj/item/circuitboard/machine/techfab/department/medical(src)
new /obj/item/storage/photo_album/CMO(src)
new /obj/item/storage/lockbox/medal/medical(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/cmo(src)
/obj/structure/closet/secure_closet/animal
name = "animal control"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index be914aef..218bc9cb 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -30,3 +30,4 @@
new /obj/item/door_remote/research_director(src)
new /obj/item/circuitboard/machine/techfab/department/science(src)
new /obj/item/storage/photo_album/RD(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/rd(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index f72f838b..adf373e4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -61,6 +61,7 @@
new /obj/item/door_remote/civillian(src)
new /obj/item/circuitboard/machine/techfab/department/service(src)
new /obj/item/storage/photo_album/HoP(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hop(src)
/obj/structure/closet/secure_closet/hos
name = "\proper head of security's locker"
req_access = list(ACCESS_HOS)
@@ -94,6 +95,7 @@
new /obj/item/pinpointer/nuke(src)
new /obj/item/circuitboard/machine/techfab/department/security(src)
new /obj/item/storage/photo_album/HoS(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hos(src)
/obj/structure/closet/secure_closet/warden
name = "\proper warden's locker"
req_access = list(ACCESS_ARMORY)
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index a1f56950..13ee6a08 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -30,7 +30,7 @@
addclientmessage(ckey,"You have been allowed to bypass the whitelist")
else
log_access("Failed Login: [key] - Not on whitelist")
- return list("reason"="whitelist", "desc" = "\nReason: You are not on the white list for this server")
+ return list("reason"="whitelist", "desc" = "\nReason: You are not on the whitelist for this server, apply in the station's discord server.")
//Guest Checking
if(!real_bans_only && IsGuestKey(key))
diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm
index 52ba3c52..117cc6a9 100644
--- a/code/modules/admin/chat_commands.dm
+++ b/code/modules/admin/chat_commands.dm
@@ -138,6 +138,6 @@ GLOBAL_LIST(round_end_notifiees)
GLOB.bunker_passthrough |= ckey(params)
- log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
- message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
+ log_admin("[sender.friendly_name] has added [params] to the bunker bypass list.")
+ message_admins("[sender.friendly_name] has added [params] to the bunker bypass list.")
return "[params] has been added to the current round's bunker bypass list."
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
index 2897427d..f1084310 100644
--- a/code/modules/admin/verbs/panicbunker.dm
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -15,18 +15,35 @@
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
send2irc("Panic Bunker", "[key_name(usr)] has toggled the Panic Bunker, it is now [new_pb ? "enabled" : "disabled"].")
+
/client/proc/addbunkerbypass(ckeytobypass as text)
set category = "Special Verbs"
- set name = "Add PB Bypass"
- set desc = "Allows a given ckey to connect despite the panic bunker for a given round."
+ set name = "Whitelist"
+ set desc = "Adds a given ckey onto the whitelist to bypass the panic bunker."
if(!CONFIG_GET(flag/sql_enabled))
to_chat(usr, "The Database is not enabled!")
return
GLOB.bunker_passthrough |= ckey(ckeytobypass)
- log_admin("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
- message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
- send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
+ log_admin("[key_name(usr)] has added [ckeytobypass] to the whitelist.")
+ message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the whitelist.")
+ send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the whitelist.")
+
+
+ //Hyperstation13 change Adds to a whitelist on the database table "whitelist", so players can join at a later date!
+ var/sql_ckey = sanitizeSQL(ckeytobypass)
+ var/datum/DBQuery/query_client_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("whitelist")] WHERE ckey = '[sql_ckey]'")
+ if(!query_client_in_db.Execute())
+ qdel(query_client_in_db)
+ return
+ if(!query_client_in_db.NextRow())
+ //add to database!
+ var/datum/DBQuery/query_add_player_whitelist = SSdbcore.NewQuery("INSERT INTO [format_table_name("whitelist")] (`ckey`) VALUES ('[sql_ckey]')")
+ if(!query_add_player_whitelist.Execute())
+ qdel(query_client_in_db)
+ qdel(query_add_player_whitelist)
+ return
+
/client/proc/revokebunkerbypass(ckeytobypass as text)
set category = "Special Verbs"
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
index 499d7a86..0dd6b08c 100644
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ b/code/modules/antagonists/cult/cult_structures.dm
@@ -73,6 +73,10 @@
animate(src, color = previouscolor, time = 8)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
+/obj/structure/destructible/cult/proc/check_menu(mob/living/user)
+ if(!user || user.incapacitated() || !iscultist(user) || !anchored || cooldowntime > world.time)
+ return FALSE
+ return TRUE
/obj/structure/destructible/cult/talisman
name = "altar"
@@ -80,9 +84,18 @@
icon_state = "talismanaltar"
break_message = "The altar shatters, leaving only the wailing of the damned!"
-/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
+ var/static/image/radial_whetstone = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener")
+ var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
+ var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
+
+/obj/structure/destructible/cult/talisman/Initialize()
. = ..()
- if(.)
+ radial_unholy_water.color = "#333333"
+
+/obj/structure/destructible/cult/talisman/ui_interact(mob/user)
+ . = ..()
+
+ if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "You're pretty sure you know exactly what this is used for and you can't seem to touch it.")
@@ -91,22 +104,27 @@
to_chat(user, "You need to anchor [src] to the floor with your dagger first.")
return
if(cooldowntime > world.time)
- to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
+ to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
- var/list/pickedtype = list()
+
+ to_chat(user, "You study the schematics etched into the altar...")
+
+ var/list/options = list("Eldritch Whetstone" = radial_whetstone, "Construct Shell" = radial_shell, "Flask of Unholy Water" = radial_unholy_water)
+ var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+
+ var/reward
switch(choice)
if("Eldritch Whetstone")
- pickedtype += /obj/item/sharpener/cult
+ reward = /obj/item/sharpener/cult
if("Construct Shell")
- pickedtype += /obj/structure/constructshell
+ reward = /obj/structure/constructshell
if("Flask of Unholy Water")
- pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
- if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
+ reward = /obj/item/reagent_containers/glass/beaker/unholywater
+
+ if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You kneel before the altar and your faith is rewarded with the [choice]!")
+ new reward(get_turf(src))
+ to_chat(user, "You kneel before the altar and your faith is rewarded with the [choice]!")
/obj/structure/destructible/cult/forge
name = "daemon forge"
@@ -116,9 +134,14 @@
light_color = LIGHT_COLOR_LAVA
break_message = "The force breaks apart into shards with a howling scream!"
-/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
+ var/static/image/radial_flagellant = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes")
+ var/static/image/radial_shielded = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor")
+ var/static/image/radial_mirror = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "mirror_shield")
+
+/obj/structure/destructible/cult/forge/ui_interact(mob/user)
. = ..()
- if(.)
+
+ if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "The heat radiating from [src] pushes you back.")
@@ -129,24 +152,26 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice
- if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
- choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
- else
- choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
- var/list/pickedtype = list()
+
+ to_chat(user, "You study the schematics etched into the forge...")
+
+
+ var/list/options = list("Shielded Robe" = radial_shielded, "Flagellant's Robe" = radial_flagellant, "Mirror Shield" = radial_mirror)
+ var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+
+ var/reward
switch(choice)
if("Shielded Robe")
- pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield
+ reward = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
- pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
+ reward = /obj/item/clothing/suit/hooded/cultrobes/berserker
if("Mirror Shield")
- pickedtype += /obj/item/shield/mirror
- if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
+ reward = /obj/item/shield/mirror
+
+ if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!")
+ new reward(get_turf(src))
+ to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!")
@@ -234,9 +259,14 @@
light_color = LIGHT_COLOR_FIRE
break_message = "The books and tomes of the archives burn into ash as the desk shatters!"
-/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
+ var/static/image/radial_blindfold = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold")
+ var/static/image/radial_curse = image(icon = 'icons/obj/cult.dmi', icon_state ="shuttlecurse")
+ var/static/image/radial_veilwalker = image(icon = 'icons/obj/cult.dmi', icon_state ="shifter")
+
+/obj/structure/destructible/cult/tome/ui_interact(mob/user)
. = ..()
- if(.)
+
+ if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "These books won't open and it hurts to even try and read the covers.")
@@ -247,21 +277,27 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
- var/list/pickedtype = list()
+
+ to_chat(user, "You flip through the black pages of the archives...")
+
+ var/list/options = list("Zealot's Blindfold" = radial_blindfold, "Shuttle Curse" = radial_curse, "Veil Walker Set" = radial_veilwalker)
+ var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+
+ var/reward
switch(choice)
if("Zealot's Blindfold")
- pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind
+ reward = /obj/item/clothing/glasses/hud/health/night/cultblind
if("Shuttle Curse")
- pickedtype += /obj/item/shuttle_curse
+ reward = /obj/item/shuttle_curse
if("Veil Walker Set")
- pickedtype += /obj/item/cult_shift
- pickedtype += /obj/item/flashlight/flare/culttorch
- if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
+ reward = /obj/effect/spawner/bundle/veil_walker
+ if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You summon the [choice] from the archives!")
+ new reward(get_turf(src))
+ to_chat(user, "You summon the [choice] from the archives!")
+
+/obj/effect/spawner/bundle/veil_walker
+ items = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch)
/obj/effect/gateway
name = "gateway"
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index bc44bfbd..b8905a36 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -291,7 +291,7 @@
radiation_pulse(location,rad_power)
var/new_heat_capacity = air.heat_capacity()
- if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY && (air.temperature <= FUSION_MAXIMUM_TEMPERATURE || reaction_energy <= 0)) //If above FUSION_MAXIMUM_TEMPERATURE, will only adjust temperature for endothermic reactions.
air.temperature = CLAMP(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY)
return REACTING
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index e53c362d..1713df90 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -500,19 +500,25 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
return
if(!query_client_in_db.NextRow())
if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough))
- log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
- message_admins("Failed Login: [key] - New account attempting to connect during panic bunker")
- to_chat(src, "You must first join the Discord to verify your account before joining this server.
To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: https://discord.gg/E6SQuhz") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
- var/list/connectiontopic_a = params2list(connectiontopic)
- var/list/panic_addr = CONFIG_GET(string/panic_server_address)
- if(panic_addr && !connectiontopic_a["redirect"])
- var/panic_name = CONFIG_GET(string/panic_server_name)
- to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].")
- winset(src, null, "command=.options")
- src << link("[panic_addr]?redirect=1")
- qdel(query_client_in_db)
- qdel(src)
- return
+ var/datum/DBQuery/query_client_in_db_whitelist = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("whitelist")] WHERE ckey = '[sql_ckey]'")
+ if(!query_client_in_db_whitelist.Execute())
+ qdel(query_client_in_db_whitelist)
+ return
+ if(!query_client_in_db_whitelist.NextRow()) //they are not on the whitelist OR have played before! on the database!
+
+ log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
+ message_admins("Failed Login: [key] - New account attempting to connect without being whitelisted!")
+ to_chat(src, "You must first join the Discord to verify your account before joining this server.
To do so, read the rules here http://hyperstation13.com/rules and post a request in the #whitelist-application under the \"Main server\" category in the Discord server linked here: https://discordapp.com/invite/PCtX2fH") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
+ var/list/connectiontopic_a = params2list(connectiontopic)
+ var/list/panic_addr = CONFIG_GET(string/panic_server_address)
+ if(panic_addr && !connectiontopic_a["redirect"])
+ var/panic_name = CONFIG_GET(string/panic_server_name)
+ to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].")
+ winset(src, null, "command=.options")
+ src << link("[panic_addr]?redirect=1")
+ qdel(query_client_in_db)
+ qdel(src)
+ return
new_player = 1
account_join_date = sanitizeSQL(findJoinDate())
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 83c2910a..d992df6f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -13,6 +13,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/client/parent
//doohickeys for savefiles
var/path
+ var/clientckey
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
var/max_save_slots = 8
@@ -233,6 +234,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(istype(C))
if(!IsGuestKey(C.key))
load_path(C.ckey)
+ clientckey = C.ckey
unlock_content = C.IsByondMember()
if(unlock_content)
max_save_slots = 16
@@ -1537,12 +1539,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_list
if(new_hair_style)
hair_style = new_hair_style
+ if(new_hair_style == "Tail Hair" && clientckey <> "quotefox")
+ hair_style = "Bald"
+
if("next_hair_style")
hair_style = next_list_item(hair_style, GLOB.hair_styles_list)
+ if(hair_style == "Tail Hair" && clientckey <> "quotefox")
+ hair_style = "Bald"
if("previous_hair_style")
hair_style = previous_list_item(hair_style, GLOB.hair_styles_list)
+ if(hair_style == "Tail Hair" && clientckey <> "quotefox")
+ hair_style = "Bald"
if("facial")
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 72ae039c..5c97d8f0 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -412,11 +412,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list)
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
- undie_color = sanitize_hexcolor(undie_color, 6, 1, initial(undie_color))
+ undie_color = sanitize_hexcolor(undie_color, 3, 0, initial(undie_color))
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
- shirt_color = sanitize_hexcolor(shirt_color, 6, 1, initial(shirt_color))
+ shirt_color = sanitize_hexcolor(shirt_color, 3, 0, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
- socks_color = sanitize_hexcolor(socks_color, 6, 1, initial(socks_color))
+ socks_color = sanitize_hexcolor(socks_color, 3, 0, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 3, 0)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 18d48f93..08adb8e5 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -332,6 +332,15 @@ BLIND // can't see anything
if(visor_vars_to_toggle & VISOR_TINT)
tint ^= initial(tint)
+/obj/item/clothing/head/helmet/space/plasmaman/visor_toggling() //handles all the actual toggling of flags
+ up = !up
+ clothing_flags ^= visor_flags
+ flags_inv ^= visor_flags_inv
+ icon_state = "[initial(icon_state)]"
+ if(visor_vars_to_toggle & VISOR_FLASHPROTECT)
+ flash_protect ^= initial(flash_protect)
+ if(visor_vars_to_toggle & VISOR_TINT)
+ tint ^= initial(tint)
/obj/item/clothing/proc/can_use(mob/user)
if(user && ismob(user))
diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm
new file mode 100644
index 00000000..9d7b0dd3
--- /dev/null
+++ b/code/modules/clothing/outfits/plasmaman.dm
@@ -0,0 +1,128 @@
+/datum/outfit/plasmaman/bar
+ name = "Bartender Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/white
+ uniform = /obj/item/clothing/under/plasmaman/enviroslacks
+
+/datum/outfit/plasmaman/chef
+ name = "Chef Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/white
+ uniform = /obj/item/clothing/under/plasmaman/chef
+
+/datum/outfit/plasmaman/botany
+ name = "Botany Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/botany
+ uniform = /obj/item/clothing/under/plasmaman/botany
+
+/datum/outfit/plasmaman/curator
+ name = "Curator Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/curator
+ uniform = /obj/item/clothing/under/plasmaman/curator
+
+/datum/outfit/plasmaman/chaplain
+ name = "Chaplain Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain
+ uniform = /obj/item/clothing/under/plasmaman/chaplain
+
+/datum/outfit/plasmaman/janitor
+ name = "Janitor Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/janitor
+ uniform = /obj/item/clothing/under/plasmaman/janitor
+
+/datum/outfit/plasmaman/security
+ name = "Security Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/security
+ uniform = /obj/item/clothing/under/plasmaman/security
+
+/datum/outfit/plasmaman/detective
+ name = "Detective Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/white
+ uniform = /obj/item/clothing/under/plasmaman/enviroslacks
+ ears = /obj/item/radio/headset/headset_sec
+
+/datum/outfit/plasmaman/warden
+ name = "Warden Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden
+ uniform = /obj/item/clothing/under/plasmaman/security/warden
+
+/datum/outfit/plasmaman/cargo
+ name = "Cargo Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/cargo
+ uniform = /obj/item/clothing/under/plasmaman/cargo
+
+/datum/outfit/plasmaman/mining
+ name = "Mining Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/mining
+ uniform = /obj/item/clothing/under/plasmaman/mining
+
+/datum/outfit/plasmaman/medical
+ name = "Medical Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/medical
+ uniform = /obj/item/clothing/under/plasmaman/medical
+
+/datum/outfit/plasmaman/viro
+ name = "Virology Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/viro
+ uniform = /obj/item/clothing/under/plasmaman/viro
+
+/datum/outfit/plasmaman/chemist
+ name = "Chemist Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/chemist
+ uniform = /obj/item/clothing/under/plasmaman/chemist
+
+/datum/outfit/plasmaman/genetics
+ name = "Genetics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/genetics
+ uniform = /obj/item/clothing/under/plasmaman/genetics
+
+/datum/outfit/plasmaman/science
+ name = "Science Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/science
+ uniform = /obj/item/clothing/under/plasmaman/science
+
+/datum/outfit/plasmaman/robotics
+ name = "Robotics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/robotics
+ uniform = /obj/item/clothing/under/plasmaman/robotics
+
+/datum/outfit/plasmaman/engineering
+ name = "Engineering Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/engineering
+ uniform = /obj/item/clothing/under/plasmaman/engineering
+
+/datum/outfit/plasmaman/atmospherics
+ name = "Atmospherics Plasmaman"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics
+ uniform = /obj/item/clothing/under/plasmaman/atmospherics
+
+/datum/outfit/plasmaman/mime
+ name = "Plasmamime"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/mime
+ uniform = /obj/item/clothing/under/plasmaman/mime
+ mask = /obj/item/clothing/mask/gas/mime
+
+/datum/outfit/plasmaman/clown
+ name = "Plasmaclown"
+
+ head = /obj/item/clothing/head/helmet/space/plasmaman/clown
+ uniform = /obj/item/clothing/under/plasmaman/clown
+ mask = /obj/item/clothing/mask/gas/clown_hat
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index d1ee88d5..e4ba758d 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -15,8 +15,8 @@
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
- ..()
- to_chat(user, "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit.")
+ . = ..()
+ . += "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit."
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
@@ -41,12 +41,92 @@
icon_state = "plasmaman-helm"
item_state = "plasmaman-helm"
strip_delay = 80
+ flash_protect = 2
+ tint = 2
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
resistance_flags = FIRE_PROOF
var/brightness_on = 4 //luminosity when the light is on
var/on = FALSE
+ var/smile = FALSE
+ var/smile_color = "#FF0000"
+ var/visor_icon = "envisor"
+ var/smile_state = "envirohelm_smile"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen/plasmaman)
+ visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES
+ visor_flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR
+
+/obj/item/clothing/head/helmet/space/plasmaman/Initialize()
+ . = ..()
+ visor_toggling()
+ update_icon()
+ cut_overlays()
+
+/obj/item/clothing/head/helmet/space/plasmaman/AltClick(mob/user)
+ if(user.canUseTopic(src, BE_CLOSE))
+ toggle_welding_screen(user)
+
+/obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_welding_screen(mob/living/user)
+ if(weldingvisortoggle(user))
+ if(on)
+ to_chat(user, "Your helmet's torch can't pass through your welding visor!")
+ on = FALSE
+ playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
+ update_icon()
+ else
+ playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
+ update_icon()
+
+/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands)
+ . = ..()
+ if(!isinhands && !up)
+ . += mutable_appearance('icons/mob/head.dmi', visor_icon)
+ else
+ cut_overlays()
+
+/obj/item/clothing/head/helmet/space/plasmaman/update_icon()
+ cut_overlays()
+ add_overlay(visor_icon)
+ ..()
actions_types = list(/datum/action/item_action/toggle_helmet_light)
+/obj/item/clothing/head/helmet/space/plasmaman/attackby(obj/item/C, mob/living/user)
+ . = ..()
+ if(istype(C, /obj/item/toy/crayon))
+ if(smile == FALSE)
+ var/obj/item/toy/crayon/CR = C
+ to_chat(user, "You start drawing a smiley face on the helmet's visor..")
+ if(do_after(user, 25, target = src))
+ smile = TRUE
+ smile_color = CR.paint_color
+ to_chat(user, "You draw a smiley on the helmet visor.")
+ update_icon()
+ return
+ if(smile == TRUE)
+ to_chat(user, "Seems like someone already drew something on this helmet's visor.")
+
+/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands)
+ . = ..()
+ if(!isinhands && smile)
+ var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', smile_state)
+ M.color = smile_color
+ . += M
+ if(!isinhands && !up)
+ . += mutable_appearance('icons/mob/head.dmi', visor_icon)
+ else
+ cut_overlays()
+
+/obj/item/clothing/head/helmet/space/plasmaman/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, .proc/wipe_that_smile_off_your_face)
+
+///gets called when receiving the CLEAN_ACT signal from something, i.e soap or a shower. exists to remove any smiley faces drawn on the helmet.
+/obj/item/clothing/head/helmet/space/plasmaman/proc/wipe_that_smile_off_your_face()
+ if(smile)
+ smile = FALSE
+ cut_overlays()
+
/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
on = !on
icon_state = "[initial(icon_state)][on ? "-light":""]"
@@ -54,10 +134,137 @@
user.update_inv_head() //So the mob overlay updates
if(on)
- set_light(brightness_on, 0.8, "#FFCC66")
+ if(!up)
+ to_chat(user, "Your helmet's torch can't pass through your welding visor!")
+ set_light(0)
+ else
+ set_light(brightness_on)
else
set_light(0)
for(var/X in actions)
var/datum/action/A=X
A.UpdateButtonIcon()
+
+/obj/item/clothing/head/helmet/space/plasmaman/security
+ name = "security plasma envirosuit helmet"
+ desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
+ icon_state = "security_envirohelm"
+ item_state = "security_envirohelm"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
+
+/obj/item/clothing/head/helmet/space/plasmaman/security/warden
+ name = "warden's plasma envirosuit helmet"
+ desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
+ icon_state = "warden_envirohelm"
+ item_state = "warden_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/medical
+ name = "medical's plasma envirosuit helmet"
+ desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much"
+ icon_state = "doctor_envirohelm"
+ item_state = "doctor_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/genetics
+ name = "geneticist's plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for geneticists."
+ icon_state = "geneticist_envirohelm"
+ item_state = "geneticist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/viro
+ name = "virology plasma envirosuit helmet"
+ desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create."
+ icon_state = "virologist_envirohelm"
+ item_state = "virologist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/chemist
+ name = "chemistry plasma envirosuit helmet"
+ desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
+ icon_state = "chemist_envirohelm"
+ item_state = "chemist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/science
+ name = "science plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for scientists."
+ icon_state = "scientist_envirohelm"
+ item_state = "scientist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/robotics
+ name = "robotics plasma envirosuit helmet"
+ desc = "A plasmaman envirohelmet designed for roboticists."
+ icon_state = "roboticist_envirohelm"
+ item_state = "roboticist_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/engineering
+ name = "engineering plasma envirosuit helmet"
+ desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
+ icon_state = "engineer_envirohelm"
+ item_state = "engineer_envirohelm"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75)
+
+/obj/item/clothing/head/helmet/space/plasmaman/atmospherics
+ name = "atmospherics plasma envirosuit helmet"
+ desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
+ icon_state = "atmos_envirohelm"
+ item_state = "atmos_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/cargo
+ name = "cargo plasma envirosuit helmet"
+ desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
+ icon_state = "cargo_envirohelm"
+ item_state = "cargo_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/mining
+ name = "mining plasma envirosuit helmet"
+ desc = "A khaki helmet given to plasmamen miners operating on lavaland."
+ icon_state = "explorer_envirohelm"
+ item_state = "explorer_envirohelm"
+ visor_icon = "explorer_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/chaplain
+ name = "chaplain's plasma envirosuit helmet"
+ desc = "An envirohelmet specially designed for only the most pious of plasmamen."
+ icon_state = "chap_envirohelm"
+ item_state = "chap_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/white
+ name = "white plasma envirosuit helmet"
+ desc = "A generic white envirohelm."
+ icon_state = "white_envirohelm"
+ item_state = "white_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/curator
+ name = "curator's plasma envirosuit helmet"
+ desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
+ icon_state = "prototype_envirohelm"
+ item_state = "prototype_envirohelm"
+ actions_types = list(/datum/action/item_action/toggle_welding_screen/plasmaman)
+ smile_state = "prototype_smile"
+ visor_icon = "prototype_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/botany
+ name = "botany plasma envirosuit helmet"
+ desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
+ icon_state = "botany_envirohelm"
+ item_state = "botany_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/janitor
+ name = "janitor's plasma envirosuit helmet"
+ desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor."
+ icon_state = "janitor_envirohelm"
+ item_state = "janitor_envirohelm"
+
+/obj/item/clothing/head/helmet/space/plasmaman/mime
+ name = "mime envirosuit helmet"
+ desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
+ icon_state = "mime_envirohelm"
+ item_state = "mime_envirohelm"
+ visor_icon = "mime_envisor"
+
+/obj/item/clothing/head/helmet/space/plasmaman/clown
+ name = "clown envirosuit helmet"
+ desc = "The make-up is painted on, it's a miracle it doesn't chip. 'HONK!'"
+ icon_state = "clown_envirohelm"
+ item_state = "clown_envirohelm"
+ visor_icon = "clown_envisor"
+ smile_state = "clown_smile"
\ No newline at end of file
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 3f64807c..e8278c3d 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -475,9 +475,7 @@
icon_state = "pharoah"
body_parts_covered = CHEST|GROIN
-
-
-// WINTER COATS
+//WINTER COATS
/obj/item/clothing/suit/hooded/wintercoat
name = "winter coat"
@@ -513,6 +511,16 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "winterhood_captain"
+/obj/item/clothing/suit/hooded/wintercoat/hop
+ name = "head of personnel's winter coat"
+ icon_state = "coathop"
+ item_state = "coathop"
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
+
+/obj/item/clothing/head/hooded/winterhood/hop
+ icon_state = "winterhood_hop"
+
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
@@ -527,6 +535,20 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "winterhood_security"
+/obj/item/clothing/suit/hooded/wintercoat/hos
+ name = "head of security's winter coat"
+ icon_state = "coathos"
+ item_state = "coathos"
+ armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hos
+
+/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/hos
+ icon_state = "winterhood_hos"
+
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
@@ -538,6 +560,39 @@
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "winterhood_medical"
+/obj/item/clothing/suit/hooded/wintercoat/cmo
+ name = "chief medical officer's winter coat"
+ icon_state = "coatcmo"
+ item_state = "coatcmo"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
+
+/obj/item/clothing/head/hooded/winterhood/cmo
+ icon_state = "winterhood_cmo"
+
+/obj/item/clothing/suit/hooded/wintercoat/chemistry
+ name = "chemistry winter coat"
+ icon_state = "coatchemistry"
+ item_state = "coatchemistry"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
+
+/obj/item/clothing/head/hooded/winterhood/chemistry
+ icon_state = "winterhood_chemistry"
+
+/obj/item/clothing/suit/hooded/wintercoat/viro
+ name = "virology winter coat"
+ icon_state = "coatviro"
+ item_state = "coatviro"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
+
+/obj/item/clothing/head/hooded/winterhood/viro
+ icon_state = "winterhood_viro"
+
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
icon_state = "coatscience"
@@ -549,6 +604,49 @@
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "winterhood_science"
+/obj/item/clothing/suit/hooded/wintercoat/robotics
+ name = "robotics winter coat"
+ icon_state = "coatrobotics"
+ item_state = "coatrobotics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics
+
+/obj/item/clothing/head/hooded/winterhood/robotics
+ icon_state = "winterhood_robotics"
+
+/obj/item/clothing/suit/hooded/wintercoat/genetics
+ name = "genetics winter coat"
+ icon_state = "coatgenetics"
+ item_state = "coatgenetics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics
+
+/obj/item/clothing/head/hooded/winterhood/genetics
+ icon_state = "winterhood_genetics"
+
+/obj/item/clothing/suit/hooded/wintercoat/rd
+ name = "research director's winter coat"
+ icon_state = "coatrd"
+ item_state = "coatrd"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/rd
+
+/obj/item/clothing/head/hooded/winterhood/rd
+ icon_state = "winterhood_rd"
+
+/obj/item/clothing/suit/hooded/wintercoat/ce
+ name = "chief engineer's winter coat"
+ icon_state = "coatce"
+ item_state = "coatce"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ce
+
+/obj/item/clothing/head/hooded/winterhood/ce
+ icon_state = "winterhood_ce"
+
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
@@ -579,6 +677,26 @@
/obj/item/clothing/head/hooded/winterhood/hydro
icon_state = "winterhood_hydro"
+/obj/item/clothing/suit/hooded/wintercoat/cosmic
+ name = "cosmic winter coat"
+ icon_state = "coatcosmic"
+ item_state = "coatcosmic"
+ allowed = list(/obj/item/flashlight)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
+
+/obj/item/clothing/head/hooded/winterhood/cosmic
+ icon_state = "winterhood_cosmic"
+
+/obj/item/clothing/suit/hooded/wintercoat/janitor
+ name = "janitors winter coat"
+ icon_state = "coatjanitor"
+ item_state = "coatjanitor"
+ allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor
+
+/obj/item/clothing/head/hooded/winterhood/janitor
+ icon_state = "winterhood_janitor"
+
/obj/item/clothing/suit/hooded/wintercoat/cargo
name = "cargo winter coat"
icon_state = "coatcargo"
@@ -588,6 +706,15 @@
/obj/item/clothing/head/hooded/winterhood/cargo
icon_state = "winterhood_cargo"
+/obj/item/clothing/suit/hooded/wintercoat/qm
+ name = "quartermaster's winter coat"
+ icon_state = "coatqm"
+ item_state = "coatqm"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/qm
+
+/obj/item/clothing/head/hooded/winterhood/qm
+ icon_state = "winterhood_qm"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
new file mode 100644
index 00000000..35aa316f
--- /dev/null
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -0,0 +1,86 @@
+/obj/item/clothing/under/plasmaman/cargo
+ name = "cargo plasma envirosuit"
+ desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs."
+ icon_state = "cargo_envirosuit"
+ item_state = "cargo_envirosuit"
+ item_color = "cargo_envirosuit"
+
+/obj/item/clothing/under/plasmaman/mining
+ name = "mining plasma envirosuit"
+ desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen."
+ icon_state = "explorer_envirosuit"
+ item_state = "explorer_envirosuit"
+ item_color = "explorer_envirosuit"
+
+
+/obj/item/clothing/under/plasmaman/chef
+ name = "chef's plasma envirosuit"
+ desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
+ icon_state = "chef_envirosuit"
+ item_state = "chef_envirosuit"
+ item_color = "chef_envirosuit"
+
+/obj/item/clothing/under/plasmaman/enviroslacks
+ name = "enviroslacks"
+ desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
+ icon_state = "enviroslacks"
+ item_state = "enviroslacks"
+ item_color = "enviroslacks"
+
+/obj/item/clothing/under/plasmaman/chaplain
+ name = "chaplain's plasma envirosuit"
+ desc = "An envirosuit specially designed for only the most pious of plasmamen."
+ icon_state = "chap_envirosuit"
+ item_state = "chap_envirosuit"
+ item_color = "chap_envirosuit"
+
+/obj/item/clothing/under/plasmaman/curator
+ name = "curator's plasma envirosuit"
+ desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
+ icon_state = "prototype_envirosuit"
+ item_state = "prototype_envirosuit"
+ item_color = "prototype_envirosuit"
+
+/obj/item/clothing/under/plasmaman/janitor
+ name = "janitor's plasma envirosuit"
+ desc = "A grey and purple envirosuit designated for plasmamen janitors."
+ icon_state = "janitor_envirosuit"
+ item_state = "janitor_envirosuit"
+ item_color = "janitor_envirosuit"
+
+/obj/item/clothing/under/plasmaman/botany
+ name = "botany envirosuit"
+ desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries."
+ icon_state = "botany_envirosuit"
+ item_state = "botany_envirosuit"
+ item_color = "botany_envirosuit"
+
+
+/obj/item/clothing/under/plasmaman/mime
+ name = "mime envirosuit"
+ desc = "It's not very colourful."
+ icon_state = "mime_envirosuit"
+ item_state = "mime_envirosuit"
+ item_color = "mime_envirosuit"
+
+/obj/item/clothing/under/plasmaman/clown
+ name = "clown envirosuit"
+ desc = "'HONK!'"
+ icon_state = "clown_envirosuit"
+ item_state = "clown_envirosuit"
+ item_color = "clown_envirosuit"
+
+/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ if(H.on_fire)
+ if(extinguishes_left)
+ if(next_extinguish > world.time)
+ return
+ next_extinguish = world.time + extinguish_cooldown
+ extinguishes_left--
+ H.visible_message("[H]'s suit spews out a tonne of space lube!","Your suit spews out a tonne of space lube!")
+ H.ExtinguishMob()
+ new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
+ return 0
diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
new file mode 100644
index 00000000..8ed33e6a
--- /dev/null
+++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
@@ -0,0 +1,15 @@
+/obj/item/clothing/under/plasmaman/engineering
+ name = "engineering plasma envirosuit"
+ desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
+ icon_state = "engineer_envirosuit"
+ item_state = "engineer_envirosuit"
+ item_color = "engineer_envirosuit"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95)
+
+/obj/item/clothing/under/plasmaman/atmospherics
+ name = "atmospherics plasma envirosuit"
+ desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
+ icon_state = "atmos_envirosuit"
+ item_state = "atmos_envirosuit"
+ item_color = "atmos_envirosuit"
+
diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm
new file mode 100644
index 00000000..5aa61e7f
--- /dev/null
+++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm
@@ -0,0 +1,41 @@
+/obj/item/clothing/under/plasmaman/medical
+ name = "medical plasma envirosuit"
+ desc = "A suit designed for the station's more plasma-based doctors."
+ icon_state = "doctor_envirosuit"
+ item_state = "doctor_envirosuit"
+ item_color = "doctor_envirosuit"
+
+/obj/item/clothing/under/plasmaman/science
+ name = "science plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for scientists."
+ icon_state = "scientist_envirosuit"
+ item_state = "scientist_envirosuit"
+ item_color = "scientist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/robotics
+ name = "robotics plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for roboticists."
+ icon_state = "roboticist_envirosuit"
+ item_state = "roboticist_envirosuit"
+ item_color = "roboticist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/viro
+ name = "virology plasma envirosuit"
+ desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create."
+ icon_state = "virologist_envirosuit"
+ item_state = "virologist_envirosuit"
+ item_color = "virologist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/genetics
+ name = "genetics plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for geneticists."
+ icon_state = "geneticist_envirosuit"
+ item_state = "geneticist_envirosuit"
+ item_color = "geneticist_envirosuit"
+
+/obj/item/clothing/under/plasmaman/chemist
+ name = "chemistry plasma envirosuit"
+ desc = "A plasmaman envirosuit designed for chemists."
+ icon_state = "chemist_envirosuit"
+ item_state = "chemist_envirosuit"
+ item_color = "chemist_envirosuit"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm
new file mode 100644
index 00000000..36c16e9c
--- /dev/null
+++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm
@@ -0,0 +1,14 @@
+/obj/item/clothing/under/plasmaman/security
+ name = "security plasma envirosuit"
+ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
+ icon_state = "security_envirosuit"
+ item_state = "security_envirosuit"
+ item_color = "security_envirosuit"
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
+
+/obj/item/clothing/under/plasmaman/security/warden
+ name = "warden plasma envirosuit"
+ desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
+ icon_state = "warden_envirosuit"
+ item_state = "warden_envirosuit"
+ item_color = "warden_envirosuit"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index b2a6ae32..ad8e8303 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -709,9 +709,15 @@
icon_state = "durathread"
item_state = "durathread"
item_color = "durathread"
- can_adjust = FALSE
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
-
+/obj/item/clothing/under/durathread/skirt
+ name = "durathread jumpskirt"
+ desc = "A jumpskirt made from durathread, its resilient fibres provide some protection to the wearer."
+ icon_state = "duraskirt"
+ item_state = "duraskirt"
+ item_color = "duraskirt"
+ can_adjust = FALSE
+
/obj/item/clothing/under/gear_harness
name = "gear harness"
desc = "A simple, inconspicuous harness replacement for a jumpsuit."
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 82d66aa6..2811168f 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -912,14 +912,6 @@
time = 30
category = CAT_CLOTHING
-/datum/crafting_recipe/durathread_bandolier
- name = "Durathread Bandolier"
- result = /obj/item/storage/belt/bandolier/durathread
- reqs = list(/obj/item/stack/sheet/durathread = 6,
- /obj/item/stack/sheet/leather = 2)
- time = 50
- category = CAT_CLOTHING
-
/datum/crafting_recipe/durathread_helmet
name = "Makeshift Durathread Helmet"
result = /obj/item/clothing/head/helmet/durathread
@@ -944,3 +936,30 @@
time = 70
category = CAT_CLOTHING
+/datum/crafting_recipe/wintercoat_cosmic
+ name = "Cosmic Winter Coat"
+ result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
+ reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/captain = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hop = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/rd = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/ce = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/qm = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/science = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/medical = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/security = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/miner = 1)
+ time = 60
+ always_availible = TRUE
+ category = CAT_CLOTHING
diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
index 74fd7dda..b75f8787 100644
--- a/code/modules/food_and_drinks/food/snacks_pizza.dm
+++ b/code/modules/food_and_drinks/food/snacks_pizza.dm
@@ -180,7 +180,7 @@
/obj/item/reagent_containers/food/snacks/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm
var/obj/item/bodypart/l_arm = user.get_bodypart(BODY_ZONE_L_ARM)
var/obj/item/bodypart/r_arm = user.get_bodypart(BODY_ZONE_R_ARM)
- if(prob(50) && iscarbon(user) && M == user && (r_arm || l_arm))
+ if(prob(5) && iscarbon(user) && M == user && (r_arm || l_arm))
user.visible_message("\The [src] breaks off [user]'s arm!!", "\The [src] breaks off your arm!")
if(l_arm)
l_arm.dismember()
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
index ae4f8a09..a05c7869 100644
--- a/code/modules/hydroponics/grown/cocoa_vanilla.dm
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -64,7 +64,7 @@
production = 7
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list()
- reagents_add = list(/datum/reagent/consumable/enzyme = 0.1, /datum/reagent/consumable/nutriment = 0.1)
+ reagents_add = list("enzyme" = 0.1, "nutriment" = 0.1)
growthstages = 4
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
icon_grow = "bungotree-grow"
@@ -97,5 +97,5 @@
/obj/item/reagent_containers/food/snacks/grown/bungopit/Initialize()
. =..()
reagents.clear_reagents()
- reagents.add_reagent(/datum/reagent/toxin/bungotoxin, seed.potency * 0.10) //More than this will kill at too low potency
- reagents.add_reagent(/datum/reagent/consumable/nutriment, seed.potency * 0.04)
\ No newline at end of file
+ reagents.add_reagent("bungotoxin", seed.potency * 0.10) //More than this will kill at too low potency
+ reagents.add_reagent("nutriment", seed.potency * 0.04)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index c9207d54..9661f38d 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -68,8 +68,8 @@
icon_grow = "spacemanstrumpet-grow"
icon_dead = "spacemanstrumpet-dead"
mutatelist = list()
- genes = list(/datum/plant_gene/reagent/polypyr)
- reagents_add = list(/datum/reagent/consumable/nutriment = 0.05)
+ genes = list( "Polypyrylium Oligomers")
+ reagents_add = list("nutriment" = 0.05)
rarity = 30
/obj/item/seeds/poppy/lily/trumpet/Initialize()
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 4f5fe812..641a5edc 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -81,7 +81,7 @@
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive)
mutatelist = list()
- reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1)
+ reagents_add = list("nutriment" = 0.05, "silibinin" = 0.1)
/obj/item/seeds/galaxythistle/Initialize()
..()
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index c4adce2a..c2543a64 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -212,13 +212,13 @@
endurance = 8
yield = 4
growthstages = 2
- genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/liquidelectricity, /datum/plant_gene/trait/plant_type/carnivory)
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/reagent/teslium, /datum/plant_gene/trait/plant_type/carnivory)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
- reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
+ reagents_add = list("nutriment" = 0.1)
/obj/item/seeds/chanterelle/jupitercup/Initialize()
..()
- unset_mutability(/datum/plant_gene/reagent/liquidelectricity, PLANT_GENE_EXTRACTABLE)
+ unset_mutability(/datum/plant_gene/reagent/teslium, PLANT_GENE_EXTRACTABLE)
unset_mutability(/datum/plant_gene/trait/plant_type/carnivory, PLANT_GENE_REMOVABLE)
/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b1602677..53e94c73 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -153,12 +153,12 @@
/datum/plant_gene/reagent/polypyr
name = "Polypyrylium Oligomers"
- reagent_id = /datum/reagent/medicine/polypyr
+ reagent_id = "polypyrylium_oligomers"
rate = 0.15
-/datum/plant_gene/reagent/liquidelectricity
- name = "Liquid Electricity"
- reagent_id = "liquidelectricity"
+/datum/plant_gene/reagent/teslium
+ name = "Teslium"
+ reagent_id = "teslium"
rate = 0.1
// Various traits affecting the product.
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 0abb1cfa..6a9c4e79 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -37,6 +37,9 @@
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //yes, even both mining locker types
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
@@ -61,6 +64,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/survivalcapsule(src)
new /obj/item/assault_pod/mining(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //because you know you want it
/**********************Shuttle Computer**************************/
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index f8d8d263..e5682059 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -461,4 +461,8 @@
/datum/sprite_accessory/hair/longestalt
name = "Very Long with Fringe"
- icon_state = "hair_vlongfringe"
\ No newline at end of file
+ icon_state = "hair_vlongfringe"
+
+/datum/sprite_accessory/hair/quotey
+ name = "Tail Hair"
+ icon_state = "hair_tailhair"
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index cc0c0d74..89bce14f 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -112,6 +112,7 @@
return
adjustStaminaLoss(diff, updating, forced)
+
/** adjustOrganLoss
* inputs: slot (organ slot, like ORGAN_SLOT_HEART), amount (damage to be done), and maximum (currently an arbitrarily large number, can be set so as to limit damage)
* outputs:
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 82a241ef..7232944b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -702,7 +702,7 @@
else if(burndamage > 0)
status += LB.light_burn_msg
if(broken == 1)
- status = "broken"
+ status = "fractured"
if(status == "")
status = "OK"
var/no_damage
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index e938ee33..82238701 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -5,14 +5,12 @@
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
- inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
mutantliver = /obj/item/organ/liver/plasmaman
mutantstomach = /obj/item/organ/stomach/plasmaman
- dangerous_existence = 1 //So so much
- blacklisted = 1 //See above
burnmod = 1.5
heatmod = 1.5
breathid = "tox"
@@ -52,22 +50,80 @@
/datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, no_protection)
if(internal_fire)
no_protection = TRUE
- ..()
+ . = ..()
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ var/current_job = J.title
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
+ switch(current_job)
+ if("Chaplain")
+ O = new /datum/outfit/plasmaman/chaplain
+
+ if("Curator")
+ O = new /datum/outfit/plasmaman/curator
+
+ if("Janitor")
+ O = new /datum/outfit/plasmaman/janitor
+
+ if("Botanist")
+ O = new /datum/outfit/plasmaman/botany
+
+ if("Bartender", "Lawyer")
+ O = new /datum/outfit/plasmaman/bar
+
+ if("Cook")
+ O = new /datum/outfit/plasmaman/chef
+
+ if("Security Officer")
+ O = new /datum/outfit/plasmaman/security
+
+ if("Detective")
+ O = new /datum/outfit/plasmaman/detective
+
+ if("Warden")
+ O = new /datum/outfit/plasmaman/warden
+
+ if("Cargo Technician", "Quartermaster")
+ O = new /datum/outfit/plasmaman/cargo
+
+ if("Shaft Miner")
+ O = new /datum/outfit/plasmaman/mining
+
+ if("Medical Doctor")
+ O = new /datum/outfit/plasmaman/medical
+
+ if("Chemist")
+ O = new /datum/outfit/plasmaman/chemist
+
+ if("Geneticist")
+ O = new /datum/outfit/plasmaman/genetics
+
+ if("Roboticist")
+ O = new /datum/outfit/plasmaman/robotics
+
+ if("Virologist")
+ O = new /datum/outfit/plasmaman/viro
+
+ if("Scientist")
+ O = new /datum/outfit/plasmaman/science
+
+ if("Station Engineer")
+ O = new /datum/outfit/plasmaman/engineering
+
+ if("Atmospheric Technician")
+ O = new /datum/outfit/plasmaman/atmospherics
+
+ if("Mime")
+ O = new /datum/outfit/plasmaman/mime
+
+ if("Clown")
+ O = new /datum/outfit/plasmaman/clown
+
H.equipOutfit(O, visualsOnly)
H.internal = H.get_item_for_held_index(2)
H.update_internals_hud_icon(1)
return 0
-/datum/species/plasmaman/qualifies_for_rank(rank, list/features)
- if(rank in GLOB.security_positions)
- return 0
- if(rank == "Clown" || rank == "Mime")//No funny bussiness
- return 0
- return ..()
-
/datum/species/plasmaman/random_name(gender,unique,lastname)
if(unique)
return random_unique_plasmaman_name()
@@ -78,3 +134,18 @@
randname += " [lastname]"
return randname
+
+/datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
+ . = ..()
+ if(chem.type == /datum/reagent/consumable/milk)
+ if(chem.volume >= 6)
+ H.reagents.remove_reagent(chem.type, chem.volume - 5)
+ to_chat(H, "The excess milk is dripping off your bones!")
+ H.heal_bodypart_damage(1.5,0, 0)
+ H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
+ return TRUE
+
+ if(chem.type == /datum/reagent/toxin/bonehurtingjuice)
+ H.adjustBruteLoss(0.5, 0)
+ H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
+ return TRUE
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 91161175..60ba3cb7 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -79,7 +79,7 @@
-/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE)
+/mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE, knockdown_stamoverride, knockdown_stammax)
var/hit_percent = (100-blocked)/100
if(!effect || (hit_percent <= 0))
return 0
@@ -87,7 +87,7 @@
if(EFFECT_STUN)
Stun(effect * hit_percent)
if(EFFECT_KNOCKDOWN)
- Knockdown(effect * hit_percent)
+ Knockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
if(EFFECT_UNCONSCIOUS)
Unconscious(effect * hit_percent)
if(EFFECT_IRRADIATE)
@@ -107,13 +107,13 @@
return 1
-/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0)
+/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax)
if(blocked >= 100)
return 0
if(stun)
apply_effect(stun, EFFECT_STUN, blocked)
if(knockdown)
- apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked)
+ apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked, kd_stamoverride, kd_stammax)
if(unconscious)
apply_effect(unconscious, EFFECT_UNCONSCIOUS, blocked)
if(irradiate)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index d7d1e27b..5be545a0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -919,7 +919,7 @@
var/blocked = getarmor(null, "rad")
if(amount > RAD_BURN_THRESHOLD)
- apply_damage((amount-RAD_BURN_THRESHOLD)/RAD_BURN_THRESHOLD, BURN, null, blocked)
+ apply_damage(log(amount)*2, BURN, null, blocked)
apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), EFFECT_IRRADIATE, blocked)
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 9336a77c..e36b946c 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -49,7 +49,7 @@
else
padloc = "(UNKNOWN)"
src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]")
- send_speech(message, 7, T, "robot", language = language)
+ send_speech(message, 7, T, "robot", message_language = language)
to_chat(src, "Holopad transmitted, [real_name] \"[message]\"")
else
to_chat(src, "No holopad connected.")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index b29749fc..abf6bfc9 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -237,6 +237,7 @@
R.hud_used.update_robot_modules_display()
SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.module)
+/* //Broken
/obj/item/robot_module/standard
name = "Standard"
basic_modules = list(
@@ -250,6 +251,7 @@
/obj/item/stack/rods/cyborg,
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/extinguisher,
+ /obj/item/borg/apparatus/beaker/service,
/obj/item/pickaxe,
/obj/item/t_scanner/adv_mining_scanner,
/obj/item/restraints/handcuffs/cable/zipties,
@@ -262,6 +264,7 @@
/obj/item/clockwork/replica_fabricator/cyborg)
moduleselect_icon = "standard"
hat_offset = -3
+*/
/obj/item/robot_module/medical
name = "Medical"
@@ -269,6 +272,7 @@
/obj/item/assembly/flash/cyborg,
/obj/item/healthanalyzer,
/obj/item/reagent_containers/borghypo,
+ /obj/item/borg/apparatus/beaker,
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/syringe,
@@ -280,6 +284,8 @@
/obj/item/scalpel,
/obj/item/circular_saw,
/obj/item/extinguisher/mini,
+ /obj/item/soap/nanotrasen,
+ /obj/item/crowbar/cyborg,
/obj/item/roller/robo,
/obj/item/borg/cyborghug/medical,
/obj/item/stack/medical/gauze/cyborg,
@@ -311,8 +317,11 @@
/obj/item/multitool/cyborg,
/obj/item/t_scanner,
/obj/item/analyzer,
+ /obj/item/soap/nanotrasen,
+ /obj/item/borg/cyborghug,
/obj/item/geiger_counter/cyborg,
/obj/item/assembly/signaler/cyborg,
+ /obj/item/holosign_creator/atmos,
/obj/item/areaeditor/blueprints/cyborg,
/obj/item/electroadaptive_pseudocircuit,
/obj/item/stack/sheet/metal/cyborg,
@@ -335,9 +344,15 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/restraints/handcuffs/cable/zipties,
+ /obj/item/holosign_creator/security,
/obj/item/melee/baton/loaded,
/obj/item/gun/energy/disabler/cyborg,
+ /obj/item/reagent_containers/spray/pepper,
/obj/item/clothing/mask/gas/sechailer/cyborg,
+ /obj/item/extinguisher/mini,
+ /obj/item/borg/cyborghug,
+ /obj/item/soap/nanotrasen,
+ /obj/item/crowbar/cyborg,
/obj/item/pinpointer/crew)
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
@@ -361,7 +376,9 @@
/obj/item/reagent_containers/borghypo/peace,
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
- /obj/item/extinguisher,
+ /obj/item/soap/nanotrasen,
+ /obj/item/extinguisher/mini,
+ /obj/item/crowbar/cyborg,
/obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
ratvar_modules = list(
@@ -386,6 +403,7 @@
/obj/item/stack/tile/plasteel/cyborg,
/obj/item/soap/nanotrasen,
/obj/item/storage/bag/trash/cyborg,
+ /obj/item/borg/cyborghug,
/obj/item/extinguisher/mini,
/obj/item/mop/cyborg,
/obj/item/lightreplacer/cyborg,
@@ -434,15 +452,19 @@
/obj/item/bikehorn,
/obj/item/bikehorn/airhorn,
/obj/item/paint/anycolor,
- /obj/item/soap/nanotrasen,
+ /obj/item/cookiesynth,
/obj/item/pneumatic_cannon/pie/selfcharge/cyborg,
/obj/item/razor, //killbait material
/obj/item/lipstick/purple,
+ /obj/item/soap/nanotrasen,
/obj/item/reagent_containers/spray/waterflower/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
/obj/item/borg/lollipop/clown,
/obj/item/picket_sign/cyborg,
+ /obj/item/reagent_containers/borghypo/borgshaker,
/obj/item/reagent_containers/borghypo/clown,
+ /obj/item/borg/apparatus/beaker/service,
+ /obj/item/reagent_containers/glass/beaker/large,
/obj/item/extinguisher/mini)
emag_modules = list(
/obj/item/reagent_containers/borghypo/clown/hacked,
@@ -459,16 +481,20 @@
name = "Service"
basic_modules = list(
/obj/item/assembly/flash/cyborg,
- /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/glass/beaker/large,
+ /obj/item/borg/apparatus/beaker/service,
/obj/item/reagent_containers/food/condiment/enzyme,
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
/obj/item/extinguisher/mini,
/obj/item/hand_labeler/borg,
/obj/item/razor,
+ /obj/item/crowbar/cyborg,
/obj/item/instrument/violin,
+ /obj/item/soap/nanotrasen,
/obj/item/instrument/guitar,
/obj/item/rsf/cyborg,
+ /obj/item/borg/cyborghug,
/obj/item/reagent_containers/dropper,
/obj/item/lighter,
/obj/item/storage/bag/tray,
@@ -497,6 +523,8 @@
/obj/item/shovel,
/obj/item/crowbar/cyborg,
/obj/item/weldingtool/mini,
+ /obj/item/borg/cyborghug,
+ /obj/item/soap/nanotrasen,
/obj/item/extinguisher/mini,
/obj/item/storage/bag/sheetsnatcher/borg,
/obj/item/t_scanner/adv_mining_scanner,
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 9db21f13..6a1cea8e 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -208,6 +208,7 @@
throwforce = 10
created_name = "Floorbot"
var/toolbox = /obj/item/storage/toolbox/mechanical
+ var/toolbox_color = "" //Blank for blue, r for red, y for yellow, etc.
/obj/item/bot_assembly/floorbot/Initialize()
. = ..()
@@ -219,25 +220,45 @@
if(ASSEMBLY_FIRST_STEP)
desc = initial(desc)
name = initial(name)
- icon_state = initial(icon_state)
+ icon_state = "[toolbox_color]toolbox_tiles"
if(ASSEMBLY_SECOND_STEP)
desc = "It's a toolbox with tiles sticking out the top and a sensor attached."
name = "incomplete floorbot assembly"
- icon_state = "toolbox_tiles_sensor"
+ icon_state = "[toolbox_color]toolbox_tiles_sensor"
+
+/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
+ var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots
+ /obj/item/storage/toolbox/electrical,
+ /obj/item/storage/toolbox/mechanical,
+ /obj/item/storage/toolbox/artistic,
+ /obj/item/storage/toolbox/syndicate)
-/obj/item/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
if(!istype(T, /obj/item/stack/tile/plasteel))
..()
return
+ if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox))
+ return
if(contents.len >= 1)
to_chat(user, "They won't fit in, as there is already stuff inside!")
return
if(T.use(10))
var/obj/item/bot_assembly/floorbot/B = new
B.toolbox = type
+ switch(B.toolbox)
+ if(/obj/item/storage/toolbox)
+ B.toolbox_color = "r"
+ if(/obj/item/storage/toolbox/emergency)
+ B.toolbox_color = "r"
+ if(/obj/item/storage/toolbox/electrical)
+ B.toolbox_color = "y"
+ if(/obj/item/storage/toolbox/artistic)
+ B.toolbox_color = "g"
+ if(/obj/item/storage/toolbox/syndicate)
+ B.toolbox_color = "s"
user.put_in_hands(B)
- to_chat(user, "You add the tiles into the empty [src.name]. They protrude from the top.")
+ B.update_icon()
+ to_chat(user, "You add the tiles into the empty [name]. They protrude from the top.")
qdel(src)
else
to_chat(user, "You need 10 floor tiles to start building a floorbot!")
@@ -259,7 +280,7 @@
if(istype(W, /obj/item/bodypart/l_arm/robot) || istype(W, /obj/item/bodypart/r_arm/robot))
if(!can_finish_build(W, user))
return
- var/mob/living/simple_animal/bot/floorbot/A = new(drop_location())
+ var/mob/living/simple_animal/bot/floorbot/A = new(drop_location(), toolbox_color)
A.name = created_name
A.robot_arm = W.type
A.toolbox = toolbox
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 4709680a..c1a21b66 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -32,6 +32,7 @@
var/turf/target
var/oldloc = null
var/toolbox = /obj/item/storage/toolbox/mechanical
+ var/toolbox_color = ""
#define HULL_BREACH 1
#define LINE_SPACE_MODE 2
@@ -41,12 +42,16 @@
#define REPLACE_TILE 6
#define TILE_EMAG 7
-/mob/living/simple_animal/bot/floorbot/Initialize()
+/mob/living/simple_animal/bot/floorbot/Initialize(mapload, new_toolbox_color)
. = ..()
+ toolbox_color = new_toolbox_color
update_icon()
var/datum/job/engineer/J = new/datum/job/engineer
access_card.access += J.get_access()
prev_access = access_card.access
+ if(toolbox_color == "s")
+ health = 100
+ maxHealth = 100
/mob/living/simple_animal/bot/floorbot/turn_on()
. = ..()
@@ -312,7 +317,7 @@
return
if(isspaceturf(target_turf)) //If we are fixing an area not part of pure space, it is
anchored = TRUE
- icon_state = "floorbot-c"
+ icon_state = "[toolbox_color]floorbot-c"
visible_message("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] ")
mode = BOT_REPAIRING
sleep(50)
@@ -327,7 +332,7 @@
if(F.type != initial(tiletype.turf_type) && (F.broken || F.burnt || isplatingturf(F)) || F.type == (initial(tiletype.turf_type) && (F.broken || F.burnt)))
anchored = TRUE
- icon_state = "floorbot-c"
+ icon_state = "[toolbox_color]floorbot-c"
mode = BOT_REPAIRING
visible_message("[src] begins repairing the floor.")
sleep(50)
@@ -338,7 +343,7 @@
if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F))
anchored = TRUE
- icon_state = "floorbot-c"
+ icon_state = "[toolbox_color]floorbot-c"
mode = BOT_REPAIRING
visible_message("[src] begins replacing the floor tiles.")
sleep(50)
@@ -355,7 +360,7 @@
target = null
/mob/living/simple_animal/bot/floorbot/update_icon()
- icon_state = "floorbot[on]"
+ icon_state = "[toolbox_color]floorbot[on]"
/mob/living/simple_animal/bot/floorbot/explode()
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index b6e87c8a..3299c220 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -20,7 +20,7 @@
name = "hybrid taser"
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
icon_state = "advtaser"
- ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 2
/obj/item/gun/energy/e_gun/advtaser/cyborg
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 78e416fb..3cf287d1 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -88,6 +88,8 @@
//Effects
var/stun = 0
var/knockdown = 0
+ var/knockdown_stamoverride
+ var/knockdown_stam_max
var/unconscious = 0
var/irradiate = 0
var/stutter = 0
@@ -202,7 +204,7 @@
else
L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange")
- return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
+ return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter, knockdown_stamoverride, knockdown_stam_max)
/obj/item/projectile/proc/vol_by_damage()
if(src.damage)
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
index e3b46d92..27835605 100644
--- a/code/modules/projectiles/projectile/energy/stun.dm
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -3,7 +3,9 @@
icon_state = "spark"
color = "#FFFF00"
nodamage = 1
- knockdown = 100
+ knockdown = 60
+ knockdown_stamoverride = 36
+ knockdown_stam_max = 50
stutter = 5
jitter = 20
hitsound = 'sound/weapons/taserhit.ogg'
@@ -11,6 +13,7 @@
tracer_type = /obj/effect/projectile/tracer/stun
muzzle_type = /obj/effect/projectile/muzzle/stun
impact_type = /obj/effect/projectile/impact/stun
+ var/tase_duration = 50
/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
. = ..()
@@ -23,6 +26,7 @@
if(C.dna && C.dna.check_mutation(HULK))
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE))
+ C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration)
addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 3ec90e2d..aa8faa5f 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1421,6 +1421,7 @@
/datum/reagent/medicine/silibinin
name = "Silibinin"
+ id = "silibinin"
description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver."
reagent_state = SOLID
color = "#FFFFD0"
@@ -1433,6 +1434,7 @@
/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems.
name = "Polypyrylium Oligomers"
+ id = "polypyrylium_oligomers"
description = "A?purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
reagent_state = SOLID
color = "#9423FF"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 69f9a801..2fb1c421 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -903,6 +903,7 @@
/datum/reagent/toxin/bungotoxin
name = "Bungotoxin"
+ id = "bungotoxin"
description = "A horrible cardiotoxin that protects the humble bungo pit."
silent_toxin = TRUE
color = "#EBFF8E"
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index e8c8bab0..841a8897 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -704,7 +704,7 @@
materials = list(MAT_METAL=15000, MAT_GLASS=15000, MAT_SILVER=10000, MAT_GOLD=10000, MAT_TITANIUM=5000, MAT_DIAMOND=5000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
-
+
/datum/design/borg_upgrade_surgicalprocessor
name = "Cyborg Upgrade (Surgical Processor)"
id = "borg_upgrade_surgicalprocessor"
@@ -759,6 +759,15 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_circuit_app
+ name = "Cyborg Upgrade (Circuit Manipulator)"
+ id = "borg_upgrade_circuitapp"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/circuit_app
+ materials = list(MAT_METAL=2000, MAT_TITANIUM=500)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
/datum/design/borg_upgrade_pinpointer
name = "Cyborg Upgrade (Crew pinpointer)"
id = "borg_upgrade_pinpointer"
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 7c6d8e08..da8efcab 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -83,6 +83,7 @@
/obj/item/bodypart/blob_act()
take_damage(max_damage)
+
/obj/item/bodypart/Destroy()
if(owner)
owner.bodyparts -= src
diff --git a/code/modules/surgery/bodyparts/broken.dm b/code/modules/surgery/bodyparts/broken.dm
new file mode 100644
index 00000000..a29bbf19
--- /dev/null
+++ b/code/modules/surgery/bodyparts/broken.dm
@@ -0,0 +1,11 @@
+/obj/item/bodypart/proc/break_bone(dam_type = BRUTE)
+ if(!owner)
+ return FALSE
+ var/mob/living/carbon/C = owner
+ if(!dismemberable)
+ return FALSE
+ if(broken == 0) //Its not broken.
+ C.visible_message("[C]'s [src.name] contorts in an unnatural way!")
+ C.emote("scream")
+ broken = 1
+ disabled = 1
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 4e2b81dc..32d790d8 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -358,6 +358,7 @@
L.burn_dam = 0
L.brutestate = 0
L.burnstate = 0
+ L.broken = 0
L.attach_limb(src, 1)
return 1
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 08ed6552..5076744a 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -123,6 +123,7 @@
products = list(/obj/item/clothing/glasses/hud/diagnostic = 3,
/obj/item/clothing/under/rank/roboticist = 3,
/obj/item/clothing/under/rank/roboticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
@@ -255,6 +256,7 @@
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/janitor = 2,
/obj/item/clothing/under/rank/janitor/skirt = 2,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 3,
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
@@ -334,6 +336,7 @@
vend_reply = "Thank you for using the ChemDrobe!"
products = list(/obj/item/clothing/under/rank/chemist = 3,
/obj/item/clothing/under/rank/chemist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/chemist = 3,
/obj/item/storage/backpack/chemistry = 3,
@@ -353,6 +356,7 @@
vend_reply = "Thank you for using the GeneDrobe!"
products = list(/obj/item/clothing/under/rank/geneticist = 3,
/obj/item/clothing/under/rank/geneticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/genetics = 3,
/obj/item/storage/backpack/genetics = 3,
@@ -370,6 +374,7 @@
vend_reply = "Thank you for using the ViroDrobe"
products = list(/obj/item/clothing/under/rank/virologist = 3,
/obj/item/clothing/under/rank/virologist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/virologist = 3,
/obj/item/clothing/mask/surgical = 3,
diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi
index 3dd431a2..bc3e3a85 100644
Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index db7a7f20..008e6f33 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 59de8600..9ccd2c8c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 97aeea4e..fb800d7d 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi
index 862e1be3..a3b6237b 100644
Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 6c917354..d1bb4107 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi
index 19f2d446..c85d9cef 100644
Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 43d35d5d..572616f8 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index c2097310..b2b28375 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 36904be1..4d675882 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 25c9b0eb..354c274a 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/station2/glass.dmi
index e10efd42..d4740997 100644
Binary files a/icons/obj/doors/airlocks/station2/glass.dmi and b/icons/obj/doors/airlocks/station2/glass.dmi differ
diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/station2/overlays.dmi
index 4cb389cb..1cf94b2e 100644
Binary files a/icons/obj/doors/airlocks/station2/overlays.dmi and b/icons/obj/doors/airlocks/station2/overlays.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index a8e6b20e..ce3e0ada 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index ac2d4237..7fa9f24a 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/interface/menu.dm b/interface/menu.dm
index 224d933f..66d88ef4 100644
--- a/interface/menu.dm
+++ b/interface/menu.dm
@@ -78,10 +78,10 @@ GLOBAL_LIST_EMPTY(menulist)
/datum/verbs/menu/Settings/FPS
checkbox = CHECKBOX_GROUP
- default = /datum/verbs/menu/Settings/FPS/verb/high
+ default = /datum/verbs/menu/Settings/FPS/verb/twentyfiveframes
-/datum/verbs/menu/Settings/FPS/verb/low()
- set name = "Low-end FPS"
+/datum/verbs/menu/Settings/FPS/verb/twentyframes()
+ set name = "Low-End (20) FPS"
set desc = "&20 fps"
set category = "Preferences"
set hidden = 1
@@ -89,8 +89,8 @@ GLOBAL_LIST_EMPTY(menulist)
usr.client.prefs.parent.fps = 20
-/datum/verbs/menu/Settings/FPS/verb/high()
- set name = "High-end FPS"
+/datum/verbs/menu/Settings/FPS/verb/twentyfiveframes()
+ set name = "High-End (25) FPS"
set desc = "&25 fps"
set category = "Preferences"
set hidden = 1
@@ -98,21 +98,37 @@ GLOBAL_LIST_EMPTY(menulist)
usr.client.prefs.parent.fps = 25
-/datum/verbs/menu/Settings/FPS/verb/vhigh()
- set name = "Higher-end FPS"
+/datum/verbs/menu/Settings/FPS/verb/thirtyframes()
+ set name = "Higher-End (30) FPS"
set desc = "&30 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 30
usr.client.prefs.parent.fps = 30
+/datum/verbs/menu/Settings/FPS/verb/fortyframes()
+ set name = "Very Higher-End (40) FPS"
+ set desc = "&40 fps"
+ set category = "Preferences"
+ set hidden = 1
+ usr.client.prefs.clientfps = 40
+ usr.client.prefs.parent.fps = 40
+
+
+/datum/verbs/menu/Settings/FPS/verb/sixtyframes()
+ set name = "Very Very Higher-End (60) FPS"
+ set desc = "&60 fps"
+ set category = "Preferences"
+ set hidden = 1
+ usr.client.prefs.clientfps = 60
+ usr.client.prefs.parent.fps = 60
/datum/verbs/menu/Settings/ChatOutput
checkbox = CHECKBOX_GROUP
default = /datum/verbs/menu/Settings/ChatOutput/verb/newchat
/datum/verbs/menu/Settings/ChatOutput/verb/oldchat()
- set name = "Old Chat"
+ set name = "Old BYONDChat"
set desc = "&Old Chat (Faster)"
set hidden = 1
set category = "Preferences"
@@ -120,7 +136,7 @@ GLOBAL_LIST_EMPTY(menulist)
winset(src, "browseroutput", "is-visible=false")
/datum/verbs/menu/Settings/ChatOutput/verb/newchat()
- set name = "Fancy Chat"
+ set name = "Fancy Goonchat"
set desc = "&Fancy Chat (Slower)"
set hidden = 1
set category = "Preferences"
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index 320a83b8..36053945 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -92,3 +92,8 @@
name = "Headphones"
category = SLOT_NECK
path = /obj/item/clothing/ears/headphones
+
+/datum/gear/polycloak
+ name = "Polychromic Cloak"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/cloak/polychromic
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index 43931db6..02b98bdb 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -18,9 +18,13 @@
return FALSE
return .
-/mob/living/carbon/proc/toggle_combat_mode()
+/mob/living/carbon/proc/toggle_combat_mode(forced)
if(recoveringstam)
return TRUE
+ if(!forced)
+ for(var/datum/status_effect/S in status_effects)
+ if(S.blocks_combatmode)
+ return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index a4c5af61..f34fde5d 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -154,9 +154,8 @@
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- liked_food = VEGETABLES | DAIRY| CLOTH
- disliked_food = FRUIT | GROSS
- toxic_food = MEAT | RAW
+ liked_food = VEGETABLES | DAIRY| CLOTH |FRUIT
+ toxic_food = GROSS | RAW | FRIED
/datum/species/insect/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
. = ..()
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index ac79ea7f..ed33041d 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -116,7 +116,7 @@
to_chat(src, "You're too exhausted to keep going...")
resting = TRUE
if(combatmode)
- toggle_combat_mode()
+ toggle_combat_mode(TRUE)
recoveringstam = TRUE
filters += CIT_FILTER_STAMINACRIT
update_canmove()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index a0dbe3a0..a038476e 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -37,6 +37,7 @@
/obj/item/clothing/mask/gas/sechailer/cyborg,
/obj/item/soap/tongue,
/obj/item/analyzer/nose,
+ /obj/item/holosign_creator/security,
/obj/item/dogborg/sleeper/K9,
/obj/item/gun/energy/disabler/cyborg,
/obj/item/pinpointer/crew)
@@ -88,9 +89,12 @@
/obj/item/healthanalyzer,
/obj/item/dogborg/sleeper/medihound,
/obj/item/roller/robo,
+ /obj/item/crowbar/cyborg,
+ /obj/item/borg/apparatus/beaker,
/obj/item/reagent_containers/borghypo,
/obj/item/twohanded/shockpaddles/cyborg/hound,
/obj/item/stack/medical/gauze/cyborg,
+ /obj/item/reagent_containers/syringe,
/obj/item/pinpointer/crew,
/obj/item/sensor_device)
emag_modules = list(/obj/item/dogborg/pounce)
@@ -132,9 +136,13 @@
basic_modules = list(
/obj/item/dogborg/jaws/small,
/obj/item/analyzer/nose,
+ /obj/item/crowbar/cyborg,
/obj/item/soap/tongue/scrubpup,
+ /obj/item/stack/tile/plasteel/cyborg,
+ /obj/item/storage/bag/trash/cyborg,
/obj/item/lightreplacer/cyborg,
/obj/item/extinguisher/mini,
+ /obj/item/holosign_creator,
/obj/item/dogborg/sleeper/compactor)
emag_modules = list(/obj/item/dogborg/pounce)
ratvar_modules = list(
@@ -168,7 +176,12 @@
/obj/item/storage/bag/borgdelivery,
/obj/item/analyzer/nose,
/obj/item/soap/tongue,
+ /obj/item/cookiesynth,
+ /obj/item/holosign_creator/cyborg,
+ /obj/item/crowbar/cyborg,
+ /obj/item/borg/projectile_dampen,
/obj/item/healthanalyzer,
+ /obj/item/reagent_containers/borghypo/peace,
/obj/item/extinguisher/mini,
/obj/item/borg/cyborghug)
emag_modules = list(/obj/item/dogborg/pounce)
@@ -210,7 +223,6 @@
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
cyborg_pixel_offset = -16
-
/obj/item/robot_module/miner/do_transform_animation()
var/mob/living/silicon/robot/R = loc
R.cut_overlays()
@@ -222,7 +234,7 @@
/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot", "BootyF", "BootyM", "BootyS", "Haydee")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -244,11 +256,27 @@
if("Heavy")
cyborg_base_icon = "heavymed"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootymedical"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootymedicalM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootymedicalS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("Haydee")
+ cyborg_base_icon = "haydeemedical"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/janitor/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/janimodels = list("Default", "Sleek", "Marina", "Can", "Heavy")
+ var/list/janimodels = list("Default", "Sleek", "Marina", "Can", "Heavy", "BootyF", "BootyM", "BootyS")
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in janimodels
if(!borg_icon)
return FALSE
@@ -267,11 +295,23 @@
if("Heavy")
cyborg_base_icon = "heavyres"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootyjanitor"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootyjanitorM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootyjanitorS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider", "BootyF", "BootyM", "BootyS")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -280,11 +320,23 @@
if("Spider")
cyborg_base_icon = "whitespider"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootypeace"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootypeaceM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootypeaceS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider", "BootyF", "BootyM", "BootyS")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -309,11 +361,23 @@
if("Heavy")
cyborg_base_icon = "heavysec"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootysecurity"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootysecurityM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootysecurityS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "BootyF", "BootyM", "BootyS")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -339,11 +403,23 @@
cyborg_base_icon = "heavyserv"
special_light_key = "heavyserv"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootyservice"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootyserviceM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootyserviceS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer")
+ var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "BootyF", "BootyM", "BootyS")
if(R.client && R.client.ckey in list("nezuli"))
engymodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
@@ -395,11 +471,23 @@
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
+ if("BootyF")
+ cyborg_base_icon = "bootyengineer"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootyengineerM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootyengineerS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid", "BootyF", "BootyM", "BootyS")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -427,4 +515,60 @@
if("Heavy")
cyborg_base_icon = "heavymin"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("BootyF")
+ cyborg_base_icon = "bootyminer"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootyminerM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootyminerS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ return ..()
+
+/obj/item/robot_module/standard/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Standard", "BootyF", "BootyM", "BootyS")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Standard")
+ cyborg_base_icon = "standard"
+ if("BootyF")
+ cyborg_base_icon = "bootystandard"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootystandardM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootystandardS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ return ..()
+
+/obj/item/robot_module/clown/be_transformed_to(obj/item/robot_module/old_module)
+ var/mob/living/silicon/robot/R = loc
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Standard", "BootyF", "BootyM", "BootyS")
+ if(!borg_icon)
+ return FALSE
+ switch(borg_icon)
+ if("Standard")
+ cyborg_base_icon = "clown"
+ if("BootyF")
+ cyborg_base_icon = "bootyclown"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyM")
+ cyborg_base_icon = "bootyclownM"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
+ if("BootyS")
+ cyborg_base_icon = "bootyclownS"
+ cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ hat_offset = 3
return ..()
diff --git a/modular_citadel/code/modules/projectiles/projectile/energy.dm b/modular_citadel/code/modules/projectiles/projectile/energy.dm
deleted file mode 100644
index a32f23f0..00000000
--- a/modular_citadel/code/modules/projectiles/projectile/energy.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/item/projectile/energy/electrode
- stamina = 36
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 9e009390..2a32276b 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -411,14 +411,14 @@
/datum/chemical_reaction/fermi/acidic_buffer//done test
name = "Acetic acid buffer"
id = "acidic_buffer"
- results = list("acidic_buffer" = 2) //acetic acid
- required_reagents = list("salglu_solution" = 0.2, "ethanol" = 0.6, "oxygen" = 0.6, "water" = 0.6)
+ results = list("acidic_buffer" = 10) //acetic acid
+ required_reagents = list("salglu_solution" = 1, "ethanol" = 3, "oxygen" = 3, "water" = 3)
//FermiChem vars:
OptimalTempMin = 250
OptimalTempMax = 500
ExplodeTemp = 9999 //check to see overflow doesn't happen!
- OptimalpHMin = 2
- OptimalpHMax = 6
+ OptimalpHMin = 0
+ OptimalpHMax = 14
ReactpHLim = 0
//CatalystFact = 0 //To do 1
CurveSharpT = 4
@@ -438,15 +438,15 @@
/datum/chemical_reaction/fermi/basic_buffer//done test
name = "Ethyl Ethanoate buffer"
id = "basic_buffer"
- results = list("basic_buffer" = 1.5)
- required_reagents = list("acidic_buffer" = 0.5, "ethanol" = 0.5, "water" = 0.5)
+ results = list("basic_buffer" = 5)
+ required_reagents = list("lye" = 1, "ethanol" = 2, "water" = 2)
required_catalysts = list("sacid" = 1) //vagely acetic
- //FermiChem vars:x
+ //FermiChem vars:
OptimalTempMin = 250
OptimalTempMax = 500
ExplodeTemp = 9999 //check to see overflow doesn't happen!
- OptimalpHMin = 5
- OptimalpHMax = 12
+ OptimalpHMin = 0
+ OptimalpHMax = 14
ReactpHLim = 0
//CatalystFact = 0 //To do 1
CurveSharpT = 4
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 1e12d2bf..0b195e55 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/robots.dmi b/modular_citadel/icons/mob/robots.dmi
index b47ee128..1489ae2a 100644
Binary files a/modular_citadel/icons/mob/robots.dmi and b/modular_citadel/icons/mob/robots.dmi differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index 74449c3f..74230c4c 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index d94aaf68..1679844e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -91,6 +91,7 @@
#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\sound.dm"
+#include "code\__DEFINES\spaceman_dmm.dm"
#include "code\__DEFINES\stat.dm"
#include "code\__DEFINES\stat_tracking.dm"
#include "code\__DEFINES\status_effects.dm"
@@ -1517,6 +1518,7 @@
#include "code\modules\clothing\neck\_neck.dm"
#include "code\modules\clothing\outfits\ert.dm"
#include "code\modules\clothing\outfits\event.dm"
+#include "code\modules\clothing\outfits\plasmaman.dm"
#include "code\modules\clothing\outfits\standard.dm"
#include "code\modules\clothing\outfits\vr.dm"
#include "code\modules\clothing\outfits\vv_outfit.dm"
@@ -1559,6 +1561,10 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\security.dm"
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
#include "code\modules\crafting\recipes.dm"
@@ -3060,7 +3066,6 @@
#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
-#include "modular_citadel\code\modules\projectiles\projectile\energy.dm"
#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm"