diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index 6e227b211a5..a5991c9bcb9 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -60,7 +60,7 @@ CREATE TABLE `characters` (
`eyes_blue` smallint(4) NOT NULL,
`underwear` mediumtext NOT NULL,
`undershirt` mediumtext NOT NULL,
- `backbag` smallint(4) NOT NULL,
+ `backbag` mediumtext NOT NULL,
`b_type` varchar(45) NOT NULL,
`alternate_option` smallint(4) NOT NULL,
`job_support_high` mediumint(8) NOT NULL,
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index a7ad598a143..845b8702fcd 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -60,7 +60,7 @@ CREATE TABLE `SS13_characters` (
`eyes_blue` smallint(4) NOT NULL,
`underwear` mediumtext NOT NULL,
`undershirt` mediumtext NOT NULL,
- `backbag` smallint(4) NOT NULL,
+ `backbag` mediumtext NOT NULL,
`b_type` varchar(45) NOT NULL,
`alternate_option` smallint(4) NOT NULL,
`job_support_high` mediumint(8) NOT NULL,
diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm
new file mode 100644
index 00000000000..e48faab9187
--- /dev/null
+++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm
@@ -0,0 +1,1512 @@
+"aa" = (/turf/unsimulated/wall{icon_state = "rock"; name = "rock"},/area/awaymission/UO71/outside)
+"ab" = (/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"ac" = (/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"ad" = (/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"ae" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"af" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"ag" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ah" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ai" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aj" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"ak" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"al" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"am" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"an" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"ao" = (/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"ap" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"aq" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ar" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"as" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"at" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"au" = (/obj/structure/stool/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"av" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aw" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"ax" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"ay" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"az" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aA" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/female,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/obj/item/weapon/gun/energy/laser/retro,/obj/item/weapon/paper/terrorspiders8,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aC" = (/obj/structure/table,/obj/machinery/computer/id_upgrader,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"aD" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aE" = (/obj/effect/spider/terrorweb,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aF" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aG" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aI" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aJ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aK" = (/obj/machinery/door/airlock{id_tag = "awaydormE1"; locked = 0; name = "Executive Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aL" = (/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aM" = (/obj/effect/spider/terrorweb,/obj/item/weapon/bedsheet,/obj/structure/stool/bed,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aN" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aO" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aP" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aR" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aS" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aT" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/item/weapon/lighter{pixel_x = 4; pixel_y = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "grimy"},/area/awaymission/UO71/plaza)
+"aU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"aV" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aW" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"aX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aY" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"aZ" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"ba" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Arrivals"; dir = 8; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bc" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bd" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"be" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bf" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bg" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"bi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"bm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"bn" = (/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bo" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bp" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/plaza)
+"bq" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"br" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bt" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bu" = (/obj/machinery/door/airlock{id_tag = "awaydormE2"; locked = 0; name = "Executive Dorm 2"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bw" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"by" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bG" = (/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"bH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"bM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"bS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/plaza)
+"bT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"bV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"bX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"bY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"bZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ca" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cb" = (/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"cc" = (/obj/structure/closet,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ce" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/pj/blue,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/female,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ch" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ci" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"ck" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/plaza)
+"co" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cr" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "awaydorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ct" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"cC" = (/obj/structure/grille,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cD" = (/obj/item/stack/rods,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/grille,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; locked = 0; name = "Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza)
+"cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/rods,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/plaza)
+"cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"cS" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"cT" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaymission/UO71/plaza)
+"cU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/plaza)
+"cV" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"cW" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"cX" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"cY" = (/obj/machinery/seed_extractor,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"cZ" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"da" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/plaza)
+"db" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"de" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"df" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"di" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dl" = (/obj/structure/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"do" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dp" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dq" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "271"},/obj/item/device/plant_analyzer,/obj/item/clothing/mask/bandana,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza)
+"ds" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/weapon/storage/belt/security,/obj/item/device/flash,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/stool/bed/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"du" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dv" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"dx" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dy" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"dA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"dC" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dE" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dF" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"dG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"dH" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "271"},/obj/item/clothing/suit/apron,/obj/item/clothing/mask/bandana,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Security Checkpoint Maintenance"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dM" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dN" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "redcorner"},/area/awaymission/UO71/plaza)
+"dO" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"dQ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dU" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"dV" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/computer/security{network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"dY" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"dZ" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ea" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"eb" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ec" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ed" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"ee" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"ef" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"eg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"eh" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"ei" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/folder/red,/obj/machinery/door/window/southleft{base_state = "left"; dir = 8; icon_state = "left"; name = "Security Checkpoint"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ej" = (/obj/structure/stool/bed/chair/office{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"ek" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"el" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "greencorner"},/area/awaymission/UO71/plaza)
+"em" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"en" = (/obj/structure/stool,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eo" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"ep" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eq" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"er" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"es" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"et" = (/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/plaza)
+"eu" = (/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "redcorner"},/area/awaymission/UO71/plaza)
+"ev" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"ew" = (/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaymission/UO71/plaza)
+"ex" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"ey" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"ez" = (/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eA" = (/obj/machinery/camera{c_tag = "Hydroponics"; dir = 1; network = list("UO71")},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "Hydroponics APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 5},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"eH" = (/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/plaza)
+"eI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/plaza)
+"eJ" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/plaza)
+"eK" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/plaza)
+"eN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"eO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/plaza)
+"eR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "awaydorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm3"; name = "Dorm 3"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eY" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"eZ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "greencorner"},/area/awaymission/UO71/plaza)
+"fa" = (/turf/simulated/wall/rust,/area/awaymission/UO71/outside)
+"fb" = (/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fc" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fd" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"fe" = (/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"ff" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"fi" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"fj" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/dresser,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"fk" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza)
+"fl" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Central Hallway"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"fm" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"fn" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"fo" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"fp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/plaza)
+"fq" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fr" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fs" = (/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"ft" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fw" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/plaza)
+"fx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fy" = (/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fD" = (/obj/structure/closet/crate{desc = "It's a storage unit for kitchen clothes and equipment."; name = "Kitchen Crate"},/obj/item/weapon/storage/box/mousetraps,/obj/item/clothing/under/waiter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fE" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fF" = (/obj/effect/decal/cleanable/dirt,/obj/item/stack/rods,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"fH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fI" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fK" = (/obj/machinery/door/airlock{name = "Kitchen Cold Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"},/area/awaymission/UO71/centralhall)
+"fL" = (/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"fM" = (/turf/simulated/wall/rust,/area/awaymission/UO71/gateway)
+"fN" = (/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"fO" = (/turf/simulated/wall,/area/awaymission/UO71/science)
+"fP" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"fQ" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"fR" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fT" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fU" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fV" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"fW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"fX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"fY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"fZ" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"ga" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"gb" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 16; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 23},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gc" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gd" = (/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ge" = (/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gf" = (/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gg" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gh" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"gj" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gk" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gl" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gm" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"gn" = (/obj/structure/table,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"go" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gp" = (/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gq" = (/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"gs" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/camera{c_tag = "Research Lab"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"gt" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/obj/item/robot_parts/l_leg,/obj/item/robot_parts/r_leg,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"gu" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"gv" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"gw" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"gx" = (/mob/living/simple_animal/hostile/poison/terror_spider/prince,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"gy" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"gz" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"gA" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gB" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gC" = (/obj/machinery/vending/snack,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gD" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gE" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gG" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gH" = (/obj/machinery/vending/boozeomat{req_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"gI" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gJ" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gK" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/applepie,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gL" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Kitchen"; dir = 8; network = list("UO71")},/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"gM" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gN" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gO" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"gP" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"gR" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/gateway)
+"gS" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"gT" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"gU" = (/mob/living/simple_animal/hostile/poison/terror_spider/mother,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"gV" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/science)
+"gW" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/science)
+"gX" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/science)
+"gY" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"gZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"ha" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"hb" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"hc" = (/obj/structure/table,/obj/item/trash/chips,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hd" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"he" = (/obj/structure/stool,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hf" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hg" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access_txt = "271"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hk" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hl" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"ho" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"hp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"hq" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"hr" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"hs" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"ht" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hu" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hv" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"hw" = (/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"hx" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"hy" = (/obj/machinery/computer/rdconsole/core{id = 3; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"hz" = (/obj/item/weapon/paper{info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them."; name = "Research Notes"; origin_tech = "combat=2;materials=2;engineering=2;biotech=2"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"hA" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"hB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"hC" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"hD" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"hE" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"hF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"hG" = (/obj/structure/table,/obj/item/trash/plate,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hH" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hI" = (/obj/structure/stool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hJ" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hK" = (/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"hL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hM" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hN" = (/obj/machinery/processor,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"hO" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hP" = (/obj/structure/window/reinforced,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/window{dir = 2; name = "Gateway Chamber"; req_access_txt = "271"},/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hR" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"hT" = (/obj/machinery/door/airlock{name = "Emergency Supplies"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"hU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hV" = (/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hW" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/vault,/area/awaymission/UO71/mother)
+"hX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"hY" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"hZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"ia" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warnwhitecorner"},/area/awaymission/UO71/science)
+"ib" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"ic" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/science)
+"id" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"ie" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0; welded = 1},/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"if" = (/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ig" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "weld"; on = 1; welded = 1},/obj/machinery/light/small,/turf/simulated/floor/vault,/area/awaymission/UO71/prince)
+"ih" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ii" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ij" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ik" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"il" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"im" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"in" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"io" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"ip" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"iq" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/gateway)
+"ir" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"is" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/item/stack/rods,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"it" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"iu" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"iv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"iw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"ix" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"iy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump,/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"iz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"iA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/awaymission/UO71/gateway)
+"iB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"iC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iE" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mother)
+"iF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"iG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"iH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"iI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iJ" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/prince)
+"iK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"iM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"iN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 2},/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"iO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"iP" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"iQ" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"iR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iT" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "271"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/centralhall)
+"iU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"iV" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/camera{c_tag = "Gateway Chamber"; dir = 4; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"iW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "weld"; on = 1; welded = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"iX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"iZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"ja" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"jb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"jc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"jd" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"je" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/camera{c_tag = "Gateway Ready Room"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"jf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"jg" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/UO71/mother)
+"jh" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mother)
+"ji" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/science)
+"jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"jk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"jl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/outside)
+"jm" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/awaymission/UO71/prince)
+"jn" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/prince)
+"jo" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jq" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jr" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"js" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jt" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "271"; req_one_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ju" = (/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("UO71")},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jv" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"jx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall)
+"jy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"jz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"jA" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"jB" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"jC" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/item/weapon/paper/terrorspiders1,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"jD" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"jE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"jF" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"jG" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/science)
+"jH" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mother)
+"jI" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/full/basic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"jJ" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"jK" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"jL" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 2"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/prince)
+"jM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jN" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall)
+"jO" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jP" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jQ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 1; locked = 0; name = "UO71 Bar APC"; pixel_x = 0; pixel_y = 25; req_access = null; start_charge = 100},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"jU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"jY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"jZ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Chamber"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"ka" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"kb" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaymission/UO71/gateway)
+"kc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"kd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"ke" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "\improper CONTAINMENT AREA"},/turf/simulated/wall,/area/awaymission/UO71/science)
+"kf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/UO71/science)
+"kg" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/UO71/science)
+"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"ki" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"kj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurple"},/area/awaymission/UO71/science)
+"kl" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"km" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/science)
+"kn" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "\improper CONTAINMENT AREA"},/turf/simulated/wall/r_wall,/area/awaymission/UO71/science)
+"ko" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/paper/terrorspiders5,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/awaymission/UO71/science)
+"kp" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/area/awaymission/UO71/science)
+"kq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"kr" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ks" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ku" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"kx" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"ky" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"kz" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"kA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/obj/machinery/door/airlock/research{name = "Gateway Observation"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/gateway)
+"kB" = (/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"kC" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"kD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"kE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warning"},/area/awaymission/UO71/gateway)
+"kF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"kG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"kH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"kI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kM" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kQ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"kS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"kT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"kU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"kV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"kW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kX" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"kZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"la" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"lb" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"lc" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"ld" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitepurple"},/area/awaymission/UO71/science)
+"le" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_biohazard"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/science)
+"lf" = (/obj/structure/sink{pixel_y = 25},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"lg" = (/obj/machinery/shower{pixel_y = 15},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"lh" = (/obj/structure/sink{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"li" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/structure/sign/science{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "purplecorner"; tag = "icon-purplecorner (WEST)"},/area/awaymission/UO71/centralhall)
+"lj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"lk" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ll" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"lm" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ln" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lp" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ls" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"lt" = (/turf/simulated/wall/r_wall,/area/awaymission/UO71/eng)
+"lu" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/structure/sign/nosmoking_2{pixel_x = -32},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"lv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"lw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"lx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"ly" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"lz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"lA" = (/obj/structure/table,/obj/item/weapon/pickaxe,/obj/item/device/radio/off,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/gun/energy/kinetic_accelerator,/obj/item/borg/upgrade/modkit/damage,/obj/item/borg/upgrade/modkit/chassis_mod/orange,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"lB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"lC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"lE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Research Division West"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/mob/living/simple_animal/hostile/poison/terror_spider/red{ai_ventcrawls = 0; wander = 0},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lJ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lN" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Research Division APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; icon_state = "weld"; on = 1; pressure_checks = 1; welded = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/gateway)
+"lP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"lQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lS" = (/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lT" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Research Division East"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lU" = (/obj/structure/sign/directions/medical{pixel_y = -12},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"lV" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"lW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "purple"; tag = "icon-purple (WEST)"},/area/awaymission/UO71/centralhall)
+"lX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"lY" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"lZ" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"ma" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"mb" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaymission/UO71/centralhall)
+"mc" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"md" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/plasma{amount = 26},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"me" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 2; network = list("UO71")},/obj/item/weapon/rcd/combat,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"mf" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plating{dir = 8; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/eng)
+"mg" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/gateway)
+"mh" = (/obj/effect/spider/cocoon{contents = newlist(/obj/effect/decal/remains/human); icon_state = "cocoon_large1"},/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"mi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+"mj" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"mk" = (/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"ml" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/gateway)
+"mm" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (WEST)"},/area/awaymission/UO71/gateway)
+"mn" = (/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"mo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"mp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"mq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/command{name = "Research Director's Office"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mr" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"ms" = (/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaymission/UO71/science)
+"mt" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"mu" = (/obj/structure/closet/firecloset,/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"mv" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaymission/UO71/science)
+"mw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "purplecorner"; tag = "icon-purplecorner (NORTH)"},/area/awaymission/UO71/centralhall)
+"mx" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"my" = (/obj/structure/table,/obj/item/weapon/newspaper,/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"mz" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mA" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mB" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/obj/item/weapon/reagent_containers/food/pill/haloperidol,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mC" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/obj/item/weapon/paper/terrorspiders4,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mD" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/pj/red,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mE" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"mF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"mG" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO71_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "271"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"mH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"mI" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mJ" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"mL" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Gateway APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 100},/obj/machinery/light/small,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/gun/energy/laser/awaymission_aeg,/obj/item/weapon/gun/energy/laser/awaymission_aeg,/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mM" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mN" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mO" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/gateway)
+"mP" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"mQ" = (/obj/structure/table,/obj/item/weapon/paper/terrorspiders6,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"mR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"mS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"mT" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/suit/storage/labcoat/science,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mV" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mX" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mY" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"mZ" = (/obj/structure/table,/obj/machinery/newscaster{pixel_x = -30},/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"na" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -6; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"nb" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"nc" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nd" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ne" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "awaydorm5"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nf" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ng" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ni" = (/obj/machinery/atmospherics/unary/vent_pump{icon_state = "weld"; on = 1; welded = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nj" = (/obj/machinery/door_control{id = "awaydorm7"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nk" = (/obj/machinery/vending/cola,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nl" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nm" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nn" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"no" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"np" = (/turf/simulated/wall,/area/awaymission/UO71/eng)
+"nq" = (/obj/machinery/door/poddoor{id_tag = "UO71_Secure Storage"; name = "secure storage"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"nr" = (/turf/simulated/wall/r_wall/rust,/area/awaymission/UO71/eng)
+"ns" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"nt" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"nu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nv" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nw" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/paper{info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them."; name = "Research Notes"; origin_tech = "combat=2;materials=2;engineering=2;biotech=2"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"ny" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"nz" = (/obj/machinery/computer/security{network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"nA" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nB" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 8; name = "research monitor"; network = list("UO71")},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"nC" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"nF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"nH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nJ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"nK" = (/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/centralhall)
+"nL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 5"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm7"; name = "Dorm 7"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nN" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"nQ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"nT" = (/turf/simulated/wall/rust,/area/awaymission/UO71/eng)
+"nU" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners"},/area/awaymission/UO71/eng)
+"nV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark"},/area/awaymission/UO71/eng)
+"nW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (NORTH)"},/area/awaymission/UO71/eng)
+"nX" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"nY" = (/obj/machinery/door/window/southleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Chem Testing"; req_access_txt = "271"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"nZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/pill/charcoal,/obj/item/weapon/reagent_containers/food/pill/charcoal,/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"oa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"ob" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/laser_pointer,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oc" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"od" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"of" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; dir = 2; name = "research monitor"; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"og" = (/obj/machinery/light/small{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oh" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"oi" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"oj" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"ok" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/science)
+"ol" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/science)
+"om" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"on" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oo" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"op" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"or" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"os" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/camera{c_tag = "Dormitories"; dir = 2; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ot" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ou" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ov" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"ow" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ox" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"oA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/mob/living/simple_animal/hostile/poison/terror_spider/gray,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"oB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"oC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"oD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"oE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"oF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-y (WEST)"; icon_state = "pipe-y"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"oG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/eng)
+"oH" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006; input_level = 10000; inputting = 0; output_level = 25000; outputting = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"oI" = (/obj/structure/cable,/obj/machinery/power/smes{charge = 5e+006; input_level = 30000; inputting = 0; output_level = 25000; outputting = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"oJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (WEST)"},/area/awaymission/UO71/eng)
+"oK" = (/mob/living/carbon/human/monkey{name = "George the lab monkey"; toxloss = 193},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"oL" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/turf/simulated/floor/engine,/area/awaymission/UO71/science)
+"oM" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"oN" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"oO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"oP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"oQ" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oR" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = 8; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oS" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oU" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"oV" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"oW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO71_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"oX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/science)
+"oY" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"oZ" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pc" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"ph" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"pl" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"po" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (EAST)"},/area/awaymission/UO71/eng)
+"pq" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"pr" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/item/weapon/wrench,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ps" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"pt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (WEST)"},/area/awaymission/UO71/eng)
+"pu" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pv" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "UO71_air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"px" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/science)
+"py" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pz" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/science)
+"pB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/wall,/area/awaymission/UO71/science)
+"pC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"pD" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pE" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"pF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"pG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm4"; name = "Dorm 4"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm6"; name = "Dorm 6"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pI" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"pJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"pK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"pL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (WEST)"},/area/awaymission/UO71/eng)
+"pM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/eng)
+"pN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warndark"; tag = "icon-warndark (NORTH)"},/area/awaymission/UO71/eng)
+"pO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "warndarkcorners"; tag = "icon-warndarkcorners (EAST)"},/area/awaymission/UO71/eng)
+"pP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "UO71_air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pQ" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 2; frequency = 1443; id = "UO71_air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/awaymission/UO71/eng)
+"pR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"pS" = (/obj/machinery/door/airlock/command{name = "Server Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"pT" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/loot)
+"pU" = (/obj/machinery/door/poddoor{id_tag = "UO71_SciStorage"; name = "SciStorage Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/loot)
+"pV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"pW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"pX" = (/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"pY" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Storage"; req_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"pZ" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/medical)
+"qa" = (/turf/simulated/wall,/area/awaymission/UO71/medical)
+"qb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaymission/UO71/centralhall)
+"qc" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"qd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"qe" = (/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaymission/UO71/centralhall)
+"qf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm4"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"qi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/door_control{id = "awaydorm6"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qk" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"ql" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qm" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qn" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qo" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/centralhall)
+"qp" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"qq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass_engineering{name = "SMES Room"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/eng)
+"qr" = (/obj/machinery/meter{frequency = 1443; id = "UO71_mair_out_meter"; layer = 3.3; name = "Mixed Air Tank Out"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"qs" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "UO71_mair_in_meter"; layer = 3.3; name = "Mixed Air Tank In"},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"qt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"qu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"qv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"qw" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"qx" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"qy" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"qz" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/obj/machinery/light/small{dir = 4},/obj/item/borg/upgrade/vtec,/obj/item/weapon/stock_parts/cell/bluespace,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"qA" = (/obj/structure/table,/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/hand_labeler,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"qB" = (/obj/machinery/vending/medical{req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"qC" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"qD" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"qE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/centralhall)
+"qF" = (/obj/machinery/door/poddoor{id_tag = "UO71_Bridge"; name = "Bridge Lockdown Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qG" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qH" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qI" = (/obj/machinery/light/small{dir = 8},/obj/structure/dresser,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qJ" = (/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qK" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qL" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"qM" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"qN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/eng)
+"qO" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/eng)
+"qP" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"qS" = (/obj/structure/closet/secure_closet{icon_broken = "secureengbroken"; icon_closed = "secureeng"; icon_locked = "secureeng1"; icon_off = "secureengoff"; icon_opened = "secureengopen"; icon_state = "secureeng1"; locked = 1; name = "engineer's locker"; req_access_txt = "271"},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qT" = (/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/structure/closet/secure_closet/engineering_personal{req_access = list(201)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"qU" = (/obj/machinery/camera{c_tag = "Atmospherics"; dir = 2; network = list("UO71")},/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/item/device/multitool,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/eng)
+"qV" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "UO71_air_in"; name = "Mixed Air Supply Control"; output_tag = "UO71_air_out"; pressure_setting = 2000; sensors = list("UO71_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "arrival"; tag = "icon-arrival (NORTHWEST)"},/area/awaymission/UO71/eng)
+"qW" = (/obj/machinery/atmospherics/trinary/mixer{dir = 1; node1_concentration = 0.8; node2_concentration = 0.2; on = 1; pixel_x = 0; pixel_y = 0; req_access = null; target_pressure = 4500},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaymission/UO71/eng)
+"qX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"qY" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"qZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"ra" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/server/core{id_with_download_string = "3"; id_with_upload_string = "3"; req_access = null},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rb" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rc" = (/obj/machinery/door/airlock/glass_command{name = "Server Room"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"rd" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"re" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"rf" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/gateway)
+"rg" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"rh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/wall,/area/awaymission/UO71/medical)
+"ri" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rj" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"rl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"rm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"rn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"ro" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"rp" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"rq" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/item/weapon/pen,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"rr" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"rs" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"rt" = (/obj/machinery/light/small{dir = 1},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"ru" = (/obj/machinery/door/airlock{name = "Unit 2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"rv" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"rw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"rx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"ry" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/centralhall)
+"rz" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/eng)
+"rA" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rB" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rC" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"rD" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"rE" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/newscaster{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"rF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"rG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"rH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 8; locked = 1; name = "UO71 Engineering APC"; pixel_x = -25; pixel_y = 0; req_access = list(201); start_charge = 100},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6; level = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rJ" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air to Distro"; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rK" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"rM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rN" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"rO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"rP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/science)
+"rQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaymission/UO71/science)
+"rR" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"rS" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaymission/UO71/science)
+"rT" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"rU" = (/obj/mecha/medical/odysseus,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaymission/UO71/loot)
+"rV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"rX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"rY" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"rZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/science)
+"sa" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"sb" = (/obj/structure/table,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"sc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/science)
+"sd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"se" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/bridge)
+"sf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"sg" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sh" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"si" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/machinery/camera{c_tag = "Engineering Hallway"; dir = 4; network = list("UO71")},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"sj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"sk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"sl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"so" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellowcorner"},/area/awaymission/UO71/centralhall)
+"sq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"sr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"ss" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"st" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"su" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"sx" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO71_EngineeringOffice"; name = "Privacy Shutters"},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"sz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"sB" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; layer = 2.9; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sC" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"sD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/meter{frequency = 1443; id = "UO71_dloop_atm_meter"; name = "Distribution Loop"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sE" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sF" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Distro"; on = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sG" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sH" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"sJ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/eng)
+"sK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter{layer = 3.3},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"sL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"sM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"sN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/loot)
+"sO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 8; locked = 1; name = "UO71 Medical APC"; pixel_x = -25; pixel_y = 0; req_access = list(201); start_charge = 100},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sP" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"sQ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"sR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"sS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"sT" = (/mob/living/simple_animal/hostile/poison/terror_spider/purple,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"sU" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sV" = (/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sW" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"sX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"sY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"sZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"ta" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"tb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "cautioncorner"},/area/awaymission/UO71/centralhall)
+"tc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"td" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/centralhall)
+"te" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Reception"; req_access_txt = "0"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"th" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"ti" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id_tag = "UO71_EngineeringOffice"; name = "Privacy Shutters"},/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"tk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"tm" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Waste In"; on = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"tn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"to" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tp" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tq" = (/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Mix to Filter"; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tr" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 6; initialize_directions = 6},/obj/item/weapon/paper/terrorspiders7,/obj/effect/gibspawner,/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ts" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tt" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tu" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tv" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_waste_in"; name = "Gas Mix Tank Control"; output_tag = "UO71_waste_out"; sensors = list("UO71_waste_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "green"},/area/awaymission/UO71/eng)
+"tw" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"tx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "UO71_waste_in"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"ty" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/awaymission/UO71/eng)
+"tz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"tA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"tB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"tC" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/wall,/area/awaymission/UO71/science)
+"tD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/science)
+"tE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"tF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"tG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"tH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/medical)
+"tI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"tJ" = (/obj/machinery/light/small{dir = 4},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/gun/energy/kinetic_accelerator,/obj/item/borg/upgrade/modkit/tracer,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/mining)
+"tK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"tL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{id_tag = "UO71_Armory"; name = "Armory Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"tM" = (/obj/machinery/door/airlock/command{name = "Bridge"; req_access_txt = "271"},/obj/machinery/door/poddoor{id_tag = "UO71_Bridge"; name = "Bridge Lockdown Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"tN" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"tO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"tP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"tQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "arrival"},/area/awaymission/UO71/eng)
+"tR" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 2},/obj/structure/window/reinforced{dir = 4; layer = 2.9},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "escape"; tag = "icon-escape (NORTH)"},/area/awaymission/UO71/eng)
+"tS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"tT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"tU" = (/obj/machinery/computer/security{network = list("UO71")},/obj/machinery/door_control{desc = "A remote control-switch for the security privacy shutters."; id = "UO71_EngineeringOffice"; name = "Privacy Shutters"; pixel_x = -24; pixel_y = 6; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"tV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"tX" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; layer = 2.9; name = "engineering security door"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tY" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"tZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ua" = (/obj/machinery/meter{frequency = 1443; id = "UO71_wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ub" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"uc" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2 Outlet Pump"; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ud" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "O2 Outlet Pump"; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ue" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Unfiltered to Mix"; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"uf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/rust,/area/awaymission/UO71/science)
+"ug" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/engineering{name = "Engineering Maintenance"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"uh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"ui" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"uj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"uk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/science)
+"ul" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"um" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"un" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"uo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/medical)
+"up" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/science)
+"uq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"ur" = (/obj/structure/table,/obj/item/weapon/gun/energy/laser/awaymission_aeg,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"us" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/awaymission/UO71/science)
+"ut" = (/turf/simulated/wall,/area/awaymission/UO71/outside)
+"uu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; icon_state = "weld"; on = 1; pressure_checks = 1; welded = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"uv" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"uw" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"ux" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"uy" = (/obj/machinery/shower{dir = 1; pixel_y = 0},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/centralhall)
+"uz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"uA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"uB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"uC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"uD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/engineering{name = "Engineering Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"uE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"uF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"uG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO71_Engineering"; name = "Engineering Lockdown"; pixel_x = 24; pixel_y = 6; req_access_txt = "271"},/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "271"},/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"uH" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"uI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "External to Filter"; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"uJ" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Air to External"; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"uK" = (/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5; initialize_directions = 5},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"uL" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 2; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"uM" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_n2_in"; name = "Nitrogen Supply Control"; output_tag = "UO71_n2_out"; sensors = list("UO71_n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaymission/UO71/eng)
+"uN" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"uO" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 1; on = 1; req_access = null},/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "blue"},/area/awaymission/UO71/eng)
+"uP" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "UO71_o2_in"; name = "Oxygen Supply Control"; output_tag = "UO71_o2_out"; sensors = list("UO71_o2_sensor" = "Tank")},/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "blue"},/area/awaymission/UO71/eng)
+"uQ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng)
+"uR" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating{dir = 9; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uS" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{dir = 1; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uT" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/obj/item/weapon/reagent_containers/food/pill/methamphetamine,/obj/item/weapon/storage/toolbox/syndicate,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"uU" = (/obj/machinery/door/airlock/medical{name = "Medical"; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"uV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/awaymission/UO71/medical)
+"uW" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"uX" = (/obj/structure/closet,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/centralhall)
+"uY" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"uZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("UO71_n2_sensor" = "Nitrogen", "UO71_o2_sensor" = "Oxygen", "UO71_waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "caution"},/area/awaymission/UO71/eng)
+"va" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"vb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"vc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"vd" = (/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"ve" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"vf" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vg" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vh" = (/obj/machinery/meter{layer = 3.3},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vi" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 8; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vj" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/science)
+"vk" = (/obj/machinery/atmospherics/binary/valve{dir = 2},/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vl" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/terrorspiders3,/obj/item/weapon/pen/edagger,/obj/item/stack/telecrystal{amount = 10},/obj/item/device/chameleon,/obj/item/weapon/reagent_containers/glass/bottle/traitor,/obj/item/borg/upgrade/syndicate,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"vm" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vn" = (/obj/machinery/optable,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vo" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vq" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"vr" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaymission/UO71/centralhall)
+"vs" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"vt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaymission/UO71/centralhall)
+"vu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "browncorner"},/area/awaymission/UO71/centralhall)
+"vv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("UO71_mair_in_meter" = "Mixed Air In", "UO71_air_sensor" = "Mixed Air Supply Tank", "UO71_mair_out_meter" = "Mixed Air Out", "UO71_dloop_atm_meter" = "Distribution Loop", "UO71_wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "caution"},/area/awaymission/UO71/eng)
+"vw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"vx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"vy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"vz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"vA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/eng)
+"vB" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vC" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vD" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id_tag = "UO71_Engineering"; name = "engineering security door"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "delivery"; name = "floor"},/area/awaymission/UO71/eng)
+"vE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO71_n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"vF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"vG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "UO71_o2_in"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"vH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "UO71_o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"vI" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{dir = 10; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vJ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{dir = 6; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/science)
+"vM" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"vN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"vO" = (/obj/structure/sign/deathsposal,/turf/simulated/wall/rust,/area/awaymission/UO71/medical)
+"vP" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"vQ" = (/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"vR" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Containment"; name = "Science Containment Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"vS" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Queen"; name = "Terror Queen Containment Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"vT" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control-switch for heavy lockdown doors."; id = "UO71_Armory"; name = "Armory Doors"; pixel_x = 0; pixel_y = -2; req_access_txt = "271"; wires = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"vU" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"vV" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"vW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"vX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaymission/UO71/centralhall)
+"vY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/centralhall)
+"vZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "brown"},/area/awaymission/UO71/centralhall)
+"wa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "brown"},/area/awaymission/UO71/centralhall)
+"wb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "caution"},/area/awaymission/UO71/eng)
+"wc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"we" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"wi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/engineering{name = "Engineering"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wk" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wl" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_n2_sensor"},/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"wm" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 10000; oxygen = 0},/area/awaymission/UO71/eng)
+"wn" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "UO71_o2_sensor"},/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"wo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/awaymission/UO71/eng)
+"wp" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 4},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wq" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaymission/UO71/medical)
+"wr" = (/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"ws" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"wt" = (/obj/structure/table,/obj/item/weapon/paper/terrorspiders2,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"wu" = (/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"wv" = (/turf/simulated/wall,/area/awaymission/UO71/mining)
+"ww" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access_txt = "271"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wx" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wy" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_mining{name = "Mining Foyer"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "caution"; tag = "icon-caution (SOUTHWEST)"},/area/awaymission/UO71/eng)
+"wA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/noticeboard{dir = 1; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"wE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng)
+"wF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng)
+"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaymission/UO71/eng)
+"wH" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wI" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wJ" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "bot"},/area/awaymission/UO71/eng)
+"wK" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen{name = "Canister: \[O2] (CRYO)"},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"wL" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wM" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wN" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wO" = (/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"wP" = (/obj/structure/stool/bed,/obj/item/weapon/storage/box/gloves{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"wQ" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"wR" = (/obj/machinery/light,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"wS" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/bridge)
+"wT" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wU" = (/obj/machinery/light/small{dir = 1},/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"wW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/mining)
+"wX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"wY" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xa" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/cable,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xb" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"xc" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/eng)
+"xd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "271"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xe" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door_control{id = "awaydorm8"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm8"; name = "Mining Dorm 1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/sign/deathsposal{desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; name = "\improper DISPOSAL: LEADS TO EXTERIOR"; pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xq" = (/obj/structure/toilet{pixel_y = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xr" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xv" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xw" = (/obj/structure/stool/bed/chair/office,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xx" = (/mob/living/simple_animal/hostile/poison/terror_spider/white,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xz" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xA" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small,/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaymission/UO71/eng)
+"xB" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door_control{id = "awaydorm9"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{id_tag = "awaydorm9"; name = "Mining Dorm 2"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xG" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xH" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xI" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/effect/decal/cleanable/dirt,/obj/item/stack/sheet/plasteel{amount = 50},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xK" = (/obj/machinery/light/small,/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/closet/secure_closet/miner{req_access = list(201)},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/mining)
+"xN" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{cell_type = 15000; dir = 2; locked = 0; name = "UO71 Mining APC"; pixel_x = 0; pixel_y = -25; req_access = null; start_charge = 1},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/closet/secure_closet/engineering_personal{icon_broken = "miningsecbroken"; icon_closed = "miningsec"; icon_locked = "miningsec1"; icon_off = "miningsecoff"; icon_opened = "miningsecopen"; icon_state = "miningsec"; locked = 0; name = "miner's equipment"; req_access = list(201)},/obj/item/weapon/storage/backpack/satchel_eng,/obj/item/clothing/gloves/fingerless,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "browncorner"},/area/awaymission/UO71/mining)
+"xO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "brown"},/area/awaymission/UO71/mining)
+"xP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "brown"},/area/awaymission/UO71/mining)
+"xQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/cigarettes{pixel_x = -2},/obj/item/weapon/lighter/zippo{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xR" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xU" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xW" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/mining{name = "Processing Area"; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"xX" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xY" = (/obj/machinery/light/small,/obj/machinery/computer/atmos_alert,/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "UO71_Engineering"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -24; req_access_txt = "271"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "UO71_Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 6; pixel_y = -24; req_access_txt = "271"},/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"xZ" = (/obj/machinery/computer/monitor{name = "primary power monitoring console"},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "neutralfull"},/area/awaymission/UO71/eng)
+"ya" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yb" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yc" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "loadingarea"},/area/awaymission/UO71/mining)
+"yd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"ye" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm/monitor{dir = 8; frequency = 1439; locked = 0; pixel_x = 23; pixel_y = 0; req_access = null},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yf" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yg" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yh" = (/obj/machinery/conveyor_switch/oneway{id = "UO71_mining"; name = "mining conveyor"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yj" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yk" = (/obj/machinery/suit_storage_unit/mining,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"ym" = (/obj/machinery/mineral/processing_unit{dir = 1; output_dir = 2},/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yn" = (/obj/machinery/mineral/processing_unit_console{machinedir = 8},/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"yo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Mining"; dir = 4; network = list("UO71")},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 7; tag = "icon-manifold-r-f (WEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yq" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yr" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"ys" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yu" = (/obj/machinery/conveyor{dir = 2; id = "UO71_mining"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 4; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yv" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_mining{name = "Mining EVA"; req_access_txt = "271"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yB" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yC" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2},/turf/simulated/wall,/area/awaymission/UO71/mining)
+"yD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 26},/obj/item/stack/sheet/glass{amount = 19},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yG" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/mech_bay_recharge_floor,/area/awaymission/UO71/mining)
+"yI" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port (WEST)"; icon_state = "recharge_port"; dir = 8},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/UO71/mining)
+"yJ" = (/obj/machinery/mineral/stacking_machine{dir = 1; input_dir = 8; output_dir = 4},/turf/simulated/floor/plating{dir = 5; heat_capacity = 1e+006; icon_state = "warnplate"},/area/awaymission/UO71/mining)
+"yK" = (/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "loadingarea"},/area/awaymission/UO71/mining)
+"yL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/sheet/mineral/plasma{amount = 6},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"yN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yO" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaymission/UO71/mining)
+"yP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/mining)
+"yS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yT" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yV" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yW" = (/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/mining)
+"yX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "\improper CONTAINMENT AREA"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"yY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'DANGER - LETHAL BIOHAZARDS WITHIN'"; name = "\improper CONTAINMENT AREA"},/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"yZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"za" = (/obj/structure/sign/biohazard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"zb" = (/obj/structure/sign/biohazard,/turf/simulated/wall/rust,/area/awaymission/UO71/mining)
+"zc" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/outside)
+"zd" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/queen)
+"ze" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/awaymission/UO71/queen)
+"zf" = (/obj/machinery/door/poddoor{id_tag = "UO71_Queen"; name = "Caves Lockdown Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zg" = (/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/queen)
+"zh" = (/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zj" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zk" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zl" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "271"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zm" = (/obj/structure/dresser,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zo" = (/obj/structure/stool/bed/chair/wood/normal,/obj/item/clothing/shoes/syndigaloshes,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zp" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zq" = (/obj/machinery/newscaster{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zr" = (/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/outside)
+"zt" = (/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zv" = (/obj/machinery/door/airlock/external{name = "Strange Airlock"; req_access_txt = "271"},/obj/machinery/door/poddoor{id_tag = "UO71_Caves"; name = "Caves Lockdown Door"},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaymission/UO71/loot)
+"zw" = (/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zx" = (/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zy" = (/turf/simulated/wall,/area/awaymission/UO71/queen)
+"zz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaymission/UO71/queen)
+"zA" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zC" = (/obj/effect/spider/cocoon{icon_state = "cocoon_large1"},/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zD" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/UO71/queen)
+"zE" = (/obj/machinery/door/airlock/external{name = "Mining External Airlock"; req_access_txt = "271"},/turf/simulated/wall/rust,/area/awaymission/UO71/queen)
+"zF" = (/mob/living/simple_animal/hostile/poison/terror_spider/green,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zG" = (/obj/machinery/door/poddoor{id_tag = "UO71_Caves"; name = "Caves Lockdown Door"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "weld"; id_tag = "UO71_waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0; welded = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zK" = (/obj/effect/spider/terrorweb,/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spider/terrorweb,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/mineral/random/labormineral,/area/awaymission/UO71/queen)
+"zN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 7; tag = "icon-manifold-b-f (WEST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zO" = (/obj/structure/table,/obj/machinery/light,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "floorgrime"},/area/awaymission/UO71/queen)
+"zP" = (/turf/simulated/wall/mineral/wood,/area/awaymission/UO71/queen)
+"zQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/mineral/wood,/area/awaymission/UO71/queen)
+"zR" = (/obj/machinery/door/poddoor{id_tag = "UO71_Queen"; name = "Caves Lockdown Door"},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zS" = (/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zU" = (/obj/structure/table/holotable/wood,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zV" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zW" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zY" = (/obj/structure/table/holotable/wood,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"zZ" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (EAST)"; icon_state = "wooden_chair"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Aa" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ab" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ac" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ad" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ae" = (/mob/living/simple_animal/hostile/poison/terror_spider/queen,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Af" = (/obj/structure/table/holotable/wood,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ag" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ah" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/awaymission/UO71/queen)
+"Ai" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/awaymission/UO71/science)
+"Aj" = (/obj/structure/table,/obj/item/weapon/defibrillator,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "whitecorner"},/area/awaymission/UO71/medical)
+"Ak" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "whitehall"},/area/awaymission/UO71/medical)
+"Al" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{id_tag = "UO71_Start"; name = "UO71 Sealed Facility"},/obj/machinery/door/airlock/command{icon_state = "door_closed"; lockdownbyai = 0; locked = 0; name = "Gateway Ready Room"; req_access_txt = "271"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaymission/UO71/gateway)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacadacadadadadacadacacacababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababadaeafagahahahahaiajakacababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacalafahahahamamahahanadababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababacacahaoaqaqaqaqapahacadacacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababacasatauavawaxayazacaAaBacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababacahatauavavaDayahacaEaFacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababadadacacacaGaHaIaIaIaIaJahaKaLaMacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacacacaNaOaNadaPaQaRaSaTaRaUahacacacacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadaVaWaXaYaZbaasbbacacacacaUbcacbdbeacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadaVacbfacbgacahbhbibjbkblbmahadbnaFacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacaVacboadbpadafbqahbrbsambtahbubnbvacababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababacbwadbxbybzbzbybAbzbBbCbybybzbDbybybEababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababadbFbGbHbIbJbKbLbMbNbObPbNbQbRbSbTbUbVababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadacacacbWbXadbYacbWadasahacbYacbVadbZbWababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccacbccbWbZadcdcecfacajahadcgchciaccjbWacadacadacadadacacadadadacacababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababacckbFclcmcnaccocpcqacafahaccrcpcsadbZctcucucucucucucvcwcxcyczczcAcBababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadcCcDcCcEbXadaccFacadcGcGacaccHacadcIbTcJcKcKcKcLcKcLcLcMbJbLbJcNbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaccObTcPbMcQaWafcRamahahahcSahbscTacacadcUaccVcWcXcYcZadbVacadacbXbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababacbXacacbWadaddadbdcahahahahdddedfaqaqdgdhdidjdkdldkdmdndodpdqacdrbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababadbXacdsdtdudvahahdwdxdxdxdydzdAdBdCdDdEbsdFamdFahdFahdFdGdfdHaccjbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaddIdJdKdLdMaqdNahatdOdOdOdOdPdQdfdRahahdSdFahdFahdFahdFdTdfdUadbZbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababacacacdVdWdXdYdZaheadOebecdOeddQdfaqaqahahdFahdFahdFahdFeedfefadbZbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadegbreheidZahejdOecekdOeddQeldpemenahdFeodFahdFahdFdQepeqacbZbWababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaderesetaqeuahevdOdOdOdOaydQewexemeyezezezeyeAeBeCeDeEeFadadbZbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaccUbVadacasaheGeHeHeHeHeIdQeJacacacacacacacadadeKeLeMeNeOePeQbVababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaceReSeTeUeVeVbBeWeVeVeVeXeYeZacabababababababfafbfcfdfefbfffgfhababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadfifjbvacfkahahbrflfmaffnfofpadababababababababfbfqfqfrfbfsftfufvabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababadadacacadadaccGfwacacacacacadadababababababababfefxfqfqfyfffzfAfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababfbfBfCfbababababababababababababababfefDfqfEfbfFfGfHfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababfbfIfJfbababababababababababababababfefefKfbfbfefbftfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLfLfLfLfMfLfLabababababababababababababababababababfNfNfOfOabababfPfPfPfPfPfPfPfPfPababfbfQfBfbababababababababababababababfbfRfSfTfUfVfefWfXabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMfYjdfZjdfZfLfLfMfLababababgagagagagagagagagafNfNfOfOgbgcfOfOababfPgdgdgegfgdgdgdfPababfbfIfIfbabababababfbfbfbfbfbfbfbfefbfbggggggggghfegifXabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMfYgjgkglfYgmgngofLfMfLfMfMgagpgpgpgqgpgpgpgafOgrgsgtgugvgwfNababfPgdgdgegxgdgdgdfPababfegygzfbabababababfbgAgBgCgDgEgFgGgHfbgIgJgKgggLfeftfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLfZgMgNgOfZgmgPgQfMgRgSgTfLgagpgpgpgUgpgpgpgafNgVgWgXgYgZhafNababfPgdgdgdgdgdgegdfPababfbhbfBfbabababababfbhchdgAhehfhghhhhhihjhkhlhmhnhohpfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLfZhqhrhsfZgmhthufMhvhwhxfLgagpgpgpgpgpgpgpgafOhyhzhAgYhBhCfNababfPhDgegdgegdgdhEfPababfbhFfBfbabababababfbhGhHgAhIhJgAgAhKfehLgKhMgghNfbfWfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMhOhPhQhRhPgmhthSfLfLhTfLfLgahUgphVgpgphVhWgafOhXhYhZiaibicfNababidiegdifgdgdiggefPababfbhFfQfbabababababfbihhdgAhIiigAgAijikilimgggginfeiofhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMipiqiraritiuiviwixiyiziAiBiCiDgagaiEiEgaiFgafNiGiHgufOfNfNfOababiIfPfPfPiJiJiKiLiLiMiMiNiOfQfeabababababfbiPgAijhehJgAgAiQfbiRiSggfSiTfbiUfhabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMiViWiXiYiZjajcjckAjbjffMababababjgjhjhjgjifOfOjjjkgvfOabababababjlababjmjnjnjmababababfejojpfefeababababfejqjrgAijhJjsjtjufbfbjvjwjwjxjxjyjzabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfLjAjBirjCjDfLfLfMfMjEjFfMababababjGjHjHjGjifOfOjIjJjKfOabababababjlababjGjLjLjGababababfbjMfIjNfefbfbfbfefejOjPhdjQhehegAgAjRjSjTjUjVjWjXjYfeabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababfMfLfMjZkBfLfLkakbfMkckdfLfOfOfOfOkekfkgkekhfNkikjkkklfOfOfOfOfOfOkmfOfOknkokpkefOfOfNfOfOkqfIfIkrfIfBfIfIjpgAgAgAksijgAktkukukvkwfbkxkykzfefbabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLaCirrffLkCkDkEixkFkGkHkIkJkKkLkMkJkNkOkPkQkRkSkTkUkJkWkNkJkJkXkYkZlalblcldlefOlflglhfOliljljljlkljlllmjpgAijgAlnlolololplqlrlsfbfbfefefeababababababababababababababltltltltltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLlulvlwjelwlylzAllBkVlDlElElFlElGlElHlxlIlJlKlLlMlNlClPlQlRlSlTlSlSlSlUguldlelVgugugulVlWlXfBlYfbfefbfbfefefbfbfblZmahdmbfbjomcfeababababababababababababababababababltmdmemfltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfMmgmhmiirjDjDlOfLmlmjfMfNfOfOfOfNfOfOmkfOfOmompfOfOfOmqfOfOfOfNmrmrmrmrmsldlefOmtmumvfOmwfCmxmyfbmzmAmzfemBmCmDfefefbfbfefbmEmFfeababababababababababababababababababltmGmHmfltabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLmmmJmImLmMmNmOfMfLfLfLabfOgugumPfOmQmKmPfNmRmSfOmTmUmVmWmXmYfOmZnanbmrmslbfOfOfNfOfOfNncndfefefbnenfngfbnhninjfenknlnmnnfbnomFfbabababababababababababababababababnpltltnqnrnrnpababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababfLfLfMfMfLfLfMfMfLababababfOgugugufOnsmKntfOmRnufOnvnwnxnymXmXfNnznAnBmrmsnCfNnDnEnFnFnGnHnInJnKfbfXnLfbfefXnMfbfbnNfBnOnPnQnRnSfbabababababababababababababababababnTnUnVnVnVnWnpababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOnXnYgumnguscnZfOkmoafOobocodoeofogfNohoiojmrmslbfNoaokolomomonooopoqorosotouovowotoxoyozoAoBoCoDoEoFfbabababababababababababababababababnToGoHoIoHoJnpnpnpnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOoKoLgufOoMoNoOfOkmoPfOoQocoRoSoToUfNoVoWoXoYmslbfOnumRfbfbfboZpaljpbpcpdpepfpgpdphpipjpkpeplpmfbpnpofeabababababababababababababababababnppppqprpsptnppupvnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababfOfOfOfOfOfOfOfOfNpwpxfOpypzmXpAmXoTfOfOpBkmfOmslafNpCmRfbfbfbpDpEfIpFfbpGfbfhfepHfbfbfepIfbfbpJfbpKmFfbabababababababababababababababababnppLpMpNpMpOnTpPpQnpabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNpRjifOfOfOpSfOpTpUpTpTpVpWpXpYpZqaoakmfbfbfbqbqcqdqefeqfqgqhqiqjfeqkqlqmqnfeqofehFmFfbababababababababnTnTnpnpnTababababnpqpqpqqqpqpnpqrqsnpnpnpabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOqtkhquqvmrqwqxpTqyqzpTpVqAqBqCqDqaoamRfbfbfbqEfbqFqFfbqGqHfbqIqJfbfbfbqKqLfeqMfbhFmFfbababababababababnTqNqOqOnpnTnTnTnpnpqPqQqRqSqTqUqVqWqXqYnpabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOqZjirarbrcrdrepTqyqypTrhriqCqCrjqarkrlrmrmrmrnrmrorpferqmzfbrrrsfbrtruqmrvfbrwfbrxryfbfbfbfbfefbfbfbfbnprzrArBrCnTrDrErFrGrHrIrJrKrLrLrMrNrOqYnpnpnTnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNrPkhqurQmrrRrSpTrgrUpTpVrVrWrXrYqarZmRsaurrTsdsesfrpfefefefefbfefbfefesgfbfbshfesisjskslsmsnsoslspsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsHsIsIsJsKsLsMnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNqZkhfOfOfOfNfNpTpTsNpTpVsOsPsQsRqaoamRsarprpsSsarpsTfbabababababfbsUsVqmsWferwfejMsXnQsYsZsYtasYtbtctdtetftftgthtitjtktlsBtmtntotptqtrtstttutvtwtxtynpababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNtztAnEtBnFnFtCtDAitDtDtEtFtGtHtItItKkmsasasatLsatMtMsasasasaababfbtNqmqmsWferwfbtOtPfefbfbfbfefbfbfbfbnptQtRtStTnptUtVtWtXtYtZtuuaubucrBrBuduenpnpnTnTababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOufugolomomuhuiujuqukujulumunuoupujisusutsarpuuuvrprpuvuwsbsaababfefeuxuyfefeqMfbuzuAfbababababababababnTuBuCuDnpnpuEuFuGnpuHuIuJuKuLuMuNuOuPuQnTabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfNuRuSuTfOfOfOfOqapVpXpXqauUuVpXfNfNfNfNabsarprprprprprpsbrpsaababuWfefefefeuXrwuYuzuAfbababababababababnTuZvavbvcnpqpvdqpnpnpvevfnpvgvhnTvgvhnTnTabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOvivjvkfOabababqaAjvmvnvoqCvppXabababababsarprprprprprprprpsaababuWuWuWvqvrvsvtfbvuuAfbababababababababnpvvvwvxtfvytftkvzvAvBvCvDnpvEvFnpvGvHnpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOvIvJvKfNabababqaAkvMqCqCqCvNvOabababababsavPsbvQrprpvRvSvTsaababuWuWvUvVvWvXvYfevZwafbababababababababnpwbrBwcwdwewfwgwhwiwjqRwknpwlwmnpwnwonpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababfOfOfNfNfOabababqawpwqqCqCqCwrqaabababababsarpwsrprprpwtwsrpsaabababwuwvwvwvwuwwwvwxwywvababababababababnTwzwAwBwCwDwEwFwGrGwHwIwJnpnpnpnpnpnpnpababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababqawKwLwMwNwOwPqaabababababsawQrpwRwSrpwRrpwQsaabababwuwTwUwVwWwXwYwZxawvababababababababnTnTnpxbxcxdnTnpnTnTnpnpnTnTababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababqaqaqaqaqaqaqaqaabababababsasasasasasasasasasaabababwuxexfxgxhxixjxkxlwvabababababababababnpxmxnxoxpnpxqnpabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwvwuwuwuxrxsxtxuwvabababababababababnpxvxwxxxyxzxAnTabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvxBxfxCxDxjxExkxFwvabababababababababnpxGxHxIxJnpnpnTabababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwTxKxLwWxMxNxOxPwuabababababababababnpxQxRxSxTxUnpababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwuwvwvwvwvwuxVxWwuabababababababababnpxXxYxZnpnpnTababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyaybycydyewvwvwuwuwuabababababnpnTnTnpnpababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyfygyhydyiyjykyklAwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvymynyoxkypyqyrystJwvababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyuygyvywyxyyyzyAyBwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyayCyDyEyFyjyGyHyIwvababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyayJyKyLyMwuwuwvwuwuababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwvwuyjyNyOwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyPyQyRySwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyTyLyTyTwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuwuyUyTyVwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwvyWyTyTwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyLyTyTwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyXyTyYwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyZyTwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuyZyTwuwuabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababwuzayTzbwuabababababababababababababababababababababababababababababababababababababababababababababababab
+zczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczdzdzdzezfzdzdzdzdzdzdzdzdzczczczczczczczczczczczczcpTpTpTpTpTzczczczczczczczczczczczczczczczczczczczczczczczc
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzgzhzizjzhzhzgzgzgzgzgzgabababababababababababababpTzkzlzmpTabababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzgzhznzjzjzhzgzgzgzgzgzgabababababababababababababpTzozpzqpTababababababzruWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWabababababzgzgzhznzjzjzhzgzgzgzgzgzgabababababababababababababpTvlztztpTababzruWuWuWuWzrabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababuWuWuWababababzgzgzhznzjzuzhzgzgzgzgzgzgabababababababababababababpTpTzvpTpTabuWuWuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWababzgzgzhznzwzjzhzgzgzgzgzgzgababababababababababababuWuWuWuWabababuWuWabuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWzruWuWuWababababababababababuWuWuWabzgzgzhznzjzxzhzgzgzgzgzgzgabuWuWuWuWuWuWabababababuWababababuWzruWabzruWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababuWababababababababababababababababababababababababababuWuWuWuWababababababababababababuWuWuWzyzyzyzzzAzyzyzyzyzgzgzgzguWuWabababuWuWuWabababuWuWuWuWuWuWuWuWuWabuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababuWuWabababababababababababababababababababababababababuWuWuWababababababababababababababuWuWzyzyzyzzzjzBzCzxzyzyzyzgzDuWabababababuWababababuWabababuWuWuWabuWuWuWuWuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababuWuWabababababababababababababababababababababababuWuWzrabababababababababababababababuWuWzEzFzGznzwzjzjzxzxzyzyzgzDuWababuWabuWuWabababababababuWuWuWababababuWuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWuWuWababababababababababababababababababababuWuWuWabababababababababababababababababuWzyzyzyzHzIzJzjzxzKzyzyzgzguWababuWabuWabababababababuWuWuWababababababuWuWuWuWzrababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababuWuWuWababababababababuWuWuWuWuWabababababuWuWuWabababababababababababababababababababzyzyzyzLzxzjzjzwzxzyzyzyzyuWababuWuWuWababuWababababuWuWabababababababuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababuWuWababababababuWuWuWuWuWuWuWuWabababuWuWzrabababababababababababababababababababzyzyzyzMzxzxzjzjzjzjzyzyzyuWababuWuWabababuWababababuWuWabababababababzruWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababuWuWuWuWuWuWuWuWababababababuWuWuWabuWuWababababababababababababababababababababzyzyzyzMzxzCzjzjzjzjzyzyzyuWabababababababuWuWababuWuWababababababababuWuWuWuWuWababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababuWuWuWabababababababababababuWuWuWuWababababababababababababababababababababzyzyzyzMzxzxzjzjzjzjzGzFzEuWuWuWabababababuWuWababuWuWabababababababababuWuWuWabababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababuWuWuWabababababababababababababababuWuWababababababababababababababababababababzyzyzgzMzxzjzjzwzxzgzyzyzyuWuWuWuWuWuWababuWuWababuWuWabababababuWuWuWuWuWuWababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababuWuWababababababababababababababababababuWababababababababababababababababababababzyzyzgzLzxzjzjzjzxzgzgzyzyabuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWuWuWuWababababababababababababuWzruWababababuWuWuWabababababababababuWababababababababzyzyzgzLzwzjzjzjzxzxzgzyzyabuWuWuWuWuWuWuWuWuWuWababababababababababuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababuWabababababababababababababuWuWuWuWuWuWzrababababuWuWuWuWabababababuWuWababuWabababababzyzyzgzNzIzJzOzjzxzxzgzyzyababuWuWuWuWuWuWuWuWababababababababababuWuWuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababzruWuWuWuWuWuWuWababababababuWuWuWababababuWababuWabababababzyzyzyznzjzxzgzjzCzjzgzgzyabababuWuWuWuWuWuWuWabababuWuWuWuWabababuWabuWuWabababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWababababababuWababababuWababuWuWababababzyzyzyznzjzjzgzjzxzxzgzgzyababuWuWuWuWababuWuWabababuWabababababuWuWuWuWababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWzruWuWuWuWabababuWuWuWababababuWababuWuWabababuWzyzyzyznzCzgzgzgzxzxzgzgzyababuWuWababababuWuWuWababuWababababuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababuWuWzruWuWuWabuWuWuWzruWuWuWuWuWababababababuWababuWuWabuWuWuWzEzjzGznzxzgzgzgzgzxzgzyzyabuWuWuWuWuWabababuWuWababuWuWabababuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWzyzyzyznzxzjzgzgzjzjzyzyzyuWuWuWababuWuWababuWuWuWababuWababuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWababababzyzyzgznzjzxzgzjzxzwzGzjzEuWuWababababuWabababuWuWababuWuWabuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWuWabababzyzgzgznzjzwzjzjzjzjzyzyzyabuWababuWabuWuWababuWuWabababuWuWuWuWuWuWuWabababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababuWuWuWuWabababzyzgzgzNzIzJzBzwzjzjzyzyzyabuWuWuWuWababuWababuWuWuWababuWuWuWuWuWuWababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababuWuWuWababzyzgzgzMzjzjzjzjzjzgzyzyzyabababababababuWabababuWuWabuWuWuWabuWuWuWababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababababuWuWuWabzyzyzyzMzgzjzjzjzgzgzyzyzyababababababuWuWababababuWuWuWuWabuWuWuWabababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWuWabababababababababuWuWabzgzPzPzQzPzRzRzRzPzPzPzPzgababuWuWuWuWuWabababuWuWuWuWabuWuWuWuWababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWuWabababababababababababuWuWuWzgzPzSzTzUzSzSzSzVzWzSzPzgabababababababababuWuWuWuWuWuWuWabababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWuWuWabababababababababababababuWuWzgzPzSzXzYzSzSzSzZzYAazPzgabababababababuWuWuWuWuWuWababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababuWuWabababababababababababababababuWabzgzPzSAbzYzSzSzSzSAczSzPzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababuWuWuWabababababababababababababababababzgzPAdzSzSzSAezSzSzSzSzPzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababuWuWuWabababababababababababababababababzgzPzSzSzSzSzSzSzSzSzSzPzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababuWuWabababababababababababababababababababzgzPzZAfAgzSzSzSAhzSzSzPzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababzgzPzPzPzPzPzPzPzPzPzPzPzgabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
+
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index b0da2da8f86..3bd59e019b9 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -3801,7 +3801,7 @@
"bve" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Chapel"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/chapel/main)
"bvf" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"bvg" = (/obj/structure/table,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"bvh" = (/obj/structure/bush,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"bvh" = (/obj/structure/flora/ausbushes/stalkybush,/obj/structure/flora/ausbushes/grassybush,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"bvi" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bvj" = (/turf/simulated/shuttle/floor,/area/shuttle/transport)
"bvk" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "port bay 3"; width = 5},/turf/simulated/shuttle/floor,/area/shuttle/transport)
@@ -3875,7 +3875,7 @@
"bwA" = (/obj/machinery/camera{c_tag = "Departure Lounge East"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"bwB" = (/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"bwC" = (/turf/simulated/floor/plasteel{desc = "\"This is a plaque in honour of those who died in the great space lube airlock incident.\" Scratched in beneath that is a crude image of a clown and a spaceman. The spaceman is slipping. The clown is laughing."; dir = 4; icon_state = "plaque"; name = "Memorial Plaque"},/area/hallway/secondary/exit)
-"bwD" = (/obj/structure/bush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hallway/secondary/exit)
+"bwD" = (/obj/structure/flora/ausbushes/pointybush,/obj/structure/flora/ausbushes/lavendergrass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"bwE" = (/turf/space,/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/transport)
"bwF" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/transport)
"bwG" = (/obj/structure/closet/crate,/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/transport)
@@ -7825,7 +7825,7 @@
"cUy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
"cUz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos)
"cUA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plasteel,/area/atmos)
-"cUB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
+"cUB" = (/obj/structure/flora/ausbushes/leafybush,/obj/structure/flora/ausbushes/grassybush,/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"cUC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cUD" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cUE" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/atmos/distribution)
@@ -8042,6 +8042,7 @@
"cYH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"cYI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/engine/chiefs_office)
"cYJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/engine/engineering)
+"cYK" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/ausbushes/pointybush,/obj/structure/flora/ausbushes/lavendergrass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"cYL" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cYM" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering)
"cYN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/engine/engineering)
@@ -8138,6 +8139,7 @@
"daA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/engine/engineering)
"daB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel,/area/engine/engineering)
"daC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"daD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
"daE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
"daF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering)
"daG" = (/turf/simulated/floor/plating,/area/engine/engineering)
@@ -9158,7 +9160,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaIIaIJaIIaaaaaaaabaGnaIKaILaHSaHSaIMaHSaGnaIIaIIaGjaGjaINaIOaIaaHSaGnaGnaIIaIIaIIaGnaGnaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaIbaIPaIQaIRaISaITaIgaIUaMDaIWaIjaIXaIlaIYaIZaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaFFaFHaJnaJoaJpaJqaJraJqaJqaJqaJsaJqaJqaJqaJqaJtaJuaJvaJwaJxaJyaJzaJAaJBaJCaJDaDPaabaJEaJFaJFaJFaJFaJFaJGaabaabaaaaaaaaaaaaaHNaJHaHNaaaaIFaGTaGTaJIaJJaGTaJKaGYaGYaGYaHaaJLaGYaJMaGXaGYaGYaGYaJNaHaaGYaGXaJOaJPaGXaGYaJQaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJRaJSaJTaaaaJUaJVaJWaabaabaIIaHSaIIaaaaaaaabaGnaJXaJYaJZaKaaKbaKcaGnaKdaHSaKeaKfaKgaKhaKhaKhaKhaKhaKhaKhaKhaKiaGnaaaaKjaaaaaaaaaaaaaaaaaaaaaaaaaIbaKkaKlaKmaKnaKoaKpaKqaKraKsaIjaIXaIlaKtaKuaKvaJbaJcaKwaKxaKxaKxaKxaKxaJjaKyaJlaFzaFFaFHaEjaKzaKAaKBaKCaKBaKBaKDaKEaKFaKFaKFaKFaKFaKFaKGaKHaKIaKJaKKaKLaKMaKNaDPaDPaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaaaaaaaaaaaaaHNaKRaKSaaaaIFaKTaKUaKVaKWaGYaGYaGYaHaaGYaHaaKXaGYaGYaGXaGYaKYaKZaKXaIHaGYaGXaLaaLbaGXaGYaLcaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLeaLfaLeaLdaLgaLhaLgaLdaabaIIaLiaLjaaaaaaaGnaGnaGnaGnaGnaLkaLlaLmaLnaLoaLpaLpaLqaLraLraLsaLtaGnaHSaGnaGnaGnaLuaGnaaaaabaaaaaaaaaaaaaaaaaaaabaabaIbaLvaLwaLxaLyaLzaLAaLBaLCaNTaIjaIXaIlaLDaLEaLFaJbaLGaLHaKxaLIaKxaLJaLJaJjaKxaJlaFzaFFaLKaEjaLLaKAaLMaPzaLNaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaMcaMdaMeaMfaMgaMhaKOaKPaKQaKQaKQaKQaKQaKPaKOaabaabaabaabaHNaHNaMiazKaHNaIFaMkaGYaMlaGYaHbaGYaGXaGXaMmaGXaGXaMnaHaaHaaKXaMoaMpaGYaGXaGYaMqaMqaMqaMqaMqaMqaMqaMqaMqaMraMraMraMrafOaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaEAaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCcUBaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaLOaPzaLNaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaLeaMtaLeaMsaLgaMuaLgaMsaGnaIIaMvaEAaIIaIIaGnaHSaHSaHSaHSaHSaHSaHSaLkaLuaGnaGnaGnaGnaGnaMxaGnaGnaHSaMyaGnaMzaLuaGnaGnaGnaaaaaaaaaaaaaaaaMAaMAaMAaMAaMAaMAaMAaMAaMAaLAaMBaMCdaDaMEaMFaMGaMHaMIaMJaMKaJcaMLaKxaMMaMNaMOaMPaMQaMRaJlaFzaFFaFHaEjaAPaMSaLOaPzaLNaLPaMUaMVaMVaMVaMVaMVaMVaMVaMVaMVaMVaMWaMXaMYaMZaNaaNbaNcaNdaKPaKQaKQaKQaKQaKQaKPaKOaKOaKOaaaaaaaHNaGYaNeaNfaJKaHaaMoaKXaMlaGYaNgaGZaNhaIHaGYaGYaGYaGYaNiaGYaGYaMoaNjaGYaMnaGYaMqaNkaNlaNmaMqaNnaNoaNpaMqaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaNqaNraNsaMsaNtaNuaNvaNwaNxaHSaNyaNzaNAaMyaNBaHSaGnaGnaGnaGnaGnaGnaGnaLuaGnaNCafOaNDaGnaNEaNFaNGaHSaNBaGnaNAaNHaKhaKiaIIaaaaaaaaaaaaaaaaNJaNKaNLaNMaNNaNOaNPaMAaiWaLAaNRaNSaIVaLAaNUaIlaNVaNWaNXaNYaJcaNZaKxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaMTaPzaLNaLPaOoaMVaOpaOpaOpaMVaMVaOqaOraOraOsaMWaOtaOuaOvaOvaOwaOxaOyaMjaKQaKQaKQaKQaKQaMwaOBaOCaODaaaaaaaHNaGYaGYaOEaGYaHaaOFaGYaOGaOHaOHaOHaOHaOIaOHaOJaGYaGYaGYaGYaGYaGYaGYaGYaHaaGZaMqaOKaOLaOLaMqaOMaONaOOaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMsaOPaOQaORaMsaOPaOQaORaNwaKcaHSaOSaHSaHSaHSaHSaHSaGnaOTaOUaOVaOWaOXaGnaLuaGnafOaOYaNCaOZaPaaPbaGnaPcaGnaGnaGnaGnaPcaLuaIIaaaaHQaHQaHQaHQaPdaNKaPeaPfaPgaPhaPiaPjaMAaLAaPkaPlaPlaPlaPmaPnaPoaPnaPnaPnaPpaPqaPraPsaPtaPtaPtaPtaPuaPvaPwaFFaPxaEjaAPaPyaOnaPzaLNaLPaMUaOpaPAaPAaPBaOpaMVaPCaPDaPDaPEaPFaOtaPGaPHaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaPLaPMaODaabaabaGXaGYaGYaHaaHaaHaaHPaHPaGXaGXaGXaHaaHaaHaaGXaPNaPOaGXaHaaHaaGXaHaaHaaGXaGXaPPaPQaPRaPSaPTaPUaPVaOKaPWaMqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNIaSdaSdaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaQcaHSaHSaGnaLuaGnaQdaabaQdaGnaJYaPbaGnaQeaQfaGnaNAaKcaGnaLuaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQpaQqaQraQsaQtaQuaQpaQpaQvaQvaQwaQxaQyaQzaQAaQBaPyaQCaPzaLNaLPaMUaOpaPAaQEaQFaOpaMVaPCaPDaPDaPEaQGaOtaPGaPIaPIaPJaMVaPKaODaKQaKQaKQaKQaKQaODaQHaPMaODaaaaaaaGXaQIaGYaGYaQJaHaaQKaHOaQLaQMaHbaGXaOFaHbaGXaQNaGYaGXaQOaGYaGXaQPaQQaQRaOHaQSaOHaQTaQUaQVaQWaQXaQYaQZaMqaMraMrafOafOaMraMraMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9181,9 +9183,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdboPboQboPboPboPboPboPboPboQboPboPboRaSfboSbgGboUaSfboVaSfboWboXboYboZbpaaMsbnwbnwbpbblMbpcbnDbnDbnDbnDbnDbnEbpdbnDbnDbnDbpeblMbnKbpfblRbpgbphbpiblTbpjbpkbplblTbpmbpnbpobppbpqbnTbnVbgSbnWbmbaaaaaaaaaaaabmcbmcbmcbmcbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbmcbmcbmcbmcaaaaaaaaaaaabmiboibhqbpCbpDbpEbpFbpGbpHbpEbpIbpJbpKbpLbpMbpNbmqbpObpPboobpQbpRboobpSbpTbpUbpVboobpWbpXbpYboBboAboAboBbpZbqabebbejaTgbaubmIbcpbljbljblkbljbcpbcpbqbbqcbcpbqdaYPbqebqfbqgboJboJbqhbqgbqiaYPbqjbqkbjKbjRbjRbndbnobjRbjRbjRbqnbjRbjRbjRbEJbjSbjSbjSbjSbqobeCblCbqoblAbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLdaLdaSdaSdaSdaSdaSdaSdaSdaSdaSdaLdaMsbgGboTbqrbqrbqrbqrbqrbqrbqsbqrbqrbqraMsbnwbnKbqtblMbqubnDbnDbqvbqwbqxbqybqvbnDbnDbnDbqzblMbnKbnLblRbqAbqBbqCblTbqDbqEbqFblTbqGbqHbqIbqJbqKbnTbqLbqMbnWbmbbmbbqNbmcbmcbmcbqObqPbqQbqRbqSbqSbqTbqUbqSbqVbqSbqWbqXbqYbqZbrabrbbmcbmcbmcbqNbmibmiboibhqbhqaUSbrcbrdbpMbrebmqbrfbrgbmqbrhbribpNbmqbonbooboobrjbrkbrlbrmbrnbrobrpboobqpbpXbrrboBboAboAbrsbrtbrubebbejaGYbaubrvbrwbrxbljblkbrybcpbcpbrzbcpbrAbrBaYPbrCbrDbrEboJboJbrFbrEbrGaYPbrHbqkbjKbjObGIbjMbjKbjKbrIbrJbrKbrLbrMbrKbrNbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCblCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObrPbrPbrQbrPbrPbrPbrRbrPbrPbrSaabaSdaUnaShbrTbqrbrUbrVbrWbrXbrYbrZbsabsbbqrbscbsdbsebsfblMbsgbnDbnDbqvbqxbshbsibqvbnDbnDbsjbskblMbnKbnLblRblRbslblRblTbsmbsnbsoblTbspbqJbsqbqJbsrbnTbnVbssbnWbgXbgXbstbsubsvbmcbswbptbsxbqSbqSbsybszbsAbsBbsAbsCbsDbsEbsFbsGbsHbsIbmcbsJbsubsKbsLbsMboibhqbhqbsNbmqbsObmqbmqbmqbsPbsQbmqbrhbsRbpNbmqbpObooboobsSbsTbsUbsVbsWbsXbrpbsYbebbqabrrboBboAboAboBbrtbtcbebbtdbtebaubtfbaubaubtgblkbthbtibcpbtjbtkbtlbtmbmUbtnbtobtpbtqbtqbtrbtsbttbmUbtubqqbrqbtwbjKbjMdsfbjKbtxbjRbjRbjRbjRbqnbijbtybeCblCblDblAbeCblCblDblAbeCbtzbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaSdaSdaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbtabjKbjKbjKbtbbALbjKbvgbqnbvhbvhbvhbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvkbvlaOQbvlaSfboSbqrbvmbrUbvnbvnbvnbvobrUbvpbqrbvqbvrbtNbvsbvsbvsbvsbvtbvsbvubnDbvvbvwbvxbvxbvybvzblMbvAbvBbvCbvDbvEbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvLbnVbvMbvNbvObvPbvQbvRbvSbvTbvUbusbvVbvWbvXbvXbvXbvXbvYbvXbvZbwabwbbwcbvVbwdbwebmcbwfbwgbwhbwibwjbwkbhqbhqbsNbmqbwlbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwnbooboobwobwpboobooboobwqbwrbwsbebbqabrrboBboBboBboBbrtbwtbebbwubwvbwvbwwbwvbwxbljbljbljbljbwybljbljbljbwzbveboJboJboJboJboJboJboJbvdbvebvfbtabjKboMboMboNboMbjKbwAbjRbwBbwCbwDbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbtabjKbqlbqlbqmbqlbjKbvgbqnbvhbvhbvhbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrObtAbtBbtCbtDbtDbtEbtDbtDbtDbtEbrQaSdaSdaSdaToboSbqrbrUbtFbtGbrUbtHbtIbtJbtKbqrbtLbtMbtNblQblMbtObtPbtQbtRbtSbtTbtUbtVbtVbtVbtWbtXblMbnKbsdbtYbtZbuabubblTblTblTblTblTbucbudbuebufbugbnTbnVbssbgSbgSbgSbuhbuibujbukbulbumbqSbunbuobupbuqburbusbutbuubuvbuwbuxbulbuybuzbuAbuBbuCbuDbuEbuEbuFbhqbuGaUSbmqbuHbuIbpNbmqbuJbuKbmqbuLbuMbpNbmqbonboobooboobopboobuNboobsXbrpbuObebbuPbrrboBboAboAboBbrtbuQbebbuRbuSbuTbuUbuVbuWbuXbuYbuZbuZbuZbuZbuZbuZbvabvbbvcboJboJboJboJboJboJbvdbvebvfbtabjKbjKbjKbtbbALbjKbvgbqnbwDbvhcUBbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvkbvlaOQbvlaSfboSbqrbvmbrUbvnbvnbvnbvobrUbvpbqrbvqbvrbtNbvsbvsbvsbvsbvtbvsbvubnDbvvbvwbvxbvxbvybvzblMbvAbvBbvCbvDbvEbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvLbnVbvMbvNbvObvPbvQbvRbvSbvTbvUbusbvVbvWbvXbvXbvXbvXbvYbvXbvZbwabwbbwcbvVbwdbwebmcbwfbwgbwhbwibwjbwkbhqbhqbsNbmqbwlbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwnbooboobwobwpboobooboobwqbwrbwsbebbqabrrboBboBboBboBbrtbwtbebbwubwvbwvbwwbwvbwxbljbljbljbljbwybljbljbljbwzbveboJboJboJboJboJboJboJbvdbvebvfbtabjKboMboMboNboMbjKbwAbjRbwBbwCcYKbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbwFbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblHbwLbrUbwMbvnbvnbvnbvobwMbrUbqrbwNbwObtNbvsbwPbwQbwRbwSbvsbwTbwUbwVblMbwWbwXbwYbwZblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxdbxebxebxebxfbxebxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxsbxtbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwkbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxCbxDbmqbxEbdTbxFbxGbdTbdTbxHbxIbxJbxIbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbtabjKbqlbqlbqmbqlbjKbvgbqnbwDbvhcUBbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwEbrPbrPbrQbrPbrPbrPbrRbrPbrPbydaabaSdbyebngbyfbqrbtFbtFbtFbrUbygbyhbyibyjbqrbykbylbtNbvsbymbvsbynbyobvsbypbyqbyrblMbwWbwXbwYbskblMbnKbxabxbbysbytbyubyvbywbxbbyxbyybyzbyAbyBbyBbyBbyCbyDbyEbyFbxlbyGbyHbyIbyJbyKbyLbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyTbyUbyVbyWbyXbyYbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzfbzgbzgbzgbzgbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbzmbtvbznbxKbjKbjMbjKbjKdsgbjRbjRbjRbjRbqnbijbzobeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUlaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzqbzrbqrbqrbqrbqrbqrbqrbzsbqrbqrbqrbnKbnKbztbvsbzubzvbynbzwbvsbzxbzybzzblMbwWbwXbwYbnDblMbnKbxabxbbzAbzBbzCbyvbzCbxbbyxbzDbzEbzFbzGbzHbzIbzJbzKbzLbyFbzMbzNbzObzPbzQbzQbzPbzRbzSbvXbzTbxqbxqbyPbzUbyPbxqbxqbzVbwbbzWbzXbzYbzZbAabAbbzYbAcbxvbAdbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAlbAmbAnbAkbAkbAobAkbAkbAkbAkbAkbAkbAkbAkbApbAqbArbArbArbArbArbArbAsbAibAtbAubAubAvbAwbAxbAwbAybAwbAzbAAbABbAwbACbADbAEbAFbAGbAGbAGbAGbAGbAGbAGbAHbAIbAJbAJbAKbAJbBObjKbjKbrIbAMbrKbANbrMbrKbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUnaShbAUbAVbAWbAXbAXbAXbAXbAYbAZbBablQbnwbBbbBcbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBfbBgblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyxbBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzMbBrbBsbBtbBubBvbBwbzRbBxbvXbBybyPbxqbBzbBAbBzbxqbyPbBBbxubBCbzYbzYbzZbBDbAbbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbDtbjKbjKbjKbjKbBQbjRbqnbjRbjRbjRbEJbjSdsidshbjSbBUaYUbBUaYUbDxbBRbBSbijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index d2988a6474f..fe7e2b0067c 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -114,4 +114,9 @@
// Atmos pipe limits
#define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at.
-#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at.
\ No newline at end of file
+#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at.
+
+// Atmos alarm defines
+#define ATMOS_ALARM_NONE 0
+#define ATMOS_ALARM_WARNING 1
+#define ATMOS_ALARM_DANGER 2
\ No newline at end of file
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 7ab8a19f86d..5a96b6e954f 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -54,6 +54,8 @@
#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles.
#define DEFAULT_MARKING_COLOURS list("head" = "#000000", "body" = "#000000", "tail" = "#000000") //Marking colours. Use instead of initial() for m_colours.
+#define OXYCONCEN_PLASMEN_IGNITION 0.5 //Moles of oxygen in the air needed to light up a poorly clothed Plasmaman. Same as LINDA requirements for plasma burning.
+
////////REAGENT STUFF////////
// How many units of reagent are consumed per tick, by default.
#define REAGENTS_METABOLISM 0.4
@@ -129,11 +131,21 @@
#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer))
#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian))
+
+
#define issilicon(A) (istype((A), /mob/living/silicon))
#define isAI(A) (istype((A), /mob/living/silicon/ai))
#define isrobot(A) (istype((A), /mob/living/silicon/robot))
#define ispAI(A) (istype((A), /mob/living/silicon/pai))
+// For the tcomms monitor
+#define ispathhuman(A) (ispath(A, /mob/living/carbon/human))
+#define ispathbrain(A) (ispath(A, /mob/living/carbon/brain))
+#define ispathslime(A) (ispath(A, /mob/living/carbon/slime))
+#define ispathbot(A) (ispath(A, /mob/living/simple_animal/bot))
+#define ispathsilicon(A) (ispath(A, /mob/living/silicon))
+#define ispathanimal(A) (ispath(A, /mob/living/simple_animal))
+
#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer))
#define isAIEye(A) (istype((A), /mob/camera/aiEye))
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index c6f0e9bf1c9..5edccb012e3 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -463,7 +463,7 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time =
G << 'sound/misc/notice2.ogg'//Alerting them to their consideration
if(flashwindow)
window_flash(G.client)
- switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Not This Round"))
+ switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","No","Yes","Not This Round"))
if("Yes")
to_chat(G, "Choice registered: Yes. ")
if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed.
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
index b0312d44134..aa73b686b9d 100644
--- a/code/__HELPERS/maths.dm
+++ b/code/__HELPERS/maths.dm
@@ -110,3 +110,9 @@ var/gaussian_next
if(new_val < bound_lower)
new_val = min(orig_val, bound_lower)
return new_val
+
+// sqrt, but if you give it a negative number, you get 0 instead of a runtime
+/proc/sqrtor0(num)
+ if(num < 0)
+ return 0
+ return sqrt(num)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 930e8244eb6..eb2305cfdb2 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -550,17 +550,17 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
var/turf/current = get_turf(source)
var/turf/target_turf = get_turf(target)
var/steps = 1
-
+
if(current != target_turf)
- current = get_step_towards(current, target_turf)
+ current = get_step_towards(current, target_turf)
while(current != target_turf)
- if(steps > length)
+ if(steps > length)
return 0
- if(current.opacity)
+ if(current.opacity)
return 0
for(var/thing in current)
var/atom/A = thing
- if(A.opacity)
+ if(A.opacity)
return 0
current = get_step_towards(current, target_turf)
steps++
@@ -1863,7 +1863,7 @@ var/global/list/g_fancy_list_of_types = null
pois[name] = A
return pois
-
+
/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20)
var/client/C
if(istype(mob_or_client, /mob))
@@ -1881,7 +1881,7 @@ var/global/list/g_fancy_list_of_types = null
C.color = flash_color
spawn(0)
animate(C, color = initial(C.color), time = flash_time)
-
+
#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255)))
/proc/make_bit_triplet()
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index c139b969df1..4d9a578b19a 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -25,8 +25,6 @@ var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
//Alt Heads
var/global/list/alt_heads_list = list() //stores /datum/sprite_accessory/alt_heads indexed by name
- //Backpacks
-var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
var/static/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.ogg','sound/weapons/armbomb.ogg','sound/voice/hiss1.ogg','sound/voice/hiss2.ogg', \
'sound/voice/hiss3.ogg','sound/voice/hiss4.ogg','sound/voice/hiss5.ogg','sound/voice/hiss6.ogg','sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg', \
@@ -62,4 +60,14 @@ var/global/list/phonetic_alphabet = list("Alpha", "Bravo", "Charlie",
var/global/list/numbers_as_words = list("One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve",
"Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen",
- "Eighteen", "Nineteen")
\ No newline at end of file
+ "Eighteen", "Nineteen")
+
+ //Backpacks
+#define GBACKPACK "Grey Backpack"
+#define GSATCHEL "Grey Satchel"
+#define GDUFFLEBAG "Grey Dufflebag"
+#define LSATCHEL "Leather Satchel"
+#define DBACKPACK "Department Backpack"
+#define DSATCHEL "Department Satchel"
+#define DDUFFLEBAG "Department Dufflebag"
+var/global/list/backbaglist = list(DBACKPACK, DSATCHEL, DDUFFLEBAG, GBACKPACK, GSATCHEL, GDUFFLEBAG, LSATCHEL)
\ No newline at end of file
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index 6c6a02b265f..a6b78bce94c 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -14,6 +14,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
"Thunderdome",
"UO45",
"UO45R",
+ "UO71",
"Xeno",
"Hotel"
)
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index 523965b66a1..f08afe5efb9 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1,4 +1,4 @@
-var/global/obj/effect/datacore/data_core = null
+var/global/datum/datacore/data_core = null
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index e65cc040917..9b056472bde 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -347,3 +347,21 @@ var/global/datum/controller/radio/radio_controller
var/list/L = data[i]
for(var/t in L)
. += "data\[\"[i]\"\] list has: [t]"
+
+/datum/signal/proc/get_race(mob/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ . = H.species.name
+ else if(isbrain(M))
+ var/mob/living/carbon/brain/B = M
+ . = B.get_race()
+ else if(issilicon(M))
+ . = "Artificial Life"
+ else if(isslime(M))
+ . = "Slime"
+ else if(isbot(M))
+ . = "Bot"
+ else if(isanimal(M))
+ . = "Domestic Animal"
+ else
+ . = "Unidentifiable"
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f1826c334c5..62a2bd9a39d 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -187,7 +187,7 @@
/datum/action/item_action/toggle_hardsuit_mode
name = "Toggle Hardsuit Mode"
-
+
/datum/action/item_action/toggle_unfriendly_fire
name = "Toggle Friendly Fire \[ON\]"
desc = "Toggles if the staff causes friendly fire."
@@ -357,7 +357,7 @@
..()
name = "Toggle [target.name]"
button.name = name
-
+
/datum/action/item_action/organ_action/use/New(Target)
..()
name = "Use [target.name]"
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 6a73d9108dd..364f39c208f 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -1,16 +1,231 @@
/hook/startup/proc/createDatacore()
- data_core = new /obj/effect/datacore()
+ data_core = new /datum/datacore()
return 1
-/obj/effect/datacore/proc/manifest(var/nosleep = 0)
- spawn()
- if(!nosleep)
- sleep(40)
- for(var/mob/living/carbon/human/H in player_list)
- manifest_inject(H)
- return
+/datum/datacore
+ var/list/medical = list()
+ var/list/general = list()
+ var/list/security = list()
+ //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
+ var/list/locked = list()
-/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
+/datum/datacore/proc/get_manifest(monochrome, OOC)
+ var/list/heads = new()
+ var/list/sec = new()
+ var/list/eng = new()
+ var/list/med = new()
+ var/list/sci = new()
+ var/list/ser = new()
+ var/list/sup = new()
+ var/list/bot = new()
+ var/list/misc = new()
+ var/list/isactive = new()
+ var/dat = {"
+
+
+ Name Rank Activity
+ "}
+ var/even = 0
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = t.fields["real_rank"]
+ if(OOC)
+ var/active = 0
+ for(var/mob/M in player_list)
+ if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
+ active = 1
+ break
+ isactive[name] = active ? "Active" : "Inactive"
+ else
+ isactive[name] = t.fields["p_stat"]
+ var/department = 0
+ if(real_rank in command_positions)
+ heads[name] = rank
+ department = 1
+ if(real_rank in security_positions)
+ sec[name] = rank
+ department = 1
+ if(real_rank in engineering_positions)
+ eng[name] = rank
+ department = 1
+ if(real_rank in medical_positions)
+ med[name] = rank
+ department = 1
+ if(real_rank in science_positions)
+ sci[name] = rank
+ department = 1
+ if(real_rank in service_positions)
+ ser[name] = rank
+ department = 1
+ if(real_rank in supply_positions)
+ sup[name] = rank
+ department = 1
+ if(real_rank in nonhuman_positions)
+ bot[name] = rank
+ department = 1
+ if(!department && !(name in heads))
+ misc[name] = rank
+ if(heads.len > 0)
+ dat += "Heads "
+ for(var/name in heads)
+ dat += "[name] [heads[name]] [isactive[name]] "
+ even = !even
+ if(sec.len > 0)
+ dat += "Security "
+ for(var/name in sec)
+ dat += "[name] [sec[name]] [isactive[name]] "
+ even = !even
+ if(eng.len > 0)
+ dat += "Engineering "
+ for(var/name in eng)
+ dat += "[name] [eng[name]] [isactive[name]] "
+ even = !even
+ if(med.len > 0)
+ dat += "Medical "
+ for(var/name in med)
+ dat += "[name] [med[name]] [isactive[name]] "
+ even = !even
+ if(sci.len > 0)
+ dat += "Science "
+ for(var/name in sci)
+ dat += "[name] [sci[name]] [isactive[name]] "
+ even = !even
+ if(ser.len > 0)
+ dat += "Service "
+ for(var/name in ser)
+ dat += "[name] [ser[name]] [isactive[name]] "
+ even = !even
+ if(sup.len > 0)
+ dat += "Supply "
+ for(var/name in sup)
+ dat += "[name] [sup[name]] [isactive[name]] "
+ even = !even
+ if(bot.len > 0)
+ dat += "Silicon "
+ for(var/name in bot)
+ dat += "[name] [bot[name]] [isactive[name]] "
+ even = !even
+ if(misc.len > 0)
+ dat += "Miscellaneous "
+ for(var/name in misc)
+ dat += "[name] [misc[name]] [isactive[name]] "
+ even = !even
+
+ dat += "
"
+ dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = replacetext(dat, "\t", "")
+ return dat
+
+
+/*
+We can't just insert in HTML into the nanoUI so we need the raw data to play with.
+Instead of creating this list over and over when someone leaves their PDA open to the page
+we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
+using /datum/datacore/proc/manifest_inject(), or manifest_insert()
+*/
+
+var/global/list/PDA_Manifest = list()
+
+/datum/datacore/proc/get_manifest_json()
+ if(PDA_Manifest.len)
+ return
+ var/heads[0]
+ var/sec[0]
+ var/eng[0]
+ var/med[0]
+ var/sci[0]
+ var/ser[0]
+ var/sup[0]
+ var/bot[0]
+ var/misc[0]
+ for(var/datum/data/record/t in data_core.general)
+ var/name = sanitize(t.fields["name"])
+ var/rank = sanitize(t.fields["rank"])
+ var/real_rank = t.fields["real_rank"]
+
+ var/isactive = t.fields["p_stat"]
+ var/department = 0
+ var/depthead = 0 // Department Heads will be placed at the top of their lists.
+ if(real_rank in command_positions)
+ heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ depthead = 1
+ if(rank == "Captain" && heads.len != 1)
+ heads.Swap(1, heads.len)
+
+ if(real_rank in security_positions)
+ sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sec.len != 1)
+ sec.Swap(1, sec.len)
+
+ if(real_rank in engineering_positions)
+ eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && eng.len != 1)
+ eng.Swap(1, eng.len)
+
+ if(real_rank in medical_positions)
+ med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && med.len != 1)
+ med.Swap(1, med.len)
+
+ if(real_rank in science_positions)
+ sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sci.len != 1)
+ sci.Swap(1, sci.len)
+
+ if(real_rank in service_positions)
+ ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && ser.len != 1)
+ ser.Swap(1, ser.len)
+
+ if(real_rank in supply_positions)
+ sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sup.len != 1)
+ sup.Swap(1, sup.len)
+
+ if(real_rank in nonhuman_positions)
+ bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+
+ if(!department && !(name in heads))
+ misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
+
+
+ PDA_Manifest = list(\
+ "heads" = heads,\
+ "sec" = sec,\
+ "eng" = eng,\
+ "med" = med,\
+ "sci" = sci,\
+ "ser" = ser,\
+ "sup" = sup,\
+ "bot" = bot,\
+ "misc" = misc\
+ )
+ return
+
+
+
+/datum/datacore/proc/manifest()
+ for(var/mob/living/carbon/human/H in player_list)
+ manifest_inject(H)
+
+/datum/datacore/proc/manifest_modify(name, assignment)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
var/datum/data/record/foundrecord
@@ -35,7 +250,8 @@
foundrecord.fields["rank"] = assignment
foundrecord.fields["real_rank"] = real_title
-/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
+var/record_id_num = 1001
+/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
@@ -50,7 +266,7 @@
else
assignment = "Unassigned"
- var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
+ var/id = num2hex(record_id_num++, 6)
//General Record
@@ -125,8 +341,7 @@
locked += L
return
-
-proc/get_id_photo(var/mob/living/carbon/human/H)
+/proc/get_id_photo(mob/living/carbon/human/H)
var/icon/preview_icon = null
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 172c4b63757..62e31105b92 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -43,11 +43,11 @@ Bonus
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
+ var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
+ var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm
index 917ec9f3bf1..b19d821b75f 100644
--- a/code/datums/diseases/advance/symptoms/fever.dm
+++ b/code/datums/diseases/advance/symptoms/fever.dm
@@ -36,6 +36,6 @@ Bonus
return
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
- var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
+ var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index ad828efdd4c..1466bc86459 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -45,13 +45,13 @@ Bonus
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(16+A.totalStealth()))
+ var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks/2)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
- var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth()))
+ var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth()))
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index e99f6f2835b..9cfdf8a9d34 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -38,6 +38,6 @@ Bonus
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
- var/get_damage = ((sqrt(16-A.totalStealth()))*5)
+ var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 11235d9a35b..007bbc92f0b 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -34,7 +34,7 @@ Bonus
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
+ var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
return 1
@@ -148,7 +148,7 @@ Bonus
level = 5
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
- var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
+ var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))
M.adjustBrainLoss(-amt_healed)
//Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT]
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index a26a19de048..d52a0a02256 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -35,6 +35,6 @@ Bonus
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
- var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
+ var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
\ No newline at end of file
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
new file mode 100644
index 00000000000..9517ee09ef8
--- /dev/null
+++ b/code/datums/outfits/outfit.dm
@@ -0,0 +1,143 @@
+/datum/outfit
+ var/name = "Naked"
+ var/collect_not_del = FALSE
+
+ var/uniform = null
+ var/suit = null
+ var/back = null
+ var/belt = null
+ var/gloves = null
+ var/shoes = null
+ var/head = null
+ var/mask = null
+ var/l_ear = null
+ var/r_ear = null
+ var/glasses = null
+ var/id = null
+ var/l_pocket = null
+ var/r_pocket = null
+ var/suit_store = null
+ var/l_hand = null
+ var/r_hand = null
+ var/pda = null
+ var/internals_slot = null //ID of slot containing a gas tank
+ var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
+
+
+/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ //to be overriden for customization depending on client prefs,species etc
+ return
+
+// Used to equip an item to the mob. Mainly to prevent copypasta for collect_not_del.
+/datum/outfit/proc/equip_item(mob/living/carbon/human/H, path, slot)
+ var/obj/item/I = new path(H)
+ if(collect_not_del)
+ H.equip_or_collect(I, slot)
+ else
+ H.equip_to_slot_or_del(I, slot)
+
+/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ //to be overriden for toggling internals, id binding, access etc
+ return
+
+/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ pre_equip(H, visualsOnly)
+
+ //Start with uniform,suit,backpack for additional slots
+ if(uniform)
+ equip_item(H, uniform, slot_w_uniform)
+ if(suit)
+ equip_item(H, suit, slot_wear_suit)
+ if(back)
+ equip_item(H, back, slot_back)
+ if(belt)
+ equip_item(H, belt, slot_belt)
+ if(gloves)
+ equip_item(H, gloves, slot_gloves)
+ if(shoes)
+ equip_item(H, shoes, slot_shoes)
+ if(head)
+ equip_item(H, head, slot_head)
+ if(mask)
+ equip_item(H, mask, slot_wear_mask)
+ if(l_ear)
+ equip_item(H, l_ear, slot_l_ear)
+ if(r_ear)
+ equip_item(H, r_ear, slot_r_ear)
+ if(glasses)
+ equip_item(H, glasses, slot_glasses)
+ if(id)
+ equip_item(H, id, slot_wear_id)
+ if(suit_store)
+ equip_item(H, suit_store, slot_s_store)
+
+ if(l_hand)
+ H.put_in_l_hand(new l_hand(H))
+ if(r_hand)
+ H.put_in_r_hand(new r_hand(H))
+
+ if(pda)
+ equip_item(H, pda, slot_wear_pda)
+
+ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
+ if(l_pocket)
+ equip_item(H, l_pocket, slot_l_store)
+ if(r_pocket)
+ equip_item(H, r_pocket, slot_r_store)
+
+ for(var/path in backpack_contents)
+ var/number = backpack_contents[path]
+ for(var/i = 0, i < number, i++)
+ equip_item(H, path, slot_in_backpack)
+
+ post_equip(H, visualsOnly)
+
+ if(!visualsOnly)
+ apply_fingerprints(H)
+ if(internals_slot)
+ H.internal = H.get_item_by_slot(internals_slot)
+ H.update_action_buttons_icon()
+
+ H.update_body()
+ return 1
+
+/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(H.back)
+ H.back.add_fingerprint(H, 1) //The 1 sets a flag to ignore gloves
+ for(var/obj/item/I in H.back.contents)
+ I.add_fingerprint(H, 1)
+ if(H.wear_id)
+ H.wear_id.add_fingerprint(H, 1)
+ if(H.w_uniform)
+ H.w_uniform.add_fingerprint(H, 1)
+ if(H.wear_suit)
+ H.wear_suit.add_fingerprint(H, 1)
+ if(H.wear_mask)
+ H.wear_mask.add_fingerprint(H, 1)
+ if(H.head)
+ H.head.add_fingerprint(H, 1)
+ if(H.shoes)
+ H.shoes.add_fingerprint(H, 1)
+ if(H.gloves)
+ H.gloves.add_fingerprint(H, 1)
+ if(H.l_ear)
+ H.l_ear.add_fingerprint(H, 1)
+ if(H.r_ear)
+ H.r_ear.add_fingerprint(H, 1)
+ if(H.glasses)
+ H.glasses.add_fingerprint(H, 1)
+ if(H.belt)
+ H.belt.add_fingerprint(H, 1)
+ for(var/obj/item/I in H.belt.contents)
+ I.add_fingerprint(H, 1)
+ if(H.s_store)
+ H.s_store.add_fingerprint(H, 1)
+ if(H.l_store)
+ H.l_store.add_fingerprint(H, 1)
+ if(H.r_store)
+ H.r_store.add_fingerprint(H, 1)
+ if(H.wear_pda)
+ H.wear_pda.add_fingerprint(H, 1)
+ return 1
\ No newline at end of file
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
new file mode 100644
index 00000000000..e0027a71302
--- /dev/null
+++ b/code/datums/outfits/outfit_admin.dm
@@ -0,0 +1,1066 @@
+// Used for 'select equipment'
+// code/modules/admin/verbs/debug.dm 566
+
+/proc/apply_to_card(obj/item/weapon/card/id/I, mob/living/carbon/human/H, list/access = list(), rank, special_icon)
+ if(!istype(I) || !istype(H))
+ return 0
+
+ I.access = access
+ I.registered_name = H.real_name
+ I.rank = rank
+ I.assignment = rank
+ I.sex = capitalize(H.gender)
+ I.age = H.age
+ I.name = "[I.registered_name]'s ID Card ([I.assignment])"
+ I.photo = get_id_photo(H)
+
+ if(special_icon)
+ I.icon_state = special_icon
+
+/datum/outfit/admin
+/datum/outfit/admin/spacegear
+ name = "Standard Space Gear"
+
+ uniform = /obj/item/clothing/under/color/grey
+ suit = /obj/item/clothing/suit/space
+ back = /obj/item/weapon/tank/jetpack/oxygen
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/space
+ mask = /obj/item/clothing/mask/breath
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+
+/datum/outfit/admin/spacegear/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ var/obj/item/weapon/tank/jetpack/J = H.back
+ J.turn_on()
+ J.toggle_internals(H)
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Space Explorer")
+
+
+
+/datum/outfit/admin/rig
+ back = /obj/item/weapon/tank/jetpack/oxygen
+ mask = /obj/item/clothing/mask/breath
+ id = /obj/item/weapon/card/id
+
+/datum/outfit/admin/rig/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ var/obj/item/weapon/tank/jetpack/J = H.back
+ J.turn_on()
+ J.toggle_internals(H)
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "RIG Tester")
+
+/datum/outfit/admin/rig/engineer
+ name = "Engineer RIG"
+ suit = /obj/item/clothing/suit/space/rig
+ head = /obj/item/clothing/head/helmet/space/rig
+
+/datum/outfit/admin/rig/ce
+ name = "CE RIG"
+ suit = /obj/item/clothing/suit/space/rig/elite
+ head = /obj/item/clothing/head/helmet/space/rig/elite
+
+/datum/outfit/admin/rig/mining
+ name = "Mining RIG"
+ suit = /obj/item/clothing/suit/space/rig/mining
+ head = /obj/item/clothing/head/helmet/space/rig/mining
+
+/datum/outfit/admin/rig/syndi
+ name = "Syndi RIG"
+ suit = /obj/item/clothing/suit/space/rig/syndi
+ head = /obj/item/clothing/head/helmet/space/rig/syndi
+
+/datum/outfit/admin/rig/wizard
+ name = "Wizard RIG"
+ suit = /obj/item/clothing/suit/space/rig/wizard
+ head = /obj/item/clothing/head/helmet/space/rig/wizard
+
+/datum/outfit/admin/rig/medical
+ name = "Medical RIG"
+ suit = /obj/item/clothing/suit/space/rig/medical
+ head = /obj/item/clothing/head/helmet/space/rig/medical
+
+/datum/outfit/admin/rig/atmos
+ name = "Atmos RIG"
+ suit = /obj/item/clothing/suit/space/rig/atmos
+ head = /obj/item/clothing/head/helmet/space/rig/atmos
+
+
+/datum/outfit/admin/tournament
+ suit = /obj/item/clothing/suit/armor/vest
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/thunderdome
+ r_pocket = /obj/item/weapon/grenade/smokebomb
+ l_hand = /obj/item/weapon/kitchen/knife
+ r_hand = /obj/item/weapon/gun/energy/pulse/destroyer
+
+/datum/outfit/admin/tournament/red
+ name = "Tournament Standard Red"
+ uniform = /obj/item/clothing/under/color/red
+
+/datum/outfit/admin/tournament/green
+ name = "Tournament Standard Green"
+ uniform = /obj/item/clothing/under/color/green
+
+/datum/outfit/admin/tournament_gangster //gangster are supposed to fight each other. --rastaf0
+ name = "Tournament Gangster"
+
+ uniform = /obj/item/clothing/under/det
+ suit = /obj/item/clothing/suit/storage/det_suit
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/det_hat
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ l_pocket = /obj/item/ammo_box/a357
+ r_hand = /obj/item/weapon/gun/projectile/automatic/proto
+
+/datum/outfit/admin/tournament_chef //Steven Seagal FTW
+ name = "Tournament Chef"
+
+ uniform = /obj/item/clothing/under/rank/chef
+ suit = /obj/item/clothing/suit/chef
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/chefhat
+ l_pocket = /obj/item/weapon/kitchen/knife
+ r_pocket = /obj/item/weapon/kitchen/knife
+ l_hand = /obj/item/weapon/kitchen/knife
+ r_hand = /obj/item/weapon/kitchen/rollingpin
+
+/datum/outfit/admin/tournament_janitor
+ name = "Tournament Janitor"
+
+ uniform = /obj/item/clothing/under/rank/janitor
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/black
+ l_hand = /obj/item/weapon/reagent_containers/glass/bucket
+ backpack_contents = list(
+ /obj/item/weapon/grenade/chem_grenade/cleaner = 2,
+ /obj/item/stack/tile/plasteel = 7
+ )
+
+/datum/outfit/admin/tournament_janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/reagent_containers/R = H.l_hand
+ if(istype(R))
+ R.reagents.add_reagent("water", 70)
+
+
+
+/datum/outfit/admin/pirate
+ name = "Pirate"
+
+ uniform = /obj/item/clothing/under/pirate
+ back = /obj/item/weapon/storage/backpack/satchel
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/bandana
+ glasses = /obj/item/clothing/glasses/eyepatch
+ id = /obj/item/weapon/card/id
+ r_hand = /obj/item/weapon/melee/energy/sword/pirate
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Pirate")
+
+/datum/outfit/admin/pirate/space
+ name = "Space Pirate"
+
+ suit = /obj/item/clothing/suit/space/pirate
+ head = /obj/item/clothing/head/helmet/space/pirate
+
+/datum/outfit/admin/pirate/space/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..(H, TRUE)
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Space Pirate")
+
+
+
+/datum/outfit/admin/tunnel_clown
+ name = "Tunnel Clown"
+
+ uniform = /obj/item/clothing/under/rank/clown
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/clown_shoes
+ mask = /obj/item/clothing/mask/gas/clown_hat
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id
+ l_pocket = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
+ r_pocket = /obj/item/weapon/bikehorn
+ r_hand = /obj/item/weapon/twohanded/fireaxe
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown")
+
+
+
+/datum/outfit/admin/mime_assassin
+ name = "Mime Assassin"
+
+ uniform = /obj/item/clothing/under/mime
+ suit = /obj/item/clothing/suit/suspenders
+ back = /obj/item/weapon/storage/backpack/mime
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/beret
+ mask = /obj/item/clothing/mask/gas/mime
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate
+ pda = /obj/item/device/pda/mime
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 1,
+ /obj/item/weapon/storage/box/syndie_kit/caneshotgun = 1,
+ /obj/item/toy/crayon/mime = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/weapon/suppressor = 1,
+ /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath = 2,
+ /obj/item/weapon/pen/sleepy = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/mime_assassin/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ uniform = /obj/item/clothing/under/sexymime
+ suit = /obj/item/clothing/mask/gas/sexymime
+
+/datum/outfit/admin/mime_assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Mime"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_mime, access_theatre, access_maint_tunnels), "Mime")
+
+
+
+/datum/outfit/admin/survivor
+ name = "Survivor"
+
+ uniform = /obj/item/clothing/under/overalls
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/latex
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/survivor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ for(var/obj/item/I in H.contents)
+ if(!istype(I, /obj/item/weapon/implant))
+ I.add_blood(H)
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Survivor")
+
+
+
+/datum/outfit/admin/greytide
+ name = "Greytide"
+
+ uniform = /obj/item/clothing/under/color/grey
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/brown
+ mask = /obj/item/clothing/mask/gas
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ l_hand = /obj/item/weapon/storage/toolbox/mechanical
+ r_hand = /obj/item/flag/grey
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Greytide")
+
+/datum/outfit/admin/greytide/leader
+ name = "Greytide Leader"
+
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/yellow
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/clothing/head/welding = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..(H, TRUE)
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Greytide Leader")
+
+/datum/outfit/admin/greytide/xeno
+ name = "Greytide Xeno"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/xenos
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/color/yellow
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/xenos
+ glasses = /obj/item/clothing/glasses/thermal
+ l_pocket = /obj/item/weapon/tank/emergency_oxygen/double/full
+ r_pocket = /obj/item/toy/toy_xeno
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/clothing/head/welding = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/greytide/xeno/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..(H, TRUE)
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Legit Xenomorph")
+
+
+
+/datum/outfit/admin/masked_killer
+ name = "Masked Killer"
+
+ uniform = /obj/item/clothing/under/overalls
+ suit = /obj/item/clothing/suit/apron
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/latex
+ shoes = /obj/item/clothing/shoes/white
+ head = /obj/item/clothing/head/welding
+ mask = /obj/item/clothing/mask/surgical
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/kitchen/knife
+ r_pocket = /obj/item/weapon/scalpel
+ r_hand = /obj/item/weapon/twohanded/fireaxe
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+/datum/outfit/admin/masked_killer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ for(var/obj/item/I in H.contents)
+ if(!istype(I, /obj/item/weapon/implant))
+ I.add_blood(H)
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Masked Killer", "syndie")
+
+
+
+/datum/outfit/admin/dark_lord
+ name = "Dark Lord"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ l_hand = /obj/item/weapon/twohanded/dualsaber/red
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1,
+ )
+
+/datum/outfit/admin/dark_lord/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/clothing/suit/hooded/chaplain_hoodie/C = H.wear_suit
+ if(istype(C))
+ C.name = "dark lord robes"
+ C.hood.name = "dark lord hood"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Dark Lord", "syndie")
+
+
+
+/datum/outfit/admin/assassin
+ name = "Assassin"
+
+ uniform = /obj/item/clothing/under/suit_jacket
+ suit = /obj/item/clothing/suit/wcoat
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/melee/energy/sword/saber
+ l_hand = /obj/item/weapon/storage/secure/briefcase
+ pda = /obj/item/device/pda/heads
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1
+ )
+
+ var/briefcase_contents = list(
+ /obj/item/weapon/spacecash/c1000 = 3,
+ /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow = 1,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 1
+ )
+
+/datum/outfit/admin/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/storage/secure/briefcase/B = H.l_hand
+ if(istype(B))
+ for(var/obj/item/I in B)
+ qdel(I)
+ for(var/path in briefcase_contents)
+ var/number = backpack_contents[path]
+ for(var/i = 0, i < number, i++)
+ B.handle_item_insertion(new path(B), 1)
+
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Reaper"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Reaper", "syndie")
+
+
+
+/datum/outfit/admin/spy
+ name = "Spy"
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/hud/security/chameleon
+ id = /obj/item/weapon/card/id/syndicate
+ l_pocket = /obj/item/weapon/melee/energy/sword/saber
+ r_pocket = /obj/item/weapon/pen/sleepy
+ pda = /obj/item/device/pda/heads
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/weapon/suppressor = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/implanter/storage = 1
+ )
+
+/datum/outfit/admin/spy/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/clothing/gloves/combat/G = H.gloves
+ if(istype(G))
+ G.name = "black gloves"
+
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Spy"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(access_maint_tunnels), "Spy", "syndie")
+
+
+
+/datum/outfit/admin/vox
+ name = "Vox"
+ uniform = /obj/item/clothing/under/vox/vox_robes
+ suit = /obj/item/clothing/suit/space/vox/carapace
+ back = /obj/item/weapon/storage/backpack
+ gloves = /obj/item/clothing/gloves/color/yellow/vox
+ shoes = /obj/item/clothing/shoes/magboots/vox
+ head = /obj/item/clothing/head/helmet/space/vox/carapace
+ mask = /obj/item/clothing/mask/gas/syndicate
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/thermal/monocle
+ id = /obj/item/weapon/card/id/syndicate/vox
+ l_pocket = /obj/item/weapon/melee/classic_baton/telescopic
+ r_pocket = /obj/item/weapon/tank/emergency_oxygen/vox
+ backpack_contents = list(
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/restraints/handcuffs/cable/zipties = 1,
+ /obj/item/device/flash = 1,
+ /obj/item/weapon/gun/energy/noisecannon = 1
+ )
+
+/datum/outfit/admin/vox/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(H.get_species() == "Vox Armalis")
+ . = ..()
+ else
+ H.equip_vox_raider()
+ H.regenerate_icons()
+
+/datum/outfit/admin/vox/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Vox Armalis", "syndie")
+
+
+
+/datum/outfit/admin/death_commando
+ name = "Death Commando"
+
+/datum/outfit/admin/death_commando/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ return H.equip_death_commando()
+
+
+
+/datum/outfit/admin/syndicate
+ name = "Syndicate Agent"
+
+ uniform = /obj/item/clothing/under/syndicate
+ back = /obj/item/weapon/storage/backpack
+ belt = /obj/item/weapon/storage/belt/utility/full/multitool
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ r_pocket = /obj/item/device/radio/uplink
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1
+ )
+
+ var/id_icon = "syndie"
+ var/uplink_uses = 20
+
+/datum/outfit/admin/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_syndicate_access("Syndicate Operative"), name, id_icon)
+
+ var/obj/item/device/radio/uplink/U = H.r_store
+ if(istype(U))
+ U.hidden_uplink.uplink_owner = "[H.key]"
+ U.hidden_uplink.uses = uplink_uses
+
+ var/obj/item/device/radio/R = H.l_ear
+ if(istype(R))
+ R.set_frequency(SYND_FREQ)
+
+/datum/outfit/admin/syndicate/bomber
+ name = "Syndicate Bomber"
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/radio/beacon/syndicate/bomb = 2,
+ /obj/item/device/syndicatedetonator = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1
+ )
+
+/datum/outfit/admin/syndicate/operative
+ name = "Syndicate Operative"
+
+ suit = /obj/item/clothing/suit/space/rig/syndi
+ belt = /obj/item/weapon/storage/belt/military
+ head = /obj/item/clothing/head/helmet/space/rig/syndi
+ mask = /obj/item/clothing/mask/gas/syndicate
+ l_ear = /obj/item/device/radio/headset/syndicate/alt
+ glasses = /obj/item/clothing/glasses/night
+ l_pocket = /obj/item/weapon/pinpointer/advpinpointer
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/reagent_containers/food/pill/initropidril = 1,
+ /obj/item/weapon/gun/projectile/automatic/pistol = 1,
+ /obj/item/ammo_box/magazine/m10mm = 1,
+ /obj/item/weapon/crowbar/red = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/tank/jetpack/oxygen/harness = 1,
+ )
+
+/datum/outfit/admin/syndicate/operative/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/implant/explosive/E = new(H)
+ E.implant(H)
+
+/datum/outfit/admin/syndicate_strike_team
+ name = "Syndicate Strike Team"
+
+/datum/outfit/admin/syndicate_strike_team/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ return H.equip_syndicate_commando()
+
+/datum/outfit/admin/syndicate/officer
+ name = "Syndicate Officer"
+
+ suit = /obj/item/clothing/suit/space/syndicate/black/red/strike
+ belt = /obj/item/weapon/storage/belt/military
+ head = /obj/item/clothing/head/helmet/space/syndicate/black/red/strike
+ mask = /obj/item/clothing/mask/gas/syndicate
+ l_ear = /obj/item/device/radio/headset/syndicate/alt
+ glasses = /obj/item/clothing/glasses/thermal
+ l_pocket = /obj/item/weapon/pinpointer/advpinpointer
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/reagent_containers/food/pill/initropidril = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1,
+ /obj/item/weapon/tank/jetpack/oxygen/harness = 1
+ )
+
+ id_icon = "commander"
+ uplink_uses = 50
+
+/datum/outfit/admin/syndicate/officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/implant/dust/D = new(H)
+ D.implant(H)
+
+
+
+/datum/outfit/admin/nt_vip
+ name = "NT VIP Guest"
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ back = /obj/item/weapon/storage/backpack/satchel
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/that
+ l_ear = /obj/item/device/radio/headset/ert
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1
+ )
+
+/datum/outfit/admin/nt_vip/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("VIP Guest"), "VIP Guest")
+
+/datum/outfit/admin/nt_navy_officer
+ name = "NT Navy Officer"
+
+ uniform = /obj/item/clothing/under/rank/centcom/officer
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/officer
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_navy_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer")
+
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ H.sec_hud_set_implants()
+
+/datum/outfit/admin/nt_navy_captain
+ name = "NT Navy Captain"
+
+ uniform = /obj/item/clothing/under/rank/centcom/captain
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/captain
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_navy_captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain")
+
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ H.sec_hud_set_implants()
+
+/datum/outfit/admin/nt_special_ops_officer
+ name = "NT Special Ops Officer"
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/deathsquad/officer
+ back = /obj/item/weapon/storage/backpack/security
+ belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/deathsquad/beret
+ mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/thermal/cyber
+ id = /obj/item/weapon/card/id/centcom
+ r_pocket = /obj/item/weapon/storage/box/matches
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/tank/emergency_oxygen/double/full = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1,
+ /obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/weapon/twohanded/dualsaber/red = 1,
+ /obj/item/weapon/pinpointer/advpinpointer = 1,
+ /obj/item/weapon/reagent_containers/hypospray/combat/nanites = 1,
+ /obj/item/weapon/storage/box/flashbangs = 1,
+ /obj/item/weapon/storage/box/zipties = 1,
+ /obj/item/clothing/shoes/magboots/advance = 1,
+ /obj/item/weapon/implanter/loyalty = 1,
+ )
+
+/datum/outfit/admin/nt_special_ops_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer")
+
+
+
+/datum/outfit/admin/nt_special_ops_formal
+ name = "NT Special Ops Formal"
+
+ uniform = /obj/item/clothing/under/rank/centcom/captain
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/deathsquad/beret
+ mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/thermal/cyber
+ id = /obj/item/weapon/card/id/centcom
+ r_pocket = /obj/item/weapon/storage/box/matches
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+/datum/outfit/admin/nt_special_ops_formal/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = "Special Operations Officer"
+ PDA.icon_state = "pda-syndi"
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+ PDA.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer")
+
+
+
+/datum/outfit/admin/singuloth_knight
+ name = "Singuloth Knight"
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/rig/singuloth
+ back = /obj/item/weapon/twohanded/knighthammer
+ belt = /obj/item/weapon/claymore/ceremonial
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/magboots
+ head = /obj/item/clothing/head/helmet/space/rig/singuloth
+ mask = /obj/item/clothing/mask/breath
+ l_ear = /obj/item/device/radio/headset/ert
+ glasses = /obj/item/clothing/glasses/meson/cyber
+ id = /obj/item/weapon/card/id
+ suit_store = /obj/item/weapon/tank/oxygen
+
+/datum/outfit/admin/singuloth_knight/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Singuloth Knight")
+
+
+
+/datum/outfit/admin/wizard
+ uniform = /obj/item/clothing/under/color/lightpurple
+ suit = /obj/item/clothing/suit/wizrobe
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/sandal
+ head = /obj/item/clothing/head/wizard
+ l_ear = /obj/item/device/radio/headset
+ id = /obj/item/weapon/card/id
+ r_pocket = /obj/item/weapon/teleportation_scroll
+ l_hand = /obj/item/weapon/twohanded/staff
+ r_hand = /obj/item/weapon/spellbook
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1
+ )
+
+/datum/outfit/admin/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Wizard")
+
+/datum/outfit/admin/wizard/blue
+ name = "Blue Wizard"
+ // the default wizard clothes are blue
+
+/datum/outfit/admin/wizard/red
+ name = "Red Wizard"
+
+ suit = /obj/item/clothing/suit/wizrobe/red
+ head = /obj/item/clothing/head/wizard/red
+
+/datum/outfit/admin/wizard/marisa
+ name = "Marisa Wizard"
+
+ suit = /obj/item/clothing/suit/wizrobe/marisa
+ shoes = /obj/item/clothing/shoes/sandal/marisa
+ head = /obj/item/clothing/head/wizard/marisa
+
+
+
+/datum/outfit/admin/soviet
+ uniform = /obj/item/clothing/under/soviet
+ back = /obj/item/weapon/storage/backpack/satchel
+ head = /obj/item/clothing/head/ushanka
+ id = /obj/item/weapon/card/id
+
+
+/datum/outfit/admin/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), name)
+
+/datum/outfit/admin/soviet/tourist
+ name = "Soviet Tourist"
+
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1
+ )
+
+/datum/outfit/admin/soviet/soldier
+ name = "Soviet Soldier"
+
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ l_ear = /obj/item/device/radio/headset/syndicate
+ glasses = /obj/item/clothing/glasses/sunglasses
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/card/emag = 1,
+ /obj/item/device/flashlight = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 2,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 3
+ )
+
+/datum/outfit/admin/soviet/admiral
+ name = "Soviet Admiral"
+
+ suit = /obj/item/clothing/suit/hgpirate
+ belt = null
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/hgpiratecap
+ mask = null
+ l_ear = /obj/item/device/radio/headset/syndicate
+ r_ear = null
+ glasses = /obj/item/clothing/glasses/thermal/eyepatch
+ id = null
+ l_pocket = null
+ r_pocket = null
+ suit_store = null
+ l_hand = null
+ r_hand = null
+ pda = null
+
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/engineer = 1,
+ /obj/item/weapon/gun/projectile/revolver/mateba = 1,
+ /obj/item/ammo_box/a357 = 3
+ )
+
+
+
+/datum/outfit/admin/chrono
+ name = "Chrono Legionnaire"
+
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/space/chronos
+ back = /obj/item/weapon/chrono_eraser
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/helmet/space/chronos
+ mask = /obj/item/clothing/mask/gas/syndicate
+ glasses = /obj/item/clothing/glasses/night
+ id = /obj/item/weapon/card/id/syndicate
+ suit_store = /obj/item/weapon/tank/emergency_oxygen/double/full
+
+/datum/outfit/admin/chrono/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses() + get_all_centcom_access(), name, "syndie")
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index dab251125a7..b5fe11fc096 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1408,6 +1408,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/head/collectable/flatcap,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/collectable/kitty,
+ /obj/item/clothing/head/crown/fancy,
/obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/collectable/hardhat,
@@ -1527,9 +1528,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/beach_ball)
cost = 20
containername = "polo supply crate"
-
-///////////// Station Goals
-
+
+///////////// Station Goals
+
/datum/supply_packs/misc/bsa
name = "Bluespace Artillery Parts"
cost = 150
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 8ec413450b0..fd6b0938108 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -17,7 +17,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area
var/fire = null
- var/atmosalm = 0
+ var/atmosalm = ATMOS_ALARM_NONE
var/poweralm = 1
var/party = null
var/radalert = 0
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index ec70d50c504..eb743afad62 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -53,7 +53,7 @@
/area/proc/atmosalert(danger_level, var/alarm_source)
- if(danger_level == 0)
+ if(danger_level == ATMOS_ALARM_NONE)
atmosphere_alarm.clearAlarm(src, alarm_source)
else
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
@@ -64,10 +64,10 @@
danger_level = max(danger_level, AA.danger_level)
if(danger_level != atmosalm)
- if(danger_level < 1 && atmosalm >= 1)
+ if(danger_level < ATMOS_ALARM_WARNING && atmosalm >= ATMOS_ALARM_WARNING)
//closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise
air_doors_open()
- else if(danger_level >= 2 && atmosalm < 2)
+ else if(danger_level >= ATMOS_ALARM_DANGER && atmosalm < ATMOS_ALARM_DANGER)
air_doors_close()
atmosalm = danger_level
@@ -81,9 +81,10 @@
/area/proc/air_doors_close()
if(!air_doors_activated)
- air_doors_activated = 1
+ air_doors_activated = TRUE
for(var/obj/machinery/door/firedoor/D in src)
if(!D.welded)
+ D.activate_alarm()
if(D.operating)
D.nextstate = CLOSED
else if(!D.density)
@@ -92,9 +93,10 @@
/area/proc/air_doors_open()
if(air_doors_activated)
- air_doors_activated = 0
+ air_doors_activated = FALSE
for(var/obj/machinery/door/firedoor/D in src)
if(!D.welded)
+ D.deactivate_alarm()
if(D.operating)
D.nextstate = OPEN
else if(D.density)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 82f7ffb2e93..c8a4d91038e 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -426,3 +426,7 @@ var/global/list/bad_blocks[0]
species = data["species"]
b_type = data["b_type"]
real_name = data["real_name"]
+
+// a nice hook for if/when we refactor species on dna
+/datum/dna/proc/get_species_name()
+ return species
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 6e50736e722..2476753b34b 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -399,6 +399,7 @@ var/bomb_set
/obj/item/weapon/disk/nuclear/New()
..()
processing_objects.Add(src)
+ poi_list |= src
/obj/item/weapon/disk/nuclear/process()
var/turf/disk_loc = get_turf(src)
@@ -414,10 +415,12 @@ var/bomb_set
if(force)
message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP ":"nonexistent location"]).")
log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).")
+ poi_list.Remove(src)
processing_objects.Remove(src)
return ..()
if(blobstart.len > 0)
+ poi_list.Remove(src)
var/obj/item/weapon/disk/nuclear/NEWDISK = new(pick(blobstart))
transfer_fingerprints_to(NEWDISK)
message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP ). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP ).")
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index c00e0436473..99a400acfe6 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -157,7 +157,7 @@
wizard_mob.faction = list("wizard")
- wizard_mob.species.equip(wizard_mob)
+ wizard_mob.species.after_equip_job(null, wizard_mob)
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 58d041b9442..2a72f32bedf 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -93,18 +93,21 @@
/var/const/access_cent_bridge = 113//Bridge.
/var/const/access_cent_commander = 114//Commander's Office/ID computer.
- //The Syndicate
+//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
/var/const/access_syndicate_leader = 151//Nuke Op Leader Access
/var/const/access_vox = 152//Vox Access
//Trade Stations
-
var/const/access_trade_sol = 160
- //MONEY
+//MONEY
/var/const/access_crate_cash = 200
+//Awaymissions
+/var/const/access_away01 = 271
+
+
/obj/var/list/req_access = null
/obj/var/req_access_txt = "0"
/obj/var/list/req_one_access = null
diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm
index d5cba5be3d0..9d3d5a7ab7a 100644
--- a/code/game/jobs/job/central.dm
+++ b/code/game/jobs/job/central.dm
@@ -8,36 +8,37 @@
spawn_positions = 5
supervisors = "the admins"
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/centcom
access = list()
minimal_access = list()
admin_only = 1
-
-/datum/job/ntnavyofficer/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(H), slot_in_backpack)
-
- H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack)
-
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/ntnavyofficer
/datum/job/ntnavyofficer/get_access()
return get_centcom_access(title)
+/datum/outfit/job/ntnavyofficer
+ name = "Nanotrasen Navy Officer"
+ jobtype = /datum/job/ntnavyofficer
+
+ uniform = /obj/item/clothing/under/rank/centcom/officer
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/beret/centcom/officer
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/gun/energy/pulse/pistol = 1,
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/satchel
+
+
// CC Officials who lead ERTs, Death Squads, etc.
/datum/job/ntspecops
@@ -48,33 +49,34 @@
spawn_positions = 5
supervisors = "the admins"
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/centcom
access = list()
minimal_access = list()
admin_only = 1
spawn_ert = 1
-
-/datum/job/ntspecops/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/clothing/under/syndicate/combat(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/combat(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer/navy(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/suit/space/deathsquad/officer(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_belt)
- H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack)
-
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/ntspecops
/datum/job/ntspecops/get_access()
return get_centcom_access(title)
+
+/datum/outfit/job/ntspecops
+ name = "Special Operations Officer"
+ jobtype = /datum/job/ntspecops
+
+ uniform = /obj/item/clothing/under/syndicate/combat
+ suit = /obj/item/clothing/suit/space/deathsquad/officer
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/beret/centcom/officer/navy
+ l_ear = /obj/item/device/radio/headset/centcom
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/centcom
+ pda = /obj/item/device/pda/centcom
+ backpack_contents = list(
+ /obj/item/weapon/implanter/dust = 1,
+ /obj/item/weapon/gun/energy/pulse/pistol/m1911 = 1,
+ /obj/item/weapon/implanter/death_alarm = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/satchel
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index a6f1ef11749..40b1dfd8bd1 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -9,20 +9,19 @@
access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access()
alt_titles = list("Tourist","Businessman","Trader","Assistant")
-
-/datum/job/civilian/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/color/random(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ outfit = /datum/outfit/job/assistant
/datum/job/civilian/get_access()
if(config.assistant_maint)
return list(access_maint_tunnels)
else
return list()
+
+/datum/outfit/job/assistant
+ name = "Civilian"
+ jobtype = /datum/job/civilian
+
+ uniform = /obj/item/clothing/under/color/random
+ shoes = /obj/item/clothing/shoes/black
+
+
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 7e6f664252f..1cdff2ec775 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -7,7 +7,6 @@
is_engineering = 1
supervisors = "the captain"
selection_color = "#ffeeaa"
- idtype = /obj/item/weapon/card/id/ce
req_admin_notify = 1
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
@@ -20,24 +19,28 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/chief_engineer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/ce(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat/white(H), slot_head)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
+/datum/outfit/job/chief_engineer
+ name = "Chief Engineer"
+ jobtype = /datum/job/chief_engineer
+ uniform = /obj/item/clothing/under/rank/chief_engineer
+ belt = /obj/item/weapon/storage/belt/utility/full
+ gloves = /obj/item/clothing/gloves/color/black/ce
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/hardhat/white
+ l_ear = /obj/item/device/radio/headset/heads/ce
+ id = /obj/item/weapon/card/id/ce
+ pda = /obj/item/device/pda/heads/ce
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
/datum/job/engineer
@@ -49,26 +52,29 @@
is_engineering = 1
supervisors = "the chief engineer"
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_mineral_storeroom)
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- return 1
+ outfit = /datum/outfit/job/engineer
+
+/datum/outfit/job/engineer
+ name = "Station Engineer"
+ jobtype = /datum/job/engineer
+
+ uniform = /obj/item/clothing/under/rank/engineer
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/workboots
+ head = /obj/item/clothing/head/hardhat
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ l_pocket = /obj/item/device/t_scanner
+ pda = /obj/item/device/pda/engineering
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
@@ -81,24 +87,24 @@
is_engineering = 1
supervisors = "the chief engineer"
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_mineral_storeroom)
minimal_access = list(access_eva, access_atmospherics, access_maint_tunnels, access_external_airlocks, access_emergency_storage, access_construction, access_mineral_storeroom)
alt_titles = list("Atmospheric Technician")
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
- H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- return 1
+ outfit = /datum/outfit/job/atmos
+
+/datum/outfit/job/atmos
+ name = "Life Support Specialist"
+ jobtype = /datum/job/atmos
+
+ uniform = /obj/item/clothing/under/rank/atmospheric_technician
+ belt = /obj/item/weapon/storage/belt/utility/atmostech
+ shoes = /obj/item/clothing/shoes/workboots
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ pda = /obj/item/device/pda/atmos
+
+ box = /obj/item/weapon/storage/box/engineer
/datum/job/mechanic
title = "Mechanic"
@@ -109,24 +115,27 @@
is_engineering = 1
supervisors = "the chief engineer"
selection_color = "#fff5cc"
- idtype = /obj/item/weapon/card/id/engineering
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom)
+ outfit = /datum/outfit/job/mechanic
+/datum/outfit/job/mechanic
+ name = "Mechanic"
+ jobtype = /datum/job/mechanic
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/mechanic(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/pod_paint_bucket(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/mechanic
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/workboots
+ head = /obj/item/clothing/head/hardhat
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ id = /obj/item/weapon/card/id/engineering
+ r_pocket = /obj/item/device/t_scanner
+ pda = /obj/item/device/pda/engineering
+ backpack_contents = list(
+ /obj/item/weapon/pod_paint_bucket = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering
+ box = /obj/item/weapon/storage/box/engineer
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index b4dc5610ce6..bf78f7b56b3 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -29,9 +29,6 @@
//Sellection screen color
var/selection_color = "#ffffff"
- //the type of the ID the player will have
- var/idtype = /obj/item/weapon/card/id
-
//List of alternate titles, if any
var/list/alt_titles
@@ -57,14 +54,32 @@
var/admin_only = 0
var/spawn_ert = 0
+ var/outfit = null
+
/////////////////////////////////
// /vg/ feature: Job Objectives!
/////////////////////////////////
var/required_objectives=list() // Objectives that are ALWAYS added.
var/optional_objectives=list() // Objectives that are SOMETIMES added.
-/datum/job/proc/equip(var/mob/living/carbon/human/H)
- return 1
+//Only override this proc
+/datum/job/proc/after_spawn(mob/living/carbon/human/H)
+
+/datum/job/proc/announce(mob/living/carbon/human/H)
+
+/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE)
+ if(!H)
+ return 0
+
+ H.species.before_equip_job(src, H, visualsOnly)
+
+ if(outfit)
+ H.equipOutfit(outfit, visualsOnly)
+
+ H.species.after_equip_job(src, H, visualsOnly)
+
+ if(!visualsOnly && announce)
+ announce(H)
/datum/job/proc/get_access()
if(!config) //Needed for robots.
@@ -94,44 +109,139 @@
return max(0, minimal_player_age - C.player_age)
-/datum/job/proc/apply_fingerprints(var/mob/living/carbon/human/H)
- if(!istype(H))
- return
- if(H.back)
- H.back.add_fingerprint(H,1) //The 1 sets a flag to ignore gloves
- for(var/obj/item/I in H.back.contents)
- I.add_fingerprint(H,1)
- if(H.wear_id)
- H.wear_id.add_fingerprint(H,1)
- if(H.w_uniform)
- H.w_uniform.add_fingerprint(H,1)
- if(H.wear_suit)
- H.wear_suit.add_fingerprint(H,1)
- if(H.wear_mask)
- H.wear_mask.add_fingerprint(H,1)
- if(H.head)
- H.head.add_fingerprint(H,1)
- if(H.shoes)
- H.shoes.add_fingerprint(H,1)
- if(H.gloves)
- H.gloves.add_fingerprint(H,1)
- if(H.l_ear)
- H.l_ear.add_fingerprint(H,1)
- if(H.r_ear)
- H.r_ear.add_fingerprint(H,1)
- if(H.glasses)
- H.glasses.add_fingerprint(H,1)
- if(H.belt)
- H.belt.add_fingerprint(H,1)
- for(var/obj/item/I in H.belt.contents)
- I.add_fingerprint(H,1)
- if(H.s_store)
- H.s_store.add_fingerprint(H,1)
- if(H.l_store)
- H.l_store.add_fingerprint(H,1)
- if(H.r_store)
- H.r_store.add_fingerprint(H,1)
- return 1
-
/datum/job/proc/is_position_available()
return (current_positions < total_positions) || (total_positions == -1)
+
+/datum/outfit/job
+ name = "Standard Gear"
+ collect_not_del = TRUE // we don't want anyone to lose their job shit
+
+ var/jobtype = null
+
+ uniform = /obj/item/clothing/under/color/grey
+ id = /obj/item/weapon/card/id
+ l_ear = /obj/item/device/radio/headset
+ back = /obj/item/weapon/storage/backpack
+ shoes = /obj/item/clothing/shoes/black
+ pda = /obj/item/device/pda
+
+ var/list/implants = null
+
+ var/backpack = /obj/item/weapon/storage/backpack
+ var/satchel = /obj/item/weapon/storage/backpack/satchel_norm
+ var/dufflebag = /obj/item/weapon/storage/backpack/duffel
+ var/box = /obj/item/weapon/storage/box/survival
+
+ var/tmp/list/gear_leftovers = list()
+
+/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ switch(H.backbag)
+ if(GBACKPACK)
+ back = /obj/item/weapon/storage/backpack //Grey backpack
+ if(GSATCHEL)
+ back = /obj/item/weapon/storage/backpack/satchel_norm //Grey satchel
+ if(GDUFFLEBAG)
+ back = /obj/item/weapon/storage/backpack/duffel //Grey Dufflebag
+ if(LSATCHEL)
+ back = /obj/item/weapon/storage/backpack/satchel //Leather Satchel
+ if(DSATCHEL)
+ back = satchel //Department satchel
+ if(DDUFFLEBAG)
+ back = dufflebag //Department dufflebag
+ else
+ back = backpack //Department backpack
+
+ var/datum/job/J = job_master.GetJobType(jobtype)
+ if(!J)
+ J = job_master.GetJob(H.job)
+
+ if(box)
+ backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
+ backpack_contents[box] = 1
+
+ if(H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
+ for(var/gear in H.client.prefs.gear)
+ var/datum/gear/G = gear_datums[gear]
+ if(G)
+ var/permitted = FALSE
+
+ if(G.allowed_roles)
+ if(name in G.allowed_roles)
+ permitted = TRUE
+ else
+ permitted = TRUE
+
+ if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ permitted = FALSE
+
+ if(!permitted)
+ to_chat(H, "Your current job or whitelist status does not permit you to spawn with [gear]! ")
+ continue
+
+ if(G.slot)
+ if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot))
+ to_chat(H, "Equipping you with [gear]! ")
+ else
+ gear_leftovers += G
+ else
+ gear_leftovers += G
+
+/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+
+ var/datum/job/J = job_master.GetJobType(jobtype)
+ if(!J)
+ J = job_master.GetJob(H.job)
+
+ var/obj/item/weapon/card/id/C = H.wear_id
+ if(istype(C))
+ C.access = J.get_access()
+ C.registered_name = H.real_name
+ C.rank = J.title
+ C.assignment = J.title
+ C.sex = capitalize(H.gender)
+ C.age = H.age
+ C.name = "[C.registered_name]'s ID Card ([C.assignment])"
+ C.photo = get_id_photo(H)
+
+ if(H.mind && H.mind.initial_account)
+ C.associated_account_number = H.mind.initial_account.account_number
+
+ H.sec_hud_set_ID()
+
+ var/obj/item/device/pda/PDA = H.wear_pda
+ if(istype(PDA))
+ PDA.owner = H.real_name
+ PDA.ownjob = C.assignment
+ PDA.ownrank = C.rank
+ PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+
+ if(implants)
+ for(var/implant_type in implants)
+ var/obj/item/weapon/implant/I = new implant_type(H)
+ I.imp_in = H
+ I.implanted = 1
+ H.sec_hud_set_implants()
+
+ if(gear_leftovers.len)
+ for(var/datum/gear/G in gear_leftovers)
+ var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name]))
+ if(istype(placed_in))
+ if(isturf(placed_in))
+ to_chat(H, "Placing \the [G] on [placed_in]! ")
+ else
+ to_chat(H, "Placing \the [G] in [placed_in.name]]")
+ continue
+ if(H.equip_to_appropriate_slot(G))
+ to_chat(H, "Placing \the [G] in your inventory! ")
+ continue
+ if(H.put_in_hands(G))
+ to_chat(H, "Placing \the [G] in your hands! ")
+ continue
+ to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug. ")
+ qdel(G)
+
+ qdel(gear_leftovers)
+
+ return 1
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 9e4e5f5acee..3c6d6f7fe01 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -7,7 +7,6 @@
is_medical = 1
supervisors = "the captain"
selection_color = "#ffddf0"
- idtype = /obj/item/weapon/card/id/cmo
req_admin_notify = 1
access = list(access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
@@ -18,25 +17,27 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/cmo
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
+/datum/outfit/job/cmo
+ name = "Chief Medical Officer"
+ jobtype = /datum/job/cmo
+ uniform = /obj/item/clothing/under/rank/chief_medical_officer
+ suit = /obj/item/clothing/suit/storage/labcoat/cmo
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/heads/cmo
+ id = /obj/item/weapon/card/id/cmo
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/heads/cmo
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
/datum/job/doctor
title = "Medical Doctor"
@@ -47,54 +48,56 @@
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_surgery, access_maint_tunnels)
alt_titles = list("Surgeon","Nurse","Coroner")
minimal_player_age = 3
+ outfit = /datum/outfit/job/doctor
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(H.mind.role_alt_title)
- switch(H.mind.role_alt_title)
- if("Coroner")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/mortician(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/mortician(H), slot_wear_suit)
- if(H.backbag != 1)
- H.equip_or_collect(new /obj/item/clothing/head/surgery/black(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/autopsy_scanner(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/mass_spectrometer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/bodybags(H), slot_in_backpack)
- if("Surgeon")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/head/surgery/blue(H), slot_head)
- if("Medical Doctor")
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- if("Nurse")
- if(H.gender == FEMALE)
- if(prob(50))
- H.equip_or_collect(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/head/nursehat(H), slot_head)
+/datum/outfit/job/doctor
+ name = "Medical Doctor"
+ jobtype = /datum/job/doctor
+
+ uniform = /obj/item/clothing/under/rank/medical
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/medical
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+
+/datum/outfit/job/doctor/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Coroner")
+ uniform = /obj/item/clothing/under/rank/medical/mortician
+ suit = /obj/item/clothing/suit/storage/labcoat/mortician
+ backpack_contents = list(
+ /obj/item/clothing/head/surgery/black = 1,
+ /obj/item/weapon/autopsy_scanner = 1,
+ /obj/item/device/mass_spectrometer = 1,
+ /obj/item/weapon/storage/box/bodybags = 1
+ )
+ if("Surgeon")
+ uniform = /obj/item/clothing/under/rank/medical/blue
+ head = /obj/item/clothing/head/surgery/blue
+ if("Medical Doctor")
+ uniform = /obj/item/clothing/under/rank/medical
+ if("Nurse")
+ if(H.gender == FEMALE)
+ if(prob(50))
+ uniform = /obj/item/clothing/under/rank/nursesuit
else
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/nurse
+ head = /obj/item/clothing/head/nursehat
+ else
+ uniform = /obj/item/clothing/under/rank/medical/purple
@@ -108,28 +111,27 @@
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_chemistry, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Pharmacist","Pharmacologist")
minimal_player_age = 7
+ outfit = /datum/outfit/job/chemist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/glasses/science(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/chemist
+ name = "Chemist"
+ jobtype = /datum/job/chemist
+ uniform = /obj/item/clothing/under/rank/chemist
+ suit = /obj/item/clothing/suit/storage/labcoat/chemist
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_med
+ glasses = /obj/item/clothing/glasses/science
+ id = /obj/item/weapon/card/id/medical
+ pda = /obj/item/device/pda/chemist
+ backpack = /obj/item/weapon/storage/backpack/chemistry
+ satchel = /obj/item/weapon/storage/backpack/satchel_chem
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/chemistry
/datum/job/geneticist
title = "Geneticist"
@@ -140,25 +142,27 @@
is_medical = 1
supervisors = "the chief medical officer and the research director"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research, access_maint_tunnels)
minimal_player_age = 3
+ outfit = /datum/outfit/job/geneticist
+
+/datum/outfit/job/geneticist
+ name = "Geneticist"
+ jobtype = /datum/job/geneticist
+
+ uniform = /obj/item/clothing/under/rank/geneticist
+ suit = /obj/item/clothing/suit/storage/labcoat/genetics
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_medsci
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/geneticist
+
+ backpack = /obj/item/weapon/storage/backpack/genetics
+ satchel = /obj/item/weapon/storage/backpack/satchel_gen
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/genetics
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
/datum/job/virologist
title = "Virologist"
@@ -169,27 +173,28 @@
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_virology, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Pathologist","Microbiologist")
minimal_player_age = 7
+ outfit = /datum/outfit/job/virologist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/virologist
+ name = "Virologist"
+ jobtype = /datum/job/virologist
+
+ uniform = /obj/item/clothing/under/rank/virologist
+ suit = /obj/item/clothing/suit/storage/labcoat/virologist
+ shoes = /obj/item/clothing/shoes/white
+ mask = /obj/item/clothing/mask/surgical
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/viro
+
+ backpack = /obj/item/weapon/storage/backpack/virology
+ satchel = /obj/item/weapon/storage/backpack/satchel_vir
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/virology
/datum/job/psychiatrist
title = "Psychiatrist"
@@ -200,34 +205,33 @@
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist)
minimal_access = list(access_medical, access_psychiatrist, access_maint_tunnels)
alt_titles = list("Psychologist","Therapist")
+ outfit = /datum/outfit/job/psychiatrist
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(H.mind.role_alt_title)
- switch(H.mind.role_alt_title)
- if("Psychiatrist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
- if("Psychologist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
- if("Therapist")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/psychiatrist
+ name = "Psychiatrist"
+ jobtype = /datum/job/psychiatrist
+
+ uniform = /obj/item/clothing/under/rank/medical
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/laceup
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ suit_store = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/medical
+
+/datum/outfit/job/psychiatrist/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Psychiatrist")
+ uniform = /obj/item/clothing/under/rank/psych
+ if("Psychologist")
+ uniform = /obj/item/clothing/under/rank/psych/turtleneck
+ if("Therapist")
+ uniform = /obj/item/clothing/under/rank/medical
/datum/job/paramedic
title = "Paramedic"
@@ -238,23 +242,29 @@
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
- idtype = /obj/item/weapon/card/id/medical
access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_player_age = 3
+ outfit = /datum/outfit/job/paramedic
+/datum/outfit/job/paramedic
+ name = "Paramedic"
+ jobtype = /datum/job/paramedic
+
+ uniform = /obj/item/clothing/under/rank/medical/paramedic
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/soft/blue
+ mask = /obj/item/clothing/mask/cigarette
+ l_ear = /obj/item/device/radio/headset/headset_med
+ id = /obj/item/weapon/card/id/medical
+ l_pocket = /obj/item/device/flashlight/pen
+ pda = /obj/item/device/pda/medical
+ backpack_contents = list(
+ /obj/item/device/healthanalyzer = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+ box = /obj/item/weapon/storage/box/engineer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- if(H.backbag == 2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
- if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/cigarette(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/head/soft/blue(H), slot_head)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/healthanalyzer(H), slot_in_backpack)
- return 1
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 2e07a08b2bc..2701589b2db 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -1,4 +1,4 @@
-/datum/job/rd
+/datum/job/rd
title = "Research Director"
flag = RD
department_flag = MEDSCI
@@ -7,42 +7,45 @@
is_science = 1
supervisors = "the captain"
selection_color = "#ffddff"
- req_admin_notify = 1
- idtype = /obj/item/weapon/card/id/rd
+ req_admin_notify = 1
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
- access_research, access_robotics, access_xenobiology, access_ai_upload,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_mineral_storeroom)
+ access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_mineral_storeroom)
minimal_access = list(access_eva, access_rd, access_heads, access_tox, access_genetics, access_morgue,
- access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
- access_research, access_robotics, access_xenobiology, access_ai_upload,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom)
+ access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
+ access_research, access_robotics, access_xenobiology, access_ai_upload,
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom)
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
// All science-y guys get bonuses for maxing out their tech.
- required_objectives=list(
+ required_objectives = list(
/datum/job_objective/further_research
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- return 1
-
-
+ )
+
+ outfit = /datum/outfit/job/rd
+
+/datum/outfit/job/rd
+ name = "Research Director"
+ jobtype = /datum/job/rd
+
+ uniform = /obj/item/clothing/under/rank/research_director
+ suit = /obj/item/clothing/suit/storage/labcoat
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/heads/rd
+ id = /obj/item/weapon/card/id/rd
+ l_hand = /obj/item/weapon/clipboard
+ pda = /obj/item/device/pda/heads/rd
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/science
+ satchel = /obj/item/weapon/storage/backpack/satchel_tox
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/science
+
/datum/job/scientist
title = "Scientist"
@@ -53,33 +56,34 @@
is_science = 1
supervisors = "the research director"
selection_color = "#ffeeff"
- idtype = /obj/item/weapon/card/id/research
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_mineral_storeroom)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist", "Chemical Researcher")
minimal_player_age = 3
// All science-y guys get bonuses for maxing out their tech.
- required_objectives=list(
+ required_objectives = list(
/datum/job_objective/further_research
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/science(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_wear_pda)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
-
-
-
+ )
+
+ outfit = /datum/outfit/job/scientist
+
+/datum/outfit/job/scientist
+ name = "Scientist"
+ jobtype = /datum/job/scientist
+
+ uniform = /obj/item/clothing/under/rank/scientist
+ suit = /obj/item/clothing/suit/storage/labcoat/science
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_sci
+ id = /obj/item/weapon/card/id/research
+ pda = /obj/item/device/pda/toxins
+
+ backpack = /obj/item/weapon/storage/backpack/science
+ satchel = /obj/item/weapon/storage/backpack/satchel_tox
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/science
+
+
/datum/job/roboticist
title = "Roboticist"
flag = ROBOTICIST
@@ -89,28 +93,26 @@
is_science = 1
supervisors = "the research director"
selection_color = "#ffeeff"
- idtype = /obj/item/weapon/card/id/research
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_maint_tunnels, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
minimal_player_age = 3
- required_objectives=list(
+ required_objectives = list(
/datum/job_objective/make_cyborg,
/datum/job_objective/make_ripley
- )
-
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ )
+
+ outfit = /datum/outfit/job/roboticist
+
+/datum/outfit/job/roboticist
+ name = "Roboticist"
+ jobtype = /datum/job/roboticist
+
+ uniform = /obj/item/clothing/under/rank/roboticist
+ suit = /obj/item/clothing/suit/storage/labcoat
+ belt = /obj/item/weapon/storage/belt/utility/full
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_sci
+ id = /obj/item/weapon/card/id/research
+ pda = /obj/item/device/pda/roboticist
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index cd1e3fb370d..62b248c4875 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -7,7 +7,6 @@
is_security = 1
supervisors = "the captain"
selection_color = "#ffdddd"
- idtype = /obj/item/weapon/card/id/hos
req_admin_notify = 1
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_pilot, access_morgue, access_maint_tunnels, access_all_personal_lockers,
@@ -20,30 +19,32 @@
minimal_player_age = 21
exp_requirements = 600
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/hos
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos/alt(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black/hos(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/head/HoS(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/hos
+ name = "Head of Security"
+ jobtype = /datum/job/hos
+
+ uniform = /obj/item/clothing/under/rank/head_of_security
+ suit = /obj/item/clothing/suit/armor/hos
+ gloves = /obj/item/clothing/gloves/color/black/hos
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS
+ l_ear = /obj/item/device/radio/headset/heads/hos/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/hos
+ suit_store = /obj/item/weapon/gun/energy/gun
+ pda = /obj/item/device/pda/heads/hos
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
@@ -56,37 +57,37 @@
is_security = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 21
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ outfit = /datum/outfit/job/warden
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
-// H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/warden
+ name = "Warden"
+ jobtype = /datum/job/warden
+
+ uniform = /obj/item/clothing/under/rank/warden
+ suit = /obj/item/clothing/suit/armor/vest/warden
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/warden
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/warden
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
@@ -100,50 +101,53 @@
supervisors = "the head of security"
selection_color = "#ffeeee"
alt_titles = list("Forensic Technician")
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
alt_titles = list("Forensic Technician")
minimal_player_age = 14
exp_requirements = 300
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/det(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/toy/crayon/white(H), slot_l_store)
-/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
- CIG.light("")
- H.equip_or_collect(CIG, slot_wear_mask) */
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/noir(H),slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
- H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit/forensics/blue(H), slot_wear_suit)
- else
- H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/head/det_hat(H), slot_head)
- H.equip_or_collect(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/detective_scanner(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
+ outfit = /datum/outfit/job/detective
- H.dna.SetSEState(SOBERBLOCK,1)
- H.mutations += SOBER
- H.check_mutations = 1
- return 1
+/datum/outfit/job/detective
+ name = "Detective"
+ jobtype = /datum/job/detective
+ uniform = /obj/item/clothing/under/det
+ suit = /obj/item/clothing/suit/storage/det_suit
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/det_hat
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/sunglasses/noir
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/toy/crayon/white
+ r_pocket = /obj/item/weapon/lighter/zippo
+ pda = /obj/item/device/pda/detective
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/evidence = 1,
+ /obj/item/device/detective_scanner = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+/datum/outfit/job/detective/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind.role_alt_title)
+ switch(H.mind.role_alt_title)
+ if("Forensic Technician")
+ suit = /obj/item/clothing/suit/storage/det_suit/forensics/blue
+ head = null
+
+/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ H.dna.SetSEState(SOBERBLOCK,1)
+ H.mutations += SOBER
+ H.check_mutations = 1
/datum/job/officer
title = "Security Officer"
@@ -154,34 +158,38 @@
is_security = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons)
minimal_player_age = 14
exp_requirements = 300
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/security(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/officer
+
+/datum/outfit/job/officer
+ name = "Security Officer"
+ jobtype = /datum/job/officer
+
+ uniform = /obj/item/clothing/under/rank/security
+ suit = /obj/item/clothing/suit/armor/vest/security
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/helmet
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/security
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+
+
/datum/job/brigdoc
title = "Brig Physician"
@@ -192,30 +200,31 @@
is_security = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_morgue, access_surgery, access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels)
+ outfit = /datum/outfit/job/brigdoc
+
+/datum/outfit/job/brigdoc
+ name = "Brig Physician"
+ jobtype = /datum/job/brigdoc
+
+ uniform = /obj/item/clothing/under/rank/security/brigphys
+ suit = /obj/item/clothing/suit/storage/fr_jacket
+ shoes = /obj/item/clothing/shoes/white
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/health/health_advanced
+ id = /obj/item/weapon/card/id/security
+ suit_store = /obj/item/device/flashlight/pen
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ pda = /obj/item/device/pda/medical
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel = /obj/item/weapon/storage/backpack/satchel_med
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
+
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security/brigphys(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
/datum/job/pilot
title = "Security Pod Pilot"
@@ -226,28 +235,31 @@
is_security = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
- idtype = /obj/item/weapon/card/id/security
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons, access_pilot, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons, access_pilot, access_external_airlocks)
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/security/pod_pilot(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/jacket/pilot(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/pilot
+
+/datum/outfit/job/pilot
+ name = "Security Pod Pilot"
+ jobtype = /datum/job/pilot
+
+ uniform = /obj/item/clothing/under/rank/security/pod_pilot
+ suit = /obj/item/clothing/suit/jacket/pilot
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/flash
+ suit_store = /obj/item/weapon/gun/energy/gun/advtaser
+ pda = /obj/item/device/pda/security
+ backpack_contents = list(
+ /obj/item/weapon/restraints/handcuffs = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel = /obj/item/weapon/storage/backpack/satchel_sec
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+ box = /obj/item/weapon/storage/box/engineer
\ No newline at end of file
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 1331db02791..1b092087997 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -11,9 +11,9 @@
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
+/datum/job/ai/equip(mob/living/carbon/human/H)
+ if(!H)
+ return 0
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
@@ -32,6 +32,7 @@
exp_type = EXP_TYPE_CREW
alt_titles = list("Android", "Robot")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
\ No newline at end of file
+/datum/job/cyborg/equip(mob/living/carbon/human/H)
+ if(!H)
+ return 0
+ return H.Robotize()
\ No newline at end of file
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 981753c5aee..4394147cb37 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -7,7 +7,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
spawn_positions = 1
supervisors = "Nanotrasen officials"
selection_color = "#ccccff"
- idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
is_command = 1
access = list() //See get_access()
@@ -15,36 +14,46 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
minimal_player_age = 30
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
+ outfit = /datum/outfit/job/captain
+
+/datum/job/captain/get_access()
+ return get_all_accesses()
+
+/datum/job/captain/announce(mob/living/carbon/human/H)
+ . = ..()
+ captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
+ callHook("captain_spawned", list("captain" = H))
+
+/datum/outfit/job/captain
+ name = "Captain"
+ jobtype = /datum/job/captain
+
+ uniform = /obj/item/clothing/under/rank/captain
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/caphat
+ l_ear = /obj/item/device/radio/headset/heads/captain/alt
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/gold
+ pda = /obj/item/device/pda/captain
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/ids = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/captain
+ satchel = /obj/item/weapon/storage/backpack/satchel_cap
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/captain
+
+/datum/outfit/job/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H && H.w_uniform)
+ var/obj/item/clothing/under/U = H.w_uniform
var/obj/item/clothing/accessory/medal/gold/captain/M = new /obj/item/clothing/accessory/medal/gold/captain(U)
U.accessories += M
M.on_attached(U)
- H.equip_or_collect(U, slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/caphat(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
- callHook("captain_spawned", list("captain" = H))
- return 1
-
- get_access()
- return get_all_accesses()
@@ -56,7 +65,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -75,22 +83,25 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons, access_mineral_storeroom)
+ outfit = /datum/outfit/job/hop
+
+/datum/outfit/job/hop
+ name = "Head of Personnel"
+ jobtype = /datum/job/hop
+
+ uniform = /obj/item/clothing/under/rank/head_of_personnel
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/hopcap
+ l_ear = /obj/item/device/radio/headset/heads/hop
+ id = /obj/item/weapon/card/id/silver
+ pda = /obj/item/device/pda/heads/hop
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/ids = 1,
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list()
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/hop(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/head/hopcap(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
/datum/job/nanotrasenrep
@@ -101,7 +112,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
spawn_positions = 1
supervisors = "the command staff"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -118,25 +128,26 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons, access_ntrep)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/ntrep(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/ntcane(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/lighter/zippo/nt_rep(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/nanotrasenrep
+
+/datum/outfit/job/nanotrasenrep
+ name = "Nanotrasen Representative"
+ jobtype = /datum/job/nanotrasenrep
+
+ uniform = /obj/item/clothing/under/rank/ntrep
+ suit = /obj/item/clothing/suit/storage/ntrep
+ shoes = /obj/item/clothing/shoes/centcom
+ l_ear = /obj/item/device/radio/headset/heads/ntrep
+ id = /obj/item/weapon/card/id/nanotrasen
+ l_pocket = /obj/item/weapon/lighter/zippo/nt_rep
+ pda = /obj/item/device/pda/heads/ntrep
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/ntcane = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+
/datum/job/blueshield
title = "Blueshield"
@@ -146,7 +157,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
spawn_positions = 1
supervisors = "the Nanotrasen representative"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_command = 1
minimal_player_age = 21
@@ -159,27 +169,29 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
minimal_access = list(access_forensics_lockers, access_sec_doors, access_medical, access_construction, access_engine, access_maint_tunnels, access_research,
access_RC_announce, access_keycard_auth, access_heads, access_blueshield, access_weapons)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/blueshield/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/blueshield(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/blueshield
+
+/datum/outfit/job/blueshield
+ name = "Blueshield"
+ jobtype = /datum/job/blueshield
+
+ uniform = /obj/item/clothing/under/rank/blueshield
+ suit = /obj/item/clothing/suit/armor/vest/blueshield
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/jackboots
+ l_ear = /obj/item/device/radio/headset/heads/blueshield/alt
+ glasses = /obj/item/clothing/glasses/hud/health/health_advanced
+ id = /obj/item/weapon/card/id/nanotrasen
+ pda = /obj/item/device/pda/heads/blueshield
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/deathimp = 1,
+ /obj/item/weapon/gun/energy/gun/blueshield = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+ backpack = /obj/item/weapon/storage/backpack/security
+
/datum/job/judge
title = "Magistrate"
@@ -189,7 +201,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
spawn_positions = 1
supervisors = "the Nanotrasen Supreme Court"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/nanotrasen
req_admin_notify = 1
is_legal = 1
minimal_player_age = 30
@@ -201,27 +212,28 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_magistrate)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/heads/magistrate/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/judgerobe(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/powdered_wig(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+ outfit = /datum/outfit/job/judge
+
+/datum/outfit/job/judge
+ name = "Magistrate"
+ jobtype = /datum/job/judge
+
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ suit = /obj/item/clothing/suit/judgerobe
+ shoes = /obj/item/clothing/shoes/centcom
+ head = /obj/item/clothing/head/powdered_wig
+ l_ear = /obj/item/device/radio/headset/heads/magistrate/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/nanotrasen
+ l_pocket = /obj/item/device/flash
+ pda = /obj/item/device/pda/heads/magistrate
+ backpack_contents = list(
+ /obj/item/weapon/melee/classic_baton/telescopic = 1
+ )
+
+ implants = list(/obj/item/weapon/implant/loyalty)
+
+
//var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds.
/datum/job/lawyer
@@ -239,26 +251,21 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
minimal_player_age = 30
exp_requirements = 300
exp_type = EXP_TYPE_CREW
- idtype = /obj/item/weapon/card/id/security
+ outfit = /datum/outfit/job/lawyer
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/storage/internalaffairs(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
- L.imp_in = H
- L.implanted = 1
- H.sec_hud_set_implants()
- return 1
+/datum/outfit/job/lawyer
+ name = "Internal Affairs Agent"
+ jobtype = /datum/job/lawyer
+
+ uniform = /obj/item/clothing/under/rank/internalaffairs
+ suit = /obj/item/clothing/suit/storage/internalaffairs
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/headset_sec/alt
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ id = /obj/item/weapon/card/id/security
+ l_pocket = /obj/item/device/laser_pointer
+ r_pocket = /obj/item/device/flash
+ l_hand = /obj/item/weapon/storage/briefcase
+ pda = /obj/item/device/pda/lawyer
+
+ implants = list(/obj/item/weapon/implant/loyalty)
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 2148c339000..b7d6b448895 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -10,29 +10,31 @@
selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_weapons, access_mineral_storeroom)
minimal_access = list(access_bar, access_maint_tunnels, access_weapons, access_mineral_storeroom)
+ outfit = /datum/outfit/job/bartender
+/datum/outfit/job/bartender
+ name = "Bartender"
+ jobtype = /datum/job/bartender
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/reagent(H), slot_glasses)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/toy/russian_revolver(H), slot_in_backpack)
+ uniform = /obj/item/clothing/under/rank/bartender
+ suit = /obj/item/clothing/suit/armor/vest
+ belt = /obj/item/weapon/storage/belt/bandolier/full
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ glasses = /obj/item/clothing/glasses/sunglasses/reagent
+ pda = /obj/item/device/pda/bar
+ backpack_contents = list(
+ /obj/item/toy/russian_revolver = 1
+ )
- H.dna.SetSEState(SOBERBLOCK,1)
- H.mutations += SOBER
- H.check_mutations = 1
+/datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
- return 1
+ H.dna.SetSEState(SOBERBLOCK,1)
+ H.mutations += SOBER
+ H.check_mutations = 1
@@ -48,22 +50,18 @@
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
minimal_access = list(access_kitchen, access_maint_tunnels)
alt_titles = list("Cook","Culinary Artist","Butcher")
+ outfit = /datum/outfit/job/chef
+/datum/outfit/job/chef
+ name = "Chef"
+ jobtype = /datum/job/chef
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/head/chefhat(H), slot_head)
- H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/chef
+ suit = /obj/item/clothing/suit/chef
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/chefhat
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/chef
@@ -79,23 +77,23 @@
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
minimal_access = list(access_hydroponics, access_morgue, access_maint_tunnels)
alt_titles = list("Hydroponicist", "Botanical Researcher")
+ outfit = /datum/outfit/job/hydro
+/datum/outfit/job/hydro
+ name = "Botanist"
+ jobtype = /datum/job/hydro
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/botany(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/device/plant_analyzer(H), slot_s_store)
- H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/hydroponics
+ suit = /obj/item/clothing/suit/apron
+ gloves = /obj/item/clothing/gloves/botanic_leather
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ suit_store = /obj/item/device/plant_analyzer
+ pda = /obj/item/device/pda/botanist
+
+ backpack = /obj/item/weapon/storage/backpack/botany
+ satchel = /obj/item/weapon/storage/backpack/satchel_hyd
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/hydro
@@ -109,25 +107,21 @@
is_supply = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
+ outfit = /datum/outfit/job/qm
+/datum/outfit/job/qm
+ name = "Quartermaster"
+ jobtype = /datum/job/qm
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_or_collect(new /obj/item/weapon/clipboard(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/cargo
+ shoes = /obj/item/clothing/shoes/brown
+ l_ear = /obj/item/device/radio/headset/headset_cargo
+ glasses = /obj/item/clothing/glasses/sunglasses
+ id = /obj/item/weapon/card/id/supply
+ l_hand = /obj/item/weapon/clipboard
+ pda = /obj/item/device/pda/quartermaster
@@ -140,23 +134,19 @@
is_supply = 1
supervisors = "the quartermaster"
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting, access_mineral_storeroom)
+ outfit = /datum/outfit/job/cargo_tech
+/datum/outfit/job/cargo_tech
+ name = "Cargo Technician"
+ jobtype = /datum/job/cargo_tech
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/rank/cargotech
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_cargo
+ id = /obj/item/weapon/card/id/supply
+ pda = /obj/item/device/pda/cargo
@@ -169,32 +159,30 @@
is_supply = 1
supervisors = "the quartermaster"
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/supply
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Spelunker")
+ outfit = /datum/outfit/job/mining
- equip(var/mob/living/carbon/human/H)
- if(!H)
- return 0
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo/mining(H), slot_l_ear)
- switch(H.backbag)
- if(2)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
- if(4)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/gloves/fingerless(H), slot_gloves)
- H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/patch/styptic(H), slot_l_store)
- H.equip_or_collect(new /obj/item/device/flashlight/seclite(H), slot_r_store)
- H.equip_or_collect(new /obj/item/weapon/mining_voucher(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+/datum/outfit/job/mining
+ name = "Shaft Miner"
+ jobtype = /datum/job/mining
+
+ uniform = /obj/item/clothing/under/rank/miner
+ gloves = /obj/item/clothing/gloves/fingerless
+ shoes = /obj/item/clothing/shoes/workboots
+ l_ear = /obj/item/device/radio/headset/headset_cargo/mining
+ id = /obj/item/weapon/card/id/supply
+ l_pocket = /obj/item/weapon/reagent_containers/food/pill/patch/styptic
+ r_pocket = /obj/item/device/flashlight/seclite
+ pda = /obj/item/device/pda/shaftminer
+ backpack_contents = list(
+ /obj/item/weapon/mining_voucher = 1,
+ /obj/item/weapon/storage/bag/ore = 1
+ )
+
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel = /obj/item/weapon/storage/backpack/satchel_eng
@@ -209,40 +197,51 @@
is_service = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/clown
access = list(access_clown, access_theatre, access_maint_tunnels)
minimal_access = list(access_clown, access_theatre, access_maint_tunnels)
+ outfit = /datum/outfit/job/clown
+/datum/outfit/job/clown
+ name = "Clown"
+ jobtype = /datum/job/clown
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/clown(H), slot_back)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- if(H.gender == FEMALE)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/sexyclown(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/clothing/under/sexyclown(H), slot_w_uniform)
- else
- H.equip_or_collect(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/bikehorn(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/stamp/clown(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack)
- if(H.get_species() == "Machine")
- var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant
- implant = new
- implant.insert(H)
- H.mutations.Add(CLUMSY)
- H.dna.SetSEState(COMICBLOCK,1,1)
- genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED)
- return 1
+ uniform = /obj/item/clothing/under/rank/clown
+ shoes = /obj/item/clothing/shoes/clown_shoes
+ mask = /obj/item/clothing/mask/gas/clown_hat
+ l_ear = /obj/item/device/radio/headset/headset_service
+ id = /obj/item/weapon/card/id/clown
+ pda = /obj/item/device/pda/clown
+ backpack_contents = list(
+ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
+ /obj/item/weapon/bikehorn = 1,
+ /obj/item/weapon/stamp/clown = 1,
+ /obj/item/toy/crayon/rainbow = 1,
+ /obj/item/weapon/storage/fancy/crayons = 1,
+ /obj/item/weapon/reagent_containers/spray/waterflower = 1
+ )
+ backpack = /obj/item/weapon/storage/backpack/clown
+ satchel = /obj/item/weapon/storage/backpack/clown
+ dufflebag = /obj/item/weapon/storage/backpack/duffel/clown
+
+/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ mask = /obj/item/clothing/mask/gas/sexyclown
+ uniform = /obj/item/clothing/under/sexyclown
+
+/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(H.get_species() == "Machine")
+ var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant = new
+ implant.insert(H)
+
+ H.mutations.Add(CLUMSY)
+ H.dna.SetSEState(COMICBLOCK, 1, 1)
+ genemutcheck(H, COMICBLOCK, null, MUTCHK_FORCED)
/datum/job/mime
@@ -254,35 +253,45 @@
is_service = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
- idtype = /obj/item/weapon/card/id/mime
access = list(access_mime, access_theatre, access_maint_tunnels)
minimal_access = list(access_mime, access_theatre, access_maint_tunnels)
+ outfit = /datum/outfit/job/mime
+/datum/outfit/job/mime
+ name = "Mime"
+ jobtype = /datum/job/mime
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/mime(H), slot_back)
- if(H.gender == FEMALE)
- H.equip_or_collect(new /obj/item/clothing/under/sexymime(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(H), slot_wear_mask)
- else
- H.equip_or_collect(new /obj/item/clothing/under/mime(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves)
- H.equip_or_collect(new /obj/item/clothing/head/beret(H), slot_head)
- H.equip_or_collect(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
- H.equip_or_collect(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/cane(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- if(H.mind)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
- H.mind.miming = 1
- return 1
+ uniform = /obj/item/clothing/under/mime
+ suit = /obj/item/clothing/suit/suspenders
+ back = /obj/item/weapon/storage/backpack/mime
+ gloves = /obj/item/clothing/gloves/color/white
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/beret
+ mask = /obj/item/clothing/mask/gas/mime
+ l_ear = /obj/item/device/radio/headset/headset_service
+ id = /obj/item/weapon/card/id/mime
+ pda = /obj/item/device/pda/mime
+ backpack_contents = list(
+ /obj/item/toy/crayon/mime = 1,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 1,
+ /obj/item/weapon/cane = 1
+ )
+
+/datum/outfit/job/mime/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.gender == FEMALE)
+ uniform = /obj/item/clothing/under/sexymime
+ suit = /obj/item/clothing/mask/gas/sexymime
+
+/datum/outfit/job/mime/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
+ H.mind.miming = 1
@@ -298,21 +307,16 @@
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
alt_titles = list("Custodial Technician")
+ outfit = /datum/outfit/job/janitor
+/datum/outfit/job/janitor
+ name = "Janitor"
+ jobtype = /datum/job/janitor
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/device/pda/janitor(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
-
+ uniform = /obj/item/clothing/under/rank/janitor
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/janitor
//More or less assistants
@@ -328,24 +332,19 @@
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library, access_maint_tunnels)
alt_titles = list("Journalist")
+ outfit = /datum/outfit/job/librarian
+/datum/outfit/job/librarian
+ name = "Librarian"
+ jobtype = /datum/job/librarian
- equip(var/mob/living/carbon/human/H)
- if(!H)
- return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
- H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store)
- H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/suit_jacket/red
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ l_pocket = /obj/item/device/laser_pointer
+ r_pocket = /obj/item/weapon/barcodescanner
+ l_hand = /obj/item/weapon/storage/bag/books
+ pda = /obj/item/device/pda/librarian
/datum/job/barber
title = "Barber"
@@ -359,18 +358,17 @@
alt_titles = list("Hair Stylist","Beautician")
access = list(access_maint_tunnels)
minimal_access = list(access_maint_tunnels)
+ outfit = /datum/outfit/job/barber
+/datum/outfit/job/barber
+ name = "Barber"
+ jobtype = /datum/job/barber
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/barber(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/barber(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/weapon/storage/box/lip_stick(H), slot_in_backpack)
- return 1
+ uniform = /obj/item/clothing/under/barber
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ backpack_contents = list(
+ /obj/item/clothing/shoes/black = 1,
+ /obj/item/weapon/storage/box/lip_stick = 1,
+ /obj/item/weapon/storage/box/barber = 1
+ )
diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm
index da9bd5c8ec1..637524ad3bd 100644
--- a/code/game/jobs/job/support_chaplain.dm
+++ b/code/game/jobs/job/support_chaplain.dm
@@ -11,149 +11,154 @@
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
+ outfit = /datum/outfit/job/chaplain
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT
- H.equip_or_collect(B, slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
- if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_or_collect(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
- H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/device/camera/spooky(H), slot_in_backpack)
- spawn(0)
- var/religion_name = "Christianity"
- var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN))
+/datum/outfit/job/chaplain
+ name = "Chaplain"
+ jobtype = /datum/job/chaplain
- if(!new_religion)
- new_religion = religion_name
+ uniform = /obj/item/clothing/under/rank/chaplain
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/headset_service
+ pda = /obj/item/device/pda/chaplain
+ backpack_contents = list(
+ /obj/item/device/camera/spooky = 1
+ )
- switch(lowertext(new_religion))
- if("christianity")
- B.name = pick("The Holy Bible")
- if("satanism")
- B.name = "The Unholy Bible"
- if("cthulu")
- B.name = "The Necronomicon"
- if("islam")
- B.name = "Quran"
- if("scientology")
- B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
- if("chaos")
- B.name = "The Book of Lorgar"
- if("imperium")
- B.name = "Uplifting Primer"
- if("toolboxia")
- B.name = "Toolbox Manifesto Robusto"
- if("homosexuality")
- B.name = "Guys Gone Wild"
- if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
- B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
- H.setBrainLoss(99) // starts off retarded as fuck
- if("science")
- B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+/datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H)
+
+ spawn()
+ var/religion_name = "Christianity"
+ var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN))
+
+ if(!new_religion)
+ new_religion = religion_name
+
+ switch(lowertext(new_religion))
+ if("christianity")
+ B.name = pick("The Holy Bible")
+ if("satanism")
+ B.name = "The Unholy Bible"
+ if("cthulu")
+ B.name = "The Necronomicon"
+ if("islam")
+ B.name = "Quran"
+ if("scientology")
+ B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
+ if("chaos")
+ B.name = "The Book of Lorgar"
+ if("imperium")
+ B.name = "Uplifting Primer"
+ if("toolboxia")
+ B.name = "Toolbox Manifesto Robusto"
+ if("homosexuality")
+ B.name = "Guys Gone Wild"
+ if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
+ B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
+ H.setBrainLoss(99) // starts off retarded as fuck
+ if("science")
+ B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+ else
+ B.name = "The Holy Book of [new_religion]"
+ feedback_set_details("religion_name","[new_religion]")
+
+ var/deity_name = "Space Jesus"
+ var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
+
+ if((length(new_deity) == 0) || (new_deity == "Space Jesus") )
+ new_deity = deity_name
+ B.deity_name = new_deity
+
+ var/accepted = 0
+ var/outoftime = 0
+ spawn(200) // 20 seconds to choose
+ outoftime = 1
+ var/new_book_style = "Bible"
+
+ while(!accepted)
+ if(!B) break // prevents possible runtime errors
+ new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext")
+ switch(new_book_style)
+ if("Koran")
+ B.icon_state = "koran"
+ B.item_state = "koran"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 4
+ if("Scrapbook")
+ B.icon_state = "scrapbook"
+ B.item_state = "scrapbook"
+ if("Creeper")
+ B.icon_state = "creeper"
+ B.item_state = "syringe_kit"
+ if("White Bible")
+ B.icon_state = "white"
+ B.item_state = "syringe_kit"
+ if("Holy Light")
+ B.icon_state = "holylight"
+ B.item_state = "syringe_kit"
+ if("Athiest")
+ B.icon_state = "athiest"
+ B.item_state = "syringe_kit"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 10
+ if("Tome")
+ B.icon_state = "tome"
+ B.item_state = "syringe_kit"
+ if("The King in Yellow")
+ B.icon_state = "kingyellow"
+ B.item_state = "kingyellow"
+ if("Ithaqua")
+ B.icon_state = "ithaqua"
+ B.item_state = "ithaqua"
+ if("Scientology")
+ B.icon_state = "scientology"
+ B.item_state = "scientology"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 8
+ if("the bible melts")
+ B.icon_state = "melted"
+ B.item_state = "melted"
+ if("Necronomicon")
+ B.icon_state = "necronomicon"
+ B.item_state = "necronomicon"
+ if("Greentext")
+ B.icon_state = "greentext"
+ B.item_state = "greentext"
else
- B.name = "The Holy Book of [new_religion]"
- feedback_set_details("religion_name","[new_religion]")
+ // if christian bible, revert to default
+ B.icon_state = "bible"
+ B.item_state = "bible"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.dir = 2
- spawn(1)
- var/deity_name = "Space Jesus"
- var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
+ H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
- if((length(new_deity) == 0) || (new_deity == "Space Jesus") )
- new_deity = deity_name
- B.deity_name = new_deity
-
- var/accepted = 0
- var/outoftime = 0
- spawn(200) // 20 seconds to choose
- outoftime = 1
- var/new_book_style = "Bible"
-
- while(!accepted)
- if(!B) break // prevents possible runtime errors
- new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext")
- switch(new_book_style)
- if("Koran")
- B.icon_state = "koran"
- B.item_state = "koran"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 4
- if("Scrapbook")
- B.icon_state = "scrapbook"
- B.item_state = "scrapbook"
- if("Creeper")
- B.icon_state = "creeper"
- B.item_state = "syringe_kit"
- if("White Bible")
- B.icon_state = "white"
- B.item_state = "syringe_kit"
- if("Holy Light")
- B.icon_state = "holylight"
- B.item_state = "syringe_kit"
- if("Athiest")
- B.icon_state = "athiest"
- B.item_state = "syringe_kit"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 10
- if("Tome")
- B.icon_state = "tome"
- B.item_state = "syringe_kit"
- if("The King in Yellow")
- B.icon_state = "kingyellow"
- B.item_state = "kingyellow"
- if("Ithaqua")
- B.icon_state = "ithaqua"
- B.item_state = "ithaqua"
- if("Scientology")
- B.icon_state = "scientology"
- B.item_state = "scientology"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 8
- if("the bible melts")
- B.icon_state = "melted"
- B.item_state = "melted"
- if("Necronomicon")
- B.icon_state = "necronomicon"
- B.item_state = "necronomicon"
- if("Greentext")
- B.icon_state = "greentext"
- B.item_state = "greentext"
- else
- // if christian bible, revert to default
- B.icon_state = "bible"
- B.item_state = "bible"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.dir = 2
-
- H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
-
- switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
- if("Yes")
+ switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ accepted = 1
+ if("No")
+ if(outoftime)
+ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
accepted = 1
- if("No")
- if(outoftime)
- to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
- accepted = 1
- if(ticker)
- ticker.Bible_icon_state = B.icon_state
- ticker.Bible_item_state = B.item_state
- ticker.Bible_name = B.name
- ticker.Bible_deity_name = B.deity_name
- feedback_set_details("religion_deity","[new_deity]")
- feedback_set_details("religion_book","[new_book_style]")
- return 1
+ if(ticker)
+ ticker.Bible_icon_state = B.icon_state
+ ticker.Bible_item_state = B.item_state
+ ticker.Bible_name = B.name
+ ticker.Bible_deity_name = B.deity_name
+ feedback_set_details("religion_deity","[new_deity]")
+ feedback_set_details("religion_book","[new_book_style]")
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index a770084dbbc..b0891498c98 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -1,3 +1,4 @@
+
var/global/datum/controller/occupations/job_master
#define GET_RANDOM_JOB 0
@@ -5,571 +6,483 @@ var/global/datum/controller/occupations/job_master
#define RETURN_TO_LOBBY 2
/datum/controller/occupations
- //List of all jobs
+ //List of all jobs
var/list/occupations = list()
- //Players who need jobs
+ var/list/name_occupations = list() //Dict of all jobs, keys are titles
+ var/list/type_occupations = list() //Dict of all jobs, keys are types
+ //Players who need jobs
var/list/unassigned = list()
- //Debug info
+ //Debug info
var/list/job_debug = list()
- proc/SetupOccupations(var/list/faction = list("Station"))
- occupations = list()
- var/list/all_jobs = subtypesof(/datum/job)
- if(!all_jobs.len)
- to_chat(world, "\red \b Error setting up jobs, no job datums found")
- return 0
- for(var/J in all_jobs)
- var/datum/job/job = new J()
- if(!job) continue
- if(!job.faction in faction) continue
- occupations += job
+/datum/controller/occupations/proc/SetupOccupations(var/list/faction = list("Station"))
+ occupations = list()
- return 1
-
-
- proc/Debug(var/text)
- if(!Debug2) return 0
- job_debug.Add(text)
- return 1
-
-
- proc/GetJob(var/rank)
- if(!rank) return null
- for(var/datum/job/J in occupations)
- if(!J) continue
- if(J.title == rank) return J
- return null
-
- proc/GetPlayerAltTitle(mob/new_player/player, rank)
- return player.client.prefs.GetPlayerAltTitle(GetJob(rank))
-
- proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
- Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
- if(player && player.mind && rank)
- var/datum/job/job = GetJob(rank)
- if(!job) return 0
- if(jobban_isbanned(player, rank)) return 0
- if(!job.player_old_enough(player.client)) return 0
- if(job.available_in_playtime(player.client))
- return 0
- if(!is_job_whitelisted(player, rank)) return 0
- var/position_limit = job.total_positions
- if(!latejoin)
- position_limit = job.spawn_positions
- if((job.current_positions < position_limit) || position_limit == -1)
- Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
- player.mind.assigned_role = rank
- player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
-
- // JOB OBJECTIVES OH SHIT
- player.mind.job_objectives.Cut()
- for(var/objectiveType in job.required_objectives)
- new objectiveType(player.mind)
-
- // 50/50 chance of getting optional objectives.
- for(var/objectiveType in job.optional_objectives)
- if(prob(50))
- new objectiveType(player.mind)
-
- unassigned -= player
- job.current_positions++
- return 1
- Debug("AR has failed, Player: [player], Rank: [rank]")
+ var/list/all_jobs = subtypesof(/datum/job)
+ if(!all_jobs.len)
+ to_chat(world, "Error setting up jobs, no job datums found ")
return 0
- proc/FreeRole(var/rank) //making additional slot on the fly
- var/datum/job/job = GetJob(rank)
- if(job && job.current_positions >= job.total_positions && job.total_positions != -1)
- job.total_positions++
- return 1
+ for(var/J in all_jobs)
+ var/datum/job/job = new J()
+ if(!job)
+ continue
+ if(!job.faction in faction)
+ continue
+ occupations += job
+ name_occupations[job.title] = job
+ type_occupations[J] = job
+
+ return 1
+
+
+/datum/controller/occupations/proc/Debug(var/text)
+ if(!Debug2)
return 0
+ job_debug.Add(text)
+ return 1
- proc/FindOccupationCandidates(datum/job/job, level, flag)
- Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
- var/list/candidates = list()
- for(var/mob/new_player/player in unassigned)
- Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] AvInPlaytime: [job.available_in_playtime(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
- if(jobban_isbanned(player, job.title))
- Debug("FOC isbanned failed, Player: [player]")
- continue
- if(!job.player_old_enough(player.client))
- Debug("FOC player not old enough, Player: [player]")
- continue
- if(job.available_in_playtime(player.client))
- Debug("FOC player not enough playtime, Player: [player]")
- continue
- if(flag && !(flag in player.client.prefs.be_special))
- Debug("FOC flag failed, Player: [player], Flag: [flag], ")
- continue
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("FOC incompatbile with antagonist role, Player: [player]")
- continue
- if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
- Debug("FOC pass, Player: [player], Level:[level]")
- candidates += player
- return candidates
- proc/GiveRandomJob(var/mob/new_player/player)
- Debug("GRJ Giving random job, Player: [player]")
- for(var/datum/job/job in shuffle(occupations))
- if(!job)
- continue
-
- if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring!
- continue
-
- if(job.title in command_positions) //If you want a command position, select it!
- continue
-
- if(job.title in whitelisted_positions) // No random whitelisted job, sorry!
- continue
-
- if(job.admin_only) // No admin positions either.
- continue
-
- if(jobban_isbanned(player, job.title))
- Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
- continue
-
- if(!job.player_old_enough(player.client))
- Debug("GRJ player not old enough, Player: [player]")
- continue
-
- if(job.available_in_playtime(player.client))
- Debug("GRJ player not enough playtime, Player: [player]")
- continue
-
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
- continue
-
- if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("GRJ Random job given, Player: [player], Job: [job]")
- AssignRole(player, job.title)
- unassigned -= player
- break
-
- proc/ResetOccupations()
- for(var/mob/new_player/player in player_list)
- if((player) && (player.mind))
- player.mind.assigned_role = null
- player.mind.special_role = null
+/datum/controller/occupations/proc/GetJob(rank)
+ if(!occupations.len)
SetupOccupations()
- unassigned = list()
- return
+ return name_occupations[rank]
+/datum/controller/occupations/proc/GetJobType(jobtype)
+ if(!occupations.len)
+ SetupOccupations()
+ return type_occupations[jobtype]
- ///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
- proc/FillHeadPosition()
- for(var/level = 1 to 3)
- for(var/command_position in command_positions)
- var/datum/job/job = GetJob(command_position)
- if(!job) continue
- var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len) continue
+/datum/controller/occupations/proc/GetPlayerAltTitle(mob/new_player/player, rank)
+ return player.client.prefs.GetPlayerAltTitle(GetJob(rank))
- // Build a weighted list, weight by age.
- var/list/weightedCandidates = list()
-
- // Different head positions have different good ages.
- var/good_age_minimal = 25
- var/good_age_maximal = 60
- if(command_position == "Captain")
- good_age_minimal = 30
- good_age_maximal = 70 // Old geezer captains ftw
-
- for(var/mob/V in candidates)
- // Log-out during round-start? What a bad boy, no head position for you!
- if(!V.client) continue
- var/age = V.client.prefs.age
- switch(age)
- if(good_age_minimal - 10 to good_age_minimal)
- weightedCandidates[V] = 3 // Still a bit young.
- if(good_age_minimal to good_age_minimal + 10)
- weightedCandidates[V] = 6 // Better.
- if(good_age_minimal + 10 to good_age_maximal - 10)
- weightedCandidates[V] = 10 // Great.
- if(good_age_maximal - 10 to good_age_maximal)
- weightedCandidates[V] = 6 // Still good.
- if(good_age_maximal to good_age_maximal + 10)
- weightedCandidates[V] = 6 // Bit old, don't you think?
- if(good_age_maximal to good_age_maximal + 50)
- weightedCandidates[V] = 3 // Geezer.
- else
- // If there's ABSOLUTELY NOBODY ELSE
- if(candidates.len == 1) weightedCandidates[V] = 1
-
-
- var/mob/new_player/candidate = pickweight(weightedCandidates)
- if(AssignRole(candidate, command_position))
- return 1
- return 0
-
-
- ///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
- proc/CheckHeadPositions(var/level)
- for(var/command_position in command_positions)
- var/datum/job/job = GetJob(command_position)
- if(!job) continue
- var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len) continue
- var/mob/new_player/candidate = pick(candidates)
- AssignRole(candidate, command_position)
- return
-
-
- proc/FillAIPosition()
- var/ai_selected = 0
- var/datum/job/job = GetJob("AI")
+/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
+ Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
+ if(player && player.mind && rank)
+ var/datum/job/job = GetJob(rank)
if(!job)
return 0
- if((job.title == "AI") && (config) && (!config.allow_ai))
+ if(jobban_isbanned(player, rank))
return 0
- for(var/i = job.total_positions, i > 0, i--)
- for(var/level = 1 to 3)
- var/list/candidates = list()
- candidates = FindOccupationCandidates(job, level)
- if(candidates.len)
- var/mob/new_player/candidate = pick(candidates)
- if(AssignRole(candidate, "AI"))
- ai_selected++
- break
- if(ai_selected) return 1
+ if(!job.player_old_enough(player.client))
return 0
+ if(job.available_in_playtime(player.client))
+ return 0
+ if(!is_job_whitelisted(player, rank))
+ return 0
+
+ var/position_limit = job.total_positions
+ if(!latejoin)
+ position_limit = job.spawn_positions
+
+ if((job.current_positions < position_limit) || position_limit == -1)
+ Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
+ player.mind.assigned_role = rank
+ player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
+
+ // JOB OBJECTIVES OH SHIT
+ player.mind.job_objectives.Cut()
+ for(var/objectiveType in job.required_objectives)
+ new objectiveType(player.mind)
+
+ // 50/50 chance of getting optional objectives.
+ for(var/objectiveType in job.optional_objectives)
+ if(prob(50))
+ new objectiveType(player.mind)
+
+ unassigned -= player
+ job.current_positions++
+ return 1
+
+ Debug("AR has failed, Player: [player], Rank: [rank]")
+ return 0
+
+/datum/controller/occupations/proc/FreeRole(var/rank) //making additional slot on the fly
+ var/datum/job/job = GetJob(rank)
+ if(job && job.current_positions >= job.total_positions && job.total_positions != -1)
+ job.total_positions++
+ return 1
+ return 0
+
+/datum/controller/occupations/proc/FindOccupationCandidates(datum/job/job, level, flag)
+ Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
+ var/list/candidates = list()
+ for(var/mob/new_player/player in unassigned)
+ Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] AvInPlaytime: [job.available_in_playtime(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
+ if(jobban_isbanned(player, job.title))
+ Debug("FOC isbanned failed, Player: [player]")
+ continue
+ if(!job.player_old_enough(player.client))
+ Debug("FOC player not old enough, Player: [player]")
+ continue
+ if(job.available_in_playtime(player.client))
+ Debug("FOC player not enough playtime, Player: [player]")
+ continue
+ if(flag && !(flag in player.client.prefs.be_special))
+ Debug("FOC flag failed, Player: [player], Flag: [flag], ")
+ continue
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("FOC incompatbile with antagonist role, Player: [player]")
+ continue
+ if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
+ Debug("FOC pass, Player: [player], Level:[level]")
+ candidates += player
+ return candidates
+
+/datum/controller/occupations/proc/GiveRandomJob(var/mob/new_player/player)
+ Debug("GRJ Giving random job, Player: [player]")
+ for(var/datum/job/job in shuffle(occupations))
+ if(!job)
+ continue
+
+ if(istype(job, GetJob("Civilian"))) // We don't want to give him assistant, that's boring!
+ continue
+
+ if(job.title in command_positions) //If you want a command position, select it!
+ continue
+
+ if(job.title in whitelisted_positions) // No random whitelisted job, sorry!
+ continue
+
+ if(job.admin_only) // No admin positions either.
+ continue
+
+ if(jobban_isbanned(player, job.title))
+ Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
+ continue
+
+ if(!job.player_old_enough(player.client))
+ Debug("GRJ player not old enough, Player: [player]")
+ continue
+
+ if(job.available_in_playtime(player.client))
+ Debug("GRJ player not enough playtime, Player: [player]")
+ continue
+
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
+ continue
+
+ if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
+ Debug("GRJ Random job given, Player: [player], Job: [job]")
+ AssignRole(player, job.title)
+ unassigned -= player
+ break
+
+/datum/controller/occupations/proc/ResetOccupations()
+ for(var/mob/new_player/player in player_list)
+ if((player) && (player.mind))
+ player.mind.assigned_role = null
+ player.mind.special_role = null
+ SetupOccupations()
+ unassigned = list()
+ return
+
+
+///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
+/datum/controller/occupations/proc/FillHeadPosition()
+ for(var/level = 1 to 3)
+ for(var/command_position in command_positions)
+ var/datum/job/job = GetJob(command_position)
+ if(!job)
+ continue
+ var/list/candidates = FindOccupationCandidates(job, level)
+ if(!candidates.len)
+ continue
+
+ // Build a weighted list, weight by age.
+ var/list/weightedCandidates = list()
+
+ // Different head positions have different good ages.
+ var/good_age_minimal = 25
+ var/good_age_maximal = 60
+ if(command_position == "Captain")
+ good_age_minimal = 30
+ good_age_maximal = 70 // Old geezer captains ftw
+
+ for(var/mob/V in candidates)
+ // Log-out during round-start? What a bad boy, no head position for you!
+ if(!V.client)
+ continue
+ var/age = V.client.prefs.age
+ switch(age)
+ if(good_age_minimal - 10 to good_age_minimal)
+ weightedCandidates[V] = 3 // Still a bit young.
+ if(good_age_minimal to good_age_minimal + 10)
+ weightedCandidates[V] = 6 // Better.
+ if(good_age_minimal + 10 to good_age_maximal - 10)
+ weightedCandidates[V] = 10 // Great.
+ if(good_age_maximal - 10 to good_age_maximal)
+ weightedCandidates[V] = 6 // Still good.
+ if(good_age_maximal to good_age_maximal + 10)
+ weightedCandidates[V] = 6 // Bit old, don't you think?
+ if(good_age_maximal to good_age_maximal + 50)
+ weightedCandidates[V] = 3 // Geezer.
+ else
+ // If there's ABSOLUTELY NOBODY ELSE
+ if(candidates.len == 1)
+ weightedCandidates[V] = 1
+
+ var/mob/new_player/candidate = pickweight(weightedCandidates)
+ if(AssignRole(candidate, command_position))
+ return 1
+
+ return 0
+
+
+///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
+/datum/controller/occupations/proc/CheckHeadPositions(var/level)
+ for(var/command_position in command_positions)
+ var/datum/job/job = GetJob(command_position)
+ if(!job)
+ continue
+ var/list/candidates = FindOccupationCandidates(job, level)
+ if(!candidates.len)
+ continue
+ var/mob/new_player/candidate = pick(candidates)
+ AssignRole(candidate, command_position)
+
+
+/datum/controller/occupations/proc/FillAIPosition()
+ if(config && !config.allow_ai)
+ return 0
+
+ var/ai_selected = 0
+ var/datum/job/job = GetJob("AI")
+ if(!job)
+ return 0
+
+ for(var/i = job.total_positions, i > 0, i--)
+ for(var/level = 1 to 3)
+ var/list/candidates = list()
+ candidates = FindOccupationCandidates(job, level)
+ if(candidates.len)
+ var/mob/new_player/candidate = pick(candidates)
+ if(AssignRole(candidate, "AI"))
+ ai_selected++
+ break
+
+ if(ai_selected)
+ return 1
+
+ return 0
/** Proc DivideOccupations
- * fills var "assigned_role" for all ready players.
- * This proc must not have any side effect besides of modifying "assigned_role".
- **/
- proc/DivideOccupations()
- //Setup new player list and get the jobs list
- Debug("Running DO")
- SetupOccupations()
+* fills var "assigned_role" for all ready players.
+* This proc must not have any side effect besides of modifying "assigned_role".
+**/
+/datum/controller/occupations/proc/DivideOccupations()
+ //Setup new player list and get the jobs list
+ Debug("Running DO")
+ SetupOccupations()
- //Holder for Triumvirate is stored in the ticker, this just processes it
- if(ticker)
- for(var/datum/job/ai/A in occupations)
- if(ticker.triai)
- A.spawn_positions = 3
+ //Holder for Triumvirate is stored in the ticker, this just processes it
+ if(ticker)
+ for(var/datum/job/ai/A in occupations)
+ if(ticker.triai)
+ A.spawn_positions = 3
- //Get the players who are ready
- for(var/mob/new_player/player in player_list)
- if(player.ready && player.mind && !player.mind.assigned_role)
- unassigned += player
- if(player.client.prefs.randomslot)
- player.client.prefs.load_random_character_slot(player.client)
- Debug("DO, Len: [unassigned.len]")
- if(unassigned.len == 0) return 0
+ //Get the players who are ready
+ for(var/mob/new_player/player in player_list)
+ if(player.ready && player.mind && !player.mind.assigned_role)
+ unassigned += player
+ if(player.client.prefs.randomslot)
+ player.client.prefs.load_random_character_slot(player.client)
- //Shuffle players and jobs
- unassigned = shuffle(unassigned)
+ Debug("DO, Len: [unassigned.len]")
+ if(unassigned.len == 0)
+ return 0
- HandleFeedbackGathering()
+ //Shuffle players and jobs
+ unassigned = shuffle(unassigned)
- //People who wants to be assistants, sure, go on.
- Debug("DO, Running Civilian Check 1")
- var/datum/job/civ = new /datum/job/civilian()
- var/list/civilian_candidates = FindOccupationCandidates(civ, 3)
- Debug("AC1, Candidates: [civilian_candidates.len]")
- for(var/mob/new_player/player in civilian_candidates)
- Debug("AC1 pass, Player: [player]")
- AssignRole(player, "Civilian")
- civilian_candidates -= player
- Debug("DO, AC1 end")
+ HandleFeedbackGathering()
- //Select one head
- Debug("DO, Running Head Check")
- FillHeadPosition()
- Debug("DO, Head Check end")
+ //People who wants to be assistants, sure, go on.
+ Debug("DO, Running Civilian Check 1")
+ var/datum/job/civ = new /datum/job/civilian()
+ var/list/civilian_candidates = FindOccupationCandidates(civ, 3)
+ Debug("AC1, Candidates: [civilian_candidates.len]")
+ for(var/mob/new_player/player in civilian_candidates)
+ Debug("AC1 pass, Player: [player]")
+ AssignRole(player, "Civilian")
+ civilian_candidates -= player
+ Debug("DO, AC1 end")
- //Check for an AI
- Debug("DO, Running AI Check")
- FillAIPosition()
- Debug("DO, AI Check end")
+ //Select one head
+ Debug("DO, Running Head Check")
+ FillHeadPosition()
+ Debug("DO, Head Check end")
- //Other jobs are now checked
- Debug("DO, Running Standard Check")
+ //Check for an AI
+ Debug("DO, Running AI Check")
+ FillAIPosition()
+ Debug("DO, AI Check end")
+
+ //Other jobs are now checked
+ Debug("DO, Running Standard Check")
- // New job giving system by Donkie
- // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
- // Hopefully this will add more randomness and fairness to job giving.
+ // New job giving system by Donkie
+ // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
+ // Hopefully this will add more randomness and fairness to job giving.
- // Loop through all levels from high to low
- var/list/shuffledoccupations = shuffle(occupations)
- for(var/level = 1 to 3)
- //Check the head jobs first each level
- CheckHeadPositions(level)
+ // Loop through all levels from high to low
+ var/list/shuffledoccupations = shuffle(occupations)
+ for(var/level = 1 to 3)
+ //Check the head jobs first each level
+ CheckHeadPositions(level)
- // Loop through all unassigned players
- for(var/mob/new_player/player in unassigned)
-
- // Loop through all jobs
- for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
- if(!job)
- continue
-
- if(jobban_isbanned(player, job.title))
- Debug("DO isbanned failed, Player: [player], Job:[job.title]")
- continue
-
- if(!job.player_old_enough(player.client))
- Debug("DO player not old enough, Player: [player], Job:[job.title]")
- continue
-
- if(job.available_in_playtime(player.client))
- Debug("DO player not enough playtime, Player: [player], Job:[job.title]")
- continue
-
- if(player.mind && job.title in player.mind.restricted_roles)
- Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
- continue
-
- if(!is_job_whitelisted(player, job.title))
- Debug("DO player not whitelisted, Player: [player], Job:[job.title]")
- continue
-
- // If the player wants that job on this level, then try give it to him.
- if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
-
- // If the job isn't filled
- if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
- Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
- Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
- AssignRole(player, job.title)
- unassigned -= player
- break
-
- // Hand out random jobs to the people who didn't get any in the last check
- // Also makes sure that they got their preference correct
+ // Loop through all unassigned players
for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == GET_RANDOM_JOB)
- GiveRandomJob(player)
- /*
- Old job system
- for(var/level = 1 to 3)
- for(var/datum/job/job in occupations)
- Debug("Checking job: [job]")
+
+ // Loop through all jobs
+ for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
continue
- if(!unassigned.len)
- break
- if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1)
+
+ if(jobban_isbanned(player, job.title))
+ Debug("DO isbanned failed, Player: [player], Job:[job.title]")
continue
- var/list/candidates = FindOccupationCandidates(job, level)
- while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1))
- var/mob/new_player/candidate = pick(candidates)
- Debug("Selcted: [candidate], for: [job.title]")
- AssignRole(candidate, job.title)
- candidates -= candidate*/
- Debug("DO, Standard Check end")
+ if(!job.player_old_enough(player.client))
+ Debug("DO player not old enough, Player: [player], Job:[job.title]")
+ continue
- Debug("DO, Running AC2")
+ if(job.available_in_playtime(player.client))
+ Debug("DO player not enough playtime, Player: [player], Job:[job.title]")
+ continue
- // Antags, who have to get in, come first
- for(var/mob/new_player/player in unassigned)
- if(player.mind.special_role)
- GiveRandomJob(player)
- if(player in unassigned)
- AssignRole(player, "Civilian")
+ if(player.mind && job.title in player.mind.restricted_roles)
+ Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
+ continue
- // Then we assign what we can to everyone else.
- for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == BE_ASSISTANT)
- Debug("AC2 Assistant located, Player: [player]")
+ if(!is_job_whitelisted(player, job.title))
+ Debug("DO player not whitelisted, Player: [player], Job:[job.title]")
+ continue
+
+ // If the player wants that job on this level, then try give it to him.
+ if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
+
+ // If the job isn't filled
+ if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
+ Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
+ Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
+ AssignRole(player, job.title)
+ unassigned -= player
+ break
+
+ // Hand out random jobs to the people who didn't get any in the last check
+ // Also makes sure that they got their preference correct
+ for(var/mob/new_player/player in unassigned)
+ if(player.client.prefs.alternate_option == GET_RANDOM_JOB)
+ GiveRandomJob(player)
+
+ Debug("DO, Standard Check end")
+
+ Debug("DO, Running AC2")
+
+ // Antags, who have to get in, come first
+ for(var/mob/new_player/player in unassigned)
+ if(player.mind.special_role)
+ GiveRandomJob(player)
+ if(player in unassigned)
AssignRole(player, "Civilian")
- else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
- player.ready = 0
- unassigned -= player
- return 1
+
+ // Then we assign what we can to everyone else.
+ for(var/mob/new_player/player in unassigned)
+ if(player.client.prefs.alternate_option == BE_ASSISTANT)
+ Debug("AC2 Assistant located, Player: [player]")
+ AssignRole(player, "Civilian")
+ else if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
+ player.ready = 0
+ unassigned -= player
+
+ return 1
- proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
- if(!H) return null
- var/datum/job/job = GetJob(rank)
- var/list/spawn_in_storage = list()
+/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
+ if(!H)
+ return null
- if(job)
+ var/datum/job/job = GetJob(rank)
- //Equip custom gear loadout.
- var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage.
- var/list/custom_equip_leftovers = list()
- if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI")
- for(var/thing in H.client.prefs.gear)
- var/datum/gear/G = gear_datums[thing]
- if(G)
- var/permitted
- if(G.allowed_roles)
- for(var/job_name in G.allowed_roles)
- if(job.title == job_name)
- permitted = 1
- else
- permitted = 1
+ H.job = rank
- if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
- permitted = 0
+ if(!joined_late)
+ var/turf/T = null
+ var/obj/S = null
+ for(var/obj/effect/landmark/start/sloc in landmarks_list)
+ if(sloc.name != rank)
+ continue
+ if(locate(/mob/living) in sloc.loc)
+ continue
+ S = sloc
+ break
+ if(!S)
+ S = locate("start*[rank]") // use old stype
+ if(!S) // still no spawn, fall back to the arrivals shuttle
+ for(var/turf/TS in get_area_turfs(/area/shuttle/arrival))
+ if(!TS.density)
+ var/clear = 1
+ for(var/obj/O in TS)
+ if(O.density)
+ clear = 0
+ break
+ if(clear)
+ T = TS
+ continue
- if(!permitted)
- to_chat(H, "Your current job or whitelist status does not permit you to spawn with [thing]! ")
- continue
+ if(isturf(S))
+ T = S
+ else if(istype(S, /obj/effect/landmark/start) && isturf(S.loc))
+ T = S.loc
- if(G.slot && !(G.slot in custom_equip_slots))
- // This is a miserable way to fix the loadout overwrite bug, but the alternative requires
- // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
- if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
- custom_equip_leftovers += thing
- else if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot))
- to_chat(H, "Equipping you with \the [thing]! ")
- custom_equip_slots.Add(G.slot)
- else
- custom_equip_leftovers.Add(thing)
- else
- spawn_in_storage += thing
-
- job.equip(H)
- job.apply_fingerprints(H)
-
- //If some custom items could not be equipped before, try again now.
- for(var/thing in custom_equip_leftovers)
- var/datum/gear/G = gear_datums[thing]
- if(G.slot in custom_equip_slots)
- spawn_in_storage += thing
- else
- var/metadata = H.client.prefs.gear[G.display_name]
- if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
- to_chat(H, "Equipping you with \the [thing]! ")
- custom_equip_slots.Add(G.slot)
- else
- spawn_in_storage += thing
- else
- to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
-
- H.job = rank
-
- if(!joined_late)
- var/obj/S = null
- for(var/obj/effect/landmark/start/sloc in landmarks_list)
- if(sloc.name != rank) continue
- if(locate(/mob/living) in sloc.loc) continue
- S = sloc
- break
- if(!S)
- S = locate("start*[rank]") // use old stype
- if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
- H.loc = S.loc
+ if(T)
+ H.loc = T
// Moving wheelchair if they have one
if(H.buckled && istype(H.buckled, /obj/structure/stool/bed/chair/wheelchair))
H.buckled.loc = H.loc
H.buckled.dir = H.dir
- var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
- if(H.mind)
- var/remembered_info = ""
+ var/alt_title = null
+ if(H.mind)
+ H.mind.assigned_role = rank
+ alt_title = H.mind.role_alt_title
- remembered_info += "Your account number is: #[M.account_number] "
- remembered_info += "Your account pin is: [M.remote_access_pin] "
- remembered_info += "Your account funds are: $[M.money] "
+ CreateMoneyAccount(H, rank, job)
- if(M.transaction_log.len)
- var/datum/transaction/T = M.transaction_log[1]
- remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal] "
- H.mind.store_memory(remembered_info)
+ if(job)
+ var/new_mob = job.equip(H)
+ if(ismob(new_mob))
+ H = new_mob
- H.mind.initial_account = M
+ to_chat(H, "You are the [alt_title ? alt_title : rank]. ")
+ to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this. ")
+ to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP) ")
+ if(job.is_service)
+ to_chat(H, "As a member of Service, make sure to read up on your Department SOP ")
+ if(job.is_supply)
+ to_chat(H, "As a member of Supply, make sure to read up on your Department SOP ")
+ if(job.is_command)
+ to_chat(H, "As an important member of Command, read up on your Department SOP ")
+ if(job.is_legal)
+ to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure ")
+ if(job.is_engineering)
+ to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP ")
+ if(job.is_medical)
+ to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP ")
+ if(job.is_science)
+ to_chat(H, "As a member of Science, make sure to read up on your Department SOP ")
+ if(job.is_security)
+ to_chat(H, "As a member of Security, you are to know Space Law , Legal Standard Operating Procedure , as well as your Department SOP ")
+ if(job.req_admin_notify)
+ to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp. ")
- // If they're head, give them the account info for their department
- if(H.mind && job.head_position)
- var/remembered_info = ""
- var/datum/money_account/department_account = department_accounts[job.department]
-
- if(department_account)
- remembered_info += "Your department's account number is: #[department_account.account_number] "
- remembered_info += "Your department's account pin is: [department_account.remote_access_pin] "
- remembered_info += "Your department's account funds are: $[department_account.money] "
-
- H.mind.store_memory(remembered_info)
-
- spawn(0)
- to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin] ")
-
- var/alt_title = null
- if(H.mind)
- H.mind.assigned_role = rank
- alt_title = H.mind.role_alt_title
-
- switch(rank)
- if("Cyborg")
- return H.Robotize()
- if("AI")
- return H
- if("Clown") //don't need bag preference stuff!
- if(rank=="Clown") // Clowns DO need to breathe, though - N3X
- H.species.equip(H)
- else
- switch(H.backbag) //BS12 EDIT
- if(1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(3)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(4)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- H.species.equip(H)
-
- //Deferred item spawning.
- for(var/thing in spawn_in_storage)
- var/datum/gear/G = gear_datums[thing]
- var/metadata = H.client.prefs.gear[G.display_name]
- var/item = G.spawn_item(null, metadata)
-
- var/atom/placed_in = H.equip_or_collect(item)
- if(placed_in)
- to_chat(H, "Placing \the [item] in your [placed_in.name]! ")
- continue
- if(H.equip_to_appropriate_slot(item))
- to_chat(H, "Placing \the [item] in your inventory! ")
- continue
- if(H.put_in_hands(item))
- to_chat(H, "Placing \the [item] in your hands! ")
- continue
- to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug. ")
- qdel(item)
-
-
- to_chat(H, "You are the [alt_title ? alt_title : rank]. ")
- to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this. ")
- to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP) ")
- if(job.is_service)
- to_chat(H, "As a member of Service, make sure to read up on your Department SOP ")
- if(job.is_supply)
- to_chat(H, "As a member of Supply, make sure to read up on your Department SOP ")
- if(job.is_command)
- to_chat(H, "As an important member of Command, read up on your Department SOP ")
- if(job.is_legal)
- to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure ")
- if(job.is_engineering)
- to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP ")
- if(job.is_medical)
- to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP ")
- if(job.is_science)
- to_chat(H, "As a member of Science, make sure to read up on your Department SOP ")
- if(job.is_security)
- to_chat(H, "As a member of Security, you are to know Space Law , Legal Standard Operating Procedure , as well as your Department SOP ")
- if(job.req_admin_notify)
- to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp. ")
-
- spawnId(H, rank, alt_title)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
+ if(job && H)
+ job.after_spawn(H)
//Gives glasses to the vision impaired
if(H.disabilities & DISABILITY_FLAG_NEARSIGHTED)
@@ -579,121 +492,107 @@ var/global/datum/controller/occupations/job_master
if(istype(G) && !G.prescription)
G.prescription = 1
G.name = "prescription [G.name]"
- H.regenerate_icons()
-
- H.sec_hud_set_ID()
- H.sec_hud_set_implants()
- return H
+ return H
- proc/spawnId(var/mob/living/carbon/human/H, rank, title)
- if(!H) return 0
- var/obj/item/weapon/card/id/C = null
- var/datum/job/job = null
- for(var/datum/job/J in occupations)
- if(J.title == rank)
- job = J
- break
- if(job)
- if(job.title == "Cyborg")
- return
- else
- C = new job.idtype(H)
- C.access = job.get_access()
+
+/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
+ if(!config.load_jobs_from_txt)
+ return 0
+
+ var/list/jobEntries = file2list(jobsfile)
+
+ for(var/job in jobEntries)
+ if(!job)
+ continue
+
+ job = trim(job)
+ if(!length(job))
+ continue
+
+ var/pos = findtext(job, "=")
+ var/name = null
+ var/value = null
+
+ if(pos)
+ name = copytext(job, 1, pos)
+ value = copytext(job, pos + 1)
else
- C = new /obj/item/weapon/card/id(H)
- if(C)
- C.registered_name = H.real_name
- C.rank = rank
- C.assignment = title ? title : rank
- C.sex = capitalize(H.gender)
- C.age = H.age
- C.name = "[C.registered_name]'s ID Card ([C.assignment])"
- C.photo = get_id_photo(H)
+ continue
- //put the player's account number onto the ID
- if(H.mind && H.mind.initial_account)
- C.associated_account_number = H.mind.initial_account.account_number
+ if(name && value)
+ var/datum/job/J = GetJob(name)
+ if(!J) continue
+ J.total_positions = text2num(value)
+ J.spawn_positions = text2num(value)
+ if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
+ J.total_positions = 0
- H.equip_to_slot_or_del(C, slot_wear_id)
-
- H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_wear_pda)
- if(locate(/obj/item/device/pda,H))
- var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
- pda.owner = H.real_name
- pda.ownjob = C.assignment
- pda.ownrank = C.rank
- pda.name = "PDA-[H.real_name] ([pda.ownjob])"
-
- return 1
+ return 1
- proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
- if(!config.load_jobs_from_txt)
- return 0
+/datum/controller/occupations/proc/HandleFeedbackGathering()
+ for(var/datum/job/job in occupations)
+ var/tmp_str = "|[job.title]|"
- var/list/jobEntries = file2list(jobsfile)
-
- for(var/job in jobEntries)
- if(!job)
+ var/level1 = 0 //high
+ var/level2 = 0 //medium
+ var/level3 = 0 //low
+ var/level4 = 0 //never
+ var/level5 = 0 //banned
+ var/level6 = 0 //account too young
+ for(var/mob/new_player/player in player_list)
+ if(!(player.ready && player.mind && !player.mind.assigned_role))
+ continue //This player is not ready
+ if(jobban_isbanned(player, job.title))
+ level5++
continue
-
- job = trim(job)
- if(!length(job))
+ if(!job.player_old_enough(player.client))
+ level6++
continue
-
- var/pos = findtext(job, "=")
- var/name = null
- var/value = null
-
- if(pos)
- name = copytext(job, 1, pos)
- value = copytext(job, pos + 1)
- else
+ if(job.available_in_playtime(player.client))
+ level6++
continue
+ if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
+ level1++
+ else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
+ level2++
+ else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
+ level3++
+ else level4++ //not selected
- if(name && value)
- var/datum/job/J = GetJob(name)
- if(!J) continue
- J.total_positions = text2num(value)
- J.spawn_positions = text2num(value)
- if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
- J.total_positions = 0
-
- return 1
+ tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
+ feedback_add_details("job_preferences",tmp_str)
- proc/HandleFeedbackGathering()
- for(var/datum/job/job in occupations)
- var/tmp_str = "|[job.title]|"
+/datum/controller/occupations/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job)
+ var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
+ var/remembered_info = ""
- var/level1 = 0 //high
- var/level2 = 0 //medium
- var/level3 = 0 //low
- var/level4 = 0 //never
- var/level5 = 0 //banned
- var/level6 = 0 //account too young
- for(var/mob/new_player/player in player_list)
- if(!(player.ready && player.mind && !player.mind.assigned_role))
- continue //This player is not ready
- if(jobban_isbanned(player, job.title))
- level5++
- continue
- if(!job.player_old_enough(player.client))
- level6++
- continue
- if(job.available_in_playtime(player.client))
- level6++
- continue
- if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
- level1++
- else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
- level2++
- else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
- level3++
- else level4++ //not selected
+ remembered_info += "Your account number is: #[M.account_number] "
+ remembered_info += "Your account pin is: [M.remote_access_pin] "
+ remembered_info += "Your account funds are: $[M.money] "
- tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
- feedback_add_details("job_preferences",tmp_str)
+ if(M.transaction_log.len)
+ var/datum/transaction/T = M.transaction_log[1]
+ remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal] "
+ H.mind.store_memory(remembered_info)
+
+ // If they're head, give them the account info for their department
+ if(job.head_position)
+ remembered_info = ""
+ var/datum/money_account/department_account = department_accounts[job.department]
+
+ if(department_account)
+ remembered_info += "Your department's account number is: #[department_account.account_number] "
+ remembered_info += "Your department's account pin is: [department_account.remote_access_pin] "
+ remembered_info += "Your department's account funds are: $[department_account.money] "
+
+ H.mind.store_memory(remembered_info)
+
+ H.mind.initial_account = M
+
+ spawn(0)
+ to_chat(H, "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin] ")
diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm
index 57146664b67..c9ce95a86a9 100644
--- a/code/game/jobs/job_exp.dm
+++ b/code/game/jobs/job_exp.dm
@@ -19,7 +19,7 @@
jtext = theirjob.title
if(config.use_exp_restrictions && theirjob.exp_requirements && theirjob.exp_type)
jtext += "* "
- if(check_rights(R_ADMIN))
+ if(check_rights(R_ADMIN, 0))
pline = " [key_name_admin(C.mob)]: [jtext]: " + C.get_exp_living() + " "
else
pline = " [key_name_mentor(C.mob)]: [jtext]: " + C.get_exp_living() + " "
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index efa6a1ded81..632177d7358 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -14,14 +14,14 @@
/datum/tlv/proc/get_danger_level(curval as num)
if(max2 >=0 && curval>max2)
- return 2
+ return ATMOS_ALARM_DANGER
if(min2 >=0 && curval=0 && curval>max1)
- return 1
+ return ATMOS_ALARM_WARNING
if(min1 >=0 && curvalUnable to establish a connection : You're too far away from the station!")
- return
if(istype(O, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
var/datum/game_mode/nations/mode = get_nations_mode()
if(!mode)
var/obj/item/weapon/aiModule/M = O
@@ -74,6 +75,10 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
if(istype(module, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
var/datum/game_mode/nations/mode = get_nations_mode()
if(!mode)
module.install(src)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index ddbee4c06a9..79696fe1c9d 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -1,4 +1,9 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define MED_DATA_MAIN 1 // Main menu
+#define MED_DATA_R_LIST 2 // Record list
+#define MED_DATA_MAINT 3 // Records maintenance
+#define MED_DATA_RECORD 4 // Record
+#define MED_DATA_V_DATA 5 // Virus database
+#define MED_DATA_MEDBOT 6 // Medbot monitor
/obj/machinery/computer/med_data//TODO:SANITY
name = "medical records console"
@@ -13,486 +18,516 @@
var/screen = null
var/datum/data/record/active1 = null
var/datum/data/record/active2 = null
- var/a_id = null
var/temp = null
var/printing = null
light_color = LIGHT_COLOR_DARKBLUE
-/obj/machinery/computer/med_data/attack_ai(user as mob)
- return src.attack_hand(user)
+/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/card/id) && !scan)
+ usr.drop_item()
+ O.forceMove(src)
+ scan = O
+ ui_interact(user)
+ ..()
-
-/obj/machinery/computer/med_data/attack_hand(mob/user as mob)
+/obj/machinery/computer/med_data/attack_hand(mob/user)
if(..())
return
- var/dat
- if(src.temp)
- dat = text("[src.temp] Clear Screen ")
- else
- dat = text("Confirm Identity: [] ", (src.scan ? text("[]", src.scan.name) : "----------"))
- if(src.authenticated)
- switch(src.screen)
- if(1.0)
- dat += {"
-Search Records
-List Records
-
-Virus Database
-Medbot Tracking
-
-Record Maintenance
-{Log Out}
-"}
- if(2.0)
- dat += "Record List : "
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general))
- dat += text("[]: [] ", R, R.fields["id"], R.fields["name"])
- //Foreach goto(132)
- dat += "Back "
- if(3.0)
- dat += "Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack "
- if(4.0)
- dat += "Medical Record "
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- dat += ""
- else
- dat += "General Record Lost! "
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"])
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", src.active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Medical Only) "
- else
- dat += "Medical Record Lost! "
- dat += text("New Record ")
- dat += "\nPrint Record \nBack "
- if(5.0)
- dat += "Virus Database "
- for(var/Dt in typesof(/datum/disease/))
- var/datum/disease/Dis = new Dt(0)
- if(istype(Dis, /datum/disease/advance))
- continue // TODO (tm): Add advance diseases to the virus database which no one uses.
- if(!Dis.desc)
- continue
- dat += "[Dis.name] "
- dat += "Back "
- if(6.0)
- dat += "Medical Robot Monitor "
- dat += "Back "
- dat += "Medical Robots: "
- var/bdat = null
- for(var/mob/living/simple_animal/bot/medbot/M in world)
+ if(is_away_level(z))
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
+ return
+ add_fingerprint(user)
+ ui_interact(user)
- if(M.z != src.z) continue //only find medibots on the same z-level as the computer
- var/turf/bl = get_turf(M)
- if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up
- bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"] "
- if((!isnull(M.reagent_glass)) && M.use_beaker)
- bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\] "
- else
- bdat += "Using Internal Synthesizer. "
- if(!bdat)
- dat += "None detected "
- else
- dat += " [bdat]"
+/obj/machinery/computer/med_data/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "med_data.tmpl", name, 800, 380)
+ ui.open()
+/obj/machinery/computer/med_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(MED_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ var/list/records = list()
+ data["records"] = records
+ for(var/datum/data/record/R in sortRecord(data_core.general))
+ records[++records.len] = list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"])
+ if(MED_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "edit" = null)
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "edit" = null)
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "edit" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "edit" = "age")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "edit" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"], "edit" = "p_stat")
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"], "edit" = "m_stat")
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] = (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- var/datum/browser/popup = new(user, "med_rec", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "med_rec")
- return
+ general["empty"] = 1
+
+ var/list/medical = list()
+ data["medical"] = medical
+ if(istype(active2, /datum/data/record) && data_core.medical.Find(active2))
+ var/list/fields = list()
+ medical["fields"] = fields
+ fields[++fields.len] = list("field" = "Blood Type:", "value" = active2.fields["b_type"], "edit" = "b_type", "line_break" = 0)
+ fields[++fields.len] = list("field" = "DNA:", "value" = active2.fields["b_dna"], "edit" = "b_dna", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Minor Disabilities:", "value" = active2.fields["mi_dis"], "edit" = "mi_dis", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["mi_dis_d"], "edit" = "mi_dis_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Major Disabilities:", "value" = active2.fields["ma_dis"], "edit" = "ma_dis", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["ma_dis_d"], "edit" = "ma_dis_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Allergies:", "value" = active2.fields["alg"], "edit" = "alg", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["alg_d"], "edit" = "alg_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Current Diseases:", "value" = active2.fields["cdi"], "edit" = "cdi", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["cdi_d"], "edit" = "cdi_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Important Notes:", "value" = active2.fields["notes"], "edit" = "notes", "line_break" = 0)
+ if(!active2.fields["comments"] || !islist(active2.fields["comments"]))
+ active2.fields["comments"] = list()
+ medical["comments"] = active2.fields["comments"]
+ medical["empty"] = 0
+ else
+ medical["empty"] = 1
+ if(MED_DATA_V_DATA)
+ data["virus"] = list()
+ for(var/D in typesof(/datum/disease))
+ var/datum/disease/DS = new D(0)
+ if(istype(DS, /datum/disease/advance))
+ continue
+ if(!DS.desc)
+ continue
+ data["virus"] += list(list("name" = DS.name, "D" = D))
+ if(MED_DATA_MEDBOT)
+ data["medbots"] = list()
+ for(var/mob/living/simple_animal/bot/medbot/M in world)
+ if(M.z != z)
+ continue
+ var/turf/T = get_turf(M)
+ if(T)
+ var/medbot = list()
+ medbot["name"] = M.name
+ medbot["x"] = T.x
+ medbot["y"] = T.y
+ medbot["on"] = M.on
+ if(!isnull(M.reagent_glass) && M.use_beaker)
+ medbot["use_beaker"] = 1
+ medbot["total_volume"] = M.reagent_glass.reagents.total_volume
+ medbot["maximum_volume"] = M.reagent_glass.reagents.maximum_volume
+ else
+ medbot["use_beaker"] = 0
+ data["medbots"] += list(medbot)
+ return data
/obj/machinery/computer/med_data/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(src.active1) ))
- src.active1 = null
+ if(!data_core.general.Find(active1))
+ active1 = null
+ if(!data_core.medical.Find(active2))
+ active2 = null
- if(!( data_core.medical.Find(src.active2) ))
- src.active2 = null
+ if(href_list["temp"])
+ temp = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ if(href_list["temp_action"])
+ if(href_list["temp_action"])
+ var/temp_href = splittext(href_list["temp_action"], "=")
+ switch(temp_href[1])
+ if("del_all2")
+ for(var/datum/data/record/R in data_core.medical)
+ qdel(R)
+ setTemp("All records deleted. ")
+ if("p_stat")
+ if(active1)
+ switch(temp_href[2])
+ if("deceased")
+ active1.fields["p_stat"] = "*Deceased*"
+ if("ssd")
+ active1.fields["p_stat"] = "*SSD*"
+ if("active")
+ active1.fields["p_stat"] = "Active"
+ if("unfit")
+ active1.fields["p_stat"] = "Physically Unfit"
+ if("disabled")
+ active1.fields["p_stat"] = "Disabled"
+ if("m_stat")
+ if(active1)
+ switch(temp_href[2])
+ if("insane")
+ active1.fields["m_stat"] = "*Insane*"
+ if("unstable")
+ active1.fields["m_stat"] = "*Unstable*"
+ if("watch")
+ active1.fields["m_stat"] = "*Watch*"
+ if("stable")
+ active1.fields["m_stat"] = "Stable"
+ if("b_type")
+ if(active2)
+ switch(temp_href[2])
+ if("an")
+ active2.fields["b_type"] = "A-"
+ if("bn")
+ active2.fields["b_type"] = "B-"
+ if("abn")
+ active2.fields["b_type"] = "AB-"
+ if("on")
+ active2.fields["b_type"] = "O-"
+ if("ap")
+ active2.fields["b_type"] = "A+"
+ if("bp")
+ active2.fields["b_type"] = "B+"
+ if("abp")
+ active2.fields["b_type"] = "AB+"
+ if("op")
+ active2.fields["b_type"] = "O+"
+ if("del_r2")
+ if(active2)
+ qdel(active2)
+ active2 = null
- if(href_list["temp"])
- src.temp = null
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
- if(href_list["scan"])
- if(src.scan)
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
- if(ishuman(usr))
- scan.loc = usr.loc
+ if(authenticated)
+ active1 = null
+ active2 = null
+ screen = MED_DATA_MAIN
- if(!usr.get_active_hand())
- usr.put_in_hands(scan)
+ if(authenticated)
+ var/incapable = (usr.stat || usr.restrained() || (!in_range(src, usr) && !issilicon(usr)))
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+ active2 = null
- scan = null
+ if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = MED_DATA_MAIN
- else
- src.scan.loc = src.loc
- src.scan = null
+ active1 = null
+ active2 = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- src.scan = I
+ if(href_list["vir"])
+ var/type = href_list["vir"]
+ var/datum/disease/D = new type(0)
+ var/afs = ""
+ for(var/mob/M in D.viable_mobtypes)
+ afs += "[initial(M.name)];"
+ var/severity = D.severity
+ switch(severity)
+ if("Harmful", "Minor")
+ severity = "[severity] "
+ if("Medium")
+ severity = "[severity] "
+ if("Dangerous!")
+ severity = "[severity] "
+ if("BIOHAZARD THREAT!")
+ severity = "[severity] "
+ setTemp({"Name: [D.name]
+ Number of stages: [D.max_stages]
+ Spread: [D.spread_text] Transmission
+ Possible Cure: [(D.cure_text||"none")]
+ Affected Lifeforms: [afs]
+ Notes: [D.desc]
+ Severity: [severity]"})
+ qdel(D)
- else if(href_list["logout"])
- src.authenticated = null
- src.screen = null
- src.active1 = null
- src.active2 = null
+ if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_all2=1")
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null)
+ setTemp("Are you sure you wish to delete all records? ", buttons)
- else if(href_list["login"])
-
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
-
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = "[R.modtype] [R.braintype]"
- src.screen = 1
-
- else if(istype(src.scan, /obj/item/weapon/card/id))
- src.active1 = null
- src.active2 = null
-
- if(src.check_access(src.scan))
- src.authenticated = src.scan.registered_name
- src.rank = src.scan.assignment
- src.screen = 1
-
- if(src.authenticated)
-
- if(href_list["screen"])
- src.screen = text2num(href_list["screen"])
- if(src.screen < 1)
- src.screen = 1
-
- src.active1 = null
- src.active2 = null
-
- if(href_list["vir"])
- var/type = href_list["vir"]
- var/datum/disease/Dis = new type(0)
- var/AfS = ""
- for(var/mob/M in Dis.viable_mobtypes)
- AfS += " [initial(M.name)];"
- src.temp = {"Name: [Dis.name]
-Number of stages: [Dis.max_stages]
-Spread: [Dis.spread_text] Transmission
-Possible Cure: [(Dis.cure_text||"none")]
-Affected Lifeforms: [AfS]
-
-Notes: [Dis.desc]
-
-Severity: [Dis.severity]"}
-
- if(href_list["del_all"])
- src.temp = "Are you sure you wish to delete all records? \n\tYes \n\tNo "
-
- if(href_list["del_all2"])
- for(var/datum/data/record/R in data_core.medical)
- //R = null
- qdel(R)
- //Foreach goto(494)
- src.temp = "All records deleted."
-
- if(href_list["field"])
- var/a1 = src.active1
- var/a2 = src.active2
- switch(href_list["field"])
- if("fingerprint")
- if(istype(src.active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(src.active1, /datum/data/record))
- if(src.active1.fields["sex"] == "Male")
- src.active1.fields["sex"] = "Female"
- else
- src.active1.fields["sex"] = "Male"
- if("age")
- if(istype(src.active1, /datum/data/record))
- var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["age"] = t1
- if("mi_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis"] = t1
- if("mi_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["mi_dis_d"] = t1
- if("ma_dis")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis"] = t1
- if("ma_dis_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["ma_dis_d"] = t1
- if("alg")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg"] = t1
- if("alg_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["alg_d"] = t1
- if("cdi")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi"] = t1
- if("cdi_d")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["cdi_d"] = t1
- if("notes")
- if(istype(src.active2, /datum/data/record))
- var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- src.active2.fields["notes"] = t1
- if("p_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled "
- if("m_stat")
- if(istype(src.active1, /datum/data/record))
- src.temp = "Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable "
- if("b_type")
- if(istype(src.active2, /datum/data/record))
- src.temp = "Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ "
- if("b_dna")
- if(istype(src.active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- src.active1.fields["dna"] = t1
- if("vir_name")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["name"] = t1
- if("vir_desc")
- var/datum/data/record/v = locate(href_list["edit_vir"])
- if(v)
- var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
- return
- v.fields["description"] = t1
- else
-
- if(href_list["p_stat"])
- if(src.active1)
- switch(href_list["p_stat"])
- if("deceased")
- src.active1.fields["p_stat"] = "*Deceased*"
- if("ssd")
- src.active1.fields["p_stat"] = "*SSD*"
- if("active")
- src.active1.fields["p_stat"] = "Active"
- if("unfit")
- src.active1.fields["p_stat"] = "Physically Unfit"
- if("disabled")
- src.active1.fields["p_stat"] = "Disabled"
-
- if(href_list["m_stat"])
- if(src.active1)
- switch(href_list["m_stat"])
- if("insane")
- src.active1.fields["m_stat"] = "*Insane*"
- if("unstable")
- src.active1.fields["m_stat"] = "*Unstable*"
- if("watch")
- src.active1.fields["m_stat"] = "*Watch*"
- if("stable")
- src.active1.fields["m_stat"] = "Stable"
-
-
- if(href_list["b_type"])
- if(src.active2)
- switch(href_list["b_type"])
- if("an")
- src.active2.fields["b_type"] = "A-"
- if("bn")
- src.active2.fields["b_type"] = "B-"
- if("abn")
- src.active2.fields["b_type"] = "AB-"
- if("on")
- src.active2.fields["b_type"] = "O-"
- if("ap")
- src.active2.fields["b_type"] = "A+"
- if("bp")
- src.active2.fields["b_type"] = "B+"
- if("abp")
- src.active2.fields["b_type"] = "AB+"
- if("op")
- src.active2.fields["b_type"] = "O+"
-
-
- if(href_list["del_r"])
- if(src.active2)
- src.temp = "Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo "
-
- if(href_list["del_r2"])
- if(src.active2)
- //src.active2 = null
- qdel(src.active2)
-
- if(href_list["d_rec"])
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/datum/data/record/M = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- src.temp = "Record Not Found!"
- return
- for(var/datum/data/record/E in data_core.medical)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- else
- //Foreach continue //goto(2540)
- src.active1 = R
- src.active2 = M
- src.screen = 4
-
- if(href_list["new"])
- if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record( )
- R.fields["name"] = src.active1.fields["name"]
- R.fields["id"] = src.active1.fields["id"]
- R.name = text("Medical Record #[]", R.fields["id"])
- R.fields["b_type"] = "Unknown"
- R.fields["b_dna"] = "Unknown"
- R.fields["mi_dis"] = "None"
- R.fields["mi_dis_d"] = "No minor disabilities have been declared."
- R.fields["ma_dis"] = "None"
- R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- R.fields["alg"] = "None"
- R.fields["alg_d"] = "No allergies have been detected in this patient."
- R.fields["cdi"] = "None"
- R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- R.fields["notes"] = "No notes."
- data_core.medical += R
- src.active2 = R
- src.screen = 4
-
- if(href_list["add_c"])
- if(!( istype(src.active2, /datum/data/record) ))
- return
- var/a2 = src.active2
- var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
- return
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- counter++
- src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")] [t1]")
-
- if(href_list["del_c"])
- if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
- src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-
- if(href_list["search"])
- var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))))
- return
- src.active1 = null
- src.active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.medical)
- if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
- src.active2 = R
- else
- //Foreach continue //goto(3229)
- if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.general)
- if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
- src.active1 = E
+ if(href_list["field"])
+ if(incapable)
+ return 1
+ var/a1 = active1
+ var/a2 = active2
+ switch(href_list["field"])
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- //Foreach continue //goto(3334)
- src.screen = 4
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Med. records", active1.fields["age"], null) as num
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("mi_dis")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["mi_dis"] = t1
+ if("mi_dis_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["mi_dis_d"] = t1
+ if("ma_dis")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", active2.fields["ma_dis"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["ma_dis"] = t1
+ if("ma_dis_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["ma_dis_d"] = t1
+ if("alg")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", active2.fields["alg"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["alg"] = t1
+ if("alg_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", active2.fields["alg_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["alg_d"] = t1
+ if("cdi")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", active2.fields["cdi"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["cdi"] = t1
+ if("cdi_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["cdi_d"] = t1
+ if("notes")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(active2.fields["notes"]), null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["notes"] = t1
+ if("p_stat")
+ if(istype(active1, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "*Deceased*", "icon" = "stethoscope", "href" = "p_stat=deceased", "status" = (active1.fields["p_stat"] == "*Deceased*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*SSD*", "icon" = "stethoscope", "href" = "p_stat=ssd", "status" = (active1.fields["p_stat"] == "*SSD*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Active", "icon" = "stethoscope", "href" = "p_stat=active", "status" = (active1.fields["p_stat"] == "Active" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Physically Unfit", "icon" = "stethoscope", "href" = "p_stat=unfit", "status" = (active1.fields["p_stat"] == "Physically Unfit" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Disabled", "icon" = "stethoscope", "href" = "p_stat=disabled", "status" = (active1.fields["p_stat"] == "Disabled" ? "selected" : null))
+ setTemp("Physical Condition ", buttons)
+ if("m_stat")
+ if(istype(active1, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "*Insane*", "icon" = "stethoscope", "href" = "m_stat=insane", "status" = (active1.fields["m_stat"] == "*Insane*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Unstable*", "icon" = "stethoscope", "href" = "m_stat=unstable", "status" = (active1.fields["m_stat"] == "*Unstable*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Watch*", "icon" = "stethoscope", "href" = "m_stat=watch", "status" = (active1.fields["m_stat"] == "*Watch*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Stable", "icon" = "stethoscope", "href" = "m_stat=stable", "status" = (active1.fields["m_stat"] == "Stable" ? "selected" : null))
+ setTemp("Mental Condition ", buttons)
+ if("b_type")
+ if(istype(active2, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "A-", "icon" = "tint", "href" = "b_type=an", "status" = (active2.fields["b_type"] == "A-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "A+", "icon" = "tint", "href" = "b_type=ap", "status" = (active2.fields["b_type"] == "A+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "B-", "icon" = "tint", "href" = "b_type=bn", "status" = (active2.fields["b_type"] == "B-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "B+", "icon" = "tint", "href" = "b_type=bp", "status" = (active2.fields["b_type"] == "B+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "AB-", "icon" = "tint", "href" = "b_type=abn", "status" = (active2.fields["b_type"] == "AB-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "AB+", "icon" = "tint", "href" = "b_type=abp", "status" = (active2.fields["b_type"] == "AB+" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "O-", "icon" = "tint", "href" = "b_type=on", "status" = (active2.fields["b_type"] == "O-" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "O+", "icon" = "tint", "href" = "b_type=op", "status" = (active2.fields["b_type"] == "O+" ? "selected" : null))
+ setTemp("Blood Type ", buttons)
+ if("b_dna")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", active2.fields["b_dna"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["b_dna"] = t1
+ if("vir_name")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ v.fields["name"] = t1
+ if("vir_desc")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if(v)
+ var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ v.fields["description"] = t1
- if(href_list["print_p"])
- if(!( src.printing ))
- src.printing = 1
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
- P.info = "Medical Record "
- if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"])
- else
- P.info += "General Record Lost! "
- if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
- P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"])
- var/counter = 1
- while(src.active2.fields[text("com_[]", counter)])
- P.info += text("[] ", src.active2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Medical Record Lost! "
- P.info += ""
- P.name = "paper- 'Medical Record'"
- src.printing = null
+ if(href_list["del_r"])
+ if(active2)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_r2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (Medical Portion Only)? ", buttons)
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
+ if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/datum/data/record/M = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ for(var/datum/data/record/E in data_core.medical)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ M = E
+ active1 = R
+ active2 = M
+ screen = MED_DATA_RECORD
+
+ if(href_list["new"])
+ if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record))
+ var/datum/data/record/R = new /datum/data/record()
+ R.fields["name"] = active1.fields["name"]
+ R.fields["id"] = active1.fields["id"]
+ R.name = "Medical Record #[R.fields["id"]]"
+ R.fields["b_type"] = "Unknown"
+ R.fields["b_dna"] = "Unknown"
+ R.fields["mi_dis"] = "None"
+ R.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ R.fields["ma_dis"] = "None"
+ R.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ R.fields["alg"] = "None"
+ R.fields["alg_d"] = "No allergies have been detected in this patient."
+ R.fields["cdi"] = "None"
+ R.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ R.fields["notes"] = "No notes."
+ data_core.medical += R
+ active2 = R
+ screen = MED_DATA_RECORD
+
+ if(href_list["add_c"])
+ if(!istype(active2, /datum/data/record))
+ return 1
+ var/a2 = active2
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["comments"] += "Made by [authenticated] ([rank]) on [current_date_string] [worldtime2text()] [t1]"
+
+ if(href_list["del_c"])
+ var/index = min(max(text2num(href_list["del_c"]) + 1, 1), length(active2.fields["comments"]))
+ if(istype(active2, /datum/data/record) && active2.fields["comments"][index])
+ active2.fields["comments"] -= active2.fields["comments"][index]
+
+ if(href_list["search"])
+ var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
+ if(!t1 || incapable)
+ return 1
+ active1 = null
+ active2 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(t1 == lowertext(R.fields["name"]) || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))
+ active2 = R
+ if(!active2)
+ setTemp("Could not locate record [t1]. ")
+ else
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == active2.fields["name"] && E.fields["id"] == active2.fields["id"])
+ active1 = E
+ screen = MED_DATA_RECORD
+
+ if(href_list["print_p"])
+ if(!printing)
+ printing = 1
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Medical Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]] "}
+ else
+ P.info += "General Record Lost! "
+ if(istype(active2, /datum/data/record) && data_core.medical.Find(active2))
+ P.info += {" \nMedical Data
+ \nBlood Type: [active2.fields["b_type"]]
+ \nDNA: [active2.fields["b_dna"]] \n
+ \nMinor Disabilities: [active2.fields["mi_dis"]]
+ \nDetails: [active2.fields["mi_dis_d"]] \n
+ \nMajor Disabilities: [active2.fields["ma_dis"]]
+ \nDetails: [active2.fields["ma_dis_d"]] \n
+ \nAllergies: [active2.fields["alg"]]
+ \nDetails: [active2.fields["alg_d"]] \n
+ \nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section)
+ \nDetails: [active2.fields["cdi_d"]] \n
+ \nImportant Notes:
+ \n\t[active2.fields["notes"]] \n
+ \n
+ Comments/Log "}
+ for(var/c in active2.fields["comments"])
+ P.info += "[c] "
+ else
+ P.info += "Medical Record Lost! "
+ P.info += ""
+ P.name = "paper- 'Medical Record'"
+ printing = 0
+ return 1
+
+/obj/machinery/computer/med_data/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
/obj/machinery/computer/med_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
+ return ..(severity)
for(var/datum/data/record/R in data_core.medical)
if(prob(10/severity))
@@ -500,7 +535,7 @@
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -525,3 +560,10 @@
icon_keyboard = "laptop_key"
icon_screen = "medlaptop"
density = 0
+
+#undef MED_DATA_MAIN
+#undef MED_DATA_R_LIST
+#undef MED_DATA_MAINT
+#undef MED_DATA_RECORD
+#undef MED_DATA_V_DATA
+#undef MED_DATA_MEDBOT
\ No newline at end of file
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 77921e171bb..bdb1110379d 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -1,4 +1,6 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define SEC_DATA_R_LIST 1 // Record list
+#define SEC_DATA_MAINT 2 // Records maintenance
+#define SEC_DATA_RECORD 3 // Record
/obj/machinery/computer/secure_data//TODO:SANITY
name = "security records"
@@ -13,12 +15,8 @@
var/screen = null
var/datum/data/record/active1 = null
var/datum/data/record/active2 = null
- var/a_id = null
var/temp = null
var/printing = null
- var/can_change_id = 0
- var/list/Perp
- var/tempname = null
//Sorting Variables
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
@@ -26,538 +24,453 @@
light_color = LIGHT_COLOR_RED
-/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
- O.loc = src
+ user.drop_item()
+ O.forceMove(src)
scan = O
- to_chat(user, "You insert [O].")
+ ui_interact(user)
..()
-/obj/machinery/computer/secure_data/attack_ai(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
-/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
+/obj/machinery/computer/secure_data/attack_hand(mob/user)
if(..())
return
- if(is_away_level(src.z))
+ if(is_away_level(z))
to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
- var/dat
+ add_fingerprint(user)
+ ui_interact(user)
- // search javascript
- var/head_content = {"
-
-
-"}
-
- if(temp)
- dat = text("[] Clear Screen ", temp)
- else
- dat = text("Confirm Identity: [] ", (scan ? text("[]", scan.name) : "----------"))
- if(authenticated)
- switch(screen)
- if(1.0)
-
- //body tag start + onload and onkeypress (onkeyup) javascript event calls
- dat += ""
-
- dat += {"
-"}
- dat += "New Record "
- //search bar
- dat += {"
-
- "}
- dat += {"
-
-
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
-Criminal Status
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- var/crimstat = ""
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- crimstat = E.fields["criminal"]
- var/background
- switch(crimstat)
- if("*Arrest*")
- background = "'background-color:#890E26'"
- if("Incarcerated")
- background = "'background-color:#743B03'"
- if("Parolled")
- background = "'background-color:#743B03'"
- if("Released")
- background = "'background-color:#216489'"
- if("None")
- background = "'background-color:#007f47'"
- if("")
- background = "''"
- crimstat = "No Record."
- dat += ""
- dat += text("[] ", R.fields["name"], R.fields["id"], R.fields["rank"], R.fields["fingerprint"], R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += {"
-
-
- "}
- dat += "Record Maintenance "
- dat += "{Log Out} "
- if(2.0)
- dat += "Records Maintenance "
- dat += "Delete All Records Back "
- if(3.0)
- dat += "Security Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += {"
- "}
- else
- dat += "General Record Lost! "
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], active2.fields["notes"])
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- dat += text("[]Delete Entry ", active2.fields[text("com_[]", counter)], counter)
- counter++
- dat += "Add Entry "
- dat += "Delete Record (Security Only) "
- else
- dat += "Security Record Lost! "
- dat += "New Security Record "
- dat += "\nDelete Record (ALL) \nPrint Record \nBack "
+/obj/machinery/computer/secure_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(SEC_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ var/crimstat = "null"
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ crimstat = E.fields["criminal"]
+ break
+ var/background = "''"
+ switch(crimstat)
+ if("*Arrest*")
+ background = "'background-color:#890E26'"
+ if("Incarcerated")
+ background = "'background-color:#743B03'"
+ if("Parolled")
+ background = "'background-color:#743B03'"
+ if("Released")
+ background = "'background-color:#216489'"
+ if("None")
+ background = "'background-color:#007f47'"
+ if("null")
+ crimstat = "No record."
+ data["records"] += list(list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"], "rank" = R.fields["rank"], "fingerprint" = R.fields["fingerprint"], "background" = background, "crimstat" = crimstat))
+ if(SEC_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "edit" = "name")
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "edit" = "id")
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "edit" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "edit" = "age")
+ fields[++fields.len] = list("field" = "Rank:", "value" = active1.fields["rank"], "edit" = "rank")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "edit" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"], "edit" = null)
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"], "edit" = null)
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] += (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- var/datum/browser/popup = new(user, "secure_rec", name, 600, 400)
- popup.set_content(dat)
- popup.add_head_content(head_content)
- popup.open(0)
- onclose(user, "secure_rec")
- return
+ general["empty"] = 1
+
+ var/list/security = list()
+ data["security"] = security
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ var/list/fields = list()
+ security["fields"] = fields
+ fields[++fields.len] = list("field" = "Criminal Status:", "value" = active2.fields["criminal"], "edit" = "criminal", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Minor Crimes:", "value" = active2.fields["mi_crim"], "edit" = "mi_crim", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["mi_crim_d"], "edit" = "mi_crim_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Major Crimes:", "value" = active2.fields["ma_crim"], "edit" = "ma_crim", "line_break" = 0)
+ fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["ma_crim_d"], "edit" = "ma_crim_d", "line_break" = 1)
+ fields[++fields.len] = list("field" = "Important Notes:", "value" = active2.fields["notes"], "edit" = "notes", "line_break" = 0)
+ if(!active2.fields["comments"] || !islist(active2.fields["comments"]))
+ active2.fields["comments"] = list()
+ security["comments"] = active2.fields["comments"]
+ security["empty"] = 0
+ else
+ security["empty"] = 1
+ return data
-/*Revised /N
-I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
-What a mess.*/
/obj/machinery/computer/secure_data/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(active1) ))
+
+ if(!data_core.general.Find(active1))
active1 = null
- if(!( data_core.security.Find(active2) ))
+ if(!data_core.security.Find(active2))
active2 = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
- if("Return")
- screen = 1
- active1 = null
- active2 = null
+ if(href_list["temp"])
+ temp = null
- if("Confirm Identity")
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- usr.put_in_hands(scan)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- scan = I
-
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
- active2 = null
-
- if("Log In")
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.active2 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = R.braintype
- src.screen = 1
- else if(istype(scan, /obj/item/weapon/card/id))
- active1 = null
- active2 = null
- if(check_access(scan))
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Record Maintenance")
- screen = 2
- active1 = null
- active2 = null
-
- if("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- var/S = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- active1 = R
- active2 = S
- screen = 3
-
-/* if("Search Fingerprints")
- var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
- return
- active1 = null
- active2 = null
- t1 = lowertext(t1)
- for(var/datum/data/record/R in data_core.general)
- if(lowertext(R.fields["fingerprint"]) == t1)
- active1 = R
- if(!( active1 ))
- temp = text("Could not locate record [].", t1)
- else
- for(var/datum/data/record/E in data_core.security)
- if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
- active2 = E
- screen = 3 */
-
- if("Print Record")
- if(!( printing ))
- printing = 1
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- P.info = "Security Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
- else
- P.info += "General Record Lost! "
- if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], active2.fields["notes"])
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- P.info += text("[] ", active2.fields[text("com_[]", counter)])
- counter++
- else
- P.info += "Security Record Lost! "
- P.info += ""
- P.name = "paper - 'Security Record'"
- printing = null
-
- if("Print Photo")
- if(!printing)
- printing = 1
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- sleep(50)
- if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
- create_record_photo(active1)
- printing = null
-
-//RECORD DELETE
- if("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Security records? "
- temp += "Yes "
- temp += "No "
-
- if("Purge All Records")
+ if(href_list["temp_action"])
+ var/temp_href = splittext(href_list["temp_action"], "=")
+ switch(temp_href[1])
+ if("del_all2")
for(var/datum/data/record/R in data_core.security)
qdel(R)
- temp = "All Security records deleted."
-
- if("Add Entry")
- if(!( istype(active2, /datum/data/record) ))
- return
- var/a2 = active2
- var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- var/counter = 1
- while(active2.fields[text("com_[]", counter)])
- counter++
- active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [worldtime2text()] [t1]")
-
- if("Delete Record (ALL)")
- if(active1)
- temp = "Are you sure you wish to delete the record (ALL)? "
- temp += "Yes "
- temp += "No "
-
- if("Delete Record (Security)")
+ setTemp("All records deleted. ")
+ if("del_r2")
if(active2)
- temp = "Are you sure you wish to delete the record (Security Portion Only)? "
- temp += "Yes "
- temp += "No "
+ qdel(active2)
+ if("del_rg2")
+ if(active1)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"])
+ qdel(R)
+ qdel(active1)
+ active1 = null
+ if(active2)
+ qdel(active2)
+ active2 = null
+ screen = SEC_DATA_R_LIST
+ if("criminal")
+ if(active2)
+ switch(temp_href[2])
+ if("none")
+ active2.fields["criminal"] = "None"
+ if("arrest")
+ active2.fields["criminal"] = "*Arrest*"
+ if("incarcerated")
+ active2.fields["criminal"] = "Incarcerated"
+ if("parolled")
+ active2.fields["criminal"] = "Parolled"
+ if("released")
+ active2.fields["criminal"] = "Released"
- if("Delete Entry")
- if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
- active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
-//RECORD CREATE
- if("New Record (Security)")
- if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- var/datum/data/record/R = new /datum/data/record()
- R.fields["name"] = active1.fields["name"]
- R.fields["id"] = active1.fields["id"]
- R.name = text("Security Record #[]", R.fields["id"])
- R.fields["criminal"] = "None"
- R.fields["mi_crim"] = "None"
- R.fields["mi_crim_d"] = "No minor crime convictions."
- R.fields["ma_crim"] = "None"
- R.fields["ma_crim_d"] = "No major crime convictions."
- R.fields["notes"] = "No notes."
- data_core.security += R
- active2 = R
- screen = 3
+ for(var/mob/living/carbon/human/H in mob_list)
+ H.sec_hud_set_security_status()
+ if("rank")
+ if(active1)
+ active1.fields["rank"] = temp_href[2]
+ if(temp_href[2] in joblist)
+ active1.fields["real_rank"] = temp_href[2]
- if("New Record (General)")
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["fingerprint"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- data_core.general += G
- active1 = G
- active2 = null
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
-//FIELD FUNCTIONS
- if("Edit Field")
- var/a1 = active1
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
+
+ if(authenticated)
+ active1 = null
+ active2 = null
+ screen = SEC_DATA_R_LIST
+
+ if(authenticated)
+ var/incapable = (usr.stat || usr.restrained() || (!in_range(src, usr) && !issilicon(usr)))
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+ active2 = null
+
+ else if(href_list["sort"])
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ sortBy = href_list["sort"]
+ order = initial(order)
+
+ else if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = SEC_DATA_R_LIST
+
+ active1 = null
+ active2 = null
+
+ else if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ var/datum/data/record/M = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ for(var/datum/data/record/E in data_core.security)
+ if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])
+ M = E
+ active1 = R
+ active2 = M
+ screen = SEC_DATA_RECORD
+
+ /*else if("s_fingerprint")
+ var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
+ if(!t1 || usr.stat || !authenticated || usr.restrained() || (!in_range(src, usr) && (!issilicon(usr)))
+ return
+ active1 = null
+ active2 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.general)
+ if(lowertext(R.fields["fingerprint"]) == t1)
+ active1 = R
+ if(!active1)
+ setTemp("Could not locate record [t1].")
+ else
+ for(var/datum/data/record/E in data_core.security)
+ if((E.fields["name"] == active1.fields["name"] && E.fields["id"] == active1.fields["id"]))
+ active2 = E
+ screen = SEC_DATA_RECORD */
+
+ else if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_all2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete all records? ", buttons)
+
+ else if(href_list["del_rg"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_rg2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (ALL)? ", buttons)
+
+ else if(href_list["del_r"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "href" = "del_r2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "href" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (Security Portion Only)? ", buttons)
+
+ else if(href_list["new_s"])
+ if(istype(active1, /datum/data/record) && !istype(active2, /datum/data/record))
+ var/datum/data/record/R = new /datum/data/record()
+ R.fields["name"] = active1.fields["name"]
+ R.fields["id"] = active1.fields["id"]
+ R.name = "Security Record #[R.fields["id"]]"
+ R.fields["criminal"] = "None"
+ R.fields["mi_crim"] = "None"
+ R.fields["mi_crim_d"] = "No minor crime convictions."
+ R.fields["ma_crim"] = "None"
+ R.fields["ma_crim_d"] = "No major crime convictions."
+ R.fields["notes"] = "No notes."
+ data_core.security += R
+ active2 = R
+ screen = SEC_DATA_RECORD
+
+ else if(href_list["new_g"])
+ var/datum/data/record/G = new /datum/data/record()
+ G.fields["name"] = "New Record"
+ G.fields["id"] = "[add_zero(num2hex(rand(1, 1.6777215E7)), 6)]"
+ G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = "Unassigned"
+ G.fields["sex"] = "Male"
+ G.fields["age"] = "Unknown"
+ G.fields["fingerprint"] = "Unknown"
+ G.fields["p_stat"] = "Active"
+ G.fields["m_stat"] = "Stable"
+ G.fields["species"] = "Human"
+ data_core.general += G
+ active1 = G
+ active2 = null
+
+ else if(href_list["print_r"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Security Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]] "}
+ else
+ P.info += "General Record Lost! "
+ if(istype(active2, /datum/data/record) && data_core.security.Find(active2))
+ P.info += {" \nSecurity Data
+ \nCriminal Status: [active2.fields["criminal"]] \n
+ \nMinor Crimes: [active2.fields["mi_crim"]]
+ \nDetails: [active2.fields["mi_crim_d"]] \n
+ \nMajor Crimes: [active2.fields["ma_crim"]]
+ \nDetails: [active2.fields["ma_crim_d"]] \n
+ \nImportant Notes:
+ \n\t[active2.fields["notes"]] \n \nComments/Log "}
+ for(var/c in active2.fields["comments"])
+ P.info += "[c] "
+ else
+ P.info += "Security Record Lost! "
+ P.info += ""
+ P.name = "paper - 'Security Record'"
+ printing = 0
+
+ else if(href_list["print_p"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ create_record_photo(active1)
+ printing = 0
+
+ else if(href_list["add_c"])
+ if(istype(active2, /datum/data/record))
var/a2 = active2
- switch(href_list["field"])
- if("name")
- if(istype(active1, /datum/data/record))
- var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["comments"] += "Made by [authenticated] ([rank]) on [current_date_string] [worldtime2text()] [t1]"
+
+ else if(href_list["del_c"])
+ var/index = min(max(text2num(href_list["del_c"]) + 1, 1), length(active2.fields["comments"]))
+ if(istype(active2, /datum/data/record) && active2.fields["comments"][index])
+ active2.fields["comments"] -= active2.fields["comments"][index]
+
+ if(href_list["field"])
+ if(incapable)
+ return 1
+ var/a1 = active1
+ var/a2 = active2
+ switch(href_list["field"])
+ if("name")
+ if(istype(active1, /datum/data/record))
+ var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
+ if(!t1 || !length(trim(t1)) || incapable || active1 != a1)
+ return 1
+ active1.fields["name"] = t1
if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(active1, /datum/data/record))
- if(active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("mi_crim")
+ active2.fields["name"] = t1
+ if("id")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["id"] = t1
if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim"] = t1
- if("mi_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["mi_crim_d"] = t1
- if("ma_crim")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim"] = t1
- if("ma_crim_d")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["ma_crim_d"] = t1
- if("notes")
- if(istype(active2, /datum/data/record))
- var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
- return
- active2.fields["notes"] = t1
- if("criminal")
- if(istype(active2, /datum/data/record))
- temp = "Criminal Status: "
- temp += ""
- if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank: "
- temp += ""
- for(var/rank in joblist)
- temp += "[rank] "
- temp += " "
+ active2.fields["id"] = t1
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if("Change Rank")
- if(active1)
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if("Change Criminal Status")
- if(active2)
- switch(href_list["criminal2"])
- if("none")
- active2.fields["criminal"] = "None"
- if("arrest")
- active2.fields["criminal"] = "*Arrest*"
- if("incarcerated")
- active2.fields["criminal"] = "Incarcerated"
- if("parolled")
- active2.fields["criminal"] = "Parolled"
- if("released")
- active2.fields["criminal"] = "Released"
-
- for(var/mob/living/carbon/human/H in mob_list)
- H.sec_hud_set_security_status()
-
- if("Delete Record (Security) Execute")
- if(active2)
- qdel(active2)
-
- if("Delete Record (ALL) Execute")
- if(active1)
- for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
- if(active2)
- qdel(active2)
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("mi_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["mi_crim"] = t1
+ if("mi_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["mi_crim_d"] = t1
+ if("ma_crim")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["ma_crim"] = t1
+ if("ma_crim_d")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["ma_crim_d"] = t1
+ if("notes")
+ if(istype(active2, /datum/data/record))
+ var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active2 != a2)
+ return 1
+ active2.fields["notes"] = t1
+ if("criminal")
+ if(istype(active2, /datum/data/record))
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == "None" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == "*Arrest*" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == "Incarcerated" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == "Parolled" ? "selected" : null))
+ buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == "Released" ? "selected" : null))
+ setTemp("Criminal Status ", buttons)
+ if("rank")
+ var/list/L = list("Head of Personnel", "Captain", "AI")
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if(istype(active1, /datum/data/record) && L.Find(rank))
+ var/list/buttons = list()
+ for(var/rank in joblist)
+ buttons[++buttons.len] = list("name" = rank, "icon" = null, "href" = "rank=[rank]", "status" = (active1.fields["rank"] == rank ? "selected" : null))
+ setTemp("Rank ", buttons)
else
- temp = "This function does not appear to be working at the moment. Our apologies."
+ setTemp("You do not have the required rank to do this! ")
+ if("species")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["species"] = t1
+ return 1
- add_fingerprint(usr)
- updateUsrDialog()
- return
+/obj/machinery/computer/secure_data/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
/obj/machinery/computer/secure_data/proc/create_record_photo(datum/data/record/R)
// basically copy-pasted from the camera code but different enough that it has to be redone
@@ -568,8 +481,8 @@ What a mess.*/
var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo")
small_img.Scale(8, 8)
tiny_img.Scale(4, 4)
- ic.Blend(small_img,ICON_OVERLAY, 10, 13)
- pc.Blend(tiny_img,ICON_OVERLAY, 12, 19)
+ ic.Blend(small_img, ICON_OVERLAY, 10, 13)
+ pc.Blend(tiny_img, ICON_OVERLAY, 12, 19)
var/datum/picture/P = new()
P.fields["name"] = "File Photo - [R.fields["name"]]"
@@ -582,8 +495,8 @@ What a mess.*/
P.fields["pixel_y"] = rand(-10, 10)
P.fields["size"] = 2
- var/obj/item/weapon/photo/Photo = new/obj/item/weapon/photo(loc)
- Photo.construct(P)
+ var/obj/item/weapon/photo/PH = new/obj/item/weapon/photo(loc)
+ PH.construct(P)
/obj/machinery/computer/secure_data/proc/get_record_photo(datum/data/record/R)
// similar to the code to make a photo, but of course the actual rendering is completely different
@@ -607,7 +520,7 @@ What a mess.*/
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -627,3 +540,7 @@ What a mess.*/
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
icon_state = "messyfiles"
+
+#undef SEC_DATA_R_LIST
+#undef SEC_DATA_MAINT
+#undef SEC_DATA_RECORD
\ No newline at end of file
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 384e9e80179..e98028e3807 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -1,4 +1,6 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define SKILL_DATA_R_LIST 1 // Record list
+#define SKILL_DATA_MAINT 2 // Records maintenance
+#define SKILL_DATA_RECORD 3 // Record
/obj/machinery/computer/skills//TODO:SANITY
name = "employment records console"
@@ -15,372 +17,280 @@
var/rank = null
var/screen = null
var/datum/data/record/active1 = null
- var/a_id = null
var/temp = null
var/printing = null
- var/can_change_id = 0
- var/list/Perp
- var/tempname = null
//Sorting Variables
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/skills/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
- O.loc = src
+ user.drop_item()
+ O.forceMove(src)
scan = O
- to_chat(user, "You insert [O].")
+ ui_interact(user)
..()
-/obj/machinery/computer/skills/attack_ai(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
-/obj/machinery/computer/skills/attack_hand(mob/user as mob)
+/obj/machinery/computer/skills/attack_hand(mob/user)
if(..())
return
-
- if(is_away_level(src.z))
+ if(is_away_level(z))
to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
- var/dat
+ add_fingerprint(user)
+ ui_interact(user)
- if(temp)
- dat = "[temp] Clear Screen "
- else
- dat = text("Confirm Identity: [] ", (scan ? text("[]", scan.name) : "----------"))
- if(authenticated)
- switch(screen)
- if(1.0)
- dat += {"
-"}
- dat += "Search Records "
- dat += "New Record "
- dat += {"
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
- "}
- if(!isnull(data_core.general))
- for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
- for(var/datum/data/record/E in data_core.security)
- var/background
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += "
"
- dat += "Record Maintenance "
- dat += "{Log Out} "
- if(2.0)
- dat += "Records Maintenance "
- dat += "Delete All Records Back "
- if(3.0)
- dat += "Employment Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += text("")
- else
- dat += "General Record Lost! "
- dat += "\nDelete Record (ALL) \nPrint Record \nBack "
- if(4.0)
- if(!Perp.len)
- dat += "ERROR. String could not be located.Back "
- else
- dat += {"
-
- "}
- dat += text("Search Results for '[]': ", tempname)
- dat += {"
-
-
-
-
-Name
-ID
-Rank
-Fingerprints
- "}
- for(var/i=1, i<=Perp.len, i += 2)
- var/crimstat = ""
- var/datum/data/record/R = Perp[i]
- if(istype(Perp[i+1],/datum/data/record/))
- var/datum/data/record/E = Perp[i+1]
- crimstat = E.fields["criminal"]
- var/background
- background = "'background-color:#00FF7F;'"
- dat += text("[] ", background, R, R.fields["name"])
- dat += text("[] ", R.fields["id"])
- dat += text("[] ", R.fields["rank"])
- dat += text("[] ", R.fields["fingerprint"])
- dat += text("[] ", crimstat)
- dat += "
"
- dat += "Return to index. "
+/obj/machinery/computer/skills/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "skills_data.tmpl", name, 800, 380)
+ ui.open()
+
+/obj/machinery/computer/skills/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["temp"] = temp
+ data["scan"] = scan ? scan.name : null
+ data["authenticated"] = authenticated
+ data["screen"] = screen
+ if(authenticated)
+ switch(screen)
+ if(SKILL_DATA_R_LIST)
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ data["records"] += list(list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"], "rank" = R.fields["rank"], "fingerprint" = R.fields["fingerprint"]))
+ if(SKILL_DATA_RECORD)
+ var/list/general = list()
+ data["general"] = general
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ var/list/fields = list()
+ general["fields"] = fields
+ fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "name" = "name")
+ fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "name" = "id")
+ fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "name" = "sex")
+ fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "name" = "age")
+ fields[++fields.len] = list("field" = "Rank:", "value" = active1.fields["rank"], "name" = "rank")
+ fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "name" = "fingerprint")
+ fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"])
+ fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"])
+ general["notes"] = active1.fields["notes"]
+ var/list/photos = list()
+ general["photos"] = photos
+ photos[++photos.len] = list("photo" = active1.fields["photo-south"])
+ photos[++photos.len] = list("photo" = active1.fields["photo-west"])
+ general["has_photos"] += (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0)
+ general["empty"] = 0
else
- else
- dat += "{Log In} "
- user << browse(text("Employment Records [] ", dat), "window=secure_rec;size=600x400")
- onclose(user, "secure_rec")
- return
+ general["empty"] = 1
+ return data
-/*Revised /N
-I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
-What a mess.*/
/obj/machinery/computer/skills/Topic(href, href_list)
if(..())
return 1
- if(!( data_core.general.Find(active1) ))
+
+ if(!data_core.general.Find(active1))
active1 = null
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- switch(href_list["choice"])
-// SORTING!
- if("Sorting")
- // Reverse the order if clicked twice
- if(sortBy == href_list["sort"])
- if(order == 1)
- order = -1
- else
- order = 1
- else
- // New sorting order!
- sortBy = href_list["sort"]
- order = initial(order)
-//BASIC FUNCTIONS
- if("Clear Screen")
- temp = null
- if("Return")
- screen = 1
- active1 = null
+ if(href_list["temp"])
+ temp = null
- if("Confirm Identity")
- if(scan)
- if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
- usr.put_in_hands(scan)
- else
- scan.loc = get_turf(src)
- scan = null
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- scan = I
-
- if("Log Out")
- authenticated = null
- screen = null
- active1 = null
-
- if("Log In")
- if(istype(usr, /mob/living/silicon/ai))
- src.active1 = null
- src.authenticated = usr.name
- src.rank = "AI"
- src.screen = 1
- else if(istype(usr, /mob/living/silicon/robot))
- src.active1 = null
- src.authenticated = usr.name
- var/mob/living/silicon/robot/R = usr
- src.rank = R.braintype
- src.screen = 1
- else if(istype(scan, /obj/item/weapon/card/id))
- active1 = null
- if(check_access(scan))
- authenticated = scan.registered_name
- rank = scan.assignment
- screen = 1
-//RECORD FUNCTIONS
- if("Search Records")
- var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
- return
- Perp = new/list()
- t1 = lowertext(t1)
- var/list/components = splittext(t1, " ")
- if(components.len > 5)
- return //Lets not let them search too greedily.
- for(var/datum/data/record/R in data_core.general)
- var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
- for(var/i = 1, i<=components.len, i++)
- if(findtext(temptext,components[i]))
- var/prelist = new/list(2)
- prelist[1] = R
- Perp += prelist
- for(var/i = 1, i<=Perp.len, i+=2)
- for(var/datum/data/record/E in data_core.security)
- var/datum/data/record/R = Perp[i]
- if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
- Perp[i+1] = E
- tempname = t1
- screen = 4
-
- if("Record Maintenance")
- screen = 2
- active1 = null
-
- if("Browse Record")
- var/datum/data/record/R = locate(href_list["d_rec"])
- if(!( data_core.general.Find(R) ))
- temp = "Record Not Found!"
- else
- for(var/datum/data/record/E in data_core.security)
- active1 = R
- screen = 3
-
- if("Print Record")
- if(!( printing ))
- printing = 1
- playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
- sleep(50)
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- P.info = "Employment Record "
- if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] \nEmployment/Skills Summary:[] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
- else
- P.info += "General Record Lost! "
- P.info += ""
- P.name = "paper - 'Employment Record'"
- printing = null
-//RECORD DELETE
- if("Delete All Records")
- temp = ""
- temp += "Are you sure you wish to delete all Employment records? "
- temp += "Yes "
- temp += "No "
-
- if("Purge All Records")
- if(PDA_Manifest.len)
+ if(href_list["temp_action"])
+ var/temp_list = splittext(href_list["temp_action"], "=")
+ switch(temp_list[1])
+ if("del_all2")
+ if(PDA_Manifest && PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.security)
qdel(R)
- temp = "All Employment records deleted."
-
- if("Delete Record (ALL)")
+ setTemp("All employment records deleted. ")
+ if("del_rg2")
if(active1)
- temp = "Are you sure you wish to delete the record (ALL)? "
- temp += "Yes "
- temp += "No "
-//RECORD CREATE
- if("New Record (General)")
+ if(PDA_Manifest && PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"])
+ qdel(R)
+ qdel(active1)
+ active1 = null
+ screen = SKILL_DATA_R_LIST
+ if("rank")
+ if(active1)
+ if(PDA_Manifest && PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ active1.fields["rank"] = temp_list[2]
+ if(temp_list[2] in joblist)
+ active1.fields["real_rank"] = temp_list[2]
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["fingerprint"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- data_core.general += G
- active1 = G
+ if(href_list["scan"])
+ if(scan)
+ scan.forceMove(loc)
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ scan = I
-//FIELD FUNCTIONS
- if("Edit Field")
- var/a1 = active1
- switch(href_list["field"])
- if("name")
- if(istype(active1, /datum/data/record))
- var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
- return
- active1.fields["name"] = t1
- if("id")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["id"] = t1
- if("fingerprint")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["fingerprint"] = t1
- if("sex")
- if(istype(active1, /datum/data/record))
- if(active1.fields["sex"] == "Male")
- active1.fields["sex"] = "Female"
- else
- active1.fields["sex"] = "Male"
- if("age")
- if(istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["age"] = t1
- if("rank")
- var/list/L = list( "Head of Personnel", "Captain", "AI" )
- //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if((istype(active1, /datum/data/record) && L.Find(rank)))
- temp = "Rank: "
- temp += ""
- for(var/rank in joblist)
- temp += "[rank] "
- temp += " "
+ if(href_list["login"])
+ if(isAI(usr))
+ authenticated = usr.name
+ rank = "AI"
+ else if(isrobot(usr))
+ authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ rank = "[R.modtype] [R.braintype]"
+ else if(istype(scan, /obj/item/weapon/card/id))
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
+
+ if(authenticated)
+ active1 = null
+ screen = SKILL_DATA_R_LIST
+
+ if(authenticated)
+ var/incapable = (usr.stat || usr.restrained() || (!in_range(src, usr) && !issilicon(usr)))
+ if(href_list["logout"])
+ authenticated = null
+ screen = null
+ active1 = null
+
+ else if(href_list["sort"])
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ sortBy = href_list["sort"]
+ order = initial(order)
+
+ else if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+ if(screen < 1)
+ screen = SKILL_DATA_R_LIST
+
+ active1 = null
+
+ else if(href_list["d_rec"])
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ if(!data_core.general.Find(R))
+ setTemp("Record not found! ")
+ return 1
+ active1 = R
+ screen = SKILL_DATA_RECORD
+
+ else if(href_list["del_all"])
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "val" = "del_all2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "val" = null, "status" = null)
+ setTemp("Are you sure you wish to delete all employment records? ", buttons)
+
+ else if(href_list["del_rg"])
+ if(active1)
+ var/list/buttons = list()
+ buttons[++buttons.len] = list("name" = "Yes", "icon" = "check", "val" = "del_rg2=1", "status" = null)
+ buttons[++buttons.len] = list("name" = "No", "icon" = "times", "val" = null, "status" = null)
+ setTemp("Are you sure you wish to delete the record (ALL)? ", buttons)
+
+ else if(href_list["new_g"])
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
+ var/datum/data/record/G = new /datum/data/record()
+ G.fields["name"] = "New Record"
+ G.fields["id"] = "[add_zero(num2hex(rand(1, 1.6777215E7)), 6)]"
+ G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = "Unassigned"
+ G.fields["sex"] = "Male"
+ G.fields["age"] = "Unknown"
+ G.fields["fingerprint"] = "Unknown"
+ G.fields["p_stat"] = "Active"
+ G.fields["m_stat"] = "Stable"
+ G.fields["species"] = "Human"
+ data_core.general += G
+ active1 = G
+
+ else if(href_list["print_r"])
+ if(!printing)
+ printing = 1
+ playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
+ P.info = "Employment Record "
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
+ \nSex: [active1.fields["sex"]]
+ \nAge: [active1.fields["age"]]
+ \nFingerprint: [active1.fields["fingerprint"]]
+ \nPhysical Status: [active1.fields["p_stat"]]
+ \nMental Status: [active1.fields["m_stat"]]
+ \nEmployment/Skills Summary:[active1.fields["notes"]] "}
+ else
+ P.info += "General Record Lost! "
+ P.info += ""
+ P.name = "paper - 'Employment Record'"
+ printing = 0
+
+ if(href_list["field"])
+ if(incapable)
+ return 1
+ var/a1 = active1
+ switch(href_list["field"])
+ if("name")
+ if(istype(active1, /datum/data/record))
+ var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
+ if(!t1 || !length(trim(t1)) || incapable || active1 != a1)
+ return 1
+ active1.fields["name"] = t1
+ if("id")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["id"] = t1
+ if("fingerprint")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
else
- alert(usr, "You do not have the required rank to do this!")
- if("species")
- if(istype(active1, /datum/data/record))
- var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
- return
- active1.fields["species"] = t1
-
-//TEMPORARY MENU FUNCTIONS
- else//To properly clear as per clear screen.
- temp=null
- switch(href_list["choice"])
- if("Change Rank")
- if(active1)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in joblist)
- active1.fields["real_rank"] = href_list["real_rank"]
-
- if("Delete Record (ALL) Execute")
- if(active1)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
- for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
- qdel(R)
- else
- qdel(active1)
+ active1.fields["sex"] = "Male"
+ if("age")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["age"] = t1
+ if("rank")
+ var/list/L = list("Head of Personnel", "Captain", "AI")
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if(istype(active1, /datum/data/record) && L.Find(rank))
+ var/list/buttons = list()
+ for(var/rank in joblist)
+ buttons[++buttons.len] = list("name" = rank, "icon" = null, "val" = "rank=[rank]", "status" = (active1.fields["rank"] == rank ? "selected" : null))
+ setTemp("Rank ", buttons)
else
- temp = "This function does not appear to be working at the moment. Our apologies."
+ setTemp("You do not have the required rank to do this! ")
+ if("species")
+ if(istype(active1, /datum/data/record))
+ var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || incapable || active1 != a1)
+ return 1
+ active1.fields["species"] = t1
+ return 1
- add_fingerprint(usr)
- updateUsrDialog()
- return
+/obj/machinery/computer/skills/proc/setTemp(text, list/buttons = list())
+ temp = list("text" = text, "buttons" = buttons, "has_buttons" = buttons.len > 0)
/obj/machinery/computer/skills/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
@@ -393,7 +303,7 @@ What a mess.*/
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -409,3 +319,7 @@ What a mess.*/
continue
..(severity)
+
+#undef SKILL_DATA_R_LIST
+#undef SKILL_DATA_MAINT
+#undef SKILL_DATA_RECORD
\ No newline at end of file
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 549c99dfbd1..032760fdd65 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -34,7 +34,7 @@
var/main_power_timer = null
var/backup_power_timer = null
var/spawnPowerRestoreRunning = 0
- var/welded = null
+ var/welded = FALSE
var/locked = 0
var/lights = 1 // bolt lights show by default
var/datum/wires/airlock/wires = null
@@ -90,6 +90,9 @@
icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
+/obj/machinery/door/airlock/welded
+ welded = 1
+
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Doorglass.dmi'
@@ -557,8 +560,8 @@ About the new airlock wires panel:
return
/obj/machinery/door/airlock/attack_ghost(mob/user)
- ui_interact(user)
-
+ ui_interact(user)
+
/obj/machinery/door/airlock/attack_ai(mob/user)
ui_interact(user)
@@ -987,17 +990,17 @@ About the new airlock wires panel:
update_icon()
return 1
-/obj/machinery/door/airlock/New()
- ..()
+/obj/machinery/door/airlock/initialize()
+ . = ..()
wires = new(src)
if(closeOtherId != null)
- spawn (5)
- for(var/obj/machinery/door/airlock/A in airlocks)
- if(A.closeOtherId == closeOtherId && A != src)
- closeOther = A
- break
+ for(var/obj/machinery/door/airlock/A in airlocks)
+ if(A.closeOtherId == closeOtherId && A != src)
+ closeOther = A
+ break
if(frozen)
- welded = 1
+ welded = TRUE
+ if(welded)
update_icon()
/obj/machinery/door/airlock/hatch/gamma/attackby(C as obj, mob/user as mob, params)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 0d1488acad6..e1532051632 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -21,6 +21,8 @@
var/autoclose_timer
var/glass = 0
var/normalspeed = 1
+ var/auto_close_time = 150
+ var/auto_close_time_dangerous = 5
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/emergency = 0
var/air_properties_vary_with_direction = 0
@@ -116,8 +118,8 @@
/obj/machinery/door/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
- return attack_hand(user)
-
+ return attack_hand(user)
+
/obj/machinery/door/attack_hand(mob/user)
return attackby(user, user)
@@ -130,7 +132,7 @@
if(istype(I, /obj/item/device/detective_scanner))
return
- if(operating || isrobot(user))
+ if(operating || isrobot(user))
return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
add_fingerprint(user)
@@ -231,7 +233,7 @@
// The `addtimer` system has the advantage of being cancelable
if(autoclose)
- autoclose_timer = addtimer(src, "autoclose", normalspeed ? 150 : 5, unique = 1)
+ autoclose_timer = addtimer(src, "autoclose", normalspeed ? auto_close_time : auto_close_time_dangerous, unique = 1)
return 1
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 526ad96cde4..052f0a99bea 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -13,22 +13,27 @@
icon = 'icons/obj/doors/Doorfireglass.dmi'
icon_state = "door_open"
opacity = 0
- density = 0
- heat_proof = 1
- glass = 1
+ density = FALSE
+ heat_proof = TRUE
+ glass = TRUE
power_channel = ENVIRON
closed_layer = 3.11
+ auto_close_time = 50
- var/assembly_type = /obj/structure/firelock_frame
+ var/can_force = TRUE
+ var/force_open_time = 300
+ var/can_crush = TRUE
+ var/assembly_type = /obj/structure/firelock_frame
var/nextstate = null
- var/welded = 0
- var/boltslocked = 1
- var/can_deconstruct = 1
+ var/welded = FALSE
+ var/boltslocked = TRUE
+ var/can_deconstruct = TRUE
+ var/active_alarm = FALSE
/obj/machinery/door/firedoor/Bumped(atom/AM)
- if(p_open || operating)
+ if(p_open || operating)
return
- if(!density)
+ if(!density)
return ..()
return 0
@@ -38,7 +43,7 @@
latetoggle()
else
stat |= NOPOWER
- return
+ update_icon()
/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob, params)
add_fingerprint(user)
@@ -81,30 +86,44 @@
if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe))
if(istype(C, /obj/item/weapon/twohanded/fireaxe))
- var/obj/item/weapon/twohanded/fireaxe/F = C
+ var/obj/item/weapon/twohanded/fireaxe/F = C
if(!F.wielded)
return
+ user.visible_message("[user] forces \the [src] with [C].",
+ "You force \the [src] with [C].")
if(density)
+ autoclose = TRUE
open()
else
close()
-/obj/machinery/door/firedoor/attack_hand(mob/user)
- add_fingerprint(user)
- if(welded || operating || stat & NOPOWER)
+/obj/machinery/door/firedoor/attack_hand(mob/user)
+ if(operating || !density)
return
- if(density)
- open()
- else
- close()
-
+
+ add_fingerprint(user)
+
+ if(can_force && (!glass || user.a_intent != I_HELP))
+ user.visible_message("[user] begins forcing \the [src]. ", \
+ "You begin forcing \the [src]. ")
+ if(do_after(user, force_open_time, target = src))
+ user.visible_message("[user] forces \the [src]. ", \
+ "You force \the [src]. ")
+ autoclose = TRUE
+ open()
+ else if(glass)
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.visible_message("[user] bangs on \the [src]. ",
+ "You bang on \the [src]. ")
+ playsound(get_turf(src), 'sound/effects/Glassknock.ogg', 10, 1)
+
/obj/machinery/door/firedoor/attack_ai(mob/user)
- attack_hand(user)
-
+ forcetoggle()
+
/obj/machinery/door/firedoor/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
- attack_hand(user)
+ forcetoggle(TRUE)
/obj/machinery/door/firedoor/attack_alien(mob/user)
add_fingerprint(user)
@@ -122,6 +141,8 @@
/obj/machinery/door/firedoor/update_icon()
overlays.Cut()
+ if(active_alarm && !(stat & NOPOWER))
+ overlays += image('icons/obj/doors/Doorfire.dmi', "alarmlights")
if(density)
icon_state = "door_closed"
if(welded)
@@ -131,14 +152,28 @@
if(welded)
overlays += "welded_open"
+/obj/machinery/door/firedoor/proc/activate_alarm()
+ active_alarm = TRUE
+ update_icon()
+
+/obj/machinery/door/firedoor/proc/deactivate_alarm()
+ active_alarm = FALSE
+ update_icon()
+
/obj/machinery/door/firedoor/open()
. = ..()
latetoggle()
/obj/machinery/door/firedoor/close()
. = ..()
+ if(can_crush)
+ crush()
latetoggle()
+/obj/machinery/door/firedoor/autoclose()
+ if(active_alarm)
+ . = ..()
+
/obj/machinery/door/firedoor/proc/latetoggle()
if(operating || stat & NOPOWER || !nextstate)
return
@@ -149,7 +184,15 @@
if(CLOSED)
nextstate = null
close()
-
+
+/obj/machinery/door/firedoor/proc/forcetoggle(magic = FALSE)
+ if(!magic && (operating || stat & NOPOWER))
+ return
+ if(density)
+ open()
+ else
+ close()
+
/obj/machinery/door/firedoor/proc/deconstruct(disassembled = TRUE)
if(can_deconstruct)
var/obj/structure/firelock_frame/F = new assembly_type(get_turf(src))
@@ -159,10 +202,11 @@
F.constructionStep = CONSTRUCTION_WIRES_EXPOSED
F.update_icon()
qdel(src)
-
-/obj/machinery/door/firedoor/border_only
+
+/obj/machinery/door/firedoor/border_only
icon = 'icons/obj/doors/edge_Doorfire.dmi'
flags = ON_BORDER
+ can_crush = FALSE
/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
@@ -189,10 +233,11 @@
/obj/machinery/door/firedoor/heavy
name = "heavy firelock"
icon = 'icons/obj/doors/Doorfire.dmi'
- glass = 0
+ glass = FALSE
opacity = 1
assembly_type = /obj/structure/firelock_frame/heavy
-
+ can_force = FALSE
+
/obj/machinery/door/firedoor/heavy/ex_act(severity)
switch(severity)
if(1.0)
@@ -215,7 +260,7 @@
density = 1
var/constructionStep = CONSTRUCTION_NOCIRCUIT
var/reinforced = 0
-
+
/obj/structure/firelock_frame/heavy
name = "heavy firelock frame"
reinforced = 1
@@ -398,4 +443,4 @@
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index ae0b2738d1b..5b799d3a2e4 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -24,7 +24,8 @@
if(stat & (BROKEN|NOPOWER))
return
user.set_machine(src)
- var/dat = "Telecommunication Server Monitor Telecommunications Server Monitor "
+ var/list/dat = list()
+ dat += "Telecommunication Server Monitor Telecommunications Server Monitor "
switch(screen)
@@ -63,55 +64,16 @@
var/i = 0
for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
i++
-
-
// If the log is a speech file
if(C.input_type == "Speech File")
-
dat += "[C.name] \[X\] "
- // -- Determine race of orator --
-
- var/race // The actual race of the mob
- var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human
- var/mobtype = C.parameters["mobtype"]
- var/mob/M = new mobtype
-
- if(ishuman(M) || isbrain(M))
- var/mob/living/carbon/human/H = M
- race = "[H.species.name]"
-
-
- else if(issmall(M))
- race = "Monkey"
- language = race
-
- else if(issilicon(M) || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
- race = "Artificial Life"
-
- else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes
- race = "Slime"
- language = race
-
- else if(isbot(M))
- race = "Bot"
-
- else if(isanimal(M))
- race = "Domestic Animal"
- language = race
-
- else
- race = "Unidentifiable "
- language = race
-
- qdel(M)
-
// -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
- if(language == "Human" || universal_translate || C.parameters["uspeech"])
+ if(user.say_understands(null, C.parameters["language"]) || universal_translate || C.parameters["uspeech"])
dat += "Data type : [C.input_type] "
dat += "Source : [C.parameters["name"]] (Job: [C.parameters["job"]]) "
- dat += "Class : [race] "
+ dat += "Class : [C.parameters["race"]] "
dat += "Contents : \"[C.parameters["message"]]\" "
@@ -120,7 +82,7 @@
else
dat += "Data type : Audio File "
dat += "Source : Unidentifiable "
- dat += "Class : [race] "
+ dat += "Class : [C.parameters["race"]] "
dat += "Contents : Unintelligble "
dat += " "
@@ -136,7 +98,7 @@
- user << browse(dat, "window=comm_monitor;size=575x400")
+ user << browse(dat.Join(""), "window=comm_monitor;size=575x400")
onclose(user, "server_control")
temp = ""
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index a4e481f430b..953fdb68b8b 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -475,7 +475,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
// Copy the signal.data entries we want
log.parameters["mobtype"] = signal.data["mobtype"]
+ log.parameters["race"] = signal.data["race"]
log.parameters["job"] = signal.data["job"]
+ log.parameters["language"] = signal.data["language"]
log.parameters["key"] = signal.data["key"]
log.parameters["vmessage"] = signal.data["message"]
log.parameters["vname"] = signal.data["vname"]
diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm
deleted file mode 100644
index 65d873666d1..00000000000
--- a/code/game/objects/effects/datacore-effect.dm
+++ /dev/null
@@ -1,228 +0,0 @@
-//This item is not completely unused- the central datacore datum uses it.
-/*
- * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
- */
-
-/obj/effect/datacore
- name = "datacore"
- var/medical[] = list()
- var/general[] = list()
- var/security[] = list()
- //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
- var/locked[] = list()
-
-
-/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
- var/list/heads = new()
- var/list/sec = new()
- var/list/eng = new()
- var/list/med = new()
- var/list/sci = new()
- var/list/ser = new()
- var/list/sup = new()
- var/list/bot = new()
- var/list/misc = new()
- var/list/isactive = new()
- var/dat = {"
-
-
- Name Rank Activity
- "}
- var/even = 0
- // sort mobs
- for(var/datum/data/record/t in data_core.general)
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/real_rank = t.fields["real_rank"]
- if(OOC)
- var/active = 0
- for(var/mob/M in player_list)
- if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
- active = 1
- break
- isactive[name] = active ? "Active" : "Inactive"
- else
- isactive[name] = t.fields["p_stat"]
-// to_chat(world, "[name]: [rank]")
- //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
- var/department = 0
- if(real_rank in command_positions)
- heads[name] = rank
- department = 1
- if(real_rank in security_positions)
- sec[name] = rank
- department = 1
- if(real_rank in engineering_positions)
- eng[name] = rank
- department = 1
- if(real_rank in medical_positions)
- med[name] = rank
- department = 1
- if(real_rank in science_positions)
- sci[name] = rank
- department = 1
- if(real_rank in service_positions)
- ser[name] = rank
- department = 1
- if(real_rank in supply_positions)
- sup[name] = rank
- department = 1
- if(real_rank in nonhuman_positions)
- bot[name] = rank
- department = 1
- if(!department && !(name in heads))
- misc[name] = rank
- if(heads.len > 0)
- dat += "Heads "
- for(name in heads)
- dat += "[name] [heads[name]] [isactive[name]] "
- even = !even
- if(sec.len > 0)
- dat += "Security "
- for(name in sec)
- dat += "[name] [sec[name]] [isactive[name]] "
- even = !even
- if(eng.len > 0)
- dat += "Engineering "
- for(name in eng)
- dat += "[name] [eng[name]] [isactive[name]] "
- even = !even
- if(med.len > 0)
- dat += "Medical "
- for(name in med)
- dat += "[name] [med[name]] [isactive[name]] "
- even = !even
- if(sci.len > 0)
- dat += "Science "
- for(name in sci)
- dat += "[name] [sci[name]] [isactive[name]] "
- even = !even
- if(ser.len > 0)
- dat += "Service "
- for(name in ser)
- dat += "[name] [ser[name]] [isactive[name]] "
- even = !even
- if(sup.len > 0)
- dat += "Supply "
- for(name in sup)
- dat += "[name] [sup[name]] [isactive[name]] "
- even = !even
- // in case somebody is insane and added them to the manifest, why not
- if(bot.len > 0)
- dat += "Silicon "
- for(name in bot)
- dat += "[name] [bot[name]] [isactive[name]] "
- even = !even
- // misc guys
- if(misc.len > 0)
- dat += "Miscellaneous "
- for(name in misc)
- dat += "[name] [misc[name]] [isactive[name]] "
- even = !even
-
- dat += "
"
- dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
- dat = replacetext(dat, "\t", "")
- return dat
-
-
-/*
-We can't just insert in HTML into the nanoUI so we need the raw data to play with.
-Instead of creating this list over and over when someone leaves their PDA open to the page
-we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
-using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
-*/
-
-var/global/list/PDA_Manifest = list()
-
-/obj/effect/datacore/proc/get_manifest_json()
- if(PDA_Manifest.len)
- return
- var/heads[0]
- var/sec[0]
- var/eng[0]
- var/med[0]
- var/sci[0]
- var/ser[0]
- var/sup[0]
- var/bot[0]
- var/misc[0]
- for(var/datum/data/record/t in data_core.general)
- var/name = sanitize(t.fields["name"])
- var/rank = sanitize(t.fields["rank"])
- var/real_rank = t.fields["real_rank"]
-
- var/isactive = t.fields["p_stat"]
- var/department = 0
- var/depthead = 0 // Department Heads will be placed at the top of their lists.
- if(real_rank in command_positions)
- heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- depthead = 1
- if(rank == "Captain" && heads.len != 1)
- heads.Swap(1, heads.len)
-
- if(real_rank in security_positions)
- sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sec.len != 1)
- sec.Swap(1, sec.len)
-
- if(real_rank in engineering_positions)
- eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && eng.len != 1)
- eng.Swap(1, eng.len)
-
- if(real_rank in medical_positions)
- med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && med.len != 1)
- med.Swap(1, med.len)
-
- if(real_rank in science_positions)
- sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sci.len != 1)
- sci.Swap(1, sci.len)
-
- if(real_rank in service_positions)
- ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && ser.len != 1)
- ser.Swap(1, ser.len)
-
- if(real_rank in supply_positions)
- sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sup.len != 1)
- sup.Swap(1, sup.len)
-
- if(real_rank in nonhuman_positions)
- bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
-
- if(!department && !(name in heads))
- misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
-
-
- PDA_Manifest = list(\
- "heads" = heads,\
- "sec" = sec,\
- "eng" = eng,\
- "med" = med,\
- "sci" = sci,\
- "ser" = ser,\
- "sup" = sup,\
- "bot" = bot,\
- "misc" = misc\
- )
- return
-
diff --git a/code/game/objects/effects/spawners/random_barrier.dm b/code/game/objects/effects/spawners/random_barrier.dm
new file mode 100644
index 00000000000..ff165fff38a
--- /dev/null
+++ b/code/game/objects/effects/spawners/random_barrier.dm
@@ -0,0 +1,55 @@
+/obj/effect/spawner/random_barrier
+ name = "random tile"
+ var/list/result = list(
+ /turf/simulated/floor/plasteel = 1,
+ /turf/simulated/wall = 1,
+ /obj/structure/falsewall = 1,
+ /obj/effect/spawner/window/reinforced = 1,
+ /obj/machinery/door/airlock = 1,
+ /obj/machinery/door/airlock/welded = 1,
+ /obj/structure/barricade/wooden = 1)
+
+// This needs to come before the initialization wave because
+// the thing it creates might need to be initialized too
+/obj/effect/spawner/random_barrier/New()
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(!T)
+ log_runtime(EXCEPTION("Barrier spawner placed in nullspace!"), src)
+ return
+ var/thing_to_place = pickweight(result)
+ if(ispath(thing_to_place, /turf))
+ T.ChangeTurf(thing_to_place)
+ else
+ new thing_to_place(T)
+ qdel(src)
+
+/obj/effect/spawner/random_barrier/wall_probably
+ name = "probably a wall"
+ result = list(
+ /turf/simulated/wall = 9,
+ /obj/structure/falsewall = 1
+ )
+
+/obj/effect/spawner/random_barrier/floor_probably
+ name = "probably a floor"
+ result = list(
+ /turf/simulated/floor/plasteel = 3,
+ /turf/simulated/wall = 1
+ )
+
+/obj/effect/spawner/random_barrier/obstruction
+ name = "obstruction"
+ result = list(
+ /turf/simulated/wall = 1,
+ /obj/structure/falsewall = 1,
+ /obj/structure/barricade/wooden = 1,
+ /obj/machinery/door/airlock/welded = 1
+ )
+
+/obj/effect/spawner/random_barrier/possibly_welded_airlock
+ name = "possibly welded airlock"
+ result = list(
+ /obj/machinery/door/airlock = 3,
+ /obj/machinery/door/airlock/welded = 1
+ )
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index e144c5d3c50..419ba6cc5bc 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -242,7 +242,6 @@ var/global/list/default_medbay_channels = list(
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if(channel == "department")
-// to_chat(world, "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"")
channel = channels[1]
connection = secure_radio_connections[channel]
else
@@ -259,9 +258,8 @@ var/global/list/default_medbay_channels = list(
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
- 4, 0, zlevel, connection.frequency, follow_target=follow_target)
+ 4, 0, zlevel, connection.frequency, follow_target = follow_target)
qdel(A)
- return
// Just a dummy mob used for making announcements, so we don't create AIs to do this
// I'm not sure who thought that was a good idea. -- Crazylemon
@@ -403,6 +401,7 @@ var/global/list/default_medbay_channels = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
+ "race" = signal.get_race(M),
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -464,6 +463,7 @@ var/global/list/default_medbay_channels = list(
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
+ "race" = signal.get_race(M), // text to show next to mob in comms log console
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
@@ -562,7 +562,7 @@ var/global/list/default_medbay_channels = list(
var/range = receive_range(freq, level)
if(range > -1)
return get_mobs_in_view(canhear_range, src)
-
+
/obj/item/device/radio/proc/is_listening()
var/is_listening = TRUE
if(!on)
@@ -573,11 +573,11 @@ var/global/list/default_medbay_channels = list(
is_listening = FALSE
return is_listening
-
+
/obj/item/device/radio/proc/send_announcement()
if(is_listening())
return get_mobs_in_view(canhear_range, src)
-
+
return null
/obj/item/device/radio/examine(mob/user, var/distance = -1)
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 5fc704b7618..5ab7a6cd61a 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -80,8 +80,7 @@
//TODO; Add support for reagents in water.
if(target.loc == user)//No more spraying yourself when putting your extinguisher away
return
- var/Refill = AttemptRefill(target, user)
- if(Refill)
+ if(AttemptRefill(target, user))
return
if(!safety)
if(src.reagents.total_volume < 1)
@@ -164,4 +163,4 @@
if(W.loc == my_target) break
sleep(2)
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
index db4f25e1be2..da9560122ad 100644
--- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm
+++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
@@ -3,6 +3,7 @@
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
var/mobname = "Will Robinson"
activated = 0
+ var/static/list/stealth_areas = typecacheof(list(/area/syndicate_station, /area/syndicate_mothership, /area/shuttle/syndicate_elite))
/obj/item/weapon/implant/death_alarm/get_data()
var/dat = {"Implant Specifications:
@@ -33,26 +34,26 @@
/obj/item/weapon/implant/death_alarm/activate(var/cause)
var/mob/M = imp_in
var/area/t = get_area(M)
+
+ var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
+ a.follow_target = M
+
switch(cause)
if("death")
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
- if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
+ if(is_type_in_typecache(t, stealth_areas))
//give the syndies a bit of stealth
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm")
else
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
- qdel(a)
qdel(src)
if("emp")
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
var/name = prob(50) ? t.name : pick(teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
- qdel(a)
else
- var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
- qdel(a)
qdel(src)
+
+ qdel(a)
/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
activate("emp") //let's shout that this dude is dead
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index a61a3cea5ce..39481c4f6ab 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -45,7 +45,7 @@
/obj/item/weapon/tank/ui_action_click(mob/user)
toggle_internals(user)
-/obj/item/weapon/tank/proc/toggle_internals(mob/user)
+/obj/item/weapon/tank/proc/toggle_internals(mob/user, silent = FALSE)
var/mob/living/carbon/C = user
if(!istype(C))
return 0
@@ -65,13 +65,16 @@
if(can_open_valve)
if(C.internal)
- to_chat(C, "You switch your internals to [src]. ")
+ if(!silent)
+ to_chat(C, "You switch your internals to [src]. ")
else
- to_chat(C, "You open \the [src] valve. ")
+ if(!silent)
+ to_chat(C, "You open \the [src] valve. ")
C.internal = src
C.update_internals_hud_icon(1)
else
- to_chat(C, "You are not wearing a suitable mask or helmet. ")
+ if(!silent)
+ to_chat(C, "You are not wearing a suitable mask or helmet. ")
return 0
C.update_action_buttons_icon()
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 fce3cd376e2..8d854c384e8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -15,7 +15,6 @@
else
new /obj/item/weapon/storage/backpack/satchel_cap(src)
new /obj/item/weapon/book/manual/faxes(src)
- new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/weapon/storage/backpack/duffel/captain(src)
new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/suit/captunic/capjacket(src)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index e2e287052ff..301cf1c2053 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -60,19 +60,16 @@
set src in oview(1)
if(config.ghost_interaction)
- src.dir = turn(src.dir, 90)
+ setDir(turn(dir, 90))
handle_rotation()
return
- else
- if(!usr || !isturf(usr.loc))
- return
- if(usr.stat || usr.restrained())
- return
- src.dir = turn(src.dir, 90)
- handle_rotation()
+ if(usr.incapacitated())
return
+ setDir(turn(dir, 90))
+ handle_rotation()
+
/obj/structure/stool/bed/chair/AltClick(mob/user)
if(user.incapacitated())
to_chat(user, "You can't do that right now! ")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index ef3199b3484..ed4dc9e5cf6 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1741,33 +1741,42 @@
btypes += "Heal Over Time"
btypes += "Permanent Regeneration"
btypes += "Super Powers"
- var/blessing = input(src.owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
+ var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
if(!(blessing in btypes))
return
+ var/logmsg = null
switch(blessing)
if("To Arrivals")
M.forceMove(pick(latejoin))
to_chat(M, "You are abruptly pulled through space! ")
+ logmsg = "a teleport to arrivals."
if("Moderate Heal")
M.adjustBruteLoss(-25)
M.adjustFireLoss(-25)
M.adjustToxLoss(-25)
M.adjustOxyLoss(-25)
to_chat(M,"You feel invigorated! ")
+ logmsg = "a moderate heal."
if("Heal Over Time")
H.reagents.add_reagent("salglu_solution", 30)
H.reagents.add_reagent("salbutamol", 20)
H.reagents.add_reagent("spaceacillin", 20)
+ logmsg = "a heal over time."
if("Permanent Regeneration")
H.dna.SetSEState(REGENERATEBLOCK, 1)
genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
H.update_mutations()
+ logmsg = "permanent regeneration."
if("Super Powers")
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
for(var/gene in default_genes)
H.dna.SetSEState(gene, 1)
genemutcheck(H, gene, null, MUTCHK_FORCED)
H.update_mutations()
+ logmsg = "superpowers."
+ if(logmsg)
+ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
+ message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
else if(href_list["Smite"])
if(!check_rights(R_ADMIN))
return
@@ -1784,9 +1793,10 @@
ptypes += "Cluwne"
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
- var/punishment = input(src.owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
+ var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
+ var/logmsg = null
switch(punishment)
if("Lightning bolt")
M.electrocute_act(5, "Lightning Bolt", safety=1)
@@ -1794,20 +1804,25 @@
M.adjustFireLoss(75)
M.Weaken(5)
to_chat(M, "The gods have punished you for your sins! ")
+ logmsg = "a lightning bolt."
if("Brain Damage")
H.adjustBrainLoss(75)
+ logmsg = "75 brain damage."
if("Fire Death")
to_chat(M,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting? ")
var/turf/simulated/T = get_turf(M)
new /obj/effect/hotspot(T)
M.adjustFireLoss(150)
+ logmsg = "a firey death."
if("Honk Tumor")
if(!H.get_int_organ(/obj/item/organ/internal/honktumor))
var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor
to_chat(H, "Life seems funnier, somehow. ")
organ.insert(H)
+ logmsg = "a honk tumor."
if("Cluwne")
H.makeCluwne()
+ logmsg = "cluwned."
if("Mutagen Cookie")
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
evilcookie.reagents.add_reagent("mutagen", 10)
@@ -1815,6 +1830,7 @@
evilcookie.bitesize = 100
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
+ logmsg = "a mutagen cookie."
if("Hellwater Cookie")
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
evilcookie.reagents.add_reagent("hell_water", 25)
@@ -1822,8 +1838,13 @@
evilcookie.bitesize = 100
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
+ logmsg = "a hellwater cookie."
if("Gib")
+ logmsg = "gibbed."
M.gib(FALSE)
+ if(logmsg)
+ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]")
+ message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]")
else if(href_list["FaxReplyTemplate"])
if(!check_rights(R_ADMIN))
return
@@ -3132,7 +3153,7 @@
error_viewer.showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
else
error_viewer.showTo(usr, null, href_list["viewruntime_linear"])
-
+
else if(href_list["add_station_goal"])
if(!check_rights(R_EVENT))
return
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 59ea8992889..035139b81fc 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -574,67 +574,35 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
alert("Invalid mob")
return
- //log_admin("[key_name(src)] has alienized [M.key].")
- var/list/dresspacks = list(
+ var/list/choices = list(
"strip",
"as job...",
- "Engineer RIG",
- "CE RIG",
- "Mining RIG",
- "Syndi RIG",
- "Wizard RIG",
- "Medical RIG",
- "Atmos RIG",
- "standard space gear",
- "tournament standard red",
- "tournament standard green",
- "tournament gangster",
- "tournament chef",
- "tournament janitor",
- "pirate",
- "space pirate",
- "soviet tourist",
- "soviet soldier",
- "soviet admiral",
- "tunnel clown",
- "mime assassin",
- "survivor",
- "greytide",
- "greytide leader",
- "greytide xeno",
- "masked killer",
- "singuloth knight",
- "dark lord",
- "assassin",
- "spy",
- "vox",
- "death commando",
- "syndicate agent",
- "syndicate operative",
- "syndicate bomber",
- "syndicate strike team",
- "syndicate officer",
- "chrono legionnaire",
- "blue wizard",
- "red wizard",
- "marisa wizard",
- "emergency response team member",
- "emergency response team leader",
- "nt vip guest",
- "nt navy officer", // now in jobs list
- "nt navy captain",
- "nt special ops officer", // now in jobs list
- "nt special ops formal",
- )
+ "emergency response team member",
+ "emergency response team leader"
+ )
+
+ var/admin_outfits = subtypesof(/datum/outfit/admin)
+ for(var/type in admin_outfits)
+ var/datum/outfit/O = type
+ var/name = initial(O.name)
+ if(name != "Naked")
+ choices[initial(O.name)] = type
+
var/dostrip = 0
switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
if("Yes")
dostrip = 1
if("Cancel")
return
- var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
+
+ var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices
if(isnull(dresscode))
return
+
+ var/datum/outfit/O
+ if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader")))
+ O = choices[dresscode]
+
var/datum/job/jobdatum
if(dresscode == "as job...")
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
@@ -648,6 +616,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(I, /obj/item/organ))
continue
qdel(I)
+
+
switch(dresscode)
if("strip")
//do nothing
@@ -657,495 +627,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(jobdatum)
dresscode = "[jobdatum.title]"
jobdatum.equip(M)
- equip_special_id(M,jobdatum.get_access(),jobdatum.title, jobdatum.idtype)
-
- if("standard space gear")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
- M.equip_to_slot_or_del(J, slot_back)
- J.turn_on()
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- J.Topic(null, list("stat" = 1))
- equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id)
-
- if("Engineer RIG", "CE RIG", "Mining RIG", "Syndi RIG", "Wizard RIG", "Medical RIG", "Atmos RIG")
- if(dresscode=="Engineer RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head)
- else if(dresscode=="CE RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/elite(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/elite(M), slot_head)
- else if(dresscode=="Mining RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/mining(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/mining(M), slot_head)
- else if(dresscode=="Syndi RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
- else if(dresscode=="Wizard RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/wizard(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/wizard(M), slot_head)
- else if(dresscode=="Medical RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/medical(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/medical(M), slot_head)
- else if(dresscode=="Atmos RIG")
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/atmos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head)
- var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
- M.equip_to_slot_or_del(J, slot_back)
- J.turn_on()
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id)
- J.Topic(null, list("stat" = 1))
-
- if("tournament standard red", "tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
- if(dresscode=="tournament standard red")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
- else
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
-
- if("tournament gangster") //gangster are supposed to fight each other. --rastaf0
- M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
-
- if("tournament chef") //Steven Seagal FTW
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
-
- if("tournament janitor")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- var/obj/item/weapon/storage/backpack/backpack = new(M)
- for(var/obj/item/I in backpack)
- qdel(I)
- M.equip_to_slot_or_del(backpack, slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
- var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
- bucket.reagents.add_reagent("water", 70)
- M.equip_to_slot_or_del(bucket, slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
-
- if("pirate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id)
-
- if("space pirate") // not spaceworthy, just has fancier coat.
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id)
-
- if("tunnel clown")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/chaplain_hoodie(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
- equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
-
-
- if("mime assassin")
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back)
- if(M.gender == FEMALE)
- M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask)
- else
- M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- var/obj/item/device/pda/mime/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Mime"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
- equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
-
- if("survivor")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id)
- for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))
- carried_item.add_blood(M)
-
- if("greytide")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id)
-
- if("greytide leader")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id)
-
- if("greytide xeno")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id)
-
- if("masked killer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
- for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))
- carried_item.add_blood(M)//Oh yes, there will be blood...
-
- if("dark lord")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
- var/obj/item/clothing/suit/hooded/chaplain_hoodie/robe = new /obj/item/clothing/suit/hooded/chaplain_hoodie(M)
- robe.name = "dark lord robes"
- robe.hood.name = "dark lord hood"
- M.equip_to_slot_or_del(robe, slot_wear_suit)
- equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("assassin")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
- for(var/obj/item/briefcase_item in sec_briefcase)
- qdel(briefcase_item)
- for(var/i=3, i>0, i--)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1)
- // briefcase must be unlocked by setting the code.
- M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Reaper"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
- equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("spy")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/chameleon(M), slot_glasses)
- var/obj/item/clothing/gloves/combat/G = new /obj/item/clothing/gloves/combat(src)
- G.name = "black gloves"
- M.equip_to_slot_or_del(G, slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack)
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Spy"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_belt)
- equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
-
-
- if("vox")
- if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear!
- M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie")
- else
- M.equip_vox_raider()
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand)
- M.regenerate_icons()
-
- if("death commando")
- M.equip_death_commando()
-
- if("syndicate agent")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Agent", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 20
- M.equip_to_slot_or_del(U, slot_r_store)
-
- if("syndicate bomber")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie")
-
- if("syndicate operative")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
- R.set_frequency(SYND_FREQ)
- M.equip_to_slot_or_del(R, slot_l_ear)
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 20
- M.equip_to_slot_or_del(U, slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
- equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Operative", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(M)
- E.implant(M)
-
- if("syndicate strike team")
- M.equip_syndicate_commando()
-
- if("syndicate officer")
- M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(M), slot_head)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
- R.set_frequency(SYND_FREQ)
- M.equip_to_slot_or_del(R, slot_l_ear)
- var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
- U.hidden_uplink.uplink_owner="[M.key]"
- U.hidden_uplink.uses = 50
- M.equip_to_slot_or_del(U, slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses() + get_syndicate_access("Syndicate Commando"), "Syndicate Officer", /obj/item/weapon/card/id/syndicate, "commander")
- var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
- DUST.implant(M)
-
- if("nt vip guest")
- M.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
- M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda)
- equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom)
-
- if("nt navy officer")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
- M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- M.sec_hud_set_implants()
- equip_special_id(M,get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer", /obj/item/weapon/card/id/centcom)
-
- if("nt navy captain")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
- M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
- M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
- M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- M.sec_hud_set_implants()
- equip_special_id(M,get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain", /obj/item/weapon/card/id/centcom)
if("emergency response team member", "emergency response team leader")
var/datum/response_team/equip_team = null
@@ -1173,170 +654,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
to_chat(src, "Invalid ERT Loadout selected")
- if("nt special ops officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy
- M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_wear_pda)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
- // The following items are unique to this outfit - the special ops officer job does not spawn with them.
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/implanter/loyalty(M), slot_in_backpack)
- if("nt special ops formal")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
-
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Special Operations Officer"
- pda.icon_state = "pda-syndi"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
-
- M.equip_or_collect(pda, slot_wear_pda)
- M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
- equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
-
- if("singuloth knight")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/singuloth(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/cyber(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/singuloth(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back)
- equip_special_id(M,get_all_accesses(), "Singuloth Knight", /obj/item/weapon/card/id)
-
- if("blue wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("red wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("marisa wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
-
- if("soviet tourist")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id)
-
- if("soviet soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id)
-
- if("soviet admiral")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander")
- //W.icon_state = "commander"
-
- if("chrono legionnaire")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/chronos(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate, "syndie")
+ else // outfit datum
+ if(O)
+ M.equipOutfit(O, FALSE)
M.regenerate_icons()
@@ -1344,18 +665,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
return
-/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id, var/special_icon = null)
- if(!check_rights(R_EVENT))
- return
-
- var/obj/item/weapon/card/id/W = new id_type(H)
- if(special_icon)
- W.icon_state = special_icon
- W.name = "[H.real_name]'s ID Card ([jobtext])"
- W.access = theaccess
- W.assignment = "[jobtext]"
- W.registered_name = H.real_name
- H.equip_to_slot_or_del(W, slot_wear_id)
/client/proc/startSinglo()
set category = "Debug"
@@ -1474,15 +783,15 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
error_cache.showTo(usr)
-
+
/client/proc/jump_to_ruin()
set category = "Debug"
set name = "Jump to Ruin"
set desc = "Displays a list of all placed ruins to teleport to."
-
+
if(!check_rights(R_DEBUG))
return
-
+
var/list/names = list()
for(var/i in ruin_landmarks)
var/obj/effect/landmark/ruin/ruin_landmark = i
@@ -1505,21 +814,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(landmark))
var/datum/map_template/ruin/template = landmark.ruin_template
admin_forcemove(usr, get_turf(landmark))
-
+
to_chat(usr, "[template.name] ")
to_chat(usr, "[template.description] ")
-
+
log_admin("[key_name(usr)] jumped to ruin [ruinname]")
if(!isobserver(usr))
message_admins("[key_name_admin(usr)] jumped to ruin [ruinname]", 1)
-
+
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
+
/client/proc/toggle_medal_disable()
set category = "Debug"
set name = "Toggle Medal Disable"
set desc = "Toggles the safety lock on trying to contact the medal hub."
-
+
if(!check_rights(R_DEBUG))
return
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 907fcb92913..9bfe544cef5 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -49,7 +49,7 @@
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
- H.species.equip(H)
+ H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index a88270077d6..750d0d89b93 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -55,7 +55,7 @@
H.equip_to_slot_or_del(W, slot_wear_id)
team_toggle = !team_toggle
- H.species.equip(H)
+ H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used DODGEBAWWWWWWWL! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 9cacaefbd3f..351b7845205 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -88,7 +88,7 @@
missing_ages = 1
continue
if(C.player_age < age)
- if(check_rights(R_ADMIN))
+ if(check_rights(R_ADMIN, 0))
msg += "[key_name_admin(C.mob)]: [C.player_age] days old "
else
msg += "[key_name_mentor(C.mob)]: [C.player_age] days old "
@@ -899,7 +899,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr, "\red ERT has been Disabled .")
log_admin("Admin [key_name(src)] has disabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1)
-
+
/client/proc/modify_goals()
set category = "Event"
set name = "Modify Station Goals"
@@ -910,6 +910,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
holder.modify_goals()
/datum/admins/proc/modify_goals()
+ if(!ticker || !ticker.mode)
+ to_chat(usr, "This verb can only be used if the round has started. ")
+ return
+
var/dat = ""
for(var/datum/station_goal/S in ticker.mode.station_goals)
dat += "[S.name] - Announce | Remove "
diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
new file mode 100644
index 00000000000..a3b8db53bf2
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
@@ -0,0 +1,256 @@
+/area/awaymission/UO71
+ name = "UO71"
+ icon_state = "away"
+ report_alerts = 0
+ tele_proof = 1
+
+
+/area/awaymission/UO71/plaza
+ name = "UO71 Plaza"
+ icon_state = "awaycontent1"
+ fire = 1
+
+/area/awaymission/UO71/centralhall
+ name = "UO71 Central"
+ icon_state = "awaycontent2"
+ fire = 1
+
+/area/awaymission/UO71/eng
+ name = "UO71 Engineering"
+ icon_state = "awaycontent3"
+ fire = 1
+
+/area/awaymission/UO71/mining
+ name = "UO71 Mining"
+ icon_state = "awaycontent4"
+ fire = 1
+
+/area/awaymission/UO71/science
+ name = "UO71 Science"
+ icon_state = "awaycontent5"
+ fire = 1
+
+/area/awaymission/UO71/medical
+ name = "UO71 Medical"
+ icon_state = "awaycontent6"
+ fire = 1
+
+/area/awaymission/UO71/gateway
+ name = "UO71 Gateway"
+ icon_state = "awaycontent7"
+ fire = 1
+
+/area/awaymission/UO71/outside
+ name = "UO71 Outside"
+ icon_state = "awaycontent8"
+
+/area/awaymission/UO71/bridge
+ name = "UO71 Bridge"
+ icon_state = "awaycontent21"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/queen
+ name = "UO71 Queen Lair"
+ icon_state = "awaycontent9"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/prince
+ name = "UO71 Prince Containment"
+ icon_state = "awaycontent10"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/mother
+ name = "UO71 Mother Containment"
+ icon_state = "awaycontent10"
+ fire = 1
+ requires_power = 0
+ tele_proof = 1
+
+/area/awaymission/UO71/loot
+ name = "UO71 Loot Vault"
+ icon_state = "awaycontent11"
+ requires_power = 0
+ tele_proof = 1
+
+/obj/item/weapon/paper/terrorspiders1
+ name = "paper - 'Sealed Facility'"
+ info = {"SEALED FACILITY
+
+ This facility is sealed shut by order of Commander Marquez. Do not enter.
+ Terror spiders live here. We believe they are a weapon developed by the syndicate.
+ Any surviving personnel are to evacuate immediately via the gateway.
+ "}
+
+/obj/item/weapon/paper/terrorspiders2
+ name = "paper - 'The Trio of Terror'"
+ info = {"Status Report on the 'Terrors'
+
+ All the spiders are deadly. We know this much already. Within an hour of their appearance, they have killed several staff.
+ Three, however, bear particular mention, as they appear to be leading the spider hivemind.
+
+ The Mother is held in containment 1. Advise leaving her alone.
+ It is likely that the hundreds of tiny spiders swarming over her back would come to her defense if she was threatened.
+
+ The Prince is held in containment 2. He appears very aggressive, incredibly fast, strong, and durable. Extreme force and agility would be required to neutralize him.
+ It is likely the appearance of the prince was related to our initial aggression against the Queen. These things can THINK.
+
+ The Queen cannot be contained. She lives in the old bar, south of mining. She continues to breed dangerous spiders at an alarming rate.
+ Many of her offspring are already roaming the compound, traveling through the vents. Contact with the team sent to subdue her has been lost.
+
+
+ Based on the situation, Commander, I advise immediate evacuation through the gateway.
+ -Research Director Simons
+ "}
+
+
+/obj/item/weapon/paper/terrorspiders3
+ name = "paper - 'Final Report'"
+ info = {"FROM: Field Agent 0738
+ TO: Syndicate #873589
+ SUBJECT: Mission Success
+
+ I have seeded the Terror Queen egg in a dingy looking bar that bored engineers constructed near the mining tunnels.
+ No doubt she will grow soon.
+
+ I have also placed the Mother and Prince eggs nearby, injected with sedative. Hopefully the dimwitted NT scientists bring them back for study.
+ With any luck, the Queen will sense them telepathically, think NT is holding her children hostage, and attack.
+
+ I am going to extract out of the gateway before this all goes down.
+ I don't imagine the staff have very long to live once the Queen declares war on this place.
+ "}
+
+/obj/item/weapon/paper/terrorspiders4
+ name = "paper - 'Prescription for Jones, David'"
+ info = {"PRESCRIPTION FOR: David Jones
+ RANK: Miner
+ FOR: Haloperidol
+ REASON FOR TREATMENT: Hallucinations, Paranoia
+ CAUSE: Hallucinations caused by encounter with toxic spit of spider in the caves. Paranoia caused by disappearing staff and suspicions of syndicate infiltration.
+ TREATMENT PLAN: Take as needed. See Dr. Phloxi in one week if symptoms persist.
+ "}
+
+/obj/item/weapon/paper/terrorspiders5
+ name = "paper - 'A Study in Terror'"
+ info = {"Findings Overview
+
+ Gray Spiders Stealthy predators that ambush prey from vents. Otherwise weak.
+ Red Spiders Can kill anyone in melee, but slow.
+ Green Will lay eggs on dead bodies, breeding more spiders.
+ Black Even a single bite is enough to kill a humanoid, given time.
+ White Injects a parasitic agent. Deemed to pose too great an infection risk to study.
+ Purple Only seen guarding the nest of the Queen to the south. Appear to be territorial, and very dangerous.
+ Prince Held in containment 2. Appears to be a sort of super-warrior. Fast, strong, and thickly armored.
+ Mother Carries hordes of spiderlings on its back. Held in containment 1.
+ Queen Unable to contain. Present south of Cargo before contact was lost. Presumed ruler of the local hive.
+ "}
+
+/obj/item/weapon/paper/terrorspiders6
+ name = "paper - 'A Study in Venom'"
+ info = {"Initial Report - Black Widow Venom
+
+ Even a single bite kills within a few minutes. Immediate charcoal is necessary for the victim to survive.
+ The fascinating thing is that multiple bites actually cause rapid symptom onset. The victim quickly loses the ability to walk.
+ One test monkey went from perfect health to death in under 60 seconds - from 3 bites.
+ I am so very glad I'm not responsible for keeping these things contained."}
+
+/obj/item/weapon/paper/terrorspiders7
+ name = "paper - 'Security Orders'"
+ info = {"Directives for Officer James
+
+ 1. Find a way to lift the bridge lockdown.
+ 2. Kill any spiders you encounter.
+ 3. Once on the bridge, open a path to the Queen in the south, and find a way to kill her, ending the infestation.
+ Good luck, Officer.
+ "}
+
+/obj/item/weapon/paper/terrorspiders8
+ name = "paper - 'Last Words'"
+ info = {"The Last Words of Nurse Barnes
+
+ It is too much. First Phil, then those damn spiders bite Mary too. Heaven help us.
+ I'll be evacuating as soon as I've grabbed my supplies. I had to pay for those myself. Stupid budget cuts.
+ The new world they've found for us isn't that hospitable, but at least there are no deadly spid---
+ (the writing trails off, as if the writer was interrupted)
+ "}
+
+
+/obj/item/weapon/gun/energy/laser/awaymission_aeg
+ name = "Wireless Energy Gun"
+ desc = "An energy gun that recharges wirelessly during away missions. Does not work on the main station."
+ force = 10
+ origin_tech = null
+ selfcharge = 1
+ var/inawaymission = 1
+
+/obj/item/weapon/gun/energy/laser/awaymission_aeg/process()
+ var/turf/my_loc = get_turf(src)
+ if(is_away_level(my_loc.z))
+ if(inawaymission)
+ return ..()
+ if(ismob(loc))
+ to_chat(loc, "Your [src] activates, starting to draw power from a nearby wireless power source. ")
+ inawaymission = 1
+ else
+ if(inawaymission)
+ if(ismob(loc))
+ to_chat(loc, "Your [src] deactivates, as it is out of range from its power source. ")
+ power_supply.charge = 0
+ inawaymission = 0
+ update_icon()
+
+
+
+/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin
+ name = "beaker 'Black Terror Venom'"
+
+/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin/New()
+ ..()
+ reagents.add_reagent("terror_black_toxin", 50)
+ update_icon()
+
+
+/obj/machinery/computer/id_upgrader
+ name = "ID Upgrade Machine"
+ icon_state = "guest"
+ icon_screen = "pass"
+ var/list/access_to_give = list(access_away01)
+ var/beenused = 0
+ var/door_to_open = "UO71_Start"
+
+/obj/machinery/computer/id_upgrader/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/D = I
+ if(!access_to_give.len)
+ to_chat(user, "This machine appears to be configured incorrectly. ")
+ return
+ var/did_upgrade = 0
+ var/list/id_access = D.GetAccess()
+ for(var/this_access in access_to_give)
+ if(!(this_access in id_access))
+ // don't have it - add it
+ D.access |= this_access
+ did_upgrade = 1
+ if(did_upgrade)
+ to_chat(user, "An access type was added to your ID card. ")
+ if(beenused)
+ return
+ spawn(1)
+ beenused = 1
+ var/unlocked_something = 0
+ for(var/obj/machinery/door/poddoor/P in airlocks)
+ if(P.density && P.id_tag == door_to_open && P.z == z)
+ P.open()
+ unlocked_something = 1
+ if(unlocked_something)
+ to_chat(user, "Activating the machine has unlocked a way forward! ")
+ else
+ to_chat(user, "Your ID card already has all the access this machine can give. ")
+ . = 1
+
+
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 15af19c19e4..04d1f470327 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -108,7 +108,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/underwear = "Nude" //underwear type
var/undershirt = "Nude" //undershirt type
var/socks = "Nude" //socks type
- var/backbag = 2 //backpack type
+ var/backbag = GBACKPACK //backpack type
var/ha_style = "None" //Head accessory style
var/r_headacc = 0 //Head accessory colour
var/g_headacc = 0 //Head accessory colour
@@ -414,7 +414,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Underwear: [underwear] "
dat += "Undershirt: [undershirt] "
dat += "Socks: [socks] "
- dat += "Backpack Type: [backbaglist[backbag]] "
+ dat += "Backpack Type: [backbag] "
dat += ""
@@ -1240,7 +1240,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
g_skin = rand(0,255)
b_skin = rand(0,255)
if("bag")
- backbag = rand(1,4)
+ backbag = pick(backbaglist)
/*if("skin_style")
h_style = random_skin_style(gender)*/
if("all")
@@ -1718,9 +1718,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ooccolor = new_ooccolor
if("bag")
- var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
+ var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
if(new_backbag)
- backbag = backbaglist.Find(new_backbag)
+ backbag = new_backbag
if("nt_relation")
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
@@ -2150,8 +2150,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
- if(backbag > 4 || backbag < 1)
- backbag = 1 //Same as above
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index a945af5ba2f..b4a589f35a5 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -224,7 +224,7 @@
b_eyes = text2num(query.item[35])
underwear = query.item[36]
undershirt = query.item[37]
- backbag = text2num(query.item[38])
+ backbag = query.item[38]
b_type = query.item[39]
@@ -312,7 +312,7 @@
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_text(underwear, initial(underwear))
undershirt = sanitize_text(undershirt, initial(undershirt))
- backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
+ backbag = sanitize_text(backbag, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index c80c13d514b..fd8ebf045b6 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -24,6 +24,7 @@
var/toggle_message = null
var/alt_toggle_message = null
var/active_sound = null
+ var/toggle_sound = null
var/toggle_cooldown = null
var/cooldown = 0
var/species_disguise = null
@@ -566,7 +567,7 @@ BLIND // can't see anything
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
- species_fit = list("Vox")
+ species_fit = list("Vox", "Drask")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
"Drask" = 'icons/mob/species/drask/uniform.dmi'
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index bb47a6e9094..cb5faac3eda 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -12,7 +12,7 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
burn_state = FIRE_PROOF
- species_fit = list("Vox")
+ species_fit = list("Vox", "Drask")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi'
@@ -34,6 +34,8 @@
while(up)
playsound(src.loc, "[active_sound]", 100, 0, 4)
sleep(15)
+ if(toggle_sound)
+ playsound(src.loc, "[toggle_sound]", 100, 0, 4)
/obj/item/clothing/head/helmet/visor
@@ -71,11 +73,6 @@
icon_state = "swat"
item_state = "swat-alt"
armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/helmet.dmi',
- "Drask" = 'icons/mob/species/drask/helmet.dmi'
- )
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
@@ -127,11 +124,6 @@
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi',
- "Drask" = 'icons/mob/species/drask/helmet.dmi'
- )
/obj/item/clothing/head/helmet/swat/syndicate
name = "blood-red helmet"
@@ -174,6 +166,12 @@
flags = HEADCOVERSEYES | BLOCKHAIR
item_state = "gladiator"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ toggle_message = "You attach the face shield to the"
+ alt_toggle_message = "You remove the face shield from the"
+ actions_types = list(/datum/action/item_action/toggle_helmet_mode)
+ can_toggle = 1
+ toggle_cooldown = 20
+ toggle_sound = 'sound/items/ZippoClose.ogg'
obj/item/clothing/head/helmet/redtaghelm
name = "red laser tag helmet"
@@ -202,6 +200,10 @@ obj/item/clothing/head/blob
item_state = "blobhat"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
+ )
/obj/item/clothing/head/helmet/riot/knight/blue
icon_state = "knight_blue"
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index f8a18749644..95fba0a1a48 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -31,17 +31,25 @@
//Unathi space gear. Huge and restrictive.
/obj/item/clothing/head/helmet/space/unathi
+ icon = 'icons/obj/clothing/species/unathi/hats.dmi'
species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi'
+ )
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
name = "NT breacher helmet"
- desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
+ desc = "Hey! Watch it with that thing! It's a knock-off of an Unathi battle-helm, and that spike could put someone's eye out."
icon_state = "unathi_helm_cheap"
item_state = "unathi_helm_cheap"
item_color = "unathi_helm_cheap"
/obj/item/clothing/suit/space/unathi
+ icon = 'icons/obj/clothing/species/unathi/suits.dmi'
species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi'
+ )
/obj/item/clothing/suit/space/unathi/rig_cheap
name = "NT breacher chassis"
@@ -71,6 +79,7 @@
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ icon = 'icons/obj/clothing/species/vox/suits.dmi'
species_restricted = list("Vox", "Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
@@ -80,6 +89,7 @@
/obj/item/clothing/head/helmet/space/vox
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
+ icon = 'icons/obj/clothing/species/vox/hats.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
@@ -137,6 +147,7 @@
/obj/item/clothing/under/vox
has_sensor = 0
+ icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
species_restricted = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
@@ -150,12 +161,17 @@
item_state = "vox-casual-1"
body_parts_covered = LEGS
-/obj/item/clothing/under/vox/vox_robes
+/obj/item/clothing/under/vox/vox_robes //This will be invisible on Armalis for lack of a proper sprite. They wear a carapace suit anyway, and this is more just to let them use IDs and such.
name = "alien robes"
desc = "Weird and flowing!"
icon_state = "vox-casual-2"
item_color = "vox-casual-2"
item_state = "vox-casual-2"
+ species_restricted = list("Vox","Vox Armalis")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi',
+ "Vox Armalis" = 'icons/mob/species/armalis/suit.dmi'
+ )
/obj/item/clothing/gloves/color/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
@@ -165,20 +181,22 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
item_color = "gloves-vox"
+ icon = 'icons/obj/clothing/species/vox/gloves.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/gloves.dmi',
)
-/obj/item/clothing/shoes/magboots/vox
+/obj/item/clothing/shoes/magboots/vox
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
name = "vox magclaws"
item_state = "boots-vox"
icon_state = "boots-vox"
-
+ icon = 'icons/obj/clothing/species/vox/shoes.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/feet.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/feet.dmi'
)
@@ -223,6 +241,7 @@
name = "Vox EVA Suit"
icon_state = "voxspace"
item_state = "voxspace"
+ icon = 'icons/obj/clothing/species/vox/suits.dmi'
species_restricted = list("Vox", "Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
@@ -233,6 +252,7 @@
name = "Vox EVA Suit"
icon_state = "voxspace"
item_state = "voxspace"
+ icon = 'icons/obj/clothing/species/vox/hats.dmi'
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 73fa69d297c..324a05614c3 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -10,19 +10,19 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
species_restricted = list("Plasmaman")
+ sprite_sheets = list(
+ "Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
+ )
flags = STOPSPRESSUREDMAGE
-
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
var/extinguish_cooldown = 10 SECONDS
- var/extinguishes_left = 10 // Yeah yeah, reagents, blah blah blah. This should be simple.
-
-/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
- ..(user)
- to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit. ")
+ var/max_extinguishes = 5
+ var/extinguishes_left = 5 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
@@ -32,15 +32,49 @@
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
- to_chat(H, "Your suit automatically extinguishes the fire. ")
+ to_chat(user, "You hear a soft click and a hiss from your suit as it automatically extinguishes the fire. ")
+ if(!extinguishes_left)
+ to_chat(user, "Onboard auto-extinguisher depleted, refill with a cartridge. ")
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
H.ExtinguishMob()
+/obj/item/clothing/suit/space/eva/plasmaman/attackby(var/obj/item/A as obj, mob/user as mob, params)
+ ..()
+ if(istype(A, /obj/item/weapon/plasmensuit_cartridge)) //This suit can only be reloaded by the appropriate cartridges, and only if it's got no more extinguishes left.
+ if(!extinguishes_left)
+ extinguishes_left = max_extinguishes //Full replenishment from the cartridge.
+ to_chat(user, "You replenish \the [src] with the cartridge. ")
+ qdel(A)
+ else
+ to_chat(user, "The suit must be depleted before it can be refilled. ")
+
+/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
+ ..(user)
+ to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit. ")
+
+/obj/item/weapon/plasmensuit_cartridge //Can be used to refill Plasmaman suits when they run out of autoextinguishes.
+ name = "auto-extinguisher cartridge"
+ desc = "A tiny and light fibreglass-framed auto-extinguisher cartridge."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "miniFE0"
+ item_state = "miniFE"
+ hitsound = null //Ultralight and
+ flags = null //non-conductive
+ force = 0
+ throwforce = 0
+ w_class = 2 //Fits in boxes.
+ materials = list()
+ attack_verb = list("tapped")
+
/obj/item/clothing/head/helmet/space/eva/plasmaman
name = "plasmaman helmet"
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
flags = STOPSPRESSUREDMAGE
+ icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
species_restricted = list("Plasmaman")
-
+ sprite_sheets = list(
+ "Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
+ )
icon_state = "plasmaman_helmet0"
item_state = "plasmaman_helmet0"
var/base_state = "plasmaman_helmet"
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 0b9e87891d8..fbdf5609cae 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -195,7 +195,7 @@
if(!piece) continue
piece.icon_state = "[initial(icon_state)]"
if(airtight)
- piece.flags &= ~(STOPSPRESSUREDMAGE|AIRTIGHT)
+ piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
update_icon(1)
/obj/item/weapon/rig/proc/seal(mob/living/user)
@@ -426,11 +426,9 @@
helmet.toggle_light(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!(flags & NODROP))
- piece.flags &= ~STOPSPRESSUREDMAGE
- piece.flags &= ~AIRTIGHT
+ piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
else
- piece.flags |= STOPSPRESSUREDMAGE
- piece.flags |= AIRTIGHT
+ piece.flags |= STOPSPRESSUREDMAGE | AIRTIGHT
/obj/item/weapon/rig/process()
// If we've lost any parts, grab them back.
@@ -442,7 +440,7 @@
M.unEquip(piece)
piece.forceMove(src)
- if(!istype(wearer) || loc != wearer || wearer.back != src || (!(flags & NODROP)) || !cell || cell.charge <= 0)
+ if(!istype(wearer) || loc != wearer || wearer.back != src || !(flags & NODROP) || !cell || cell.charge <= 0)
if(!cell || cell.charge <= 0)
if(electrified > 0)
electrified = 0
@@ -777,8 +775,9 @@
to_chat(wearer, "Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
else if(deploy_mode != ONLY_RETRACT)
- if(check_slot && check_slot != use_obj)
- to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way. ")
+ if(check_slot)
+ if(check_slot != use_obj) //If use_obj is already in check_slot, silently bail. Otherwise, tell the user why the part didn't deploy.
+ to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way. ")
return
use_obj.forceMove(wearer)
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
index 5214ea919f6..59ab809e130 100644
--- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
@@ -115,7 +115,7 @@
/obj/item/weapon/rig/verb/deploy_suit()
set name = "Deploy Hardsuit"
- set desc = "Deploys helmet, gloves and boots."
+ set desc = "Deploys helmet, gloves and boots all at once."
set category = "Hardsuit"
set src = usr.contents
@@ -136,8 +136,8 @@
deploy(wearer, usr)
/obj/item/weapon/rig/verb/toggle_seals_verb()
- set name = "Toggle Hardsuit"
- set desc = "Activates or deactivates your rig."
+ set name = "Toggle Hardsuit Seals"
+ set desc = "Seals or unseals your rig."
set category = "Hardsuit"
set src = usr.contents
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 8632b6cc472..27724fa0749 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -10,8 +10,9 @@
vision_restriction = 1
offline_vision_restriction = 2
- chest_type = /obj/item/clothing/suit/space/new_rig
+ chest_type = /obj/item/clothing/suit/space/new_rig/unathi
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
+ glove_type = /obj/item/clothing/gloves/rig/unathi
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
/obj/item/weapon/rig/unathi/fancy
@@ -23,10 +24,23 @@
vision_restriction = 0
/obj/item/clothing/head/helmet/space/new_rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/hats.dmi'
species_restricted = list("Unathi")
/obj/item/clothing/suit/space/new_rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/suits.dmi'
species_restricted = list("Unathi")
+/obj/item/clothing/gloves/rig/unathi
+ icon = 'icons/obj/clothing/species/unathi/gloves.dmi'
+ species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/gloves.dmi'
+ )
+
/obj/item/clothing/shoes/magboots/rig/unathi
- species_restricted = list("Unathi")
\ No newline at end of file
+ icon = 'icons/obj/clothing/species/unathi/shoes.dmi'
+ species_restricted = list("Unathi")
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/feet.dmi'
+ )
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 486d7d7c34e..c7128ae8bf1 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -565,35 +565,43 @@
item_state = "bane"
item_color = "bane"
-/obj/item/clothing/under/vox_grey
+/obj/item/clothing/under/vox
+ name = "Ripped Jumpsuit"
+ desc = "A jumpsuit that looks like it's been shredded by some talons. Who could wear this now?"
+ icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
+ icon_state = "vgrey"
+ item_state = "vgrey"
+ item_color = "vgrey"
+
+/obj/item/clothing/under/vox/grey
name = "Grey Vox Jumpsuit"
desc = "An assistant's jumpsuit ripped to better fit a vox."
icon_state = "vgrey"
item_state = "vgrey"
item_color = "vgrey"
-/obj/item/clothing/under/vox_robotics
+/obj/item/clothing/under/vox/robotics
name = "Vox Robotics Jumpsuit"
desc = "A roboticist's jumpsuit ripped to better fit a vox."
icon_state = "vrobotics"
item_state = "vrobotics"
item_color = "vrobotics"
-/obj/item/clothing/under/vox_toxins
+/obj/item/clothing/under/vox/toxins
name = "Vox Toxins Jumpsuit"
desc = "A Toxin Researcher's jumpsuit ripped to better fit a vox."
icon_state = "vtoxinswhite"
item_state = "vtoxinswhite"
item_color = "vtoxinswhite"
-/obj/item/clothing/under/vox_atmos
+/obj/item/clothing/under/vox/atmos
name = "Vox Atmos Jumpsuit"
desc = "An Atmos Tech's jumpsuit ripped to better fit a vox."
icon_state = "vatmos"
item_state = "vatmos"
item_color = "vatmos"
-/obj/item/clothing/under/vox_engi
+/obj/item/clothing/under/vox/engi
name = "Vox Engineer Jumpsuit"
desc = "An Engineer's jumpsuit ripped to better fit a vox."
icon_state = "vengine"
@@ -601,7 +609,7 @@
item_color = "vengine"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
-/obj/item/clothing/under/vox_sec
+/obj/item/clothing/under/vox/sec
name = "Vox Security Jumpsuit"
desc = "A Security officer's jumpsuit ripped to better fit a vox."
icon_state = "vred"
@@ -609,7 +617,7 @@
item_color = "vred"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
-/obj/item/clothing/under/vox_chem
+/obj/item/clothing/under/vox/chem
name = "Vox Chemist Jumpsuit"
desc = "A Chemist's jumpsuit ripped to better fit a vox."
icon_state = "vchem"
diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm
index 533a600a4eb..e36aca935ec 100644
--- a/code/modules/computer3/computers/law.dm
+++ b/code/modules/computer3/computers/law.dm
@@ -24,10 +24,11 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- if(is_away_level(user.z))
- to_chat(user, "Unable to establish a connection : You're too far away from the station!")
- return
if(istype(module, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
module.install(src)
else
return ..()
@@ -60,6 +61,10 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
if(istype(module, /obj/item/weapon/aiModule))
+ var/turf/T = get_turf(current)
+ if(!atoms_share_level(T, src))
+ to_chat(user, "Unable to establish a connection : You're too far away from the target silicon!")
+ return
module.install(src)
else
return ..()
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 97d010439c9..b2f9cb93d5f 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -552,6 +552,14 @@
desc = "It's a worn-out bandana in camo paint"
icon_state = "bandcamo"
+
+/obj/item/clothing/mask/gas/sechailer/fluff/spartan //LP Spartan: Kaskreyarawkta
+ name = "minimal gasmask"
+ desc = "Designed to cover as little of face as possible while still being a functional gasmask."
+ icon_state = "spartan_mask"
+ item_state = "spartan_mask"
+ species_restricted = list("Vox")
+
//////////// Shoes ////////////
//////////// Sets ////////////
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 0ff4af7b405..46c8aaeb560 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -46,11 +46,11 @@ log transactions
if(stat & NOPOWER)
return
- if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
+ if(linked_db && ((linked_db.stat & NOPOWER) || !linked_db.activated))
linked_db = null
authenticated_account = null
- src.visible_message("\red [bicon(src)] [src] buzzes rudely, \"Connection to remote database lost.\"")
- updateDialog()
+ visible_message("[bicon(src)][src] buzzes rudely, \"Connection to remote database lost.\" ")
+ nanomanager.update_uis(src)
if(ticks_left_timeout > 0)
ticks_left_timeout--
@@ -66,41 +66,35 @@ log transactions
if(istype(T) && locate(/obj/item/weapon/spacecash) in T)
var/list/cash_found = list()
for(var/obj/item/weapon/spacecash/S in T)
- cash_found+=S
- if(cash_found.len>0)
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+ cash_found += S
+ if(cash_found.len > 0)
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
var/amount = count_cash(cash_found)
for(var/obj/item/weapon/spacecash/S in cash_found)
qdel(S)
- authenticated_account.charge(-amount,null,"Credit deposit",terminal_id=machine_id,dest_name = "Terminal")
+ authenticated_account.charge(-amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal")
/obj/machinery/atm/proc/reconnect_database()
- for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
- if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated )
+ for(var/obj/machinery/computer/account_database/DB in machines)
+ if(DB.z == z && !(DB.stat & NOPOWER) && DB.activated)
linked_db = DB
break
-/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/machinery/atm/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card))
- var/obj/item/weapon/card/id/idcard = I
if(!held_card)
- usr.drop_item()
- idcard.loc = src
- held_card = idcard
+ user.drop_item()
+ I.forceMove(src)
+ held_card = I
if(authenticated_account && held_card.associated_account_number != authenticated_account.account_number)
authenticated_account = null
+ nanomanager.update_uis(src)
else if(authenticated_account)
- if(istype(I,/obj/item/weapon/spacecash))
+ if(istype(I, /obj/item/weapon/spacecash))
//consume the money
var/obj/item/weapon/spacecash/C = I
authenticated_account.money += C.get_total()
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
//create a transaction log entry
var/datum/transaction/T = new()
@@ -113,108 +107,55 @@ log transactions
authenticated_account.transaction_log.Add(T)
to_chat(user, "You insert [C] into [src]. ")
- src.attack_hand(user)
+ nanomanager.update_uis(src)
qdel(I)
else
..()
-/obj/machinery/atm/attack_hand(mob/user as mob)
- if(istype(user, /mob/living/silicon))
- to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
+/obj/machinery/atm/attack_hand(mob/user)
+ if(..())
+ return 1
+ if(issilicon(user))
+ to_chat(user, "Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005. ")
return
- if(get_dist(src,user) <= 1)
- add_fingerprint(user)
+ ui_interact(user)
- //js replicated from obj/machinery/computer/card
- var/dat = {"Nanotrasen Automatic Teller Machine
- For all your monetary needs!
- This terminal is [machine_id]. Report this code when contacting Nanotrasen IT Support
- Card: [held_card ? held_card.name : "------"] "}
+/obj/machinery/atm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "atm.tmpl", name, 550, 650)
+ ui.open()
- if(ticks_left_locked_down > 0)
- dat += "Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled. "
- else if(authenticated_account)
- switch(view_screen)
- if(CHANGE_SECURITY_LEVEL)
- dat += "Select a new security level for this account: "
- var/text = "Zero - Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct."
- if(authenticated_account.security_level != 0)
- text = "[text] "
- dat += "[text] "
- text = "One - An account number and pin must be manually entered to access this account and process transactions."
- if(authenticated_account.security_level != 1)
- text = "[text] "
- dat += "[text] "
- text = "Two - In addition to account number and pin, a card is required to access this account and process transactions."
- if(authenticated_account.security_level != 2)
- text = "[text] "
- dat += {"[text]
- Back "}
- if(VIEW_TRANSACTION_LOGS)
- dat += {"Transaction logs
- Back
-
-
- Date
- Time
- Target
- Purpose
- Value
- Source terminal ID
- "}
- for(var/datum/transaction/T in authenticated_account.transaction_log)
- dat += {"
- [T.date]
- [T.time]
- [T.target_name]
- [T.purpose]
- $[T.amount]
- [T.source_terminal]
- "}
- dat += "
"
- if(TRANSFER_FUNDS)
- dat += {"Account balance: $[authenticated_account.money]
- Back
- "}
- else
- dat += {"Welcome, [authenticated_account.owner_name].
- Account balance: $[authenticated_account.money]
-
- Change account security level
- Make transfer
- View transaction log
- Print balance statement
- Logout "}
- else if(linked_db)
- dat += {""}
- else
- dat += "Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support. "
- reconnect_database()
+/obj/machinery/atm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["src"] = UID()
+ data["view_screen"] = view_screen
+ data["machine_id"] = machine_id
+ data["held_card_name"] = held_card ? held_card.name : "------"
+ data["ticks_left_locked_down"] = ticks_left_locked_down
+ data["linked_db"] = linked_db
- var/datum/browser/popup = new(user, "atm", name, 550, 650)
- popup.set_content(dat)
- popup.open(0)
- else
- user << browse(null,"window=atm")
+ data["authenticated_account"] = authenticated_account
+ if(authenticated_account)
+ data["owner_name"] = authenticated_account.owner_name
+ data["money"] = authenticated_account.money
+ data["security_level"] = authenticated_account.security_level
-/obj/machinery/atm/Topic(var/href, var/href_list)
+ var/list/trx = list()
+ for(var/datum/transaction/T in authenticated_account.transaction_log)
+ trx[++trx.len] = list(
+ "date" = T.date,
+ "time" = T.time,
+ "target_name" = T.target_name,
+ "purpose" = T.purpose,
+ "amount" = T.amount,
+ "source_terminal" = T.source_terminal)
+ data["transaction_log"] = trx
+
+ return data
+
+/obj/machinery/atm/Topic(href, list/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("transfer")
@@ -253,7 +194,7 @@ log transactions
if(linked_db)
// check if they have low security enabled
scan_user(usr)
-
+
if(!ticks_left_locked_down && held_card)
var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num)
@@ -280,11 +221,11 @@ log transactions
T.time = worldtime2text()
failed_account.transaction_log.Add(T)
else
- to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining. ")
previous_account_number = tried_account_num
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered. ")
number_incorrect_tries = 0
else
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
@@ -300,7 +241,7 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
- to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(usr, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].' ")
previous_account_number = tried_account_num
if("withdrawal")
@@ -313,7 +254,7 @@ log transactions
//remove the money
if(amount > 10000) // prevent crashes
- to_chat(usr, "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'")
+ to_chat(usr, "The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.' ")
amount = 10000
authenticated_account.money -= amount
withdraw_arbitrary_sum(amount)
@@ -332,11 +273,11 @@ log transactions
if("balance_statement")
if(authenticated_account)
if(world.timeofday < lastprint + PRINT_DELAY)
- to_chat(usr, "The [src.name] flashes an error on its display. ")
+ to_chat(usr, "The [name] flashes an error on its display. ")
return
lastprint = world.timeofday
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
- var/obj/item/weapon/paper/R = new(src.loc)
+ var/obj/item/weapon/paper/R = new(loc)
R.name = "Account balance: [authenticated_account.owner_name]"
R.info = {"NT Automated Teller Account Statement
Account holder: [authenticated_account.owner_name]
@@ -349,54 +290,49 @@ log transactions
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
- R.stamped = new
+ R.stamped = new()
R.stamped += /obj/item/weapon/stamp
R.overlays += stampoverlay
R.stamps += "This paper has been stamped by the Automatic Teller Machine. "
- if(prob(50))
- playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
- else
- playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
if("insert_card")
if(held_card)
- held_card.loc = src.loc
+ held_card.forceMove(loc)
authenticated_account = null
-
if(ishuman(usr) && !usr.get_active_hand())
usr.put_in_hands(held_card)
held_card = null
-
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
- I.loc = src
+ I.forceMove(src)
held_card = I
if("logout")
authenticated_account = null
- //usr << browse(null,"window=atm")
- src.attack_hand(usr)
+ nanomanager.update_uis(src)
+ return 1
//create the most effective combination of notes to make up the requested amount
-/obj/machinery/atm/proc/withdraw_arbitrary_sum(var/arbitrary_sum)
- dispense_cash(arbitrary_sum,get_step(get_turf(src),turn(dir,180))) // Spawn on the ATM.
+/obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum)
+ dispense_cash(arbitrary_sum, get_step(get_turf(src), turn(dir, 180))) // Spawn on the ATM.
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
-/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob)
+/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H)
if(!authenticated_account && linked_db)
- if(human_user.wear_id)
+ if(H.wear_id)
var/obj/item/weapon/card/id/I
- if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
- I = human_user.wear_id
- else if(istype(human_user.wear_id, /obj/item/device/pda) )
- var/obj/item/device/pda/P = human_user.wear_id
+ if(istype(H.wear_id, /obj/item/weapon/card/id) )
+ I = H.wear_id
+ else if(istype(H.wear_id, /obj/item/device/pda) )
+ var/obj/item/device/pda/P = H.wear_id
I = P.id
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
- to_chat(human_user, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(H, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].' ")
//create a transaction log entry
var/datum/transaction/T = new()
@@ -406,5 +342,6 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
-
+
view_screen = NO_SCREEN
+ nanomanager.update_uis(src)
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index bd7a25d12b3..babbac30b11 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -27,7 +27,7 @@
/obj/item/device/eftpos/proc/print_reference()
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
- var/obj/item/weapon/paper/R = new(src.loc)
+ var/obj/item/weapon/paper/R = new(loc)
R.name = "Reference: [eftpos_name]"
// AUTOFIXED BY fix_string_idiocy.py
@@ -45,7 +45,7 @@
R.overlays += stampoverlay
R.stamps += "This paper has been stamped by the EFTPOS device. "
var/obj/item/smallDelivery/D = new(R.loc)
- R.loc = D
+ R.forceMove(D)
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
@@ -54,70 +54,51 @@
if(!location)
return
- for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
+ for(var/obj/machinery/computer/account_database/DB in machines)
if(DB.z == location.z)
linked_db = DB
break
-/obj/item/device/eftpos/attack_self(mob/user as mob)
- if(get_dist(src,user) <= 1)
+/obj/item/device/eftpos/attack_self(mob/user)
+ ui_interact(user)
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: var/dat = "[eftpos_name] "
- var/dat = {"[eftpos_name]
-This terminal is [machine_id]. Report this code when contacting Nanotrasen IT Support "}
- // END AUTOFIX
- if(transaction_locked)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: dat += "Reset[transaction_paid ? "" : " (authentication required)"] "
- dat += {"Reset[transaction_paid ? "" : " (authentication required)"]
- Transaction purpose: [transaction_purpose]
- Value: $[transaction_amount]
- Linked account: [linked_account ? linked_account.owner_name : "None"] "}
- // END AUTOFIX
- if(transaction_paid)
- dat += "This transaction has been processed successfully. "
- else
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:67: dat += "Swipe your card below the line to finish this transaction. "
- dat += {"Swipe your card below the line to finish this transaction.
- \[------\] "}
- // END AUTOFIX
- else
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:70: dat += "Lock in new transaction "
- dat += {"Lock in new transaction
- Transaction purpose: [transaction_purpose]
- Value: $[transaction_amount]
- Linked account: [linked_account ? linked_account.owner_name : "None"]
- Change access code
- Change EFTPOS ID
- Scan card to reset access code \[------\] "}
- // END AUTOFIX
- user << browse(dat,"window=eftpos")
- else
- user << browse(null,"window=eftpos")
-
-/obj/item/device/eftpos/attackby(O as obj, user as mob, params)
+/obj/item/device/eftpos/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/weapon/card))
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
reconnect_database()
if(linked_db)
if(linked_account)
- var/obj/item/weapon/card/I = O
- scan_card(I)
+ scan_card(O, user)
+ nanomanager.update_uis(src)
else
- to_chat(usr, "[bicon(src)]Unable to connect to linked account. ")
+ to_chat(user, "[bicon(src)]Unable to connect to linked account. ")
else
- to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
+ to_chat(user, "[bicon(src)]Unable to connect to accounts database. ")
else
..()
-/obj/item/device/eftpos/Topic(var/href, var/href_list)
+/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
+ ui.open()
+
+/obj/item/device/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ data["eftpos_name"] = eftpos_name
+ data["machine_id"] = machine_id
+ data["transaction_locked"] = transaction_locked
+ data["transaction_paid"] = transaction_paid
+ data["transaction_purpose"] = transaction_purpose
+ data["transaction_amount"] = transaction_amount
+ data["linked_account"] = linked_account ? linked_account.owner_name : null
+ return data
+
+/obj/item/device/eftpos/Topic(href, list/href_list)
+ if(..())
+ return 1
+
if(href_list["choice"])
switch(href_list["choice"])
if("change_code")
@@ -134,9 +115,9 @@
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
- var name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
+ var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
if(name)
- eftpos_name = name + " EFTPOS scanner"
+ eftpos_name = "[name] EFTPOS scanner"
print_reference()
else
to_chat(usr, "[bicon(src)]Incorrect code entered. ")
@@ -150,11 +131,11 @@
else
to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
if("trans_purpose")
- var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null
+ var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) as text|null
if(purpose)
transaction_purpose = purpose
if("trans_value")
- var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num
+ var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount", transaction_amount) as num
if(try_num < 0)
alert("That is not a valid amount!")
else
@@ -168,7 +149,7 @@
else if(linked_account)
transaction_locked = 1
else
- to_chat(usr, "[bicon(src)] No account connected to send transactions to. ")
+ to_chat(usr, "[bicon(src)]No account connected to send transactions to. ")
if("scan_card")
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
@@ -176,7 +157,7 @@
if(linked_db && linked_account)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card))
- scan_card(I)
+ scan_card(I, usr)
else
to_chat(usr, "[bicon(src)]Unable to link accounts. ")
if("reset")
@@ -191,12 +172,13 @@
access_code = 0
to_chat(usr, "[bicon(src)]Access code reset to 0. ")
- src.attack_self(usr)
+ nanomanager.update_uis(src)
+ return 1
-/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I)
+/obj/item/device/eftpos/proc/scan_card(obj/item/weapon/card/I, mob/user)
if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src]. ")
+ visible_message("[user] swipes a card through [src]. ")
if(transaction_locked && !transaction_paid)
if(linked_account)
var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
@@ -204,7 +186,7 @@
if(D)
if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("[bicon(src)] The [src] chimes.")
+ visible_message("[bicon(src)] The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -233,11 +215,11 @@
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
else
- to_chat(usr, "[bicon(src)]You don't have that much money! ")
+ to_chat(user, "[bicon(src)]You don't have that much money! ")
else
- to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
+ to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again. ")
else
- to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account. ")
+ to_chat(user, "[bicon(src)]EFTPOS is not connected to an account. ")
else
..()
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index 83199f05aa1..3432b7215d4 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -14,11 +14,9 @@
var/mob/C
if(candidates.len)
C = pick(candidates)
- Blob = new /obj/effect/blob/core(T, 200)
- Blob.create_overmind(C.client, 1)
- spawn(30)
- for(var/i = 1; i < rand(3, 6), i++)
- Blob.process()
+ Blob = new /obj/effect/blob/core(T, new_overmind=C.client)
+ for(var/i in 1 to 5)
+ Blob.process()
else
return kill()
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index bece706a653..89ae637b84b 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -191,7 +191,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, is_one_shot = 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 20), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
)
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 04c9d3be5d4..d11ffa2ba78 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -17,7 +17,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/startside = pick(cardinal)
var/turf/startT = spaceDebrisStartLoc(startside, 1)
var/turf/endT = spaceDebrisFinishLoc(startside, 1)
- new /obj/effect/immovablerod(startT, endT)
+ new /obj/effect/immovablerod/event(startT, endT)
/obj/effect/immovablerod
name = "Immovable Rod"
@@ -30,18 +30,20 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/z_original = 0
var/destination
var/notify = TRUE
+ var/move_delay = 1
-/obj/effect/immovablerod/New(atom/start, atom/end)
+/obj/effect/immovablerod/New(atom/start, atom/end, delay)
loc = start
z_original = z
destination = end
+ move_delay = delay
if(notify)
notify_ghosts("\A [src] is inbound!",
enter_link="(Click to follow) ",
source=src, action=NOTIFY_FOLLOW)
poi_list |= src
if(end && end.z==z_original)
- walk_towards(src, destination, 1)
+ walk_towards(src, destination, move_delay)
/obj/effect/immovablerod/Topic(href, href_list)
if(href_list["follow"])
@@ -53,11 +55,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
poi_list.Remove(src)
return ..()
-/obj/effect/immovablerod/Move()
- if(z != z_original || loc == destination)
- qdel(src)
- return ..()
-
/obj/effect/immovablerod/ex_act(test)
return 0
@@ -81,4 +78,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
H.adjustBruteLoss(160)
if(clong.density || prob(10))
clong.ex_act(2)
- return
\ No newline at end of file
+
+/obj/effect/immovablerod/event
+ var/tiles_moved = 0
+
+/obj/effect/immovablerod/event/Move()
+ var/atom/oldloc = loc
+ . = ..()
+ tiles_moved++
+ if(get_dist(oldloc, loc) > 2 && tiles_moved > 10) // We went on a journey, commit sudoku
+ qdel(src)
diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm
index 2556c369470..2623bad0cfe 100644
--- a/code/modules/events/spider_terror.dm
+++ b/code/modules/events/spider_terror.dm
@@ -1,14 +1,14 @@
/datum/event/spider_terror
- announceWhen = 400
+ announceWhen = 120
var/spawncount = 1
/datum/event/spider_terror/setup()
- announceWhen = rand(announceWhen, announceWhen + 50)
+ announceWhen = rand(announceWhen, announceWhen + 30)
spawncount = 1
-/datum/event/spider_infestation/announce()
- command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren.ogg')
+/datum/event/spider_terror/announce()
+ command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg')
/datum/event/spider_terror/start()
@@ -17,23 +17,24 @@
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
-
var/spider_type
- var/infestation_type = pick(1, 2, 3, 4)
+ var/infestation_type = pick(1, 2, 3, 4, 5)
switch(infestation_type)
if(1)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green
- spawncount = pick(2,3)
+ spawncount = 3
if(2)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white
- spawncount = 1
+ spawncount = 2
if(3)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince
spawncount = 1
if(4)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
spawncount = 1
-
+ if(5)
+ spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/mother
+ spawncount = 1
while(spawncount >= 1 && vents.len)
var/obj/vent = pick(vents)
var/obj/effect/spider/spiderling/terror_spiderling/S = new(vent.loc)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index d9b98c82724..7aa24bdf264 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -76,7 +76,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp
/datum/deepfryer_special/banana
- input = "banana"
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
/datum/deepfryer_special/potato_chips
@@ -84,7 +84,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/chips
/datum/deepfryer_special/corn_chips
- input = "corn"
+ input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
output = /obj/item/weapon/reagent_containers/food/snacks/cornchips
/datum/deepfryer_special/fried_tofu
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 5eae76ea446..8cbca85a521 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -1,3 +1,5 @@
+#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
+
/obj/machinery/hydroponics
name = "hydroponics tray"
icon = 'icons/obj/hydroponics/equipment.dmi'
@@ -20,10 +22,12 @@
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
+ var/current_cycle = 0 //Used for tracking when to age
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
var/wrenchable = 1
+ var/lid_state = 0
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
@@ -108,6 +112,20 @@
return connected
+/obj/machinery/hydroponics/AltClick()
+ if(wrenchable && !usr.stat && !usr.lying && Adjacent(usr))
+ toggle_lid(usr)
+ return
+ return ..()
+
+/obj/machinery/hydroponics/proc/toggle_lid(mob/living/user)
+ if(!user || user.stat || user.restrained())
+ return
+
+ lid_state = !lid_state
+ to_chat(user, "You [lid_state ? "close" : "open"] the tray's lid. ")
+ update_icon()
+
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
@@ -136,7 +154,10 @@
lastcycle = world.time
if(myseed && !dead)
// Advance age
- age++
+ current_cycle++
+ if(current_cycle == HYDRO_CYCLES_PER_AGE)
+ age++
+ current_cycle = 0
if(age < myseed.maturation)
lastproduce = age
@@ -267,6 +288,9 @@
overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")
set_light(3)
+ if(lid_state)
+ overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "hydrocover")
+
update_icon_hoses()
if(myseed)
@@ -904,6 +928,9 @@
/obj/machinery/hydroponics/attack_hand(mob/user)
if(issilicon(user)) //How does AI know what plant is?
return
+ if(lid_state)
+ to_chat(user, "You can't reach the plant through the cover. ")
+ return
if(harvest)
myseed.harvest(user)
else if(dead)
@@ -1013,4 +1040,6 @@
to_chat(user, "You clear up [src]! ")
qdel(src)
else
- ..()
\ No newline at end of file
+ ..()
+
+#undef HYDRO_CYCLES_PER_AGE
\ No newline at end of file
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index d84e434456d..10bd7c3884f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -169,7 +169,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
var/response
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
- response = alert(src, alertmsg,"Are you sure you want to ghost?","Ghost","Stay in body")
+ response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost")
if(response != "Ghost")
return //didn't want to ghost after-all
resting = 1
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index e8afbb0360b..655ad111cf1 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -82,6 +82,17 @@ I'm using this for Stat to give it a more nifty interface to work with
/mob/living/carbon/brain/proc/has_synthetic_assistance()
return (container && istype(container, /obj/item/device/mmi)) || in_contents_of(/obj/mecha)
+/mob/living/carbon/brain/proc/get_race()
+ if(container)
+ var/obj/item/device/mmi/M = container
+ if(istype(M) && M.held_brain)
+ return M.held_brain.dna.get_species_name()
+ else
+ return "Artificial Life"
+ if(istype(loc, /obj/item/organ/internal/brain))
+ var/obj/item/organ/internal/brain/B = loc
+ return B.dna.get_species_name()
+
/mob/living/carbon/brain/Stat()
..()
if(has_synthetic_assistance())
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 453402ec7e3..ffd759b3295 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -494,7 +494,8 @@
msg += "Medical records: \[View\] \[Add comment\] \n"
- if(print_flavor_text()) msg += "[print_flavor_text()]\n"
+ if(print_flavor_text() && !skipface)
+ msg += "[print_flavor_text()]\n"
msg += "*---------* "
if(pose)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 7e54aebf396..ed578e20dd1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -923,12 +923,11 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
- counter++
- if(counter == 1)
- to_chat(usr, "No comment found")
+ if(length(R.fields["comments"]))
+ for(var/c in R.fields["comments"])
+ to_chat(usr, c)
+ else
+ to_chat(usr, "No comment found ")
to_chat(usr, "\[Add comment\] ")
if(!read)
@@ -950,21 +949,18 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
- var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Sec. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "security"))
return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- if(istype(usr,/mob/living/carbon/human))
+ if(ishuman(usr))
var/mob/living/carbon/human/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/robot))
+ R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/ai))
+ R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isAI(usr))
var/mob/living/silicon/ai/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] (artificial intelligence) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
+ R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()] [t1]"
if(href_list["medical"])
if(hasHUD(usr,"medical"))
@@ -1049,12 +1045,11 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
- counter++
- if(counter == 1)
- to_chat(usr, "No comment found")
+ if(length(R.fields["comments"]))
+ for(var/c in R.fields["comments"])
+ to_chat(usr, c)
+ else
+ to_chat(usr, "No comment found ")
to_chat(usr, "\[Add comment\] ")
if(!read)
@@ -1076,18 +1071,15 @@
for(var/datum/data/record/R in data_core.medical)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
- var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
+ var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
+ if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "medical"))
return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- if(istype(usr,/mob/living/carbon/human))
+ if(ishuman(usr))
var/mob/living/carbon/human/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if(istype(usr,/mob/living/silicon/robot))
+ R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] [t1]"
+ if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
- R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
+ R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] [t1]"
if(href_list["lookitem"])
var/obj/item/I = locate(href_list["lookitem"])
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index fa8de8e2b87..f05a6abcd2b 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -132,7 +132,6 @@
job = myjob.title
mind.assigned_role = job
myjob.equip(src)
- myjob.apply_fingerprints(T)
/mob/living/carbon/human/interactive/proc/reset()
walk(src, 0)
@@ -193,7 +192,6 @@
for(var/obj/item/W in T)
qdel(W)
T.myjob.equip(T)
- T.myjob.apply_fingerprints(T)
T.doSetup(alt_title)
var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No")
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index c375d718e3d..93887e8542f 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -615,3 +615,17 @@
return 1
return 0 //Unsupported slot
+
+/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
+ var/datum/outfit/O = null
+
+ if(ispath(outfit))
+ O = new outfit
+ else
+ O = outfit
+ if(!istype(O))
+ return 0
+ if(!O)
+ return 0
+
+ return O.equip(src, visualsOnly)
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 05f24facc65..095ea5ab6ca 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -15,6 +15,7 @@
butt_sprite = "plasma"
breath_type = "plasma"
+ poison_type = null //Certainly isn't plasma.
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
@@ -33,7 +34,7 @@
message = replacetext(message, "s", stutter("ss"))
return message
-/datum/species/plasmaman/equip(var/mob/living/carbon/human/H)
+/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
// Unequip existing suits and hats.
H.unEquip(H.wear_suit)
H.unEquip(H.head)
@@ -127,8 +128,10 @@
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
- H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
- to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable. ")
+ H.equip_or_collect(new /obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
+ H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack)
+ H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
+ to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable. ")
H.internal = H.get_item_by_slot(tank_slot)
H.update_internals_hud_icon(1)
@@ -235,10 +238,29 @@
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
-
- if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- to_chat(H, "Your body reacts with the atmosphere and bursts into flame! ")
- H.adjust_fire_stacks(0.5)
- H.IgniteMob()
-
return 1
+
+/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
+ var/datum/gas_mixture/environment = H.loc.return_air()
+ if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
+ H.adjust_fire_stacks(0.5)
+ if(!H.on_fire && H.fire_stacks > 0)
+ H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames! ","Your body reacts with the atmosphere and bursts into flame! ")
+ H.IgniteMob()
+ else
+ if(H.fire_stacks)
+ var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
+ if(istype(P))
+ P.Extinguish(H)
+ H.update_fire()
+
+/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
+ if(R.id == "plasma")
+ H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
+ H.adjustPlasma(20)
+ H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
+ return 0 //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
+
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 54f68f2b101..fec4da6fae4 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -439,7 +439,10 @@
/datum/species/proc/say_filter(mob/M, message, datum/language/speaking)
return message
-/datum/species/proc/equip(var/mob/living/carbon/human/H)
+/datum/species/proc/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ return
+
+/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
/datum/species/proc/can_understand(var/mob/other)
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index fcdd8ac40ea..d88eb8caa65 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -343,7 +343,7 @@
newname += pick(vox_name_syllables)
return capitalize(newname)
-/datum/species/vox/equip(var/mob/living/carbon/human/H)
+/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
if(H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
H.unEquip(H.l_hand)
@@ -365,7 +365,7 @@
..()
/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
- if(H.species.name == "Vox") //Making sure we don't break Armalis.
+ if(H.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
switch(H.s_tone)
@@ -395,6 +395,14 @@
H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so.
H.update_dna()
+/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
+ if(R.id == "oxygen") //Armalis are above such petty things.
+ H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma.
+ H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
+ return 0 //Handling reagent removal on our own.
+
+ return ..()
+
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/leap
H.verbs += /mob/living/carbon/human/proc/gut
@@ -427,7 +435,8 @@
breath_type = "nitrogen"
poison_type = "oxygen"
- flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
+ flags = NO_SCAN | NO_BLOOD | NO_PAIN | IS_WHITELISTED
+ bodyflags = HAS_TAIL
dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
blood_color = "#2299FC"
@@ -455,6 +464,9 @@
"is holding their breath!",
"is huffing oxygen!")
+/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
+ return 1
+
/datum/species/kidan
name = "Kidan"
name_plural = "Kidan"
@@ -728,7 +740,7 @@
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
..()
-/datum/species/grey/equip(var/mob/living/carbon/human/H)
+/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/speech_pref = H.client.prefs.speciesprefs
if(speech_pref)
H.mind.speech_span = "wingdings"
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 538ce8450c7..76577327b61 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -161,8 +161,8 @@
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
if(istype(A, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/Hydro = A
- if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
- wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
+ if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state)
+ wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
return 1
..()
@@ -188,12 +188,12 @@
..()
/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro)
- if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit)
+ if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state)
target = null
return
target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
- wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
+ wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
Hydro.recent_bee_visit = TRUE
spawn(BEE_TRAY_RECENT_VISIT)
if(Hydro)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
index 8453a71cff4..eefc506ff99 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/__defines.dm
@@ -4,6 +4,13 @@
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
+#define TS_AI_AGGRESSIVE 0
+#define TS_AI_DEFENSIVE 1
+
+#define TS_DAMAGE_SIMPLE 0
+#define TS_DAMAGE_POISON 1
+#define TS_DAMAGE_BRUTE 2
+
#define TS_DESC_RED "Red - Assault"
#define TS_DESC_GRAY "Gray - Ambush"
#define TS_DESC_GREEN "Green - Nurse"
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
index ca216da052d..276fb905a7b 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/actions.dm
@@ -84,7 +84,7 @@
/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web()
var/turf/mylocation = loc
visible_message("[src] begins to secrete a sticky substance. ")
- if(do_after(src, 40, target = loc))
+ if(do_after(src, delay_web, target = loc))
if(loc != mylocation)
return
else if(istype(loc, /turf/space))
@@ -112,20 +112,30 @@
if(prob(50))
icon_state = "stickyweb2"
+/obj/effect/spider/terrorweb/proc/DeCloakNearby()
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/gray/G in view(6,src))
+ if(!G.ckey && G.stat != DEAD)
+ G.GrayDeCloak()
+ G.Aggro()
+
/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider))
return 1
if(istype(mover, /obj/item/projectile/terrorqueenspit))
return 1
if(isliving(mover))
+ var/mob/living/M = mover
+ if(M.lying)
+ return 1
if(prob(80))
to_chat(mover, "You get stuck in [src] for a moment. ")
- var/mob/living/M = mover
M.Stun(4) // 8 seconds.
M.Weaken(4) // 8 seconds.
+ DeCloakNearby()
if(iscarbon(mover))
spawn(70)
- qdel(src)
+ if(mover.loc == loc)
+ qdel(src)
return 1
else
return 0
@@ -188,12 +198,15 @@
if(iscarbon(L))
regen_points += regen_points_per_kill
fed++
+ visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out. ")
+ to_chat(src, "You feel invigorated! ")
+ else
+ visible_message("[src] wraps [L] in a web. ")
large_cocoon = 1
last_cocoon_object = 0
L.loc = C
C.pixel_x = L.pixel_x
C.pixel_y = L.pixel_y
- visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out. ")
break
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
index 04ac9d30bf2..c1a7bf45da7 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
@@ -12,6 +12,7 @@
name = "Black Terror spider"
desc = "An ominous-looking spider, black as the darkest night. It has merciless eyes, and a blood-red hourglass pattern on its back."
spider_role_summary = "Hit-and-run attacker with extremely venomous bite."
+ ai_target_method = TS_DAMAGE_POISON
icon_state = "terror_widow"
icon_living = "terror_widow"
@@ -37,3 +38,10 @@
else
visible_message("[src] bites [target], but cannot inject venom into their [inject_target]! ")
L.attack_animal(src)
+ if(!ckey && (!(target in enemies) || L.reagents.has_reagent("terror_black_toxin", 60)))
+ step_away(src,L)
+ step_away(src,L)
+ LoseTarget()
+ for(var/i in 0 to 3)
+ step_away(src, L)
+ visible_message("[src] warily eyes [L] from a distance. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm
new file mode 100644
index 00000000000..637af3b1e9a
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm
@@ -0,0 +1,92 @@
+// --------------------------------------------------------------------------------
+// ----------------- TERROR SPIDERS: T5 EMPRESS OF TERROR -------------------------
+// --------------------------------------------------------------------------------
+// -------------: ROLE: ruling over planets of uncountable spiders, like Xenomorph Empresses.
+// -------------: AI: none - this is strictly adminspawn-only and intended for RP events, coder testing, and teaching people 'how to queen'
+// -------------: SPECIAL: Lay Eggs ability that allows laying queen-level eggs.
+// -------------: TO FIGHT IT: run away screaming?
+// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress
+ name = "Empress of Terror"
+ desc = "The unholy offspring of spiders, nightmares, and lovecraft fiction."
+ spider_role_summary = "Adminbus spider"
+ ai_target_method = TS_DAMAGE_SIMPLE
+ maxHealth = 1000
+ health = 1000
+ melee_damage_lower = 30
+ melee_damage_upper = 60
+ move_to_delay = 5
+ ventcrawler = 1
+ idle_ventcrawl_chance = 0
+ ai_playercontrol_allowtype = 0
+ ai_type = TS_AI_AGGRESSIVE
+ rapid = 1
+ canlay = 1000
+ spider_tier = TS_TIER_5
+ var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/handle_automated_action()
+ return
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/NestMode()
+ ..()
+ queeneggs_action.button.name = "Empress Eggs"
+ queenfakelings_action.button.name = "Empress Lings"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs()
+ var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE)
+ var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50)
+ if(eggtype == null || numlings == null)
+ to_chat(src, "Cancelled. ")
+ return
+ switch(eggtype)
+ if(TS_DESC_RED)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red,numlings,1)
+ if(TS_DESC_GRAY)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray,numlings,1)
+ if(TS_DESC_GREEN)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green,numlings,1)
+ if(TS_DESC_BLACK)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black,numlings,1)
+ if(TS_DESC_PURPLE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,numlings,0)
+ if(TS_DESC_WHITE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white,numlings,0)
+ if(TS_DESC_PRINCE)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince,numlings,1)
+ if(TS_DESC_MOTHER)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/mother,numlings,1)
+ if(TS_DESC_QUEEN)
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/queen,numlings,1)
+ else
+ to_chat(src, "Unrecognized egg type. ")
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/QueenFakeLings()
+ var/numlings = input("How many?") as null|anything in list(10, 20, 30, 40, 50)
+ var/sbpc = input("%chance to be stillborn?") as null|anything in list(0, 25, 50, 75, 100)
+ for(var/i=0, iThrough the hivemind, the raw power of [src] floods into your body, burning it from the inside out!")
+ for(var/obj/effect/spider/eggcluster/terror_eggcluster/T in ts_egg_list)
+ qdel(T)
+ for(var/obj/effect/spider/spiderling/terror_spiderling/T in ts_spiderling_list)
+ T.stillborn = 1
+ to_chat(src, "Brood will die off shortly. ")
+
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
index ddfe48bae09..61c0ed42a25 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
@@ -2,24 +2,30 @@
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T1 GRAY TERROR -------------------------------
// --------------------------------------------------------------------------------
-// -------------: ROLE: fast, weak terror spider
-// -------------: SPECIAL: silences targets
-// -------------: TO FIGHT IT: shoot it!
+// -------------: ROLE: ambusher
+// -------------: AI: hides in vents, emerges when prey is near to kill it, then hides again. Intended to scare normal crew.
+// -------------: SPECIAL: invisible when on top of a vent, emerges when prey approaches or gets trapped in webs. Bite silences targets.
+// -------------: TO FIGHT IT: shoot it through a window, or make it regret ambushing you
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
/mob/living/simple_animal/hostile/poison/terror_spider/gray
name = "Gray Terror spider"
- desc = "An ominous-looking gray spider, it seems jittery."
- spider_role_summary = "Fast-moving but weak spider."
+ desc = "An ominous-looking gray spider. It twitches occasionally, always seeming ready to pounce."
+ spider_role_summary = "Stealth spider that ambushes weak humans from vents."
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_gray"
icon_living = "terror_gray"
icon_dead = "terror_gray_dead"
- maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but silences its targets
+ maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its almost invisible.
health = 120
melee_damage_lower = 10
melee_damage_upper = 20
- move_to_delay = 5 // normal speed
+ regen_points_per_hp = 2 // 50% higher regen speed
+ move_to_delay = 5 // slightly faster than normal
stat_attack = 1 // ensures they will target people in crit, too!
+ wander = 0 // wandering defeats the purpose of stealth
+ idle_vision_range = 3 // very low idle vision range
+ delay_web = 20 // double speed
/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable)
@@ -35,4 +41,102 @@
visible_message("[src] buries grey fangs deep into the [inject_target] of [target]! ")
else
visible_message("[src] bites [target], but cannot inject venom into their [inject_target]! ")
- L.attack_animal(src)
\ No newline at end of file
+ L.attack_animal(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustBruteLoss(damage)
+ ..(damage)
+ if(invisibility > 0)
+ GrayDeCloak()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustFireLoss(damage)
+ ..(damage)
+ if(invisibility > 0)
+ GrayDeCloak()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/Aggro()
+ GrayDeCloak()
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/AttackingTarget()
+ if(invisibility > 0)
+ GrayDeCloak()
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayCloak()
+ visible_message("[src] hides in the vent. ")
+ invisibility = SEE_INVISIBLE_LEVEL_ONE
+ icon_state = "terror_gray_cloaked"
+ icon_living = "terror_gray_cloaked"
+ if(!ckey)
+ vision_range = 3
+ idle_vision_range = 3
+ // Bugged, does not work yet. Also spams webs. Also doesn't look great. But... planned.
+ move_to_delay = 15 // while invisible, slow.
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayDeCloak()
+ invisibility = 0
+ icon_state = "terror_gray"
+ icon_living = "terror_gray"
+ vision_range = 9
+ idle_vision_range = 9
+ move_to_delay = 5
+ prob_ai_hides_in_vents = 10
+
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_special_action()
+ if(prob(prob_ai_hides_in_vents))
+ var/obj/machinery/atmospherics/unary/vent_pump/e = locate() in get_turf(src)
+ if(e)
+ if(!e.welded || spider_awaymission)
+ if(invisibility != SEE_INVISIBLE_LEVEL_ONE) // aka: 35. ghosts have 15 with no darkness, 60 with darkness. Weird...
+ var/list/g_turfs_webbed = ListWebbedTurfs()
+ var/webcount = g_turfs_webbed.len
+ if(webcount >= 4)
+ // if there are already at least 4 webs around us, then we have a good web setup already. Cloak.
+ GrayCloak()
+ // I wonder if we should settle down here forever?
+ var/foundqueen = 0
+ for(var/mob/living/H in view(src, 10))
+ if(istype(H, /mob/living/simple_animal/hostile/poison/terror_spider/queen))
+ foundqueen = 1
+ break
+ if(!foundqueen)
+ var/list/g_turfs_visible = ListVisibleTurfs()
+ if(g_turfs_visible.len >= 12)
+ // So long as the room isn't tiny, and it has no queen in it, sure, settle there
+ // since we are settled now, disable most AI behaviors so we don't waste CPU.
+ ai_ventcrawls = 0
+ ai_spins_webs = 0
+ ai_break_lights = 0
+ prob_ai_hides_in_vents = 3
+ visible_message("[src] finishes setting up its trap in [get_area(src)]. ")
+ else
+ var/list/g_turfs_valid = ListValidTurfs()
+ var/turfcount = g_turfs_valid.len
+ if(turfcount == 0)
+ // if there is literally nowhere else we could put a web, cloak.
+ GrayCloak()
+ else
+ // otherwise, pick one of the valid turfs with no web to create a web there.
+ new /obj/effect/spider/terrorweb(pick(g_turfs_valid))
+ visible_message("[src] spins a web. ")
+ else
+ if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
+ // if our vent is welded, decloak
+ GrayDeCloak()
+ else
+ if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
+ // if there is no vent under us, and we are cloaked, decloak
+ GrayDeCloak()
+ var/vdistance = 99
+ var/temp_vent = null
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
+ if(!v.welded)
+ if(get_dist(src,v) < vdistance)
+ temp_vent = v
+ vdistance = get_dist(src,v)
+ if(temp_vent)
+ if(get_dist(src,temp_vent) > 0 && get_dist(src,temp_vent) < 5)
+ step_to(src,temp_vent)
+ // if you're bumped off your vent, try to get back to it
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
index 56265386686..ace7509ccdf 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T1 GREEN TERROR ------------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: reproduction
+// -------------: AI: after it kills you, it webs you and lays new terror eggs on your body
// -------------: SPECIAL: can also create webs, web normal objects, etc
// -------------: TO FIGHT IT: kill it however you like - just don't die to it!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Green Terror spider"
desc = "An ominous-looking green spider. It has a small egg-sac attached to it, and dried blood stains on its carapace."
spider_role_summary = "Average melee spider that webs its victims and lays more spider eggs"
-
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_green"
icon_living = "terror_green"
icon_dead = "terror_green_dead"
@@ -20,7 +21,6 @@
melee_damage_lower = 10
melee_damage_upper = 20
var/feedings_to_lay = 2
-
var/datum/action/innate/terrorspider/greeneggs/greeneggs_action
@@ -34,7 +34,7 @@
if(E)
to_chat(src, "There is already a cluster of eggs here! ")
else if(fed < feedings_to_lay)
- to_chat(src, "You must wrap more prey before you can do this! ")
+ to_chat(src, "You must wrap more humanoid prey before you can do this! ")
else
visible_message("[src] begins to lay a cluster of eggs. ")
if(prob(33))
@@ -45,6 +45,43 @@
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 1, 1)
fed -= feedings_to_lay
+/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_special_action()
+ if(cocoon_target)
+ if(get_dist(src, cocoon_target) <= 1)
+ spider_steps_taken = 0
+ DoWrap()
+ else
+ if(spider_steps_taken > spider_max_steps)
+ spider_steps_taken = 0
+ cocoon_target = null
+ busy = 0
+ stop_automated_movement = 0
+ else
+ spider_steps_taken++
+ CreatePath(cocoon_target)
+ step_to(src,cocoon_target)
+ if(spider_debug)
+ visible_message("[src] moves towards [cocoon_target] to cocoon it. ")
+ else if(fed >= feedings_to_lay)
+ DoLayGreenEggs()
+ else if(world.time > (last_cocoon_object + freq_cocoon_object))
+ last_cocoon_object = world.time
+ var/list/can_see = view(src, 10)
+ for(var/mob/living/C in can_see)
+ if(C.stat == DEAD && !isterrorspider(C) && !C.anchored)
+ spider_steps_taken = 0
+ cocoon_target = C
+ return
+ for(var/obj/O in can_see)
+ if(O.anchored)
+ continue
+ if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
+ if(!istype(O, /obj/item/weapon/paper))
+ cocoon_target = O
+ stop_automated_movement = 1
+ spider_steps_taken = 0
+ return
+
/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(!poisonable)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm
index 2c58a133792..e3eb1b1d49e 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/hive.dm
@@ -18,6 +18,21 @@
hsline += " AI "
to_chat(src,hsline)
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/SetHiveCommand(set_ai, set_ventcrawl)
+ var/numspiders = 0
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ if(spider_awaymission && !T.spider_awaymission)
+ continue
+ else if(!spider_awaymission && T.spider_awaymission)
+ continue
+ numspiders += 1
+ if(spider_tier >= T.spider_tier)
+ if(T.ai_type != set_ai)
+ T.ai_type = set_ai
+ if(T.idle_ventcrawl_chance != set_ventcrawl)
+ T.idle_ventcrawl_chance = set_ventcrawl
+ return numspiders
+
/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpiders()
var/numspiders = 0
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm
index f41ebb54b43..8e3f5ee20cd 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T3 MOTHER OF TERROR --------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: living schmuck bait
+// -------------: AI: no special ai
// -------------: SPECIAL: spawns an ungodly number of spiderlings when killed
// -------------: TO FIGHT IT: don't! Just leave it alone! It is harmless by itself... but god help you if you aggro it.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Mother of Terror spider"
desc = "An enormous spider. Hundreds of tiny spiderlings are crawling all over it. Their beady little eyes all stare at you. The horror!"
spider_role_summary = "Schmuck bait. Extremely weak in combat, but spawns many spiderlings when it dies."
-
+ ai_target_method = TS_DAMAGE_SIMPLE
icon_state = "terror_gray2"
icon_living = "terror_gray2"
icon_dead = "terror_gray2_dead"
@@ -20,10 +21,9 @@
melee_damage_lower = 10
melee_damage_upper = 20
move_to_delay = 5
-
+ idle_ventcrawl_chance = 5
spider_tier = TS_TIER_3
spider_opens_doors = 2
-
var/canspawn = 1
@@ -37,6 +37,7 @@
S.stillborn = 1
else if(prob(10))
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green)
+ S.amount_grown = 50 // double speed growth
visible_message("[src] breaks apart, the many spiders on its back scurrying everywhere! ")
degenerate = 1
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
index 5a3a746e1a9..b18f1c18492 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
@@ -12,26 +12,23 @@
name = "Prince of Terror spider"
desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles."
spider_role_summary = "Miniboss terror spider. Lightning bruiser."
-
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_allblack"
icon_living = "terror_allblack"
icon_dead = "terror_allblack_dead"
-
maxHealth = 600 // 30 laser shots
health = 600
regen_points_per_hp = 6 // double the normal - IE halved regen speed
-
melee_damage_lower = 20
melee_damage_upper = 30
move_to_delay = 4 // faster than normal
-
ventcrawler = 0
+ ai_ventcrawls = 0
environment_smash = 3
-
loot = list(/obj/item/clothing/accessory/medal)
+ idle_ventcrawl_chance = 0
spider_tier = TS_TIER_3
spider_opens_doors = 2
-
var/datum/action/innate/terrorspider/princesmash/princesmash_action
@@ -40,6 +37,12 @@
princesmash_action = new()
princesmash_action.Grant(src)
+/mob/living/simple_animal/hostile/poison/terror_spider/prince/death(gibbed)
+ if(!hasdied)
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_SciStorage")
+ ..()
+
/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L)
if(prob(15))
visible_message("[src] rams into [L], knocking them to the floor! ")
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm
index 7b801d76651..6b524872552 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T2 PURPLE TERROR -----------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: guarding queen nests
+// -------------: AI: dies if too far from queen
// -------------: SPECIAL: chance to stun on hit
// -------------: TO FIGHT IT: shoot it from range, bring friends!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Purple Terror spider"
desc = "An ominous-looking purple spider. It looks about warily, as if waiting for something."
spider_role_summary = "Guards the nest of the Queen of Terror."
-
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_purple"
icon_living = "terror_purple"
icon_dead = "terror_purple_dead"
@@ -20,17 +21,28 @@
melee_damage_lower = 15
melee_damage_upper = 25
move_to_delay = 6
-
spider_tier = TS_TIER_2
spider_opens_doors = 2
-
ventcrawler = 0
+ ai_ventcrawls = 0
environment_smash = 3
-
+ idle_ventcrawl_chance = 0 // stick to the queen!
var/dcheck_counter = 0
var/queen_visible = 1
var/cycles_noqueen = 0
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple/death(gibbed)
+ if(spider_myqueen)
+ var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = spider_myqueen
+ if(Q.stat != DEAD && !Q.ckey)
+ if(get_dist(src,Q) > 20)
+ if(!degenerate && !Q.degenerate)
+ degenerate = 1
+ Q.DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,1,0)
+ visible_message("[src] chitters in the direction of [Q]! ")
+ . = ..()
+
/mob/living/simple_animal/hostile/poison/terror_spider/purple/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(cycles_noqueen < 6 && prob(10))
visible_message("[src] rams into [L], knocking them to the floor! ")
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
index 6ee528218ce..3c7a9ca5677 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T4 QUEEN OF TERROR ---------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: gamma-level threat to the whole station, like a blob
+// -------------: AI: builds a nest, lays many eggs, attempts to take over the station
// -------------: SPECIAL: spins webs, breaks lights, breaks cameras, webs objects, lays eggs, commands other spiders...
// -------------: TO FIGHT IT: bring an army, and take no prisoners. Mechs and/or decloner guns are a very good idea.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Queen of Terror spider"
desc = "An enormous, terrifying spider. Its egg sac is almost as big as its body, and teeming with spider eggs!"
spider_role_summary = "Commander of the spider forces. Lays eggs, directs the brood."
-
+ ai_target_method = TS_DAMAGE_SIMPLE
icon_state = "terror_queen"
icon_living = "terror_queen"
icon_dead = "terror_queen_dead"
@@ -29,22 +30,19 @@
var/neststep = 0
var/hasnested = 0
var/spider_max_per_nest = 20 // above this, queen stops spawning more, and declares war.
-
var/canlay = 0 // main counter for egg-laying ability! # = num uses, incremented at intervals
+ var/eggslaid = 0
var/spider_can_fakelings = 3 // spawns defective spiderlings that don't grow up, used to freak out crew, atmosphere
-
+ idle_ventcrawl_chance = 0
force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can
-
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectilesound = 'sound/weapons/pierce.ogg'
projectiletype = /obj/item/projectile/terrorqueenspit
-
spider_tier = TS_TIER_4
spider_opens_doors = 2
loot = list(/obj/item/clothing/accessory/medal)
-
var/datum/action/innate/terrorspider/queen/queennest/queennest_action
var/datum/action/innate/terrorspider/queen/queensense/queensense_action
var/datum/action/innate/terrorspider/queen/queeneggs/queeneggs_action
@@ -65,10 +63,15 @@
if(.) // if mob is NOT dead
if(ckey && canlay < 12 && hasnested) // max 12 eggs worth stored at any one time, realistically that's tons.
if(world.time > (spider_lastspawn + spider_spawnfrequency))
- canlay++
+ if(eggslaid >= 20)
+ canlay += 3
+ else if(eggslaid >= 10)
+ canlay += 2
+ else
+ canlay++
spider_lastspawn = world.time
if(canlay == 1)
- to_chat(src, "You are able to lay eggs again. ")
+ to_chat(src, "You have an egg available to lay. ")
else if(canlay == 12)
to_chat(src, "You have [canlay] eggs available to lay. You won't grow any more eggs until you lay some of your existing ones. ")
else
@@ -76,6 +79,9 @@
/mob/living/simple_animal/hostile/poison/terror_spider/queen/death(gibbed)
if(!hasdied)
+ SetHiveCommand(0, 15) // Hive becomes very aggressive.
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_Caves")
// When a queen dies, so do her player-controlled purple-type guardians. Intended as a motivator for purples to ensure they guard her.
for(var/mob/living/simple_animal/hostile/poison/terror_spider/purple/P in ts_spiderlist)
if(ckey)
@@ -84,6 +90,131 @@
P.degenerate = 1
..()
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/Retaliate()
+ ..()
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
+ T.enemies |= enemies
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/handle_automated_action()
+ ..()
+ if(!stat && !ckey && AIStatus != AI_OFF && !target && !path_to_vent)
+ switch(neststep)
+ if(0)
+ // we have no nest :(
+ var/ok_to_nest = 1
+ var/area/new_area = get_area(loc)
+ if(new_area)
+ if(findtext(new_area.name, "hall"))
+ ok_to_nest = 0
+ // nesting in a hallway would be very stupid - crew would find and kill you almost instantly
+ var/numhostiles = 0
+ for(var/mob/living/H in oview(10, src))
+ if(!istype(H, /mob/living/simple_animal/hostile/poison/terror_spider))
+ if(H.stat != DEAD)
+ numhostiles += 1
+ // nesting RIGHT NEXT TO SOMEONE is even worse
+ if(numhostiles > 0)
+ ok_to_nest = 0
+ var/vdistance = 99
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
+ if(!v.welded)
+ if(get_dist(src, v) < vdistance)
+ entry_vent = v
+ vdistance = get_dist(src, v)
+ if(!entry_vent)
+ ok_to_nest = 0
+ // don't nest somewhere with no vent - your brood won't be able to get out!
+ if(ok_to_nest && entry_vent)
+ nest_vent = entry_vent
+ neststep = 1
+ visible_message("\The [src] settles down, starting to build a nest. ")
+ else if(entry_vent)
+ if(!path_to_vent)
+ visible_message("\The [src] looks around warily - then seeks a better nesting ground. ")
+ path_to_vent = 1
+ else
+ visible_message("\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone. ")
+ qdel(src)
+ new /obj/effect/portal(get_turf(loc))
+ if(1)
+ if(world.time > (lastnestsetup + nestfrequency))
+ lastnestsetup = world.time
+ neststep = 2
+ NestMode()
+ if(2)
+ if(world.time > (lastnestsetup + nestfrequency))
+ lastnestsetup = world.time
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
+ neststep = 3
+ if(3)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 0)
+ neststep = 4
+ if(4)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ if(!spider_awaymission)
+ QueenFakeLings()
+ spider_lastspawn = world.time
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
+ neststep = 5
+ if(5)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ if(prob(20))
+ var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
+ if(!N)
+ if(!spider_awaymission)
+ QueenFakeLings()
+ spider_lastspawn = world.time
+ if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, 2, 1)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ var/spidercount = CountSpiders()
+ if(spidercount >= spider_max_per_nest) // station overwhelmed!
+ neststep = 6
+ if(6)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ spider_lastspawn = world.time
+ // go hostile, EXTERMINATE MODE.
+ SetHiveCommand(0, 15) // AI=0 (attack everyone), ventcrawl=15%/tick
+ var/numspiders = CountSpiders()
+ if(numspiders < spider_max_per_nest)
+ if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ else if(spider_awaymission)
+ neststep = 7
+ spider_spawnfrequency = spider_spawnfrequency_stable
+ // if we're an away mission queen... don't keep spawning spiders at high rates. Away team should have a chance.
+ if(7)
+ if(world.time > (spider_lastspawn + spider_spawnfrequency))
+ spider_lastspawn = world.time
+ var/numspiders = CountSpiders()
+ if(numspiders < spider_max_per_nest)
+ // someone is killing my children...
+ if(prob(25))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
+ else if(prob(33))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
+ else if(prob(50))
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
+ else
+ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
+ neststep = 6
+
/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestMode()
queeneggs_action = new()
queeneggs_action.Grant(src)
@@ -94,6 +225,7 @@
queennest_action.Remove(src)
hasnested = 1
ventcrawler = 0
+ ai_ventcrawls = 0
environment_smash = 3
DoQueenScreech(8, 100, 8, 100)
MassFlicker()
@@ -159,8 +291,8 @@
if(eggtype == null || numlings == null)
to_chat(src, "Cancelled. ")
return
- //spider_lastspawn = world.time // don't think we actually need this, if queen is laying manually canlay controls her rate.
canlay -= numlings
+ eggslaid += numlings
if(eggtype == TS_DESC_RED)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, numlings, 1)
else if(eggtype == TS_DESC_GRAY)
@@ -210,5 +342,5 @@
if(L.reagents)
if(L.can_inject(null, 0, "chest", 0))
L.reagents.add_reagent("terror_queen_toxin", 15)
- if(!istype(L, /mob/living/simple_animal/hostile/poison/terror_spider))
+ if(!isterrorspider(L))
L.adjustToxLoss(30)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
index cd48027775d..1b48ccd59b9 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm
@@ -12,9 +12,8 @@
/mob/living/simple_animal/hostile/poison/terror_spider/red
name = "Red Terror spider"
desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs! It looks like it has a vicious streak a mile wide."
-
spider_role_summary = "High health, high damage, very slow, melee juggernaut"
-
+ ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_red"
icon_living = "terror_red"
icon_dead = "terror_red_dead"
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm
index ccb7a5c1148..4e58a858504 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/reproduction.dm
@@ -14,6 +14,7 @@
faction = list("terrorspiders")
var/spider_myqueen = null
var/use_vents = 1
+ var/list/enemies = list()
/obj/effect/spider/spiderling/terror_spiderling/New()
..()
@@ -91,6 +92,7 @@
S.faction = faction
S.spider_myqueen = spider_myqueen
S.master_commander = master_commander
+ S.enemies = enemies
qdel(src)
// --------------------------------------------------------------------------------
@@ -106,6 +108,7 @@
C.faction = faction
C.spider_myqueen = spider_myqueen
C.master_commander = master_commander
+ C.enemies = enemies
if(spider_growinstantly)
C.amount_grown = 250
C.spider_growinstantly = 1
@@ -122,6 +125,7 @@
var/spiderling_type = null
var/spiderling_number = 1
var/spiderling_ventcrawl = 1
+ var/list/enemies = list()
/obj/effect/spider/eggcluster/terror_eggcluster/New()
..()
@@ -162,6 +166,7 @@
S.faction = faction
S.spider_myqueen = spider_myqueen
S.master_commander = master_commander
+ S.enemies = enemies
if(spider_growinstantly)
S.amount_grown = 250
var/rnum = 5 - spiderling_number
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ai.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ai.dm
new file mode 100644
index 00000000000..a8d3300f163
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ai.dm
@@ -0,0 +1,310 @@
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: TARGETING CODE -----------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/ListTargets()
+ var/list/targets1 = list()
+ var/list/targets2 = list()
+ var/list/targets3 = list()
+ for(var/mob/living/H in view(src, vision_range))
+ if(H.stat == DEAD)
+ continue
+ if(H.flags & GODMODE)
+ continue
+ if(H.stat == UNCONSCIOUS && !stat_attack)
+ continue
+ if(ai_type == TS_AI_DEFENSIVE && !(H in enemies))
+ continue
+ if(isterrorspider(H))
+ if(H in enemies)
+ targets3 += H
+ continue
+ if(iscarbon(H))
+ var/mob/living/carbon/C = H
+ if(IsInfected(C)) // only target the infected if they're attacking us. Even then, lowest priority.
+ if(C in enemies)
+ targets3 += C
+ continue
+ else if(C.reagents.has_reagent("terror_black_toxin",60))
+ // only target those dying of black spider venom if they are close, or our enemy
+ if(get_dist(src,C) <= 2 || (C in enemies))
+ targets2 += C
+ else
+ // Target prioritization by spider type. BRUTE spiders prioritize lower armor values, POISON spiders prioritize poisonable targets
+ if(ai_target_method == TS_DAMAGE_BRUTE)
+ var/theirarmor = C.getarmor(type = "melee")
+ // Example values: Civilian: 2, Engineer w/ Hardsuit: 10, Sec Officer with armor: 19, HoS: 48, Deathsquad: 80
+ if(theirarmor < 10)
+ targets1 += C
+ else if(C in enemies)
+ if(theirarmor < 30)
+ targets2 += C
+ else
+ targets3 += C
+ else
+ targets3 += C
+ else if(ai_target_method == TS_DAMAGE_POISON)
+ if(C.can_inject(null,0,"chest",0))
+ targets1 += C
+ else if(C in enemies)
+ targets2 += C
+ else
+ targets3 += C
+ else
+ // TS_DAMAGE_SIMPLE
+ if(C in enemies)
+ targets2 += C
+ else
+ targets3 += C
+ else
+ if(istype(H,/mob/living/simple_animal))
+ var/mob/living/simple_animal/S = H
+ if(S.force_threshold > melee_damage_upper)
+ continue
+ if(H in enemies)
+ targets2 += H
+ else
+ targets3 += H
+ if(health < maxHealth)
+ // if we're hurt, and ONLY if we're hurt, do the additional check for mechs/space pods. Save processing time.
+ for(var/obj/mecha/M in view(src, vision_range))
+ if(get_dist(M, src) <= 2)
+ targets2 += M
+ else
+ targets3 += M
+ for(var/obj/spacepod/S in view(src, vision_range))
+ targets3 += S
+ if(targets1.len)
+ return targets1
+ if(targets2.len)
+ return targets2
+ return targets3
+
+/mob/living/simple_animal/hostile/poison/terror_spider/LoseTarget()
+ if(target && isliving(target))
+ var/mob/living/T = target
+ if(T.stat > 0)
+ killcount++
+ regen_points += regen_points_per_kill
+ attackstep = 0
+ attackcycles = 0
+ ..()
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: AI BEHAVIOR CODE -------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/handle_automated_action()
+ if (stat || ckey)
+ return ..()
+ if(AIStatus != AI_OFF && !target)
+ var/my_ventcrawl_freq = freq_ventcrawl_idle
+ if(ts_count_dead > 0)
+ if(world.time < (ts_death_last + ts_death_window))
+ my_ventcrawl_freq = freq_ventcrawl_combat
+ // First, check for general actions that any spider could take.
+ if(path_to_vent)
+ if(entry_vent)
+ if(spider_steps_taken > spider_max_steps)
+ path_to_vent = 0
+ stop_automated_movement = 0
+ spider_steps_taken = 0
+ path_to_vent = 0
+ entry_vent = null
+ else if(get_dist(src, entry_vent) <= 1)
+ path_to_vent = 0
+ stop_automated_movement = 1
+ spider_steps_taken = 0
+ spawn(50)
+ stop_automated_movement = 0
+ TSVentCrawlRandom(entry_vent)
+ else
+ spider_steps_taken++
+ CreatePath(entry_vent)
+ step_to(src,entry_vent)
+ if(spider_debug > 0)
+ visible_message("[src] moves towards the vent [entry_vent]. ")
+ else
+ path_to_vent = 0
+ else if(ai_break_lights && world.time > (last_break_light + freq_break_light))
+ last_break_light = world.time
+ for(var/obj/machinery/light/L in range(1, src))
+ if(!L.status)
+ step_to(src,L)
+ L.on = 1
+ L.broken()
+ L.do_attack_animation(src)
+ visible_message("[src] smashes the [L.name]. ")
+ break
+ else if(ai_spins_webs && world.time > (last_spins_webs + freq_spins_webs))
+ last_spins_webs = world.time
+ var/obj/effect/spider/terrorweb/T = locate() in get_turf(src)
+ if(!T)
+ new /obj/effect/spider/terrorweb(get_turf(src))
+ visible_message("[src] puts up some spider webs. ")
+ else if(ai_ventcrawls && world.time > (last_ventcrawl_time + my_ventcrawl_freq))
+ if(prob(idle_ventcrawl_chance))
+ last_ventcrawl_time = world.time
+ var/vdistance = 99
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
+ if(!v.welded)
+ if(get_dist(src,v) < vdistance)
+ entry_vent = v
+ vdistance = get_dist(src,v)
+ if(entry_vent)
+ path_to_vent = 1
+ else
+ // If none of the general actions apply, check for class-specific actions.
+ spider_special_action()
+ else if(AIStatus != AI_OFF && target)
+ CreatePath(target)
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/adjustBruteLoss(damage)
+ ..(damage)
+ Retaliate()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/adjustFireLoss(damage)
+ ..(damage)
+ Retaliate()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/Retaliate()
+ var/list/around = oview(src, 7)
+ var/list/ts_nearby = list()
+ for(var/atom/movable/A in around)
+ if(A in enemies)
+ continue
+ if(isterrorspider(A))
+ ts_nearby += A
+ continue
+ if(isliving(A))
+ var/mob/living/M = A
+ if(!("terrorspiders" in M.faction))
+ enemies |= M
+ visible_message("[src] glares at [M]! ")
+ else if(istype(A, /obj/mecha))
+ var/obj/mecha/M = A
+ if(M.occupant)
+ enemies |= M
+ enemies |= M.occupant
+ else if(istype(A, /obj/spacepod))
+ var/obj/spacepod/M = A
+ if(M.pilot)
+ enemies |= M
+ enemies |= M.pilot
+ for(var/mob/living/simple_animal/hostile/poison/terror_spider/H in ts_nearby)
+ var/retaliate_faction_check = 0
+ for(var/F in faction)
+ if(F in H.faction)
+ retaliate_faction_check = 1
+ break
+ if(retaliate_faction_check && !attack_same && !H.attack_same)
+ H.enemies |= enemies
+ return 0
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: PATHING CODE -----------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/CreatePath(mygoal)
+ var/m2 = get_turf(src)
+ if(m2 == mylocation)
+ chasecycles++
+ ClearObstacle(get_turf(mygoal))
+ if(chasecycles >= 2)
+ chasecycles = 0
+ if(spider_opens_doors)
+ var/tgt_dir = get_dir(src,mygoal)
+ for(var/obj/machinery/door/airlock/A in view(1, src))
+ if(A.density)
+ try_open_airlock(A)
+ for(var/obj/machinery/door/firedoor/F in view(1, src))
+ if(tgt_dir == get_dir(src,F) && F.density && !F.welded)
+ visible_message("[src] pries open the firedoor! ")
+ F.open()
+
+ else
+ mylocation = m2
+ chasecycles = 0
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ClearObstacle(turf/target_turf)
+ var/list/valid_obstacles = list(/obj/structure/window, /obj/structure/closet, /obj/structure/table, /obj/structure/grille, /obj/structure/rack, /obj/machinery/door/window)
+ for(var/dir in cardinal) // North, South, East, West
+ var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
+ if(is_type_in_list(obstacle, valid_obstacles))
+ obstacle.attack_animal(src)
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/TSVentCrawlRandom(/var/entry_vent)
+ if(entry_vent)
+ if(get_dist(src, entry_vent) <= 2)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch)
+ vents.Add(temp_vent)
+ if(!vents.len)
+ entry_vent = null
+ return
+ var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
+ visible_message("[src] scrambles into the ventillation ducts! ", "You hear something squeezing through the ventilation ducts. ")
+ spawn(rand(20,60))
+ var/original_location = loc
+ forceMove(exit_vent)
+ var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ if(prob(50))
+ audible_message("You hear something squeezing through the ventilation ducts. ")
+ spawn(travel_time)
+ if(!exit_vent || exit_vent.welded)
+ forceMove(original_location)
+ entry_vent = null
+ return
+ forceMove(exit_vent.loc)
+ entry_vent = null
+ var/area/new_area = get_area(loc)
+ if(new_area)
+ new_area.Entered(src)
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: ENVIRONMENT CODE -------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListValidTurfs()
+ var/list/potentials = list()
+ for(var/turf/simulated/T in oview(3,get_turf(src)))
+ if(T.density == 0 && get_dist(get_turf(src),T) == 3)
+ var/obj/effect/spider/terrorweb/W = locate() in T
+ if(!W)
+ var/obj/structure/grille/G = locate() in T
+ if(!G)
+ var/obj/structure/window/O = locate() in T
+ if(!O)
+ potentials += T
+ return potentials
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListWebbedTurfs()
+ var/list/webbed = list()
+ for(var/turf/simulated/T in oview(3,get_turf(src)))
+ if(T.density == 0 && get_dist(get_turf(src),T) == 3)
+ var/obj/effect/spider/terrorweb/W = locate() in T
+ if(W)
+ webbed += T
+ return webbed
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListVisibleTurfs()
+ var/list/vturfs = list()
+ for(var/turf/simulated/T in oview(7,get_turf(src)))
+ if(T.density == 0)
+ vturfs += T
+ return vturfs
+
+// --------------------------------------------------------------------------------
+// --------------------- TERROR SPIDERS: MISC AI CODE -----------------------------
+// --------------------------------------------------------------------------------
+
+/mob/living/simple_animal/hostile/poison/terror_spider/proc/UnlockBlastDoors(target_id_tag)
+ for(var/obj/machinery/door/poddoor/P in airlocks)
+ if(P.density && P.id_tag == target_id_tag && P.z == z && !P.operating)
+ P.open()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 7fa291eb2a6..67681de8240 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -1,4 +1,3 @@
-
var/global/list/ts_ckey_blacklist = list()
var/global/ts_count_dead = 0
var/global/ts_count_alive_awaymission = 0
@@ -43,6 +42,15 @@ var/global/list/ts_spiderling_list = list()
// Ventcrawling
ventcrawler = 1 // allows player ventcrawling
+ var/ai_ventcrawls = 1
+ var/idle_ventcrawl_chance = 3 // default 3% chance to ventcrawl when not in combat to a random exit vent
+ var/freq_ventcrawl_combat = 1800 // 3 minutes
+ var/freq_ventcrawl_idle = 9000 // 15 minutes
+ var/last_ventcrawl_time = -9000 // Last time the spider crawled. Used to prevent excessive crawling. Setting to freq*-1 ensures they can crawl once on spawn.
+
+ // AI movement tracking
+ var/spider_steps_taken = 0 // leave at 0, its a counter for ai steps taken.
+ var/spider_max_steps = 15 // after we take X turns trying to do something, give up!
// Speech
speak_chance = 0 // quiet but deadly
@@ -71,15 +79,35 @@ var/global/list/ts_spiderling_list = list()
aggro_vision_range = 10
see_in_dark = 10
nightvision = 1
- vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight
see_invisible = 5
+ sight = SEE_MOBS
+
+ // AI aggression settings
+ var/ai_type = TS_AI_AGGRESSIVE // 0 = aggressive to everyone, 1 = defends self only
+ var/ai_target_method = TS_DAMAGE_SIMPLE
// AI player control by ghosts
var/ai_playercontrol_allowtype = 1 // if 0, this specific class of spider is not player-controllable. Default set in code for each class, cannot be changed.
+ var/ai_break_lights = 1 // AI lightbreaking behavior
+ var/freq_break_light = 600
+ var/last_break_light = 0 // leave this, changed by procs.
+
+ var/ai_spins_webs = 1 // AI web-spinning behavior
+ var/freq_spins_webs = 600
+ var/last_spins_webs = 0 // leave this, changed by procs.
+ var/delay_web = 40 // delay between starting to spin web, and finishing
+
+ var/freq_cocoon_object = 1200 // two minutes between each attempt
+ var/last_cocoon_object = 0 // leave this, changed by procs.
+
+ var/prob_ai_hides_in_vents = 15 // probabily of a gray spider hiding in a vent
+
var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors
faction = list("terrorspiders")
var/spider_awaymission = 0 // if 1, limits certain behavior in away missions
+ var/spider_uo71 = 0 // if 1, spider is in the UO71 away mission
+ var/spider_unlock_id_tag = "" // if defined, unlock awaymission blast doors with this tag on death
var/spider_role_summary = "UNDEFINED"
var/spider_placed = 0
@@ -90,16 +118,18 @@ var/global/list/ts_spiderling_list = list()
var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens
var/fed = 0
var/travelling_in_vent = 0
+ var/list/enemies = list()
+ var/path_to_vent = 0
var/killcount = 0
var/busy = 0 // leave this alone!
var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen
var/hasdied = 0
+ var/list/spider_special_drops = list()
var/attackstep = 0
var/attackcycles = 0
var/spider_myqueen = null
var/mylocation = null
var/chasecycles = 0
- var/last_cocoon_object = 0 // leave this, changed by procs.
var/datum/action/innate/terrorspider/web/web_action
var/datum/action/innate/terrorspider/wrap/wrap_action
@@ -124,13 +154,15 @@ var/global/list/ts_spiderling_list = list()
/mob/living/simple_animal/hostile/poison/terror_spider/AttackingTarget()
if(isterrorspider(target))
+ if(target in enemies)
+ enemies -= target
var/mob/living/simple_animal/hostile/poison/terror_spider/T = target
if(T.spider_tier > spider_tier)
- visible_message("[src] bows in respect for the terrifying presence of [target]. ")
+ visible_message("[src] cowers before [target]. ")
else if(T.spider_tier == spider_tier)
visible_message("[src] nuzzles [target]. ")
else if(T.spider_tier < spider_tier && spider_tier >= 4)
- visible_message("[src] gives [target] a stern look. ")
+ target.attack_animal(src)
else
visible_message("[src] harmlessly nuzzles [target]. ")
T.CheckFaction()
@@ -223,6 +255,15 @@ var/global/list/ts_spiderling_list = list()
if(is_away_level(z))
spider_awaymission = 1
ts_count_alive_awaymission++
+ if(spider_tier >= 3)
+ ai_ventcrawls = 0 // means that pre-spawned bosses on away maps won't ventcrawl. Necessary to keep prince/mother in one place.
+ if(istype(get_area(src), /area/awaymission/UO71)) // if we are playing the away mission with our special spiders...
+ spider_uo71 = 1
+ if(world.time < 600)
+ // these are static spiders, specifically for the UO71 away mission, make them stay in place
+ ai_ventcrawls = 0
+ spider_placed = 1
+ wander = 0
else
ts_count_alive_station++
// after 30 seconds, assuming nobody took control of it yet, offer it to ghosts.
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm
index 191eed19c47..a85e0ebb42e 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/white.dm
@@ -1,4 +1,3 @@
-
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T2 WHITE TERROR ------------------------------
// --------------------------------------------------------------------------------
@@ -12,12 +11,12 @@
name = "White Terror spider"
desc = "An ominous-looking white spider, its ghostly eyes and vicious-looking fangs are the stuff of nightmares."
spider_role_summary = "Rare, bite-and-run spider that infects hosts with spiderlings"
-
+ ai_target_method = TS_DAMAGE_POISON
icon_state = "terror_white"
icon_living = "terror_white"
icon_dead = "terror_white_dead"
- maxHealth = 100
- health = 100
+ maxHealth = 200
+ health = 200
melee_damage_lower = 5
melee_damage_upper = 15
move_to_delay = 4
@@ -25,6 +24,18 @@
loot = list(/obj/item/clothing/accessory/medal)
+/mob/living/simple_animal/hostile/poison/terror_spider/white/LoseTarget()
+ stop_automated_movement = 0
+ attackstep = 0
+ attackcycles = 0
+ ..()
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white/death(gibbed)
+ if(!hasdied)
+ if(spider_uo71)
+ UnlockBlastDoors("UO71_Bridge")
+ ..()
+
/mob/living/simple_animal/hostile/poison/terror_spider/white/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(!poisonable)
..()
@@ -35,6 +46,13 @@
if(!IsInfected(L))
visible_message("[src] buries its long fangs deep into the [inject_target] of [L]! ")
new /obj/item/organ/internal/body_egg/terror_eggs(L)
+ if(!ckey)
+ LoseTarget()
+ walk_away(src,L,2,1)
+ else if(prob(25))
+ visible_message("[src] pounces on [L]! ")
+ L.Weaken(5)
+ L.Stun(5)
/mob/living/simple_animal/hostile/poison/terror_spider/proc/IsInfected(mob/living/carbon/C) // Terror AI requires this
if(C.get_int_organ(/obj/item/organ/internal/body_egg))
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3f3792fd1b7..4da4a47945b 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -231,22 +231,18 @@
//Mob can equip. Equip it.
equip_to_slot_or_del(W, slot)
else
- //Mob can't equip it. Put it in a bag B.
- // Do I have a backpack?
- var/obj/item/weapon/storage/B
- if(istype(back,/obj/item/weapon/storage))
- //Mob is wearing backpack
- B = back
- else
- //not wearing backpack. Check if player holding plastic bag
- B=is_in_hands(/obj/item/weapon/storage/bag/plasticbag)
- if(!B) //If not holding plastic bag, give plastic bag
- B=new /obj/item/weapon/storage/bag/plasticbag(null) // Null in case of failed equip.
- if(!put_in_hands(B))
- return // Bag could not be placed in players hands. I don't know what to do here...
- //Now, B represents a container we can insert W into.
- B.handle_item_insertion(W,1)
- return B
+ //Mob can't equip it. Put it their backpack or toss it on the floor
+ if(istype(back, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = back
+ //Now, B represents a container we can insert W into.
+ S.handle_item_insertion(W,1)
+ return S
+
+ var/turf/T = get_turf(src)
+ if(istype(T))
+ W.forceMove(T)
+ return T
+
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 15473caf5f2..e8899ef6123 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -470,7 +470,7 @@
if(CHEF)
clothes_s = new /icon(uniform_dmi, "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY)
switch(backbag)
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index 0670193e498..9dbb508f16e 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -25,7 +25,7 @@
if(ui_ref)
var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines)
if(alarm)
- var/datum/topic_state/TS = generate_state(alarm)
+ var/datum/topic_state/air_alarm/TS = generate_state(alarm)
alarm.ui_interact(usr, master_ui = ui_ref, state = TS)
/datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
@@ -63,7 +63,7 @@
/datum/topic_state/air_alarm/href_list(var/mob/user)
var/list/extra_href = list()
- extra_href["remote_connection"] = 1
+ extra_href["remote_connection"] = TRUE
extra_href["remote_access"] = has_access(user)
return extra_href
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 51b78d0b973..14925d9752f 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -18,8 +18,10 @@ var/list/alldepartments = list()
active_power_usage = 200
var/obj/item/weapon/card/id/scan = null // identification
+
var/authenticated = 0
var/sendcooldown = 0 // to avoid spamming fax messages
+ var/cooldown_time = 1800
var/department = "Unknown" // our department
@@ -52,7 +54,7 @@ var/list/alldepartments = list()
else
return ..()
-/obj/machinery/photocopier/faxmachine/emag_act(user as mob)
+/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
if(!emagged)
emagged = 1
to_chat(user, "The transmitters realign to an unknown source! ")
@@ -123,7 +125,7 @@ var/list/alldepartments = list()
if(copyitem)
copyitem.forceMove(get_turf(src))
if(ishuman(usr))
- if(!usr.get_active_hand())
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(copyitem)
to_chat(usr, "You eject \the [copyitem] from \the [src]. ")
copyitem = null
@@ -154,10 +156,10 @@ var/list/alldepartments = list()
destination = lastdestination
if(href_list["auth"])
- if((!authenticated) && scan)
+ if(!is_authenticated && scan)
if(check_access(scan))
authenticated = 1
- else if(!authenticated)
+ else if(is_authenticated)
authenticated = 0
if(href_list["rename"])
@@ -177,26 +179,42 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
if(scan) // Card is in machine
if(ishuman(usr))
- scan.forceMove(get_turf(usr))
- if(!usr.get_active_hand())
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else
scan.forceMove(get_turf(src))
scan = null
- else
+ else if(Adjacent(usr))
if(!card)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.forceMove(src)
scan = I
- else
- if(istype(card))
- usr.drop_item()
- card.forceMove(src)
- scan = card
+ else if(istype(card))
+ usr.drop_item()
+ card.forceMove(src)
+ scan = card
nanomanager.update_uis(src)
+
+/obj/machinery/photocopier/faxmachine/verb/eject_id()
+ set category = null
+ set name = "Eject ID Card"
+ set src in oview(1)
+
+ if(usr.restrained())
+ return
+
+ if(scan)
+ to_chat(usr, "You remove \the [scan] from \the [src].")
+ scan.forceMove(get_turf(src))
+ if(!usr.get_active_hand() && Adjacent(usr))
+ usr.put_in_hands(scan)
+ scan = null
+ else
+ to_chat(usr, "There is nothing to remove from \the [src].")
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender)
if(stat & (BROKEN|NOPOWER))
@@ -220,7 +238,6 @@ var/list/alldepartments = list()
F.sent_at = world.time
visible_message("[src] beeps, \"Message transmitted successfully.\"")
- //sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
@@ -253,6 +270,9 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
if(stat & (BROKEN|NOPOWER))
return
+
+ if(sendcooldown)
+ return
use_power(200)
@@ -284,15 +304,15 @@ var/list/alldepartments = list()
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
if("Syndicate")
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
- sendcooldown = 1800
- sleep(50)
- visible_message("[src] beeps, \"Message transmitted successfully.\"")
+ sendcooldown = cooldown_time
+ spawn(50)
+ visible_message("[src] beeps, \"Message transmitted successfully.\"")
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1")
- var/msg = "[faxname]: [key_name(sender, 1)] (PP ) (VV ) (CA ) ([admin_jump_link(sender)]) | REPLY: (RADIO ) (FAX ) (SM ) | REJECT: (TEMPLATE ) (BSA ) (EVILFAX ) : Receiving '[sent.name]' via secure connection... view message "
+ var/msg = "[faxname]: [key_name_admin(sender)] | REPLY: (RADIO ) (FAX ) (SM ) | REJECT: (TEMPLATE ) (BSA ) (EVILFAX ) : Receiving '[sent.name]' via secure connection... view message "
for(var/client/C in admins)
- if(R_EVENT & C.holder.rights)
+ if(check_rights(R_EVENT, 0, C.mob))
to_chat(C, msg)
if(C.prefs.sound & SOUND_ADMINHELP)
C << 'sound/effects/adminhelp.ogg'
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 0fe3a6e75a4..c7be9890a4f 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -110,17 +110,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/S
for(var/datum/data/record/R in data_core.security)
- if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
+ if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
S = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "Security Record "
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] "
P.info += " \nSecurity Data \nCriminal Status: [S.fields["criminal"]] \n \nMinor Crimes: [S.fields["mi_crim"]] \nDetails: [S.fields["mi_crim_d"]] \n \nMajor Crimes: [S.fields["ma_crim"]] \nDetails: [S.fields["ma_crim_d"]] \n \nImportant Notes: \n\t[S.fields["notes"]] \n \nComments/Log "
- var/counter = 1
- while(S.fields["com_[counter]"])
- P.info += "[S.fields["com_[counter]"]] "
- counter++
+ for(var/c in S.fields["comments"])
+ P.info += "[c] "
P.info += ""
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
@@ -146,17 +144,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/M
for(var/datum/data/record/R in data_core.medical)
- if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
+ if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
M = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "Medical Record "
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]] \nSex: [G.fields["sex"]] \nAge: [G.fields["age"]] \nFingerprint: [G.fields["fingerprint"]] \nPhysical Status: [G.fields["p_stat"]] \nMental Status: [G.fields["m_stat"]] "
P.info += " \nMedical Data \nBlood Type: [M.fields["b_type"]] \nDNA: [M.fields["b_dna"]] \n \nMinor Disabilities: [M.fields["mi_dis"]] \nDetails: [M.fields["mi_dis_d"]] \n \nMajor Disabilities: [M.fields["ma_dis"]] \nDetails: [M.fields["ma_dis_d"]] \n \nAllergies: [M.fields["alg"]] \nDetails: [M.fields["alg_d"]] \n \nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section) \nDetails: [M.fields["cdi_d"]] \n \nImportant Notes: \n\t[M.fields["notes"]] \n \nComments/Log "
- var/counter = 1
- while(M.fields["com_[counter]"])
- P.info += "[M.fields["com_[counter]"]] "
- counter++
+ for(var/c in M.fields["comments"])
+ P.info += "[c] "
P.info += ""
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index b859fc400fc..9a4445d111d 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -179,6 +179,17 @@
var/mob_aoe = FALSE
var/list/hit_overlays = list()
+/obj/item/projectile/kinetic/pod
+ range = 4
+
+/obj/item/projectile/kinetic/pod/regular
+ damage = 50
+ pressure_decrease = 0.5
+
+/obj/item/projectile/kinetic/pod/enhanced
+ turf_aoe = TRUE
+ mob_aoe = TRUE
+
/obj/item/projectile/kinetic/on_range()
strike_thing()
..()
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 278ec7ad82f..0e8fee1926c 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -40,6 +40,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/egg = list("egg" = -5),
+ /obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5),
//Grinder stuff, but only if dry
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0),
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index e8505d64653..89233789903 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -39,7 +39,6 @@
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
-
/datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index a04087603ad..c0e85013ccd 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -1,11 +1,13 @@
/obj/item/weapon/reagent_containers/blood
name = "BloodPack"
+ var/base_name = "BloodPack"
desc = "Contains blood used for transfusion."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
volume = 200
var/blood_type = null
+ var/label_text = ""
/obj/item/weapon/reagent_containers/blood/New()
..()
@@ -16,6 +18,7 @@
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
+ update_name_label()
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
@@ -27,27 +30,55 @@
if(51 to INFINITY)
icon_state = "full"
+/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen))
+ var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
+ if(length(tmp_label) > MAX_NAME_LEN)
+ to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long. ")
+ else
+ to_chat(user, "You set the label to \"[tmp_label]\". ")
+ label_text = tmp_label
+ update_name_label()
+
+/obj/item/weapon/reagent_containers/blood/proc/update_name_label()
+ if(reagents.total_volume == 0)
+ base_name = "Empty BloodPack"
+ desc = "Seems pretty useless... Maybe if there were a way to fill it?"
+ else
+ base_name = "BloodPack"
+ desc = "Contains blood used for transfusion."
+ if(label_text == "")
+ name = base_name
+ else
+ name = "[base_name] ([label_text])"
+
/obj/item/weapon/reagent_containers/blood/random/New()
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
..()
/obj/item/weapon/reagent_containers/blood/APlus
blood_type = "A+"
+ label_text = "A+"
/obj/item/weapon/reagent_containers/blood/AMinus
blood_type = "A-"
+ label_text = "A-"
/obj/item/weapon/reagent_containers/blood/BPlus
blood_type = "B+"
+ label_text = "B+"
/obj/item/weapon/reagent_containers/blood/BMinus
blood_type = "B-"
+ label_text = "B-"
/obj/item/weapon/reagent_containers/blood/OPlus
blood_type = "O+"
+ label_text = "O+"
/obj/item/weapon/reagent_containers/blood/OMinus
blood_type = "O-"
+ label_text = "O-"
/obj/item/weapon/reagent_containers/blood/empty
name = "Empty BloodPack"
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 722c21e3ef3..2cc7cae3512 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -321,6 +321,7 @@
newsign.data["mob"] = null
newsign.data["mobtype"] = /mob/living/carbon/human
+ newsign.data["race"] = "Automated Signal"
newsign.data["name"] = source
newsign.data["realname"] = newsign.data["name"]
newsign.data["job"] = "[job]"
@@ -343,4 +344,4 @@
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
if(!pass)
- S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
\ No newline at end of file
+ S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm
index 752c90f5db4..65b3b9232b8 100644
--- a/code/modules/spacepods/equipment.dm
+++ b/code/modules/spacepods/equipment.dm
@@ -28,9 +28,8 @@
firstloc = get_turf(my_atom)
secondloc = get_step(firstloc,NORTH)
olddir = dir
- var/proj_type = text2path(projectile_type)
- var/obj/item/projectile/projone = new proj_type(firstloc)
- var/obj/item/projectile/projtwo = new proj_type(secondloc)
+ var/obj/item/projectile/projone = new projectile_type(firstloc)
+ var/obj/item/projectile/projtwo = new projectile_type(secondloc)
projone.starting = get_turf(my_atom)
projone.firer = usr
projone.def_zone = "chest"
@@ -79,7 +78,7 @@
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
- var/projectile_type
+ var/obj/item/projectile/projectile_type
var/shot_cost = 0
var/shots_per = 1
var/fire_sound
@@ -89,7 +88,7 @@
name = "disabler system"
desc = "A weak taser system for space pods, fires disabler beams."
icon_state = "weapon_taser"
- projectile_type = "/obj/item/projectile/beam/disabler"
+ projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 400
fire_sound = 'sound/weapons/Taser.ogg'
@@ -97,7 +96,7 @@
name = "burst taser system"
desc = "A weak taser system for space pods, this one fires 3 at a time."
icon_state = "weapon_burst_taser"
- projectile_type = "/obj/item/projectile/beam/disabler"
+ projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 1200
shots_per = 3
fire_sound = 'sound/weapons/Taser.ogg'
@@ -107,7 +106,7 @@
name = "laser system"
desc = "A weak laser system for space pods, fires concentrated bursts of energy"
icon_state = "weapon_laser"
- projectile_type = "/obj/item/projectile/beam"
+ projectile_type = /obj/item/projectile/beam
shot_cost = 600
fire_sound = 'sound/weapons/Laser.ogg'
@@ -117,7 +116,7 @@
desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_taser"
- projectile_type = "/obj/item/projectile/kinetic"
+ projectile_type = /obj/item/projectile/kinetic/pod
shot_cost = 300
fire_delay = 14
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -127,7 +126,7 @@
desc = "A mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_m_laser"
- projectile_type = "/obj/item/projectile/kinetic/super"
+ projectile_type = /obj/item/projectile/kinetic/pod/regular
shot_cost = 250
fire_delay = 10
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -137,7 +136,7 @@
desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_w_laser"
- projectile_type = "/obj/item/projectile/kinetic/hyper"
+ projectile_type = /obj/item/projectile/kinetic/pod/enhanced
shot_cost = 200
fire_delay = 8
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 2090b34baa5..36f8c868cf6 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -3,7 +3,7 @@
// Satellites be actived to generate a shield that will block unorganic matter from passing it.
/datum/station_goal/station_shield
name = "Station Shield"
- var/coverage_goal = 500
+ var/coverage_goal = 5000
/datum/station_goal/station_shield/get_report()
return {"Station Shield construction
diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm
index 3d1917fe258..71ecdc41139 100644
--- a/code/modules/surgery/organs/parasites.dm
+++ b/code/modules/surgery/organs/parasites.dm
@@ -63,19 +63,19 @@
to_chat(owner,"Your spider bite wound hurts horribly! ")
if(istype(get_area(owner), /area/awaycontent) || istype(get_area(owner), /area/awaymission))
awaymission_infection = 1
- if(15) // 30 seconds... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
+ if(15) // 30s... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
to_chat(owner,"The pain has faded, and stopped bleeding, though the skin around it has turned black. ")
owner.adjustBruteLoss(-10)
- if(60) // 2 minutes... the point where the venom uses and accellerates the healing process, to feed the eggs
+ if(30) // 1m... the point where the venom uses and accellerates the healing process, to feed the eggs
to_chat(owner,"Your bite wound has completely sealed up, though the skin is still black. You feel significantly better. ")
owner.adjustBruteLoss(-20)
- if(120) // 4 minutes... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
+ if(90) // 3m... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
to_chat(owner,"The black flesh around your old spider bite wound has started to peel off. ")
- if(150) // 5 minutes... where the victim realizes something is wrong - this is not a normal wound
+ if(100) // 3m20s... where the victim realizes something is wrong - this is not a normal wound
to_chat(owner,"The black flesh around your spider bite wound has cracked, and started to split open! ")
- if(165) // 5m 30s
+ if(110) // 3m40s...
to_chat(owner,"The black flesh splits open completely, revealing a cluster of small black oval shapes inside you, shapes that seem to be moving! ")
- if(180) // 6m
+ if(120) // 4m...
if(awaymission_infection && is_away_level(owner.z))
// we started in the awaymission, we ended on the station.
// To prevent someone bringing an infection back, we're going to trigger an alternate, equally-bad result here.
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
index 7d3f9084f5f..ab64ac1252d 100644
--- a/code/modules/vehicle/ambulance.dm
+++ b/code/modules/vehicle/ambulance.dm
@@ -31,6 +31,8 @@
/obj/vehicle/ambulance/Move(newloc, Dir)
var/oldloc = loc
+ if(bed && !Adjacent(bed))
+ bed = null
. = ..()
if(bed && get_dist(oldloc, loc) <= 2)
bed.Move(oldloc)
diff --git a/config/example/away_mission_config.txt b/config/example/away_mission_config.txt
index b4a77bca61e..fe3980fef8f 100644
--- a/config/example/away_mission_config.txt
+++ b/config/example/away_mission_config.txt
@@ -19,6 +19,7 @@
#===================================#
# USABLE AWAY MISSIONS #
#===================================#
+
_maps/map_files/RandomZLevels/beach.dmm
_maps/map_files/RandomZLevels/listeningpost.dmm
_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -27,6 +28,7 @@ _maps/map_files/RandomZLevels/academy.dmm
_maps/map_files/RandomZLevels/blackmarketpackers.dmm
_maps/map_files/RandomZLevels/spacehotel.dmm
_maps/map_files/RandomZLevels/wildwest.dmm
+_maps/map_files/RandomZLevels/terrorspiders.dmm
#===================================#
# SPECIAL AWAY MISSIONS #
diff --git a/html/changelog.html b/html/changelog.html
index 07f92471830..8481c6ea499 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,113 @@
-->
+
26 February 2017
+
Crazylemon64 updated:
+
+ Immovable rod events now vanish after going through the station once
+ Firelocks can now be operated by AIs again
+ Barbers and captains get the right stuff now
+ It's now possible to have random floors or walls when mapping
+
+
KasparoVy updated:
+
+ Fixes a bug where you could get a part of a rigsuit stuck to your hand by deploying it twice.
+ Improves the readability of some rigsuit verbs.
+
+
Kyep updated:
+
+ players will no longer spawn with loadout items their job has no access to.
+ AI & Borg upload consoles now have to be on the station zlevel to work.
+
+
davipatury updated:
+
+ ATM now uses Nano-UI.
+
+
+
25 February 2017
+
Crazylemon64 updated:
+
+ Telecomms monitor is now infused with fastitude
+
+
FlattestGuitar updated:
+
+ Escape has been re-bushed.
+
+
KasparoVy updated:
+
+ Reagent plasma has a weak healing effect on Plasmamen when injected and will not poison them.
+ Reagent oxygen is as toxic to Vox as reagent plasma is to just about anyone.
+ Plasmamen now join the shift with 2 suit auto-extinguisher refill cartridges which, individually, will fully refill an empty Plasmaman suit's autoextinguisherl.
+ Plasmaman suits now auto-extinguish and will be able to do so 5 times before they can be refilled by a cartridge.
+ Plasmamen no longer burn in a vacuum or in plasma-pure environments.
+
+
davipatury updated:
+
+ Security Records now uses Nano-UI.
+
+
+
24 February 2017
+
FalseIncarnate updated:
+
+ Corn and bananas can be properly deepfried into their special results again.
+ Rice can be properly ground into a reagent again.
+ Hydroponics trays once again are equipped with Bee-proof lids to keep unwanted pollination to a minimum. This only works if you actually toggle the lid closed though!
+ Plants age slightly slower, so your space farming should no longer feel like it outpaces a meth'd up blue hedgehog in sneakers.
+
+
Kyep updated:
+
+ Fixes blob spawns prompting players twice.
+
+
Markolie updated:
+
+ Mining pod weapons are once again functional. Compared to regular kinetic accelerators, the weak projectile has one additional range (3 --> 4). The regular projectile's damage is increased (40 --> 50) and deals more damage in pressurized environments (50% instead of 25%). The enhanced projectile is able to fire its kinetic projectile AoE against turfs and mobs.
+ Fixed an issue where it was impossible to log out from fax machines.
+ It is no longer possible to steal ID cards from identification computers/fax machine using telekinesis at range.
+ The follow link on death alarms now works.
+ Fixes an exploit where players could use the ambulance trolley to teleport.
+ The chef now properly shows a chef hat on character preview.
+ The nuclear ops game mode will no longer always result in a major crew victory.
+ Players with their face covered will no longer show their flavor text upon examine.
+ Fax machines now have an "Eject ID card" verb so you can remove the inserted ID when it is depowered.
+ Firelocks are now more lethal.
+ Firelocks now crush players standing inside them when they finish closing.
+ Firelocks can no longer be instantly opened by hand: it requires thirty seconds and will autoclose in five seconds if there is still an atmospherics alert present in the area. They can no longer be closed by hand. Heavy firelocks can not be forced by hand.
+ Atmospherics technicians can once again remotely modify all settings on air alarms through the central atmospherics console.
+
+
Purpose2 updated:
+
+ Captain's crown is now part of the random hats crate, and no longer spawns in their locker.
+
+
Twinmold93 updated:
+
+ Ability to label bloodpacks with a pen, so you can now label a bloodpack from donations without a handlabeler.
+ Bloodpacks will now change name to say if they are empty or not.
+
+
davipatury updated:
+
+ EFTPOS now uses Nano-UI.
+ Medical Records now uses Nano-UI.
+ Employment Records now uses Nano-UI.
+
+
+
23 February 2017
+
Krausus updated:
+
+ Ghost candidate alert boxes ("Do you want to play as a thing?") will now have "No" as the leftmost, default option, which you will accidentally pick when it pops up while you're trying to type, but at least you won't be stuck as the thing when you didn't actually want to be that thing.
+
+
Markolie updated:
+
+ The meteor shield satellite station goal coverage goal has been increased tenfold.
+
+
+
22 February 2017
+
KasparoVy updated:
+
+ You can now toggle on/off the gladiator helmet's face-shield with an action button. This is totally cosmetic. imgadd: Adds a bunch of new helmet sprites for Vox.
+ Slightly adjusts the Vox knight armour sprites (not the Templar armour) to look nicer with the new helmets.
+ The Admin 'Select Equipment' debug verb now appropriately equips Armalis when the 'Vox' option is selected.
+
+
21 February 2017
Crazylemon64 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 97cfcfdc5a4..f46f9b6b4e0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3816,3 +3816,102 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Autolathe now uses Nano-UI.
uraniummeltdown:
- bugfix: Shuttle engines should now face the correct way
+2017-02-22:
+ KasparoVy:
+ - rscadd: 'You can now toggle on/off the gladiator helmet''s face-shield with an
+ action button. This is totally cosmetic. imgadd: Adds a bunch of new helmet
+ sprites for Vox.'
+ - tweak: Slightly adjusts the Vox knight armour sprites (not the Templar armour)
+ to look nicer with the new helmets.
+ - bugfix: The Admin 'Select Equipment' debug verb now appropriately equips Armalis
+ when the 'Vox' option is selected.
+2017-02-23:
+ Krausus:
+ - tweak: Ghost candidate alert boxes ("Do you want to play as a thing?") will now
+ have "No" as the leftmost, default option, which you will accidentally pick
+ when it pops up while you're trying to type, but at least you won't be stuck
+ as the thing when you didn't actually want to be that thing.
+ Markolie:
+ - tweak: The meteor shield satellite station goal coverage goal has been increased
+ tenfold.
+2017-02-24:
+ FalseIncarnate:
+ - bugfix: Corn and bananas can be properly deepfried into their special results
+ again.
+ - bugfix: Rice can be properly ground into a reagent again.
+ - rscadd: Hydroponics trays once again are equipped with Bee-proof lids to keep
+ unwanted pollination to a minimum. This only works if you actually toggle the
+ lid closed though!
+ - tweak: Plants age slightly slower, so your space farming should no longer feel
+ like it outpaces a meth'd up blue hedgehog in sneakers.
+ Kyep:
+ - bugfix: Fixes blob spawns prompting players twice.
+ Markolie:
+ - bugfix: Mining pod weapons are once again functional. Compared to regular kinetic
+ accelerators, the weak projectile has one additional range (3 --> 4). The regular
+ projectile's damage is increased (40 --> 50) and deals more damage in pressurized
+ environments (50% instead of 25%). The enhanced projectile is able to fire its
+ kinetic projectile AoE against turfs and mobs.
+ - bugfix: Fixed an issue where it was impossible to log out from fax machines.
+ - bugfix: It is no longer possible to steal ID cards from identification computers/fax
+ machine using telekinesis at range.
+ - bugfix: The follow link on death alarms now works.
+ - bugfix: Fixes an exploit where players could use the ambulance trolley to teleport.
+ - bugfix: The chef now properly shows a chef hat on character preview.
+ - bugfix: The nuclear ops game mode will no longer always result in a major crew
+ victory.
+ - tweak: Players with their face covered will no longer show their flavor text upon
+ examine.
+ - rscadd: Fax machines now have an "Eject ID card" verb so you can remove the inserted
+ ID when it is depowered.
+ - tweak: Firelocks are now more lethal.
+ - rscadd: Firelocks now crush players standing inside them when they finish closing.
+ - rscadd: 'Firelocks can no longer be instantly opened by hand: it requires thirty
+ seconds and will autoclose in five seconds if there is still an atmospherics
+ alert present in the area. They can no longer be closed by hand. Heavy firelocks
+ can not be forced by hand.'
+ - bugfix: Atmospherics technicians can once again remotely modify all settings on
+ air alarms through the central atmospherics console.
+ Purpose2:
+ - tweak: Captain's crown is now part of the random hats crate, and no longer spawns
+ in their locker.
+ Twinmold93:
+ - rscadd: Ability to label bloodpacks with a pen, so you can now label a bloodpack
+ from donations without a handlabeler.
+ - rscadd: Bloodpacks will now change name to say if they are empty or not.
+ davipatury:
+ - rscadd: EFTPOS now uses Nano-UI.
+ - rscadd: Medical Records now uses Nano-UI.
+ - rscadd: Employment Records now uses Nano-UI.
+2017-02-25:
+ Crazylemon64:
+ - bugfix: Telecomms monitor is now infused with fastitude
+ FlattestGuitar:
+ - tweak: Escape has been re-bushed.
+ KasparoVy:
+ - rscadd: Reagent plasma has a weak healing effect on Plasmamen when injected and
+ will not poison them.
+ - rscadd: Reagent oxygen is as toxic to Vox as reagent plasma is to just about anyone.
+ - rscadd: Plasmamen now join the shift with 2 suit auto-extinguisher refill cartridges
+ which, individually, will fully refill an empty Plasmaman suit's autoextinguisherl.
+ - rscadd: Plasmaman suits now auto-extinguish and will be able to do so 5 times
+ before they can be refilled by a cartridge.
+ - tweak: Plasmamen no longer burn in a vacuum or in plasma-pure environments.
+ davipatury:
+ - rscadd: Security Records now uses Nano-UI.
+2017-02-26:
+ Crazylemon64:
+ - tweak: Immovable rod events now vanish after going through the station once
+ - bugfix: Firelocks can now be operated by AIs again
+ - bugfix: Barbers and captains get the right stuff now
+ - rscadd: It's now possible to have random floors or walls when mapping
+ KasparoVy:
+ - bugfix: Fixes a bug where you could get a part of a rigsuit stuck to your hand
+ by deploying it twice.
+ - tweak: Improves the readability of some rigsuit verbs.
+ Kyep:
+ - bugfix: players will no longer spawn with loadout items their job has no access
+ to.
+ - tweak: AI & Borg upload consoles now have to be on the station zlevel to work.
+ davipatury:
+ - rscadd: ATM now uses Nano-UI.
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index 709a6e2f0da..0434efd900f 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 1a4810c7fbc..4a9504d91f6 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index d4f0b3ac57a..a5a14094fd6 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 93d81f6923e..1113f10464a 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/species/armalis/suit.dmi b/icons/mob/species/armalis/suit.dmi
index cecf7e414b4..ceed59b7819 100644
Binary files a/icons/mob/species/armalis/suit.dmi and b/icons/mob/species/armalis/suit.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
new file mode 100644
index 00000000000..f4771885c77
Binary files /dev/null and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
new file mode 100644
index 00000000000..526211ef0ea
Binary files /dev/null and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/species/unathi/feet.dmi b/icons/mob/species/unathi/feet.dmi
new file mode 100644
index 00000000000..2c5cc99db2e
Binary files /dev/null and b/icons/mob/species/unathi/feet.dmi differ
diff --git a/icons/mob/species/unathi/gloves.dmi b/icons/mob/species/unathi/gloves.dmi
new file mode 100644
index 00000000000..808736e4cfd
Binary files /dev/null and b/icons/mob/species/unathi/gloves.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index c84122e9571..9f40a0620f6 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index f30cb9facef..7b02fd15c85 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index bca96cddb8f..d263c1f85b6 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index 869d98223cf..3510b731987 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index 93dacb8f058..23ec9ba3c43 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 311bc31623a..503eb3a0161 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index d915f6941a7..f93e02f0c61 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index f2c1c3a1311..a89680531a6 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 48d253c16cb..82ce8437b28 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index f12fcf3d86c..bd1ef93cb93 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 1fbcc049e6b..fa191ef7e21 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
new file mode 100644
index 00000000000..19bb100595c
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
new file mode 100644
index 00000000000..b9695f0ff27
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/gloves.dmi b/icons/obj/clothing/species/unathi/gloves.dmi
new file mode 100644
index 00000000000..26ce9ca8ac5
Binary files /dev/null and b/icons/obj/clothing/species/unathi/gloves.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index f55259fadf4..6023ff01ee5 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/shoes.dmi b/icons/obj/clothing/species/unathi/shoes.dmi
new file mode 100644
index 00000000000..78f74765a76
Binary files /dev/null and b/icons/obj/clothing/species/unathi/shoes.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index f0be55a5291..d5875e74191 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/species/vox/gloves.dmi b/icons/obj/clothing/species/vox/gloves.dmi
new file mode 100644
index 00000000000..eeca4b63f30
Binary files /dev/null and b/icons/obj/clothing/species/vox/gloves.dmi differ
diff --git a/icons/obj/clothing/species/vox/hats.dmi b/icons/obj/clothing/species/vox/hats.dmi
index 2680137ff0a..714e98e1878 100644
Binary files a/icons/obj/clothing/species/vox/hats.dmi and b/icons/obj/clothing/species/vox/hats.dmi differ
diff --git a/icons/obj/clothing/species/vox/shoes.dmi b/icons/obj/clothing/species/vox/shoes.dmi
new file mode 100644
index 00000000000..a1dde383ff7
Binary files /dev/null and b/icons/obj/clothing/species/vox/shoes.dmi differ
diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi
index 3d23ba1e396..1d0873b9661 100644
Binary files a/icons/obj/clothing/species/vox/suits.dmi and b/icons/obj/clothing/species/vox/suits.dmi differ
diff --git a/icons/obj/clothing/species/vox/uniforms.dmi b/icons/obj/clothing/species/vox/uniforms.dmi
new file mode 100644
index 00000000000..4bf1b92308d
Binary files /dev/null and b/icons/obj/clothing/species/vox/uniforms.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index be68443c2bf..a0fd3b51210 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 40f4c4c2b07..1a099e23d23 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 27e4ffc2c61..8fa42986bcb 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/doors/Doorfire.dmi b/icons/obj/doors/Doorfire.dmi
index 1f3999b774e..94ec8b967fb 100644
Binary files a/icons/obj/doors/Doorfire.dmi and b/icons/obj/doors/Doorfire.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 189d1682194..3b1c4c07cfa 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/nano/templates/atm.tmpl b/nano/templates/atm.tmpl
new file mode 100644
index 00000000000..fa6c818b081
--- /dev/null
+++ b/nano/templates/atm.tmpl
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+Nanotrasen Automatic Teller Machine
+For all your monetary needs!
+
+This terminal is {{:data.machine_id}}. Report this code when contacting Nanotrasen IT Support
+
+
+
+
Card:
+
{{:helper.link(data.held_card_name, 'eject', {'choice' : 'insert_card'})}}
+
+
+{{if data.ticks_left_locked_down > 0}}
+ Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled.
+{{else data.authenticated_account}}
+ {{if data.view_screen == 1}}
+ Select a new security level for this account:
+
+
Level:
+
{{:helper.link('Zero', 'unlock', {'choice' : 'change_security_level', 'new_security_level' : 0}, data.security_level == 0 ? 'selected' : null)}}
+
+
+
Description:
+
Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct.
+
+
+
+
Level:
+
{{:helper.link('One', 'unlock-alt', {'choice' : 'change_security_level', 'new_security_level' : 1}, data.security_level == 1 ? 'selected' : null)}}
+
+
+
Description:
+
An account number and pin must be manually entered to access this account and process transactions.
+
+
+
+
Level:
+
{{:helper.link('Two', 'lock', {'choice' : 'change_security_level', 'new_security_level' : 2}, data.security_level == 2 ? 'selected' : null)}}
+
+
+
Description:
+
In addition to account number and pin, a card is required to access this account and process transactions.
+
+
+ {{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+ {{else data.view_screen == 2}}
+ Account balance: ${{:helper.smoothRound(data.money)}}
+
+
+ {{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+ {{else data.view_screen == 3}}
+
Transaction logs
+
{{:helper.link('Back', 'arrow-left', {'choice' : 'view_screen', 'view_screen' : 0})}}
+
+
+ {{if data.transaction_log}}
+
+
+
+ Timestamp
+ Target
+ Reason
+ Value
+ Terminal
+
+
+
+ {{for data.transaction_log}}
+
+ {{:value.date}} {{:value.time}}
+ {{:value.target_name}}
+ {{:value.purpose}}
+ ${{:value.amount}}
+ {{:value.source_terminal}}
+
+ {{/for}}
+
+
+ {{else}}
+
Your account has no financial transactions on record for today.
+ {{/if}}
+
+ {{else}}
+ Welcome,
{{:data.owner_name}} .
+
Account balance: ${{:helper.smoothRound(data.money)}}
+
+
+
+
Menu
+
{{:helper.link('Change account security level', 'lock', {'choice' : 'view_screen', 'view_screen' : 1})}}
+
{{:helper.link('Make transfer', 'exchange', {'choice' : 'view_screen', 'view_screen' : 2})}}
+
{{:helper.link('View transaction log', 'list', {'choice' : 'view_screen', 'view_screen' : 3})}}
+
{{:helper.link('Print balance statement', 'print', {'choice' : 'balance_statement'})}}
+
{{:helper.link('Logout', 'sign-out', {'choice' : 'logout'})}}
+ {{/if}}
+{{else data.linked_db}}
+
+{{else}}
+
Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support.
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/eftpos.tmpl b/nano/templates/eftpos.tmpl
new file mode 100644
index 00000000000..663f665d7f9
--- /dev/null
+++ b/nano/templates/eftpos.tmpl
@@ -0,0 +1,55 @@
+
+
+
{{:data.eftpos_name}}
+
This terminal is {{:data.machine_id}}.
Report this code when contacting Nanotrasen IT Support
+{{if data.transaction_locked == 1}}
+
{{:helper.link(data.transaction_paid ? 'Reset' : 'Reset (authentication required)', 'unlock', {'choice' : 'toggle_lock'})}}
+
+
+
Transaction purpose:
+
{{:data.transaction_purpose}}
+
+
+
+
Value:
+
{{:data.transaction_amount}}
+
+
+
+
Linked account:
+
{{:data.linked_account ? data.linked_account : 'None'}}
+
+
+ {{if data.transaction_paid}}
+
This transaction has been processed successfully.
+ {{else}}
+
Swipe your card below the line to finish this transaction.
+
{{:helper.link('------', 'eject', {'choice' : 'scan_card'})}}
+ {{/if}}
+{{else}}
+
{{:helper.link('Lock in new transaction', 'lock', {'choice' : 'toggle_lock'})}}
+
+
+
Transaction purpose:
+
{{:helper.link(data.transaction_purpose, 'info', {'choice' : 'trans_purpose'})}}
+
+
+
+
Value:
+
{{:helper.link(data.transaction_amount, 'usd', {'choice' : 'trans_value'})}}
+
+
+
+
Linked account:
+
{{:helper.link(data.linked_account ? data.linked_account : 'None', data.linked_account ? 'user' : 'user-times', {'choice' : 'link_account'})}}
+
+
+
+
{{:helper.link('Change access code', 'key', {'choice' : 'change_code'})}}
+
{{:helper.link('Change EFTPOS ID', 'pencil', {'choice' : 'change_id'})}}
+
{{:helper.link('Scan card to reset acess code', 'refresh', {'choice' : 'reset'})}}
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/med_data.tmpl b/nano/templates/med_data.tmpl
new file mode 100644
index 00000000000..f47e13c6885
--- /dev/null
+++ b/nano/templates/med_data.tmpl
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+
Menu
+
+
{{:helper.link('Search Records', 'search', {'search' : 1})}}
+
{{:helper.link('List Records', 'list', {'screen' : 2})}}
+
{{:helper.link('Virus Database', 'database', {'screen' : 5})}}
+
{{:helper.link('Medbot Tracking', 'plus-square', {'screen' : 6})}}
+
{{:helper.link('Record Maintenance', 'wrench', {'screen' : 3})}}
+
{{:helper.link('Logout', 'lock', {'logout' : 1})}}
+
+ {{else data.screen == 2}}
+
Record List
+ {{for data.records}}
+
{{:helper.link(value.id + ': ' + value.name, 'user', {'d_rec' : value.ref})}}
+ {{/for}}
+
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+
Records Maintenance
+
{{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+
{{:helper.link('Upload From disk', 'upload', {'u_load' : 1}, 'disabled')}}
+
{{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 4}}
+
Medical Record
+
General Data
+ {{if data.general.empty}}
+
General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
{{:value.field}}
+
{{:helper.link(value.value, value.edit ? 'pencil' : 'user-times', {'field' : value.edit}, value.edit ? null : 'disabled')}}
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+ {{/if}}
+
+
Medical Data
+ {{if data.medical.empty}}
+
Medical Record Lost!
+
+
{{:helper.link('New Record', 'plus', {'new' : 1})}}
+
+
Menu
+ {{else}}
+ {{for data.medical.fields}}
+
+
{{:value.field}}
+
{{:helper.link(value.value, 'pencil', {'field' : value.edit})}}
+
+ {{if value.line_break}}
+
+ {{/if}}
+ {{/for}}
+
+
Comments/Log
+ {{for data.medical.comments}}
+
{{:value}}
+
{{:helper.link('Remove entry', 'trash', {'del_c' : index})}}
+
+ {{/for}}
+
+
+
{{:helper.link('Add Entry', 'plus', {'add_c' : 1})}}
+
+
+
Menu
+
{{:helper.link('Delete Record (Medical Only)', 'trash', {'del_r' : 1})}}
+ {{/if}}
+
+
{{:helper.link('Print Record', 'print', {'print_p' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 2})}}
+ {{else data.screen == 5}}
+
Virus Database
+ {{for data.virus}}
+
{{:helper.link(value.name, 'arrow-right', {'vir' : value.D})}}
+ {{/for}}
+
+ {{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 6}}
+
Medical Robot Monitor
+ {{for data.medbots}}
+
{{:value.name}}
+
+
Location:
+
{{:value.x}}, {{:value.y}}
+
+
+
Status:
+
+ {{:value.on ? "Online " : "Offline "}}. {{if value.use_beaker}}Reservoir: [{{:value.total_volume}}/{{:value.maximum_volume}}]{{else}}Using internal synthesizer.{{/if}}
+
+
+
+ {{empty}}
+
None detected!
+ {{/for}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+
Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.href}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/secure_data.tmpl b/nano/templates/secure_data.tmpl
new file mode 100644
index 00000000000..00f89e17059
--- /dev/null
+++ b/nano/templates/secure_data.tmpl
@@ -0,0 +1,230 @@
+
+
+
+
+{{if !data.temp && data.screen == 1}}
+
+{{/if}}
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+
+
{{:helper.link('New Record', 'plus', {'new_g' : 1})}}
+
+
Record List
+
+
+
+
+
+
+ {{:helper.link('Name', null, {'sort' : 'name'}, null, 'infoButton')}}
+ {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}}
+ {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}}
+ {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}}
+ {{:helper.link('Criminal Status', null, {'sort' : 'name'}, null, 'infoButton')}}
+
+
+
+ {{for data.records}}
+
+ {{:helper.link(value.name, 'user', {'d_rec' : value.ref}, null, 'infoButton')}}
+ {{:value.id}}
+ {{:value.rank}}
+ {{:value.fingerprint}}
+ {{:value.crimstat}}
+
+ {{/for}}
+
+
+
+
+
Menu
+
{{:helper.link('Record Maintenance', 'wrench', {'screen' : 2})}}
+
{{:helper.link('Logout', 'lock', {'logout' : 1})}}
+ {{else data.screen == 2}}
+
Records Maintenance
+
{{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+
{{:helper.link('Upload From disk', 'upload', {'u_load' : 1}, 'disabled')}}
+
{{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+
Security Record
+
General Data
+ {{if data.general.empty}}
+
General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, value.edit ? 'pencil' : 'user-times', {'field' : value.edit}, value.edit ? null : 'disabled')}}
+
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+
+
{{:helper.link('Print photo', 'camera', {'print_p' : 1})}}
+
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+ {{/if}}
+
+
Security Data
+ {{if data.security.empty}}
+
Security Record Lost!
+
+
{{:helper.link('New Record', 'plus', {'new_s' : 1})}}
+
+
Menu
+ {{else}}
+ {{for data.security.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, 'pencil', {'field' : value.edit})}}
+
+
+ {{if value.line_break}}
+
+ {{/if}}
+ {{/for}}
+
+
Comments/Log
+ {{for data.security.comments}}
+
{{:value}}
+
{{:helper.link('Remove entry', 'trash', {'del_c' : index})}}
+
+ {{/for}}
+
+
+
{{:helper.link('Add Entry', 'plus', {'add_c' : 1})}}
+
+
+
Menu
+
{{:helper.link('Delete Record (Security Only)', 'trash', {'del_r' : 1})}}
+ {{/if}}
+
+
{{:helper.link('Delete Record (All)', 'trash', {'del_rg' : 1})}}
+
{{:helper.link('Print Record', 'print', {'print_r' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+
Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.href}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/skills_data.tmpl b/nano/templates/skills_data.tmpl
new file mode 100644
index 00000000000..6f8fb1d6a0d
--- /dev/null
+++ b/nano/templates/skills_data.tmpl
@@ -0,0 +1,199 @@
+
+
+
+
+{{if !data.temp && data.screen == 1}}
+
+{{/if}}
+
+
+
+
+ Confirm Identity:
+
+
+ {{:helper.link(data.scan ? data.scan : "----------", 'eject', {'scan' : 1}, null, data.scan ? 'itemContentWide' : 'fixedLeft')}}
+
+
+
+{{if data.authenticated}}
+ {{if data.screen == 1}}
+
+
{{:helper.link('New Record', 'plus', {'new_g' : 1})}}
+
+
Record List
+
+
+
+
+
+
+ {{:helper.link('Name', null, {'sort' : 'name'}, null, 'infoButton')}}
+ {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}}
+ {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}}
+ {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}}
+
+
+
+ {{for data.records}}
+
+ {{:helper.link(value.name, 'user', {'d_rec' : value.ref}, null, 'infoButton')}}
+ {{:value.id}}
+ {{:value.rank}}
+ {{:value.fingerprint}}
+
+ {{/for}}
+
+
+
+
+
Menu
+
{{:helper.link('Record Maintenance', 'wrench', {'screen' : 2})}}
+
{{:helper.link('Logout', 'lock', {'logout' : 1})}}
+ {{else data.screen == 2}}
+
Records Maintenance
+
{{:helper.link('Backup To Disk', 'download', {'back' : 1}, 'disabled')}}
+
{{:helper.link('Upload From disk', 'upload', {'u_load' : 1}, 'disabled')}}
+
{{:helper.link('Delete All Records', 'trash', {'del_all' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{else data.screen == 3}}
+
Employment Record
+
General Data
+ {{if data.general.empty}}
+
General Record Lost!
+ {{else}}
+
+
+
+ {{for data.general.fields}}
+
+
+ {{:value.field}}
+
+
+ {{:helper.link(value.value, value.name ? 'pencil' : 'user-times', {'field' : value.name}, value.name ? null : 'disabled')}}
+
+
+ {{/for}}
+
+
+ {{if data.general.has_photos}}
+ {{for data.general.photos}}
+ {{if value.photo}}
+
+ {{/if}}
+ {{/for}}
+ {{/if}}
+
+
+
+
+
Employment Data
+
+
+ Employment/skills summary:
+
+
+ {{:data.general.notes ? data.general.notes : 'None'}}
+
+
+ {{/if}}
+
Menu
+
{{:helper.link('Delete Record (All)', 'trash', {'del_rg' : 1})}}
+
{{:helper.link('Print Record', 'print', {'print_r' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'screen' : 1})}}
+ {{/if}}
+{{else}}
+
Menu
+ {{:helper.link('Login', 'unlock', {'login' : 1})}}
+{{/if}}
+
+{{if data.temp}}
+
+
+ {{if data.temp.notice}}
+
{{:data.temp.text}}
+ {{else}}
+
{{:data.temp.text}}
+ {{/if}}
+
+
+ {{if data.temp.has_buttons}}
+
+
+
+ {{for data.temp.buttons}}
+ {{:helper.link(value.name, value.icon, {'temp' : 1, 'temp_action' : value.val}, value.status)}}
+ {{/for}}
+
+
+
+ {{/if}}
+
+
+
{{:helper.link('Clear screen', 'home', {'temp' : 1})}}
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 3657ec45c4e..06580d45195 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -282,6 +282,8 @@
#include "code\datums\helper_datums\map_template.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
+#include "code\datums\outfits\outfit.dm"
+#include "code\datums\outfits\outfit_admin.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\bloodcrawl.dm"
@@ -661,7 +663,6 @@
#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\anomalies.dm"
#include "code\game\objects\effects\bump_teleporter.dm"
-#include "code\game\objects\effects\datacore-effect.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\explosion_particles.dm"
#include "code\game\objects\effects\forcefields.dm"
@@ -690,6 +691,7 @@
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\random_barrier.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\windowspawner.dm"
#include "code\game\objects\items\ashtray.dm"
@@ -1116,6 +1118,7 @@
#include "code\modules\awaymissions\mission_code\spacehotel.dm"
#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
+#include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm"
#include "code\modules\awaymissions\mission_code\wildwest.dm"
#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client defines.dm"
@@ -1736,6 +1739,7 @@
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\actions.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\black.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\chem.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\empress.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\ghost.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\gray.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\green.dm"
@@ -1746,6 +1750,7 @@
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\queen.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\red.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\reproduction.dm"
+#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_ai.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\terror_spiders.dm"
#include "code\modules\mob\living\simple_animal\hostile\terror_spiders\white.dm"
#include "code\modules\mob\new_player\login.dm"
diff --git a/sound/effects/siren-spooky.ogg b/sound/effects/siren-spooky.ogg
new file mode 100644
index 00000000000..6e9eb341156
Binary files /dev/null and b/sound/effects/siren-spooky.ogg differ