diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index f5fd004225f..c9e69fb8c99 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -744,7 +744,7 @@
"op" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"oq" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"or" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station)
-"os" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"os" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ot" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ou" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ov" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/airless,/area/wizard_station)
diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm
index 8a0d6d29433..0ed21f65a37 100644
--- a/_maps/map_files/MetaStation/z3.dmm
+++ b/_maps/map_files/MetaStation/z3.dmm
@@ -389,7 +389,7 @@
"hy" = (/obj/machinery/smartfridge{use_power = 0},/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/space)
"hz" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space)
"hA" = (/obj/effect/decal/cleanable/egg_smudge,/obj/effect/decal/cleanable/flour,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space)
-"hB" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchenknife,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
+"hB" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchen/knife,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"hC" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/chem_dispenser,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"hD" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor,/area/space)
"hE" = (/obj/machinery/constructable_frame/machine_frame,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
diff --git a/_maps/map_files/MetaStation/z5.dmm b/_maps/map_files/MetaStation/z5.dmm
index a4f6fd1d8ab..cba5800eedc 100644
--- a/_maps/map_files/MetaStation/z5.dmm
+++ b/_maps/map_files/MetaStation/z5.dmm
@@ -228,7 +228,7 @@
"et" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"eu" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"ev" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
-"ew" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
+"ew" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ex" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ey" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ez" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 144eb8c3a48..e0684b3534e 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -1029,7 +1029,7 @@
"tO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"tP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/bar)
"tQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"tR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"tR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"tS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"tT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"tU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm
index 059bd30b2cf..d58f8b4881a 100644
--- a/_maps/map_files/MiniStation/z2.dmm
+++ b/_maps/map_files/MiniStation/z2.dmm
@@ -409,9 +409,9 @@
"md" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"me" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"mf" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station)
-"mg" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
+"mg" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"mh" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
-"mi" = (/obj/structure/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
+"mi" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"mj" = (/obj/machinery/computer/security/telescreen{pixel_y = -32},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"mk" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin)
"ml" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome Admin"},/area/tdome/tdomeadmin)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index d18f6746f97..7f92eb9be0d 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -2483,7 +2483,7 @@
"aVM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"aVN" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aVO" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aVQ" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
"aVR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/simulated/floor/plating,/area/atmos)
"aVS" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6},/turf/simulated/floor/plasteel,/area/atmos)
@@ -6462,7 +6462,7 @@
"cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuD" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 70458f0d615..38d0b748355 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -313,7 +313,7 @@
"ga" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/space)
"gb" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry)
"gc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry)
-"gd" = (/obj/effect/landmark{name = "Deathsquad"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"gd" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"ge" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac)
"gf" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
"gg" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control)
@@ -325,11 +325,11 @@
"gm" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor,/area/space)
"gn" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"go" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/shuttle/floor,/area/space)
-"gp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"gp" = (/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"gq" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/space)
"gr" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space)
"gs" = (/turf/unsimulated/floor{name = "plating"},/area/space)
-"gt" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry)
+"gt" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
"gu" = (/obj/machinery/door/airlock/external{name = "Supply Shuttle"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/suppy)
"gv" = (/turf/unsimulated/wall/fakeglass,/area/centcom/control)
"gw" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
@@ -409,9 +409,9 @@
"hS" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass,/area/centcom/ferry)
"hT" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/area/centcom/control)
"hU" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"hV" = (/obj/structure/dresser,/obj/structure/mirror{pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"hW" = (/obj/structure/closet/secure_closet/ertCom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"hX" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hV" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
+"hW" = (/obj/structure/closet/secure_closet/ertCom,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
+"hX" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/gun/syringe/rapidsyringe,/obj/structure/extinguisher_cabinet{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"hY" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 5},/obj/item/weapon/pen/blue,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
"hZ" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve)
"ia" = (/obj/structure/reagent_dispensers/water_cooler,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/ferry)
@@ -432,7 +432,7 @@
"ip" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"iq" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"ir" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac)
-"is" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue (EAST)"; icon_state = "darkblue"; dir = 4},/area/centcom/ferry)
+"is" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"it" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iu" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iv" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-darkgreen"; icon_state = "darkgreen"; dir = 2},/area/centcom/ferry)
@@ -451,15 +451,15 @@
"iI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"iJ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"iK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
-"iL" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-darkbrown (EAST)"; icon_state = "darkbrown"; dir = 4},/area/centcom/ferry)
+"iL" = (/obj/structure/closet/secure_closet/ertEngi,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"iM" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"iN" = (/obj/structure/sign/map/left,/turf/unsimulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
"iO" = (/obj/structure/sign/map/right,/turf/unsimulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
-"iP" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred (EAST)"; icon_state = "darkred"; dir = 4},/area/centcom/ferry)
+"iP" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"iQ" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"iR" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/centcom/ferry)
"iS" = (/obj/structure/table/wood,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"iT" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/gun/syringe/rapidsyringe,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iT" = (/obj/machinery/door/poddoor/ert,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"iU" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"iV" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/ferry)
"iW" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/ferry)
@@ -499,11 +499,11 @@
"jE" = (/mob/living/simple_animal/hostile/retaliate/bat{desc = "A Syndicate experiment in weaponized space carp technology. Its fangs seem to have been intentionally dulled down to prevent accidents."; faction = list("syndicate"); harm_intent_damage = 5; health = 50; icon_dead = "carp_dead"; icon_gib = "carp_gib"; icon_living = "carp"; icon_state = "carp"; name = "Cayenne"; real_name = "Cayenne"; response_disarm = "lightly brushes aside"; response_help = "pets"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jF" = (/obj/machinery/door/airlock/centcom{name = "Study"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jG" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
-"jH" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue"; icon_state = "darkblue"; dir = 2},/area/centcom/ferry)
-"jI" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/ferry)
+"jH" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
+"jI" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/gun/syringe/rapidsyringe,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"jJ" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry)
"jK" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (WEST)"; icon_state = "yellowcornersiding"; dir = 8},/area/centcom/evac)
-"jL" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"jL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"jM" = (/turf/unsimulated/floor{tag = "icon-yellowsiding"; icon_state = "yellowsiding"},/area/centcom/evac)
"jN" = (/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/evac)
"jO" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners"; icon_state = "darkgreencorners"},/area/centcom/ferry)
@@ -545,13 +545,13 @@
"ky" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kz" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kA" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership)
-"kB" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"kB" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/ferry)
"kC" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/ferry)
"kD" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (NORTH)"; icon_state = "yellowcornersiding"; dir = 1},/area/centcom/evac)
"kE" = (/turf/unsimulated/floor{tag = "icon-yellowsiding (NORTH)"; icon_state = "yellowsiding"; dir = 1},/area/centcom/evac)
"kF" = (/turf/unsimulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/evac)
-"kG" = (/turf/unsimulated/floor{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/centcom/ferry)
-"kH" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"kG" = (/obj/machinery/computer/shuttle/ferry,/turf/unsimulated/floor{tag = "icon-warndark (WEST)"; icon_state = "warndark"; dir = 8},/area/centcom/ferry)
+"kH" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/ferry)
"kI" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 6; icon_state = "fakewindows2"},/area/wizard_station)
"kJ" = (/obj/effect/forcefield,/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Bridge"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"kK" = (/turf/unsimulated/wall/normal{tag = "icon-uranium6"; icon_state = "uranium6"},/area/wizard_station)
@@ -654,7 +654,7 @@
"mD" = (/turf/simulated/floor/plasteel,/area/tdome/arena)
"mE" = (/turf/unsimulated/wall/normal{tag = "icon-uranium1"; icon_state = "uranium1"},/area/wizard_station)
"mF" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"mG" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/device/radio/intercom{desc = "Talk through this. Magically."; freerange = 1; frequency = 1213; name = "Wizard Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"mG" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mH" = (/obj/structure/table/wood,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"mI" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"mJ" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
@@ -672,7 +672,7 @@
"mV" = (/obj/structure/table,/obj/item/weapon/weldingtool/largetank{pixel_y = 3},/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mW" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"mX" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry)
-"mY" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_y = 28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry)
+"mY" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"mZ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"na" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"nb" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -697,7 +697,7 @@
"nu" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"nv" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nw" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/tdome/tdomeobserve)
-"nx" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"nx" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ny" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nz" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/centcom/evac)
@@ -909,6 +909,8 @@
"ry" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"rz" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
"rA" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"rB" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/ferry)
+"rC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (SOUTHWEST)"; icon_state = "fakewindows"; dir = 10},/area/centcom/ferry)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababadaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeag
@@ -1043,23 +1045,23 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcBdOdPdQdRdScBabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcWdsdsdsdsdscXabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhVhUhUhUhUhUhUjHmYjIgpiTjLfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUiRfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiTfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiLfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUismXfFfFfFfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUhWhYhXhUhUeKmAfFmIfFfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhkBfhfhkCkjkkfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcfahUeKjJjQiViWfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtfagdeKhShRieiafhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGfagdeKfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTkHkGfagdkPfhfWfFfIfhepeuepeuepeuepeuepabababababababababababdAezezezezezdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhafagdhUfUfFfFelfhepepepepepepepepepabekekekekekekabababdAdZeCeDeEeDeFdYdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtfagdjOfhfFfFftfhepeuepeuepeuepeuepabeklflglglCekabababdGeLeMdHdHdHeNeOdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmfahUeKfhfFiUfYfhepepepepepepepepepabeAeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiQiMiJhUhUhUhUhUgdfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhUhUfDhUfDhUhUhUfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhUiKiKiKiKfRhUhUfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhhUfTiKiNiOiKhUhUgpfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhWhVishXiLiLfhhUhUiKiKiKiKfRhUjqfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiPiPiPiPiPiPiThUhUgnhUgnhUhUhUiSfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiPiPiPiPiPiPiThUhUhUhUhUhUhUhUeKmXfFfFfFfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhjHjHjLjIkBkBfhgthYhUhUhUhUhUhUeKmAfFmIfFfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhhzhAhAhBfhfhhzhAhAhBfhfhfhmYfhfhkCkjkkfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgchUhUeKjJjQiViWfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhhHdBdBgqdBdBdBezdBdBgrgsiRgGhUhUeKhShRieiafhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGkGhUhUeKfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTrBkHfahUhUkPfhfWfFfIfhepeuepeuepeuepeuepabababababababababababdAezezezezezdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhafahUhUhUfUfFfFelfhepepepepepepepepepabekekekekekekabababdAdZeCeDeEeDeFdYdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhhQdBdBgqdBdBdBezdBdBhigsrChahUhUjOfhfFfFftfhepeuepeuepeuepeuepabeklflglglCekabababdGeLeMdHdHdHeNeOdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmhUhUeKfhfFiUfYfhepepepepepepepepepabeAeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhivfhfhfhfhfhfhababababababababababekeJkTfbfcekababdAfddBdBfedBfffgdBfddCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeifXhpfXfHhlfHfXhpfXeiabababekekekekekekekekekfklelcldekababdGfofofoezfpdHfqfrfsezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeifXfXfXgvemgvfXfXfXeiabababekfufnfnfnfSfGgegWeJeJeJhjfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm
index 948b538f570..bfde3be2fef 100644
--- a/_maps/map_files/generic/z5.dmm
+++ b/_maps/map_files/generic/z5.dmm
@@ -228,7 +228,7 @@
"eu" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"ev" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/abandoned)
"ew" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
-"ex" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
+"ex" = (/obj/structure/table,/obj/item/trash/plate,/obj/item/weapon/kitchen/fork,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ey" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ez" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"eA" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
@@ -708,7 +708,7 @@
"nH" = (/obj/structure/disposaloutlet{dir = 1; eject_range = 1},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production)
"nI" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z5"; name = "south of asteroid"; turf_type = /turf/space; width = 18},/turf/space,/area/space)
"nJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/mine/living_quarters)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index b3f7c083b54..55acfd5c3d3 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -59,7 +59,7 @@ Pipelines + Other Objects -> Pipe network
return
/obj/machinery/atmospherics/proc/safe_input(var/title, var/text, var/default_set)
- var/new_value = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",default_set) as num
+ var/new_value = input(usr,text,title,default_set) as num
if(usr.canUseTopic(src))
return new_value
return default_set
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 756097050ff..c9429803684 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -89,14 +89,24 @@ Passive gate is similar to the regular pump except:
return 1
-/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
+/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
+ return
- user << browse("
[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ var/data = list()
+
+ data["on"] = on
+ data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["max_pressure"] = MAX_OUTPUT_PRESSURE
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/atmospherics/binary/passive_gate/atmosinit()
..()
@@ -145,7 +155,7 @@ Passive gate is similar to the regular pump except:
user << "Access denied."
return
usr.set_machine(src)
- interact(user)
+ ui_interact(user)
return
/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
@@ -154,7 +164,11 @@ Passive gate is similar to the regular pump except:
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
if(href_list["set_press"])
- target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure)))
+ switch(href_list["set_press"])
+ if ("max")
+ target_pressure = MAX_OUTPUT_PRESSURE
+ if ("set")
+ target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
usr.set_machine(src)
src.update_icon()
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index ec57b2c8f60..85c5f1cf903 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -97,14 +97,24 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/binary/pump/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
+/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
+ return
- user << browse("[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ var/data = list()
+
+ data["on"] = on
+ data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["max_pressure"] = MAX_OUTPUT_PRESSURE
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/atmospherics/binary/pump/atmosinit()
..()
@@ -152,7 +162,7 @@ Thus, the two variables affect pump operation are set in New():
user << "Access denied."
return
usr.set_machine(src)
- interact(user)
+ ui_interact(user)
return
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
@@ -161,7 +171,11 @@ Thus, the two variables affect pump operation are set in New():
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
if(href_list["set_press"])
- target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure)))
+ switch(href_list["set_press"])
+ if ("max")
+ target_pressure = MAX_OUTPUT_PRESSURE
+ if ("set")
+ target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
usr.set_machine(src)
src.update_icon()
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 195215c2242..be8fbdc6ab0 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -20,7 +20,7 @@ Thus, the two variables affect pump operation are set in New():
can_unwrench = 1
var/on = 0
- var/transfer_rate = 200
+ var/transfer_rate = MAX_TRANSFER_RATE
var/frequency = 0
var/id = null
@@ -93,16 +93,24 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow:
- [round(transfer_rate,1)]l/s | Change
- "}
+/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
+ return
- user << browse("[src.name] control[dat]", "window=atmo_pump")
- onclose(user, "atmo_pump")
+ var/data = list()
+ data["on"] = on
+ data["transfer_rate"] = round(transfer_rate*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["max_rate"] = MAX_TRANSFER_RATE
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/atmospherics/binary/volume_pump/atmosinit()
..()
@@ -149,7 +157,7 @@ Thus, the two variables affect pump operation are set in New():
user << "Access denied."
return
usr.set_machine(src)
- interact(user)
+ ui_interact(user)
return
/obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list)
@@ -158,7 +166,11 @@ Thus, the two variables affect pump operation are set in New():
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
if(href_list["set_transfer_rate"])
- transfer_rate = max(0, min(200, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", transfer_rate)))
+ switch(href_list["set_transfer_rate"])
+ if ("max")
+ transfer_rate = MAX_TRANSFER_RATE
+ if ("set")
+ transfer_rate = max(0, min(MAX_TRANSFER_RATE, safe_input("Pressure control", "Enter new transfer rate (0-[MAX_TRANSFER_RATE] L/s)", transfer_rate)))
investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
usr.set_machine(src)
src.update_icon()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 94aa810ef72..7efeee86379 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -1,6 +1,13 @@
+#define FILTER_NOTHING -1
+#define FILTER_PLASMA 0
+#define FILTER_OXYGEN 1
+#define FILTER_NITROGEN 2
+#define FILTER_CARBONDIOXIDE 3
+#define FILTER_NITROUSOXIDE 4
+
/obj/machinery/atmospherics/trinary/filter
icon_state = "filter_off"
- density = 1
+ density = 0
name = "gas filter"
@@ -92,7 +99,7 @@ Filter types:
filtered_out.temperature = removed.temperature
switch(filter_type)
- if(0) //removing plasma
+ if(FILTER_PLASMA)
filtered_out.toxins = removed.toxins
removed.toxins = 0
@@ -102,19 +109,19 @@ Filter types:
removed.trace_gases -= trace_gas
filtered_out.trace_gases += trace_gas
- if(1) //removing O2
+ if(FILTER_OXYGEN)
filtered_out.oxygen = removed.oxygen
removed.oxygen = 0
- if(2) //removing N2
+ if(FILTER_NITROGEN)
filtered_out.nitrogen = removed.nitrogen
removed.nitrogen = 0
- if(3) //removing CO2
+ if(FILTER_CARBONDIOXIDE)
filtered_out.carbon_dioxide = removed.carbon_dioxide
removed.carbon_dioxide = 0
- if(4)//removing N2O
+ if(FILTER_NITROUSOXIDE)
if(removed.trace_gases.len>0)
for(var/datum/gas/trace_gas in removed.trace_gases)
if(istype(trace_gas, /datum/gas/sleeping_agent))
@@ -148,50 +155,27 @@ Filter types:
user << "Access denied."
return
- var/dat
- var/current_filter_type
- switch(filter_type)
- if(0)
- current_filter_type = "Plasma"
- if(1)
- current_filter_type = "Oxygen"
- if(2)
- current_filter_type = "Nitrogen"
- if(3)
- current_filter_type = "Carbon Dioxide"
- if(4)
- current_filter_type = "Nitrous Oxide"
- if(-1)
- current_filter_type = "Nothing"
- else
- current_filter_type = "ERROR - Report this bug to the admin, please!"
+ ui_interact(user)
- dat += {"
- Power: [on?"On":"Off"]
- Filtering: [current_filter_type]
- Set Filter Type:
- Plasma
- Oxygen
- Nitrogen
- Carbon Dioxide
- Nitrous Oxide
- Nothing
-
Desirable output pressure:
- [src.target_pressure]kPa | Change
- "}
-/*
- user << browse("[src.name] control[dat]","window=atmo_filter")
- onclose(user, "atmo_filter")
+/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
return
- if (src.temp)
- dat = text("[]
Clear Screen", src.temp, src)
- //else
- // src.on != src.on
-*/
- user << browse("[src.name] control[dat]", "window=atmo_filter")
- onclose(user, "atmo_filter")
- return
+ var/data = list()
+
+ data["on"] = on
+ data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["max_pressure"] = MAX_OUTPUT_PRESSURE
+ data["filter_type"] = filter_type
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "atmos_filter.tmpl", name, 400, 320)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list)
if(..())
@@ -200,12 +184,31 @@ Filter types:
src.add_fingerprint(usr)
if(href_list["filterset"])
src.filter_type = text2num(href_list["filterset"])
+ var/filtering_name = "nothing"
+ switch(filter_type)
+ if(FILTER_PLASMA)
+ filtering_name = "plasma"
+ if(FILTER_OXYGEN)
+ filtering_name = "oxygen"
+ if(FILTER_NITROGEN)
+ filtering_name = "nitrogen"
+ if(FILTER_CARBONDIOXIDE)
+ filtering_name = "carbon dioxide"
+ if(FILTER_NITROUSOXIDE)
+ filtering_name = "nitrous oxide"
+ investigate_log("was set to filter [filtering_name] by [key_name(usr)]", "atmos")
if (href_list["temp"])
src.temp = null
if(href_list["set_press"])
- target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure)))
+ switch(href_list["set_press"])
+ if ("max")
+ target_pressure = MAX_OUTPUT_PRESSURE
+ if ("set")
+ target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
if(href_list["power"])
on=!on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
src.update_icon()
src.updateUsrDialog()
/*
@@ -213,6 +216,4 @@ Filter types:
if ((M.client && M.machine == src))
src.attack_hand(M)
*/
- return
-
-
+ return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 669bc073bb8..e80c0c7654b 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -1,6 +1,6 @@
/obj/machinery/atmospherics/trinary/mixer
icon_state = "mixer_off"
- density = 1
+ density = 0
name = "gas mixer"
@@ -101,48 +101,56 @@
/obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob)
if(..())
return
- src.add_fingerprint(usr)
+
if(!src.allowed(user))
user << "Access denied."
return
- usr.set_machine(src)
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [target_pressure]kPa | Change
-
- Node 1 Concentration:
- -
- -
- [node1_concentration]([node1_concentration*100]%)
- +
- +
-
- Node 2 Concentration:
- -
- -
- [node2_concentration]([node2_concentration*100]%)
- +
- +
- "}
- user << browse("[src.name] control[dat]", "window=atmo_mixer")
- onclose(user, "atmo_mixer")
- return
+ ui_interact(user)
+
+/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ var/data = list()
+
+ data["on"] = on
+ data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
+ data["max_pressure"] = MAX_OUTPUT_PRESSURE
+ data["node1_concentration"] = round(node1_concentration*100)
+ data["node2_concentration"] = round(node2_concentration*100)
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "atmos_mixer.tmpl", name, 400, 320)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
if(..()) return
if(href_list["power"])
on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
if(href_list["set_press"])
- target_pressure = max(0, min(4500, safe_input("Pressure control", "Enter new output pressure (0-4500kPa)", target_pressure)))
+ switch(href_list["set_press"])
+ if ("max")
+ target_pressure = MAX_OUTPUT_PRESSURE
+ if ("set")
+ target_pressure = max(0, min(MAX_OUTPUT_PRESSURE, safe_input("Pressure control", "Enter new output pressure (0-[MAX_OUTPUT_PRESSURE] kPa)", target_pressure)))
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
if(href_list["node1_c"])
var/value = text2num(href_list["node1_c"])
src.node1_concentration = max(0, min(1, src.node1_concentration + value))
src.node2_concentration = max(0, min(1, src.node2_concentration - value))
+ investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", "atmos")
if(href_list["node2_c"])
var/value = text2num(href_list["node2_c"])
src.node2_concentration = max(0, min(1, src.node2_concentration + value))
src.node1_concentration = max(0, min(1, src.node1_concentration - value))
+ investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos")
src.update_icon()
src.updateUsrDialog()
return
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index ac619b10b20..d43fd334d1a 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -106,5 +106,9 @@
#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
+
+#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
-#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
\ No newline at end of file
+// 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
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index bbda5d2a03e..49bbcb8d075 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1250,9 +1250,8 @@ var/global/list/common_tools = list(
//Because is_sharp is used for food or something.
var/list/sharp_things_2 = list(\
- /obj/item/weapon/kitchenknife,\
- /obj/item/weapon/scalpel,\
- /obj/item/weapon/kitchen/utensil/knife)
+ /obj/item/weapon/kitchen/knife,\
+ /obj/item/weapon/scalpel)
if(is_type_in_list(W,sharp_things_1))
return 1
@@ -1274,7 +1273,7 @@ var/global/list/common_tools = list(
return 1
if(istype(W, /obj/item/weapon/reagent_containers/syringe))
return 1
- if(istype(W, /obj/item/weapon/kitchen/utensil/fork))
+ if(istype(W, /obj/item/weapon/kitchen/fork))
return 1
else
return 0
diff --git a/code/controllers/subsystem/shuttles/emergency.dm b/code/controllers/subsystem/shuttles/emergency.dm
index 4b9d061cd8a..157e199b2ad 100644
--- a/code/controllers/subsystem/shuttles/emergency.dm
+++ b/code/controllers/subsystem/shuttles/emergency.dm
@@ -43,7 +43,10 @@
else
return
- SSshuttle.emergencyLastCallLoc = signalOrigin
+ if(prob(70))
+ SSshuttle.emergencyLastCallLoc = signalOrigin
+ else
+ SSshuttle.emergencyLastCallLoc = null
priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/AI/shuttlecalled.ogg', "Priority")
@@ -56,6 +59,8 @@
if(prob(70))
SSshuttle.emergencyLastCallLoc = signalOrigin
+ else
+ SSshuttle.emergencyLastCallLoc = null
priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/AI/shuttlerecalled.ogg', "Priority")
/*
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 020a00c3603..842837fbee7 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -51,8 +51,6 @@ var/datum/subsystem/ticker/ticker
if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
login_music = 'sound/ambience/clown.ogg'
- round_end_sound = pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg')
-
/datum/subsystem/ticker/Initialize(timeofday, zlevel)
if (zlevel)
return ..()
@@ -80,6 +78,8 @@ var/datum/subsystem/ticker/ticker
++totalPlayersReady
//countdown
+ if(timeLeft < 0)
+ return
timeLeft -= wait
if(timeLeft <= 30 && !tipped)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 91826c2d749..8aaafde67b2 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -39,4 +39,6 @@ client/verb/showrevinfo()
src << "Enforce Human Authority: [config.enforce_human_authority]"
src << "Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]"
src << "Protect Assistant From Antagonist: [config.protect_assistant_from_antagonist]"
+ src << "Enforce Continuous Rounds: [config.continuous.len] of [config.modes.len] roundtypes"
+ src << "Allow Midround Antagonists: [config.midround_antag.len] of [config.modes.len] roundtypes"
return
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 738c4852782..1dea0f2834d 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -34,6 +34,7 @@
var/list/datum/game_mode/replacementmode = null
var/round_converted = 0 //0: round not converted, 1: round going to convert, 2: round converted
var/reroll_friendly //During mode conversion only these are in the running
+ var/continuous_sanity_checked //Catches some cases where config options could be used to suggest that modes without antagonists should end when all antagonists die
var/enemy_minimum_age = 7 //How many days must players have been playing before they can play this antagonist
var/const/waittime_l = 600
@@ -174,6 +175,19 @@
if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || station_was_nuked)
return 1
if(!round_converted && (!config.continuous[config_tag] || (config.continuous[config_tag] && config.midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
+ if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
+ for(var/mob/living/Player in mob_list)
+ if(Player.mind)
+ if(Player.mind.special_role)
+ continuous_sanity_checked = 1
+ return 0
+ if(!continuous_sanity_checked)
+ message_admins("The roundtype ([config_tag]) has no antagonists, continuous round has been defaulted to on and midround_antag has been defaulted to off.")
+ config.continuous[config_tag] = 1
+ config.midround_antag[config_tag] = 0
+ return 0
+
+
if(living_antag_player && living_antag_player.mind && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
index 6ce9c6a44cf..7e4fb0e05fd 100644
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ b/code/game/gamemodes/traitor/double_agents.dm
@@ -5,7 +5,6 @@
required_players = 25
required_enemies = 5
recommended_enemies = 8
- reroll_friendly = 1
traitor_name = "double agent"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 0b11e742401..e14e0792a84 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -167,8 +167,7 @@
return 0
/obj/machinery/alarm/attack_hand(mob/user)
- . = ..()
- if (.)
+ if (..())
return
user.set_machine(src)
@@ -188,17 +187,41 @@
if(!shorted)
//user << browse(return_text(),"window=air_alarm")
//onclose(user, "air_alarm")
- var/datum/browser/popup = new(user, "air_alarm", "[alarm_area.name] Air Alarm", 500, 400)
+ /*var/datum/browser/popup = new(user, "air_alarm", "[alarm_area.name] Air Alarm", 500, 400)
popup.set_content(return_text())
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
- refresh_all()
+ refresh_all()*/
+ ui_interact(user)
if(panel_open && (!istype(user, /mob/living/silicon/ai)))
wires.Interact(user)
return
+/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main")
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ var/data = list()
+
+ data["locked"] = locked
+ data["siliconUser"] = user.has_unlimited_silicon_privilege
+ data["screen"] = screen
+ data["dangerous"] = emagged
+
+ populate_status(data)
+ if (!locked || user.has_unlimited_silicon_privilege)
+ populate_controls(data)
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "air_alarm.tmpl", "Air Alarm", 350, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/alarm/proc/shock(mob/user, prb)
if((stat & (NOPOWER))) // unpowered, no shock
@@ -247,326 +270,163 @@
return 1
-/obj/machinery/alarm/proc/return_text()
- var/dat = ""
- dat += "Swipe ID card to [locked ? "unlock" : "lock"] interface.
"
- if(!usr.has_unlimited_silicon_privilege && locked)
- dat += "[return_status()]"
- else
- dat += "[return_safety()][return_status()]
[return_controls()]"
- return dat
-
-/obj/machinery/alarm/proc/return_status()
- var/turf/location = src.loc
+/obj/machinery/alarm/proc/populate_status(var/list/data)
+ var/turf/location = get_turf(src)
var/datum/gas_mixture/environment = location.return_air()
var/total = environment.oxygen + environment.carbon_dioxide + environment.toxins + environment.nitrogen
- var/output = "Air Status:
"
- if(total == 0)
- output +={"Warning: Cannot obtain air sample for analysis."}
- return output
+ var/list/environment_data = list()
+ data["atmos_alarm"] = alarm_area.atmosalm
+ data["fire_alarm"] = (alarm_area.fire != null && alarm_area.fire)
+ data["danger_level"] = danger_level
+ if(total)
+ var/datum/tlv/cur_tlv
+ var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
- output += {"
-
-"}
- var/datum/tlv/cur_tlv
- var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
+ cur_tlv = TLV["pressure"]
+ var/pressure = environment.return_pressure()
+ var/pressure_danger = cur_tlv.get_danger_level(pressure)
+ environment_data += list(list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger))
- cur_tlv = TLV["pressure"]
- var/environment_pressure = environment.return_pressure()
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
+ cur_tlv = TLV["oxygen"]
+ var/oxygen_danger = cur_tlv.get_danger_level(environment.oxygen*partial_pressure)
+ environment_data += list(list("name" = "Oxygen", "value" = environment.oxygen / total * 100, "unit" = "%", "danger_level" = oxygen_danger))
- cur_tlv = TLV["oxygen"]
- var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.oxygen*GET_PP)
- var/oxygen_percent = round(environment.oxygen / total * 100, 2)
+ cur_tlv = TLV["carbon dioxide"]
+ var/carbon_dioxide_danger = cur_tlv.get_danger_level(environment.carbon_dioxide*partial_pressure)
+ environment_data += list(list("name" = "Carbon dioxide", "value" = environment.carbon_dioxide / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger))
- cur_tlv = TLV["carbon dioxide"]
- var/co2_dangerlevel = cur_tlv.get_danger_level(environment.carbon_dioxide*GET_PP)
- var/co2_percent = round(environment.carbon_dioxide / total * 100, 2)
+ cur_tlv = TLV["plasma"]
+ var/plasma_danger = cur_tlv.get_danger_level(environment.toxins*partial_pressure)
+ environment_data += list(list("name" = "Toxins", "value" = environment.toxins / total * 100, "unit" = "%", "danger_level" = plasma_danger))
- cur_tlv = TLV["plasma"]
- var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.toxins*GET_PP)
- var/plasma_percent = round(environment.toxins / total * 100, 2)
+ cur_tlv = TLV["other"]
+ var/other_moles = 0.0
+ for(var/datum/gas/G in environment.trace_gases)
+ other_moles+=G.moles
+ var/other_danger = cur_tlv.get_danger_level(other_moles*partial_pressure)
+ environment_data += list(list("name" = "Other", "value" = other_moles / total * 100, "unit" = "%", "danger_level" = other_danger))
- cur_tlv = TLV["other"]
- var/other_moles = 0.0
- for(var/datum/gas/G in environment.trace_gases)
- other_moles+=G.moles
- var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP)
-
- cur_tlv = TLV["temperature"]
- var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
-
- output += {"
-Pressure: [environment_pressure]kPa
-Oxygen: [oxygen_percent]%
-Carbon dioxide: [co2_percent]%
-Toxins: [plasma_percent]%
-"}
- if (other_dangerlevel==2)
- output += {"Notice: High Concentration of Unknown Particles Detected
"}
- else if (other_dangerlevel==1)
- output += {"Notice: Low Concentration of Unknown Particles Detected
"}
-
- output += {"
-Temperature: [environment.temperature]K
-"}
-
- var/display_danger_level = max(
- pressure_dangerlevel,
- oxygen_dangerlevel,
- co2_dangerlevel,
- plasma_dangerlevel,
- other_dangerlevel,
- temperature_dangerlevel
- )
-
- //Overall status
- output += {"Local Status: "}
- if(display_danger_level == 2)
- output += {"DANGER: Internals Required"}
- else if(display_danger_level == 1)
- output += {"Caution"}
- else if (alarm_area.atmosalm)
- output += {"Caution: Atmos alert in area"}
- else
- output += {"Optimal"}
-
- return output
-
-/obj/machinery/alarm/proc/return_safety()
- var/output = ""
- if(src.emagged)
- output += "NOTICE: Safety measures nonfunctional. Device may exhibit abnormal behavior.
"
- else
- output += "Safety measures functioning properly.
"
- return output
-
-
-/obj/machinery/alarm/proc/return_controls()
- var/output = ""//"[alarm_zone] Air [name]
"
+ cur_tlv = TLV["temperature"]
+ var/temperature_danger = cur_tlv.get_danger_level(environment.temperature)
+ environment_data += list(list("name" = "Temperature", "value" = environment.temperature, "unit" = "K ([round(environment.temperature - T0C, 0.1)]C)", "danger_level" = temperature_danger))
+ data["environment_data"] = environment_data
+/obj/machinery/alarm/proc/populate_controls(var/list/data)
switch(screen)
- if (AALARM_SCREEN_MAIN)
- if(alarm_area.atmosalm)
- output += {"Reset - Atmospheric Alarm
"}
- else
- output += {"Activate - Atmospheric Alarm
"}
+ if(AALARM_SCREEN_MAIN)
+ data["mode"] = mode
+ if(AALARM_SCREEN_VENT)
+ data["vents"] = list()
+ for(var/id_tag in alarm_area.air_vent_names)
+ var/long_name = alarm_area.air_vent_names[id_tag]
+ var/list/info = alarm_area.air_vent_info[id_tag]
+ if(!info)
+ continue
+ data["vents"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "checks" = info["checks"],
+ "excheck" = info["checks"]&1,
+ "incheck" = info["checks"]&2,
+ "direction" = info["direction"],
+ "external" = info["external"]
+ ))
+ if(AALARM_SCREEN_SCRUB)
+ data["scrubbers"] = list()
+ for(var/id_tag in alarm_area.air_scrub_names)
+ var/long_name = alarm_area.air_scrub_names[id_tag]
+ var/list/info = alarm_area.air_scrub_info[id_tag]
+ if(!info)
+ continue
+ data["scrubbers"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "scrubbing" = info["scrubbing"],
+ "panic" = info["panic"],
+ "filter_co2" = info["filter_co2"],
+ "filter_toxins" = info["filter_toxins"],
+ "filter_n2o" = info["filter_n2o"]
+ ))
+ if(AALARM_SCREEN_MODE)
+ data["mode"] = mode
+ data["modes"] = list()
+ data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0))
+ data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0))
+ data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1))
+ data["modes"] += list(list("name" = "Panic - Siphons air out of the room", "mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1))
+ data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0))
+ if (src.emagged)
+ data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1))
+ if(AALARM_SCREEN_SENSORS)
+ var/datum/tlv/selected
+ var/list/thresholds = list()
- output += {"
-Scrubbers Control
-Vents Control
-Set Environmentals Mode
-Sensor Settings
-
-"}
- if (mode==AALARM_MODE_PANIC)
- output += "PANIC SYPHON ACTIVE
Turn syphoning off"
- else
- output += "ACTIVATE PANIC SYPHON IN AREA"
- if (AALARM_SCREEN_VENT)
- var/sensor_data = ""
- if(alarm_area.air_vent_names.len)
- for(var/id_tag in alarm_area.air_vent_names)
- var/long_name = alarm_area.air_vent_names[id_tag]
- var/list/data = alarm_area.air_vent_info[id_tag]
- if(!data)
- continue;
- var/state = ""
-
- sensor_data += {"
-[long_name]
-[state]
-Operating:
-[data["power"]?"on":"off"]
-
-Pressure checks:
-external
-internal
-
-External pressure bound:
--
--
--
--
-[data["external"]]
-+
-+
-+
-+
-reset
-
-"}
- if (data["direction"] == "siphon")
- sensor_data += {"
-Direction:
-siphoning
-
-"}
- sensor_data += {"
"}
- else
- sensor_data = "No vents connected.
"
- output = {"<< Main Menu
[sensor_data]"}
- if (AALARM_SCREEN_SCRUB)
- var/sensor_data = ""
- if(alarm_area.air_scrub_names.len)
- for(var/id_tag in alarm_area.air_scrub_names)
- var/long_name = alarm_area.air_scrub_names[id_tag]
- var/list/data = alarm_area.air_scrub_info[id_tag]
- if(!data)
- continue;
- var/state = ""
-
- sensor_data += {"
-[long_name][state]
-Operating:
-[data["power"]?"on":"off"]
-Type:
-[data["scrubbing"]?"scrubbing":"syphoning"]
-"}
-
- if(data["scrubbing"])
- sensor_data += {"
-Filtering:
-Carbon Dioxide
-[data["filter_co2"]?"on":"off"];
-Toxins
-[data["filter_toxins"]?"on":"off"];
-Nitrous Oxide
-[data["filter_n2o"]?"on":"off"]
-
-"}
- sensor_data += {"
-Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""]
-Dea":"red'>A")]ctivate
-
-"}
- else
- sensor_data = "No scrubbers connected.
"
- output = {"<< Main Menu
[sensor_data]"}
-
- if (AALARM_SCREEN_MODE)
- output += {"
-<< Main Menu
-Air machinery mode for the area:"}
- var/list/modes = list()
- if(src.emagged)
- modes = list(
- AALARM_MODE_SCRUBBING = "Filtering",
- AALARM_MODE_VENTING = "Draught",
- AALARM_MODE_PANIC = "PANIC",
- AALARM_MODE_REPLACEMENT = "REPLACE AIR",
- AALARM_MODE_OFF = "Off",
- AALARM_MODE_FLOOD = "FLOOD", //Below everything else because it shouldn't be there normally
- )
- else
- modes = list(
- AALARM_MODE_SCRUBBING = "Filtering",
- AALARM_MODE_VENTING = "Draught",
- AALARM_MODE_PANIC = "PANIC",
- AALARM_MODE_REPLACEMENT = "REPLACE AIR",
- AALARM_MODE_OFF = "Off",
- )
- for (var/m=1,m<=modes.len,m++)
- if (mode==m)
- output += {"- [modes[m]] (selected)
"}
- else
- output += {"- [modes[m]]
"}
- output += "
"
- if (AALARM_SCREEN_SENSORS)
- output += {"
-<< Main Menu
-Alarm thresholds:
-Partial pressure for gases
-
-
- | min2 | min1 | max1 | max2 |
-"}
- var/list/gases = list(
+ var/list/gas_names = list(
"oxygen" = "O2",
"carbon dioxide" = "CO2",
"plasma" = "Toxin",
- "other" = "Other",
- )
- var/list/thresholds = list("min2", "min1", "max1", "max2")
- var/datum/tlv/tlv
- for (var/g in gases)
- output += {"
-| [gases[g]] |
-"}
- tlv = TLV[g]
- for (var/v in thresholds)
- output += {"
-
-[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
- |
-"}
- output += {"
-
-"}
- tlv = TLV["pressure"]
- output += {"
-| Pressure |
-"}
- for (var/v in thresholds)
- output += {"
-
-[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
- |
-"}
- output += {"
-
-"}
- tlv = TLV["temperature"]
- output += {"
-| Temperature |
-"}
- for (var/v in thresholds)
- output += {"
-
-[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
- |
-"}
- output += {"
-
-"}
- output += {"
"}
+ "other" = "Other")
+ for (var/g in gas_names)
+ thresholds += list(list("name" = gas_names[g], "settings" = list()))
+ selected = TLV[g]
+ thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = g, "val" = "max2", "selected" = selected.max2))
- return output
+ selected = TLV["pressure"]
+ thresholds += list(list("name" = "Pressure", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2))
+
+ selected = TLV["temperature"]
+ thresholds += list(list("name" = "Temperature", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2))
+
+
+ data["thresholds"] = thresholds
/obj/machinery/alarm/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
+ if (locked && !usr.has_unlimited_silicon_privilege)
+ return
+
if ( (get_dist(src, usr) > 1 ))
if (!istype(usr, /mob/living/silicon))
usr.unset_machine()
usr << browse(null, "window=air_alarm")
return
-
+ if(href_list["toggleaccess"])
+ if(usr.has_unlimited_silicon_privilege && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
+ locked = !locked
if(href_list["command"])
var/device_id = href_list["id_tag"]
switch(href_list["command"])
+ if("set_external_pressure")
+ var/input_pressure = input("What pressure you like the system to mantain?", "Pressure Controls") as num|null
+ if(isnum(input_pressure))
+ send_signal(device_id, list(href_list["command"] = input_pressure))
+ return 1
+
+ if("reset_external_pressure")
+ send_signal(device_id, list(href_list["command"] = ONE_ATMOSPHERE))
+ return 1
if(
"power",
"adjust_external_pressure",
- "set_external_pressure",
- "checks",
"co2_scrub",
"tox_scrub",
"n2o_scrub",
@@ -577,12 +437,18 @@ table tr:first-child th:first-child { border: none;}
spawn(3)
src.updateUsrDialog()
+ if ("excheck")
+ send_signal(device_id, list ("checks" = text2num(href_list["val"])^1))
+
+ if ("incheck")
+ send_signal(device_id, list ("checks" = text2num(href_list["val"])^2))
+
//if("adjust_threshold") //was a good idea but required very wide window
if("set_threshold")
var/env = href_list["env"]
var/varname = href_list["var"]
var/datum/tlv/tlv = TLV[env]
- var/newval = input("Enter [varname] for env", "Alarm triggers", tlv.vars[varname]) as num|null
+ var/newval = input("Enter [varname] for [env]", "Alarm triggers", tlv.vars[varname]) as num|null
if (isnull(newval) || ..() || (locked && !(usr.has_unlimited_silicon_privilege)))
return
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 58e16afadee..1ee28a02cbf 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -259,32 +259,34 @@ update_flag
return src.attack_hand(user)
/obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user as mob)
- return src.interact(user)
+ return src.ui_interact(user)
-/obj/machinery/portable_atmospherics/canister/interact(var/mob/user as mob)
+/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main")
if (src.destroyed)
return
- user.set_machine(src)
- var/holding_text
- if(holding)
- holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
-Remove Tank
-"}
- var/output_text = {"[name][can_label?" relabel":""]
-Pressure: [air_contents.return_pressure()] KPa
-Port Status: [(connected_port)?("Connected"):("Disconnected")]
-[holding_text]
-
-Release Valve: [valve_open?("Open"):("Closed")]
-Release Pressure: - - - - [release_pressure] + + + +
-
-Close
-"}
+ var/data = list()
+ data["name"] = src.name
+ data["canLabel"] = src.can_label ? 1 : 0
+ data["portConnected"] = src.connected_port ? 1 : 0
+ data["tankPressure"] = round(src.air_contents.return_pressure() ? src.air_contents.return_pressure() : 0)
+ data["releasePressure"] = round(src.release_pressure ? src.release_pressure : 0)
+ data["minReleasePressure"] = round(ONE_ATMOSPHERE/10)
+ data["maxReleasePressure"] = round(10*ONE_ATMOSPHERE)
+ data["valveOpen"] = src.valve_open ? 1 : 0
- user << browse("[src][output_text]", "window=canister;size=600x300")
- onclose(user, "canister")
- return
+ data["hasHoldingTank"] = src.holding ? 1 : 0
+ if (holding)
+ data["holdingTank"] = list("name" = src.holding.name, "tankPressure" = round(src.holding.air_contents.return_pressure()))
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "canister.tmpl", "Canister", 480, 400)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index ac30218b651..9498dbb81c9 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -12,6 +12,8 @@
density = 0
opacity = 0
+/obj/machinery/door/poddoor/ert
+ desc = "A heavy duty blast door that only opens for dire emergencies."
/obj/machinery/door/poddoor/Bumped(atom/AM)
if(density)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 5d3e4db3c85..a2d76e96a5a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -682,7 +682,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24,
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
/obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6)
- contraband = list(/obj/item/weapon/kitchen/utensil/knife = 6)
+ contraband = list(/obj/item/weapon/kitchen/knife = 6)
/obj/machinery/vending/cola
@@ -874,8 +874,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
desc = "A kitchen and restaurant equipment vendor"
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20)
- contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchenknife/butcher = 2)
+ products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/fork = 6,/obj/item/weapon/kitchen/knife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20)
+ contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2)
/obj/machinery/vending/sovietsoda
name = "\improper BODA"
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 71c92fc3fe0..ae8595b7e96 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -55,10 +55,6 @@
secequipment += loc
qdel(src)
return
- if("Deathsquad")
- deathsquadspawn += loc
- qdel(src)
- return
if("Emergencyresponseteam")
emergencyresponseteamspawn += loc
qdel(src)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 958edb93f01..731a7324b81 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -38,7 +38,7 @@
desc = "A very sad-looking crayon."
colour = "#FFFFFF"
colourName = "mime"
- uses = 0
+ uses = -1
/obj/item/toy/crayon/mime/attack_self(mob/living/user as mob)
update_window(user)
@@ -63,7 +63,7 @@
icon_state = "crayonrainbow"
colour = "#FFF000"
colourName = "rainbow"
- uses = 0
+ uses = -1
/obj/item/toy/crayon/rainbow/attack_self(mob/living/user as mob)
update_window(user)
@@ -111,7 +111,7 @@
user << "It is empty."
/obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob)
- var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color","Cancel")
+ var/choice = input(user,"Spraycan options") as null|anything in list("Toggle Cap","Change Drawing","Change Color")
switch(choice)
if("Toggle Cap")
user << "You [capped ? "Remove" : "Replace"] the cap of the [src]"
diff --git a/code/game/objects/items/devices/recaller.dm b/code/game/objects/items/devices/recaller.dm
index 1fdf9794b96..08cb37b0837 100644
--- a/code/game/objects/items/devices/recaller.dm
+++ b/code/game/objects/items/devices/recaller.dm
@@ -31,15 +31,16 @@
if(user.mind in (ticker.mode.A_bosses | ticker.mode.B_bosses))
dat += "Give this device to another member of your organization to use.
"
else
- dat += "Register Device
"
+ dat += "Register Device
"
else
var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len))
var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len)
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
- dat += "Registration: [(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Member"]
"
+ dat += "Registration: [(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Lieutenant"]
"
dat += "Organization Size: [gang_size]
"
dat += "Station Control: [round((gang_territory/start_state.num_territories)*100, 1)]%
"
+ dat += "Rally Your Gang
"
dat += "Recall Emergency Shuttle
"
dat += "
"
dat += "Influence: [points]
"
@@ -70,8 +71,8 @@
else
dat += "10mm Ammo
"
- dat += "(50 Influence) "
- if(points >= 50)
+ dat += "(40 Influence) "
+ if(points >= 40)
dat += "Recruitment Pen
"
else
dat += "Recruitment Pen
"
@@ -99,6 +100,12 @@
add_fingerprint(usr)
+ if(href_list["register"])
+ register_device(usr)
+
+ else if(!gang) //Gangtool must be registered before you can use the functions below
+ return
+
if(href_list["purchase"])
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/item_type
@@ -120,9 +127,9 @@
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("pen")
- if(points >= 50)
+ if(points >= 40)
item_type = /obj/item/weapon/pen/gang
- points = 50
+ points = 40
if("gangtool")
if((promotions < 3) && (points >= (promotions*20)+10))
item_type = /obj/item/device/gangtool/lt
@@ -144,12 +151,34 @@
switch(href_list["choice"])
if("recall")
recall(usr)
- if("register")
- register_device(usr)
-
+ if("ping")
+ ping_gang(usr)
attack_self(usr)
+
+/obj/item/device/gangtool/proc/ping_gang(var/mob/user)
+ if(!user)
+ return
+ var/area/location = get_area(user)
+ if(location && location.z != 1)
+ user << "\icon[src]Error: Signal out of range of station."
+ return
+ var/list/members = list()
+ if(gang == "A")
+ members += ticker.mode.A_bosses | ticker.mode.A_gang
+ else if(gang == "B")
+ members += ticker.mode.B_bosses | ticker.mode.B_gang
+ if(members.len)
+ for(var/datum/mind/ganger in members)
+ ganger.current << "A powerful thought invades your mind... The gang is rallying at [location]!"
+ log_game("[key_name(user)] summoned the [gang_name(gang)] Gang ([gang]) to [location].")
+
+
/obj/item/device/gangtool/proc/register_device(var/mob/user)
+ if(jobban_isbanned(user, "gangster") || jobban_isbanned(user, "Syndicate"))
+ user << "\icon[src] ACCESS DENIED: Blacklisted user."
+ return 0
+
var/promoted
if(user.mind in (ticker.mode.A_gang | ticker.mode.A_bosses))
ticker.mode.A_tools += src
@@ -185,26 +214,39 @@
if(recalling || !can_use(user))
return
- var/turf/userturf = get_turf(user)
- if(userturf.z != 1)
- user << "\icon[src]Error: Device out of range of station communication arrays."
- return
+ recalling = 1
+ loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal..."
- if(SSshuttle.emergency.mode == SHUTTLE_CALL)
- recalling = 1
- loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal..."
- sleep(rand(10,30))
- loc << "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays..."
- sleep(rand(10,30))
- loc << "\icon[src]Comm arrays accessed. Broadcasting recall signal..."
- sleep(rand(10,30))
+ sleep(rand(10,30))
+
+ if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
+ user << "\icon[src]Emergency shuttle cannot be recalled at this time."
recalling = 0
- log_game("[key_name(user)] has recalled the shuttle with a gangtool.")
- message_admins("[key_name_admin(user)] has recalled the shuttle with a gangtool.", 1)
- if(!SSshuttle.cancelEvac(user))
- loc << "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time."
return
- user << "\icon[src]Emergency shuttle cannot be recalled at this time."
+ loc << "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays..."
+
+ sleep(rand(10,30))
+
+ var/turf/userturf = get_turf(user)
+ if(userturf.z != 1) //Shuttle can only be recalled while on station
+ user << "\icon[src]Error: Device out of range of station communication arrays."
+ recalling = 0
+ return
+ var/datum/station_state/end_state = new /datum/station_state()
+ end_state.count()
+ if((100 * start_state.score(end_state)) < 70) //Shuttle cannot be recalled if the station is too damaged
+ user << "\icon[src]Error: Station communication systems compromised. Unable to establish connection."
+ recalling = 0
+ return
+ loc << "\icon[src]Comm arrays accessed. Broadcasting recall signal..."
+
+ sleep(rand(10,30))
+
+ recalling = 0
+ log_game("[key_name(user)] has tried to recall the shuttle with a gangtool.")
+ message_admins("[key_name_admin(user)] has tried to recall the shuttle with a gangtool.", 1)
+ if(!SSshuttle.cancelEvac(user))
+ loc << "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time."
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
if(!istype(user))
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 1795cb3a607..e875c6605d5 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -109,25 +109,21 @@ var/global/list/datum/stack_recipe/xeno_recipes = list ( \
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if( istype(W, /obj/item/weapon/kitchenknife) || \
- istype(W, /obj/item/weapon/kitchen/utensil/knife) || \
- istype(W, /obj/item/weapon/twohanded/fireaxe) || \
- istype(W, /obj/item/weapon/hatchet) )
-
- //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
- usr.visible_message("\the [usr] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
- if(do_after(user,50))
- usr << "You cut the hair from this [src.singular_name]."
+ if(is_sharp(W))
+ playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
+ user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
+ if(do_after(user,50, target = src))
+ user << "You cut the hair from this [src.singular_name]."
//Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
+ for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc)
if(HS.amount < 50)
HS.amount++
- src.use(1)
+ use(1)
break
//If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/sheet/hairlesshide/HS = new(usr.loc)
+ var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
HS.amount = 1
- src.use(1)
+ use(1)
else
..()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 07fe7a7defc..3621e21d852 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -427,21 +427,22 @@
//Check area validity. Reject space, player-created areas, and non-station z-levels.
if (gangID)
- var/area/user_area = get_area(user.loc)
territory = get_area(target)
if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
//Check if this area is already tagged by a gang
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
if(territory_claimed(territory, user))
return
+ /*
//Prevent people spraying from outside of the territory (ie. Maint walls)
- if(istype(user_area) && (user_area.type == territory.type))
- if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents))
- user << "You cannot tag here."
- return
- else
+ var/area/user_area = get_area(user.loc)
+ if(istype(user_area) && (user_area.type != territory.type))
user << "You cannot tag [territory] from the outside."
return
+ */
+ if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents))
+ user << "You cannot tag here."
+ return
else
user << "[territory] is unsuitable for tagging."
return
@@ -481,6 +482,8 @@
user << "You finish [instant ? "spraying" : "drawing"] [temp]."
if(instant<0)
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
+ if(uses < 0)
+ return
uses = max(0,uses-1)
if(!uses)
user << "There is no more of [src.name] left!"
@@ -492,6 +495,8 @@
if(edible && (M == user))
user << "You take a bite of the [src.name]. Delicious!"
user.nutrition += 5
+ if(uses < 0)
+ return
uses = max(0,uses-5)
if(!uses)
user << "There is no more of [src.name] left!"
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 00f3fbfd3b2..dcc041016ee 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -196,22 +196,22 @@ update_label("John Doe", "Clowny")
icon_state = "centcom"
registered_name = "Emergency Response Team Commander"
assignment = "Emergency Response Team Commander"
- New() access = get_all_accesses()+get_ert_access("commander")
+ New() access = get_all_accesses()+get_ert_access("commander")-access_change_ids
/obj/item/weapon/card/id/ert/Security
registered_name = "Security Response Officer"
assignment = "Security Response Officer"
- New() access = get_all_accesses()+get_ert_access("sec")
+ New() access = get_all_accesses()+get_ert_access("sec")-access_change_ids
/obj/item/weapon/card/id/ert/Engineer
registered_name = "Engineer Response Officer"
assignment = "Engineer Response Officer"
- New() access = get_all_accesses()+get_ert_access("eng")
+ New() access = get_all_accesses()+get_ert_access("eng")-access_change_ids
/obj/item/weapon/card/id/ert/Medical
registered_name = "Medical Response Officer"
assignment = "Medical Response Officer"
- New() access = get_all_accesses()+get_ert_access("med")
+ New() access = get_all_accesses()+get_ert_access("med")-access_change_ids
/obj/item/weapon/card/id/prisoner
name = "prisoner ID card"
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 5f52dd4a870..c6d2703e54f 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -1,22 +1,18 @@
/* Kitchen tools
* Contains:
- * Utensils
- * Spoons
- * Forks
- * Knives
+ * Fork
* Kitchen knives
* Butcher's cleaver
* Rolling Pins
- * Trays
*/
/obj/item/weapon/kitchen
icon = 'icons/obj/kitchen.dmi'
-/*
- * Utensils
- */
-/obj/item/weapon/kitchen/utensil
+/obj/item/weapon/kitchen/fork
+ name = "fork"
+ desc = "Pointy."
+ icon_state = "fork"
force = 5.0
w_class = 1.0
throwforce = 0
@@ -26,126 +22,68 @@
origin_tech = "materials=1"
attack_verb = list("attacked", "stabbed", "poked")
hitsound = 'sound/weapons/bladeslice.ogg'
+ var/datum/reagent/forkload //used to eat omelette
-/obj/item/weapon/kitchen/utensil/New()
- if (prob(60))
- src.pixel_y = rand(0, 4)
- return
-
-/*
- * Spoons
- */
- /obj/item/weapon/kitchen/utensil/spoon
- name = "spoon"
- desc = "SPOON!"
- icon_state = "spoon"
- attack_verb = list("attacked", "poked")
-
-/*
- * Forks
- */
-/obj/item/weapon/kitchen/utensil/fork
- name = "fork"
- desc = "Pointy."
- icon_state = "fork"
-
-/obj/item/weapon/kitchen/utensil/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+/obj/item/weapon/kitchen/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
return ..()
- if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
- return ..()
-
- if (src.icon_state == "forkloaded") //This is a poor way of handling it, but a proper rewrite of the fork to allow for a more varied foodening can happen when I'm in the mood. --NEO
- if(M == user)
- M.visible_message("[user] eats a delicious forkful of omelette!")
- M.reagents.add_reagent("nutriment", 1)
- else
- M.visible_message("[user] feeds [M] a delicious forkful of omelette!")
- M.reagents.add_reagent("nutriment", 1)
- src.icon_state = "fork"
- return
- else
+ if(user.zone_sel.selecting == "mouth")
+ if(forkload)
+ if(M == user)
+ M.visible_message("[user] eats a delicious forkful of omelette!")
+ M.reagents.add_reagent(forkload.id, 1)
+ else
+ M.visible_message("[user] feeds [M] a delicious forkful of omelette!")
+ M.reagents.add_reagent(forkload.id, 1)
+ icon_state = "fork"
+ forkload = null
+ return
+ else if(user.zone_sel.selecting == "eyes")
if(user.disabilities & CLUMSY && prob(50))
M = user
return eyestab(M,user)
+ else
+ return ..()
-/*
- * Knives
- */
-/obj/item/weapon/kitchen/utensil/knife
- name = "knife"
- desc = "Can cut through any food."
- icon_state = "knife"
- force = 10.0
- throwforce = 10.0
-/obj/item/weapon/kitchen/utensil/knife/suicide_act(mob/user)
- user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."))
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target, mob/living/carbon/human/user)
- if(istype(user) && user.disabilities & CLUMSY && prob(50))
- user << "You accidentally cut yourself with \the [src]."
- user.take_organ_damage(20)
- return
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/*
- * Kitchen knives
- */
-/obj/item/weapon/kitchenknife
+/obj/item/weapon/kitchen/knife
name = "kitchen knife"
- icon = 'icons/obj/kitchen.dmi'
icon_state = "knife"
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
flags = CONDUCT
force = 10.0
- w_class = 3.0
+ w_class = 2.0
throwforce = 10.0
+ hitsound = 'sound/weapons/bladeslice.ogg'
throw_speed = 3
throw_range = 6
m_amt = 12000
origin_tech = "materials=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-/obj/item/weapon/kitchenknife/suicide_act(mob/user)
+/obj/item/weapon/kitchen/knife/suicide_act(mob/user)
user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
"[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
"[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."))
return (BRUTELOSS)
-/obj/item/weapon/kitchenknife/ritual
+/obj/item/weapon/kitchen/knife/ritual
name = "ritual knife"
desc = "The unearthly energies that once powered this blade are now dormant."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
+ w_class = 3.0
-/*
- * Bucher's cleaver
- */
-/obj/item/weapon/kitchenknife/butcher
+/obj/item/weapon/kitchen/knife/butcher
name = "butcher's cleaver"
- icon = 'icons/obj/kitchen.dmi'
icon_state = "butch"
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
flags = CONDUCT
force = 15.0
- w_class = 3.0
throwforce = 8.0
- throw_speed = 3
- throw_range = 6
- m_amt = 12000
- origin_tech = "materials=1"
- hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
-/*
- * Rolling Pins
- */
+ w_class = 3.0
/obj/item/weapon/kitchen/rollingpin
name = "rolling pin"
@@ -158,4 +96,4 @@
w_class = 3.0
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
-/* Trays moved to /obj/item/weapon/storage/bag */
+/* Trays moved to /obj/item/weapon/storage/bag */
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 63d46028ba5..76ce25a17ba 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -1,3 +1,6 @@
+#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
+#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD)
+
/obj/item/weapon/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
@@ -90,24 +93,54 @@
/obj/item/weapon/tank/attack_self(mob/user as mob)
if (!(src.air_contents))
return
- user.set_machine(src)
+
+ ui_interact(user)
+
+/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main")
+ var/mob/living/carbon/location = null
+
+ if(istype(loc, /mob/living/carbon))
+ location = loc
+ else if(istype(loc.loc, /mob/living/carbon))
+ location = loc.loc
var/using_internal
- if(istype(loc,/mob/living/carbon))
- var/mob/living/carbon/location = loc
+ if(istype(location))
if(location.internal==src)
using_internal = 1
- var/message = {"
-Tank
-Tank Pressure: [air_contents.return_pressure()]
-
-Mask Release Pressure: - - [distribute_pressure] + +
-Mask Release Valve: [using_internal?("Open"):("Closed")]
-"}
- user << browse(message, "window=tank;size=600x300")
- onclose(user, "tank")
- return
+ // this is the data which will be sent to the ui
+ var/data = list()
+ data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0)
+ data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0)
+ data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE)
+ data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE)
+ data["valveOpen"] = using_internal ? 1 : 0
+
+ data["maskConnected"] = 0
+
+ if(istype(location))
+ var/mask_check = 0
+
+ if(location.internal == src) // if tank is current internal
+ mask_check = 1
+ else if(src in location) // or if tank is in the mobs possession
+ if(!location.internal) // and they do not have any active internals
+ mask_check = 1
+
+ if(mask_check)
+ if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))
+ data["maskConnected"] = 1
+
+ var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
+ if (!ui)
+ ui = new /datum/nanoui(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+ else
+ ui.push_data(data)
+
/obj/item/weapon/tank/Topic(href, href_list)
..()
@@ -116,8 +149,13 @@
if (src.loc == usr)
usr.set_machine(src)
if (href_list["dist_p"])
- var/cp = text2num(href_list["dist_p"])
- src.distribute_pressure += cp
+ if (href_list["dist_p"] == "reset")
+ src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
+ else if (href_list["dist_p"] == "max")
+ src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE
+ else
+ var/cp = text2num(href_list["dist_p"])
+ src.distribute_pressure += cp
src.distribute_pressure = min(max(round(src.distribute_pressure), 0), 3*ONE_ATMOSPHERE)
if (href_list["stat"])
if(istype(loc,/mob/living/carbon))
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index fd1e0824295..cd75b4ac155 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -3,7 +3,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
"damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2",
"platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2",
"light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken",
- "light_on_broken","light_off","wall_thermite","grass1","grass2","grass3","grass4",
+ "light_on_broken","light_off","wall_thermite","grass", "sand",
"asteroid","asteroid_dug",
"asteroid0","asteroid1","asteroid2","asteroid3","asteroid4",
"asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12",
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index b2e008e7df3..e7d3d075d78 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -38,14 +38,13 @@
/turf/simulated/floor/fancy/grass
name = "Grass patch"
- icon_state = "grass1"
+ icon_state = "grass"
floor_tile = /obj/item/stack/tile/grass
- broken_states = list("sand1", "sand2", "sand3")
+ broken_states = list("sand")
ignoredirt = 1
/turf/simulated/floor/fancy/grass/New()
..()
- icon_state = "grass[pick("1","2","3","4")]"
spawn(1)
update_icon()
fancy_update(type)
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index ca6b69118a5..a2a98f734a8 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -20,11 +20,7 @@
/turf/unsimulated/floor/grass
- icon_state = "grass1"
-
-/turf/unsimulated/floor/grass/New()
- ..()
- icon_state = "grass[rand(1,4)]"
+ icon_state = "grass"
/turf/unsimulated/floor/abductor
name = "alien floor"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 9c493b12f03..6524d509250 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -634,17 +634,21 @@ var/global/floorIsLava = 0
/datum/admins/proc/delay()
set category = "Server"
set desc="Delay the game start"
- set name="Delay"
+ set name="Delay pre-game"
+
+ var/newtime = input("Set a new time in seconds. Set -1 for indefinite delay.","Set Delay",round(ticker.timeLeft/10)) as num|null
if(ticker.current_state > GAME_STATE_PREGAME)
return alert("Too late... The game has already started!")
- ticker.can_fire = !ticker.can_fire
- if(!ticker.can_fire)
- world << "The game start has been delayed."
- log_admin("[key_name(usr)] delayed the game.")
- else
- world << "The game will start soon."
- log_admin("[key_name(usr)] removed the delay.")
- feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ if(newtime)
+ ticker.timeLeft = newtime * 10
+ if(newtime < 0)
+ world << "The game start has been delayed."
+ log_admin("[key_name(usr)] delayed the round start.")
+ else
+ world << "The game will start in [newtime] seconds."
+ world << 'sound/ai/attention.ogg'
+ log_admin("[key_name(usr)] set the pre-game delay to [newtime] seconds.")
+ feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/immreboot()
set category = "Server"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index e5d19b4f1e7..89fea828905 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -690,7 +690,7 @@ var/global/list/g_fancy_list_of_types = null
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/kitchenknife(M), slot_l_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)
@@ -712,9 +712,9 @@ var/global/list/g_fancy_list_of_types = null
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/kitchenknife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store)
+ 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)
@@ -807,7 +807,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
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/kitchenknife(M), slot_l_store)
+ 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)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
@@ -856,43 +856,23 @@ var/global/list/g_fancy_list_of_types = null
equip_deathsquad(M)
if("emergency response officer")
+ var/alert
+ if(alert("Code Red ERT?","Select Response Level","Yes","No")=="Yes")
+ alert = 1
+ else
+ alert = 0
switch(input("Which class?") in list("Commander","Security","Engineer","Medic"))
if("Commander")
- equip_emergencyresponsesquad(M, "commander")
+ equip_emergencyresponsesquad(M, "commander",alert)
if("Security")
- equip_emergencyresponsesquad(M, "sec")
+ equip_emergencyresponsesquad(M, "sec",alert)
if("Engineer")
- equip_emergencyresponsesquad(M, "eng")
+ equip_emergencyresponsesquad(M, "eng",alert)
if("Medic")
- equip_emergencyresponsesquad(M, "med")
+ equip_emergencyresponsesquad(M, "med",alert)
if("centcom official")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/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/headset_cent(M), slot_ears)
- 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/gun/energy/gun(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(M), slot_back)
-
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Centcom Official"
- pda.update_label()
-
- M.equip_to_slot_or_del(pda, slot_r_store)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_l_hand)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.icon_state = "centcom"
- W.access = get_centcom_access("Centcom Official")
- W.access += access_weapons
- W.assignment = "Centcom Official"
- W.registered_name = M.real_name
- W.update_label()
- M.equip_to_slot_or_del(W, slot_wear_id)
+ equip_centcomofficial(M)
if("centcom commander")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform)
@@ -1156,7 +1136,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
//Emergency Response Team
-/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole)
+/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole, var/alert)
var/obj/item/weapon/card/id/W = null
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
R.set_frequency(CENTCOM_FREQ)
@@ -1170,19 +1150,23 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(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/suit/space/hardsuit/ert(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(M), slot_back)
- 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/weapon/storage/box/engineer(M), slot_in_backpack)
- 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/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
-
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
R.keyslot = new /obj/item/device/encryptionkey/heads/captain
+ if(alert)
+ 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/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
+ else
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/switchblade(M), slot_l_store)
+
if("sec")
W = new /obj/item/weapon/card/id/ert/Security(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
@@ -1192,16 +1176,20 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
-
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/storage/box/handcuffs(M), slot_in_backpack)
- 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/gun/energy/pulse/carbine/loyalpin(M), slot_in_backpack)
-
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
R.keyslot = new /obj/item/device/encryptionkey/heads/hos
+ if(alert)
+ 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/gun/energy/pulse/carbine/loyalpin(M), slot_in_backpack)
+ else
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_in_backpack)
+
if("med")
W = new /obj/item/weapon/card/id/ert/Medical(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
@@ -1211,18 +1199,21 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
-
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/clothing/mask/gas/sechailer/swat(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/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
-
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_r_hand)
R.keyslot = new /obj/item/device/encryptionkey/heads/cmo
+ if(alert)
+ 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/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
+ else
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat(M), slot_in_backpack)
+
if("eng")
W = new /obj/item/weapon/card/id/ert/Engineer(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
@@ -1232,17 +1223,21 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/engine(M), slot_glasses)
-
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/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
-
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_l_store)
R.keyslot = new /obj/item/device/encryptionkey/heads/ce
+ if(alert)
+ 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/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
+ else
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/rcd/loaded(M), slot_in_backpack)
+
R.recalculateChannels()
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
@@ -1252,4 +1247,33 @@ var/global/list/g_fancy_list_of_types = null
if (W)
W.registered_name = M.real_name
- W.update_label(W.registered_name, W.assignment)
\ No newline at end of file
+ W.update_label(W.registered_name, W.assignment)
+
+
+/proc/equip_centcomofficial(var/mob/living/carbon/human/M)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/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/headset_cent(M), slot_ears)
+ 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/gun/energy/gun(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(M), slot_back)
+
+ var/obj/item/device/pda/heads/pda = new(M)
+ pda.owner = M.real_name
+ pda.ownjob = "Centcom Official"
+ pda.update_label()
+
+ M.equip_to_slot_or_del(pda, slot_r_store)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_l_hand)
+
+ var/obj/item/weapon/card/id/W = new(M)
+ W.icon_state = "centcom"
+ W.access = get_centcom_access("Centcom Official")
+ W.access += access_weapons
+ W.assignment = "Centcom Official"
+ W.registered_name = M.real_name
+ W.update_label()
+ M.equip_to_slot_or_del(W, slot_wear_id)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index d4cd11aad0d..fb2f3bff40f 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -20,8 +20,7 @@ client/proc/one_click_antag()
Make Gangsters
Make Wizard (Requires Ghosts)
Make Nuke Team (Requires Ghosts)
- Make Deathsquad (Requires Ghosts)
- Make Emergency Response Team (Requires Ghosts)
+ Make Centcom Response Team (Requires Ghosts)
Make Abductor Team (Requires Ghosts)
Make Revenant (Requires Ghost)
"}
@@ -320,7 +319,7 @@ client/proc/one_click_antag()
if(candidates.len >= 2) //Minimum 2 to be considered a squad
//Pick the lucky players
var/numagents = min(5,candidates.len) //How many commandos to spawn
- var/list/spawnpoints = deathsquadspawn
+ var/list/spawnpoints = emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
numagents--
@@ -343,6 +342,9 @@ client/proc/one_click_antag()
equip_deathsquad(Commando)
Commando.key = chosen_candidate.key
Commando.mind.assigned_role = "Death Commando"
+ for(var/obj/machinery/door/poddoor/ert/door in airlocks)
+ spawn(0)
+ door.open()
//Assign antag status and the mission
ticker.mode.traitors += Commando.mind
@@ -410,15 +412,73 @@ client/proc/one_click_antag()
return 0
-// EMERGENCY RESPONSE TEAM
+/datum/admins/proc/makeOfficial()
+ var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
+ var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered to be a Centcom Official?", "pAI")
+
+ if(candidates.len)
+ var/mob/dead/observer/chosen_candidate = pick(candidates)
+
+ //Create the official
+ var/mob/living/carbon/human/newmob = new (pick(emergencyresponseteamspawn))
+ chosen_candidate.client.prefs.copy_to(newmob)
+ ready_dna(newmob)
+ newmob.real_name = random_name(newmob.gender)
+ newmob.key = chosen_candidate.key
+ newmob.mind.assigned_role = "Centcom Official"
+ equip_centcomofficial(newmob)
+
+ //Assign antag status and the mission
+ ticker.mode.traitors += newmob.mind
+ newmob.mind.special_role = "centcom"
+ var/datum/objective/missionobj = new
+ missionobj.owner = newmob.mind
+ missionobj.explanation_text = mission
+ missionobj.completed = 1
+ newmob.mind.objectives += missionobj
+
+ //Greet the official
+ newmob << "You are a Centcom Official."
+ newmob << "
Central Command is sending you to [station_name()] with the task: [mission]"
+
+ //Logging and cleanup
+ message_admins("A [key_name_admin(newmob)] has spawned with the task: [mission]")
+ log_game("[key_name(newmob)] has been selected as a Centcom Official")
+
+ return 1
+
+ return 0
+
+// CENTCOM RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam()
+ var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: Centcom Official", "Blue: Light ERT", "Amber: Full ERT", "Red: Elite ERT", "Delta: Deathsquad")
+ if(!alert)
+ return
+ switch(alert)
+ if("Delta: Deathsquad")
+ makeDeathsquad()
+ return
+ if("Red: Elite ERT")
+ alert = "Red"
+ if("Amber: Full ERT")
+ alert = "Amber"
+ if("Blue: Light ERT")
+ alert = "Blue"
+ if("Green: Centcom Official")
+ makeOfficial()
+ return
+ var/teamsize = min(7,input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num)
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.")
- var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Emergency Response Team?", "deathsquad", null)
+ var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
var/teamSpawned = 0
- if(candidates.len >= 4) //Minimum 4 to be considered a squad
+ if(candidates.len > 0)
//Pick the (un)lucky players
- var/numagents = min(7,candidates.len) //How many officers to spawn
+ var/numagents = min(teamsize,candidates.len) //How many officers to spawn
+ var/redalert //If the ert gets super weapons
+ if (alert == "Red")
+ numagents = min(teamsize,candidates.len)
+ redalert = 1
var/list/spawnpoints = emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
@@ -438,28 +498,34 @@ client/proc/one_click_antag()
switch(numagents)
if(1)
ERTOperative.real_name = "Commander [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "commander")
+ equip_emergencyresponsesquad(ERTOperative, "commander",redalert)
if(2)
ERTOperative.real_name = "Security Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "sec")
+ equip_emergencyresponsesquad(ERTOperative, "sec",redalert)
if(3)
ERTOperative.real_name = "Medical Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "med")
+ equip_emergencyresponsesquad(ERTOperative, "med",redalert)
if(4)
ERTOperative.real_name = "Engineer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "eng")
+ equip_emergencyresponsesquad(ERTOperative, "eng",redalert)
if(5)
ERTOperative.real_name = "Security Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "sec")
+ equip_emergencyresponsesquad(ERTOperative, "sec",redalert)
if(6)
ERTOperative.real_name = "Medical Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "med")
+ equip_emergencyresponsesquad(ERTOperative, "med",redalert)
if(7)
ERTOperative.real_name = "Engineer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "eng")
+ equip_emergencyresponsesquad(ERTOperative, "eng",redalert)
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
+ //Open the Armory doors
+ if(alert != "Blue")
+ for(var/obj/machinery/door/poddoor/ert/door in airlocks)
+ spawn(0)
+ door.open()
+
//Assign antag status and the mission
ticker.mode.traitors += ERTOperative.mind
ERTOperative.mind.special_role = "ert"
@@ -471,7 +537,7 @@ client/proc/one_click_antag()
//Greet the commando
ERTOperative << "You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"]."
- var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
+ var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
else
@@ -481,7 +547,7 @@ client/proc/one_click_antag()
//Logging and cleanup
if(numagents == 1)
- message_admins("The emergency response team has spawned with the mission: [mission].")
+ message_admins("A Code [alert] emergency response team has spawned with the mission: [mission]")
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
numagents--
teamSpawned++
@@ -576,7 +642,6 @@ client/proc/one_click_antag()
G << 'sound/misc/notice2.ogg' //Alerting them to their consideration
switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No"))
if("Yes")
- G << 'sound/machines/ping.ogg'
G << "Choice registered: Yes."
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
G << "Sorry, you were too late for the consideration!"
@@ -585,7 +650,6 @@ client/proc/one_click_antag()
candidates += G
if("No")
G << "Choice registered: No."
- G << 'sound/machines/buzz-sigh.ogg'
return
else
return
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 82e183bf91f..04df14ff933 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -42,7 +42,7 @@ var/sound/admin_sound
if(!check_rights(R_SOUNDS)) return
if(ticker)
- ticker.round_end_sound = S
+ ticker.round_end_sound = fcopy_rsc(S)
else
return
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index b9ecf892582..512d464f7cb 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -60,7 +60,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = CHEST|GROIN|ARMS
- allowed = list(/obj/item/weapon/kitchenknife)
+ allowed = list(/obj/item/weapon/kitchen)
togglename = "sleeves"
//Cook
@@ -71,7 +71,7 @@
item_state = "apronchef"
blood_overlay_type = "armor"
body_parts_covered = CHEST|GROIN
- allowed = list(/obj/item/weapon/kitchenknife)
+ allowed = list(/obj/item/weapon/kitchen)
//Detective
/obj/item/clothing/suit/det_suit
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index e4ec5e8fd5a..b3f8c13c50c 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -344,7 +344,8 @@
qdel(src)
/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (!W || !user || !W.type) return
+ if (!W || !user || !W.type)
+ return
user.changeNext_move(CLICK_CD_MELEE)
var/override = 0
@@ -356,33 +357,22 @@
..()
return
- switch(W.type)
- if(/obj/item/weapon/circular_saw) qdel(src)
- if(/obj/item/weapon/kitchen/utensil/knife) qdel(src)
- if(/obj/item/weapon/scalpel) qdel(src)
- if(/obj/item/weapon/twohanded/fireaxe) qdel(src)
- if(/obj/item/weapon/hatchet) qdel(src)
- if(/obj/item/weapon/melee/energy) qdel(src)
- if(/obj/item/weapon/scythe)
- for(var/obj/effect/spacevine/B in orange(src,1))
- if(prob(80))
- qdel(B)
+ if(istype(W, /obj/item/weapon/scythe))
+ for(var/obj/effect/spacevine/B in orange(src,1))
+ if(prob(80))
+ qdel(B)
+ qdel(src)
+
+ else if(is_sharp(W))
+ qdel(src)
+
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
qdel(src)
-
- //less effective weapons
- if(/obj/item/weapon/wirecutters)
- if(prob(25)) qdel(src)
- if(/obj/item/weapon/shard)
- if(prob(25)) qdel(src)
-
- else //weapons with subtypes
- if(istype(W, /obj/item/weapon/melee/energy/sword)) qdel(src)
- else if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user)) qdel(src)
- else
- user_unbuckle_mob(user,user)
- return
+ else
+ user_unbuckle_mob(user,user)
+ return
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
..()
diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm
index 608064ed01b..08e3076e190 100644
--- a/code/modules/food&drinks/food/snacks_egg.dm
+++ b/code/modules/food&drinks/food/snacks_egg.dm
@@ -98,18 +98,20 @@
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W,/obj/item/weapon/kitchen/utensil/fork))
- if(W.icon_state == "forkloaded")
+ if(istype(W,/obj/item/weapon/kitchen/fork))
+ var/obj/item/weapon/kitchen/fork/F = W
+ if(F.forkload)
user << "You already have omelette on your fork!"
- return
- W.icon_state = "forkloaded"
- user.visible_message( \
- "[user] takes a piece of omelette with their fork!", \
- "You take a piece of omelette with your fork." \
- )
- reagents.remove_reagent("nutriment", 1)
- if(reagents.total_volume <= 0)
- qdel(src)
+ else
+ F.icon_state = "forkloaded"
+ user.visible_message("[user] takes a piece of omelette with their fork!", \
+ "You take a piece of omelette with your fork.")
+
+ var/datum/reagent/R = pick(reagents.reagent_list)
+ reagents.remove_reagent(R.id, 1)
+ F.forkload = R
+ if(reagents.total_volume <= 0)
+ qdel(src)
return
..()
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 1b0fc3f450d..b22c6d40087 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -250,7 +250,7 @@
scanner.computer.inventory.Add(src)
user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
- else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters))
+ else if(istype(I, /obj/item/weapon/kitchen/knife) || istype(I, /obj/item/weapon/wirecutters))
user << "You begin to carve out [title]..."
if(do_after(user, 30))
user << "You carve out the pages from [title]! You didn't want to read it anyway."
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 750e20450f8..3eced450fed 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -25,7 +25,6 @@
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
- var/butcher_state = 8 // Icon state for dead spider icons
icon_living = "guard"
icon_dead = "guard_dead"
speak_emote = list("chitters")
@@ -95,18 +94,11 @@
stop_automated_movement = 0
walk(src,0)
-// Chops off each leg with a 50/50 chance of harvesting one, until finally calling
-// default harvest action
-/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user, sharpness = 1)
- if(butcher_state > 0)
- butcher_state--
- icon_state = icon_dead + "[butcher_state]"
-
- if(prob(50))
- new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc)
- return
- else
- return ..()
+/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user)
+ var/leg_amount = rand(4,8)
+ for(var/i=0, iYou begin to butcher [src]..."
+ playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
+ if(do_mob(user, src, 80/sharpness))
+ harvest(user)
return
..()
@@ -461,13 +464,9 @@
new childtype(loc)
// Harvest an animal's delicious byproducts
-/mob/living/simple_animal/proc/harvest(mob/living/user, sharpness = 1)
- user << "You begin to butcher [src]..."
- playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
- if(do_mob(user, src, 80/sharpness))
- visible_message("[user] butchers [src].")
- gib()
- return
+/mob/living/simple_animal/proc/harvest(mob/living/user)
+ visible_message("[user] butchers [src].")
+ gib()
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where, child_override)
if(!child_override)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 70a8b157f64..2c0451396e9 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -69,7 +69,7 @@
stat("Game Mode:", (ticker.hide_mode) ? "Secret" : "[master_mode]")
if(ticker.current_state == GAME_STATE_PREGAME)
- stat("Time To Start:", (ticker.can_fire) ? "[round(ticker.timeLeft / 10)]s" : "DELAYED")
+ stat("Time To Start:", (ticker.timeLeft >= 0) ? "[round(ticker.timeLeft / 10)]s" : "DELAYED")
stat("Players:", "[ticker.totalPlayers]")
if(client.holder)
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index 07a6a4570dc..09b8a4796be 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -141,7 +141,8 @@
return 0 // wasn't open
processing_uis.Remove(ui)
- ui.user.open_uis.Remove(ui)
+ if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface)
+ ui.user.open_uis.Remove(ui)
var/list/uis = open_uis[src_object_key][ui.ui_key]
return uis.Remove(ui)
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 7e4071a78a9..9ae8b1e8c6f 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -14,7 +14,7 @@
/obj/item/weapon/gun/grenadelauncher/examine(mob/user)
..()
- user << "[grenades] / [max_grenades] grenades loaded."
+ user << "[grenades.len] / [max_grenades] grenades loaded."
/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index b8e4560a26a..1827184ab1e 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -191,7 +191,7 @@
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list("$metal" = 12000)
- build_path = /obj/item/weapon/kitchenknife
+ build_path = /obj/item/weapon/kitchen/knife
category = list("initial","Misc")
/datum/design/scalpel
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 7fb15f6e3f9..62a2d254e78 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -478,6 +478,7 @@
circuit = /obj/item/weapon/circuitboard/shuttle
var/shuttleId
var/possible_destinations = ""
+ var/admin_controlled
/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/shuttle/C)
..()
@@ -494,12 +495,19 @@
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]
"
if(M)
+ var/destination_found
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
if(!options.Find(S.id))
continue
if(M.canDock(S))
continue
+ destination_found = 1
dat += "Send to [S.name]
"
+ if(!destination_found)
+ dat += "Shuttle Locked
"
+ if(admin_controlled)
+ dat += "Authorized personnel only
"
+ dat += "Request Authorization
"
dat += "Close"
var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
@@ -540,7 +548,18 @@
circuit = /obj/item/weapon/circuitboard/ferry/request
var/cooldown //prevents spamming admins
possible_destinations = "ferry_home"
+ admin_controlled = 1
+/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
+ ..()
+ if(href_list["request"])
+ if(cooldown)
+ return
+ cooldown = 1
+ usr << "Your request has been recieved by Centcom."
+ admins << "FERRY: [key_name(usr)] (?) (JMP) (Move Ferry) is requesting to move the transport ferry to Centcom."
+ spawn(600) //One minute cooldown
+ cooldown = 0
#undef DOCKING_PORT_HIGHLIGHT
diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm
index b31ec1afe24..a4ea6e51ba2 100644
--- a/code/modules/surgery/generic_steps.dm
+++ b/code/modules/surgery/generic_steps.dm
@@ -1,7 +1,7 @@
//make incision
/datum/surgery_step/incise
- implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45)
+ implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 24
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -58,7 +58,7 @@
//saw bone
/datum/surgery_step/saw
- implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25)
+ implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 88f2cd2f4d1..532e90e1e9e 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -9,7 +9,7 @@
//cut fat
/datum/surgery_step/cut_fat
- implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25)
+ implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index e0a4dc96c76..52695210d1c 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -6,7 +6,7 @@
//reshape_face
/datum/surgery_step/reshape_face
- implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 50, /obj/item/weapon/wirecutters = 35)
+ implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 50, /obj/item/weapon/wirecutters = 35)
time = 64
/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/html/changelogs/Fayrik-TheNanoing.yml b/html/changelogs/Fayrik-TheNanoing.yml
new file mode 100644
index 00000000000..556f54168d2
--- /dev/null
+++ b/html/changelogs/Fayrik-TheNanoing.yml
@@ -0,0 +1,6 @@
+author: Fayrik
+
+delete-after: True
+
+changes:
+- rscadd: "Ported NanoUI to most atmospherics equipment."
\ No newline at end of file
diff --git a/html/changelogs/Ikarrus-Delay.yml b/html/changelogs/Ikarrus-Delay.yml
new file mode 100644
index 00000000000..03c6f0b7239
--- /dev/null
+++ b/html/changelogs/Ikarrus-Delay.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: Ikarrus
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Admins can now adjust the pre-game delay time."
\ No newline at end of file
diff --git a/html/changelogs/Ikarrus-Gang5_2.yml b/html/changelogs/Ikarrus-Gang5_2.yml
new file mode 100644
index 00000000000..e4e46bac83d
--- /dev/null
+++ b/html/changelogs/Ikarrus-Gang5_2.yml
@@ -0,0 +1,40 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: Ikarrus
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Gang bosses can now rally their gang to their location with their gangtool."
+ - rscadd: "Gangtools can no longer recall the shuttle if station integrity is lower than 70%"
+ - rscdel: "Removed requirement to be in the territory to tag it."
+ - tweak: "Recruitment Pen cost reduced to 40."
+ - bugfix: "Communications console should now accurately print the (lack of a) location of the last shuttle call."
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 0997a3676f5..0518872ccf8 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 15ec64bf77e..dc66c1ec6dd 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/nano/css/shared.css b/nano/css/shared.css
index 8f7110ee152..a2fa3507d55 100644
--- a/nano/css/shared.css
+++ b/nano/css/shared.css
@@ -29,9 +29,18 @@ a, a:link, a:visited, a:active, .link, .linkOn, .linkOff, .selected, .disabled
.link
{
- float: left;
- min-width: 40px;
- height: 16px;
+ float: left;
+ min-width: 15px;
+ height: 16px;
+ text-align: center;
+ color: #ffffff;
+ text-decoration: none;
+ background: #40628a;
+ border: 1px solid #161616;
+ padding: 0px 4px 4px 4px;
+ margin: 0 2px 2px 0;
+ cursor: default;
+ white-space: nowrap;
}
a:hover, .linkActive:hover
@@ -218,6 +227,10 @@ h4
font-weight: bold;
}
+.redButton {
+ background: #ea0000;
+}
+
.highlight
{
color: #8BA5C4;
@@ -228,6 +241,15 @@ h4
color: #272727;
}
+.noticePlaceholder {
+ position: relative;
+ font-size: 12px;
+ font-style: italic;
+ font-weight: bold;
+ padding: 3px 4px 3px 4px;
+ margin: 4px 0 4px 0;
+}
+
.notice
{
background: url(uiNoticeBackground.jpg) 0 0 repeat;
diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl
new file mode 100644
index 00000000000..f3a64d9efd8
--- /dev/null
+++ b/nano/templates/air_alarm.tmpl
@@ -0,0 +1,199 @@
+
+
+ {{if siliconUser}}
+
+ Interface Lock:
+
+
+ {{:~link('Engaged', 'locked', {'toggleaccess' : 1}, locked ? 'selected' : null)}}{{:~link('Disengaged', 'unlocked', {'toggleaccess' : 1}, (locked ? null : 'selected'))}}
+
+ {{else}}
+ {{if locked}}
+ Swipe an ID card to unlock this interface.
+ {{else}}
+ Swipe an ID card to lock this interface.
+ {{/if}}
+ {{/if}}
+
+
+Air Status
+{{if environment_data}}
+ {{for environment_data}}
+ {{:name}}
+ {{if danger_level == 2}}
+
+ {{else danger_level == 1}}
+
+ {{else}}
+
+ {{/if}}
+ {{:~round(value*100)/100}}
+ {{:unit}}
+ {{/for}}
+ Local Status: {{if danger_level == 2}}
+ DANGER: Internals Required
+ {{else danger_level == 1}}
+ Caution
+ {{else}}
+ Optimal
+ {{/if}}
+
+ Area Status: {{if atmos_alarm}}Atmosphere alert in area{{else fire_alarm}}Fire alarm in area{{else}}No alerts{{/if}}
+{{else}}
+ Warning: Cannot obtain air sample for analysis.
+{{/if}}
+{{if dangerous}}
+
NOTICE: Safety measures nonfunctional. Device may exhibit abnormal behavior.
+{{/if}}
+
+{{if (!locked || siliconUser)}}
+ {{if screen != 1}}
+ {{:~link('Main Menu', null, { 'screen' : 1})}}
+ {{/if}}
+ {{if screen == 1}}
+
+ {{if atmos_alarm}}
+ {{:~link('Reset - Area Atmospheric Alarm', null, { 'atmos_reset' : 1})}}
+ {{else}}
+ {{:~link('Activate - Area Atmospheric Alarm', null, { 'atmos_alarm' : 1})}}
+ {{/if}}
+
+
+
+ {{:~link('Scrubbers Control', null, { 'screen' : 3})}}
+
+
+ {{:~link('Vents Control', null, { 'screen' : 2})}}
+
+
+ {{:~link('Set Environmental Mode', null, { 'screen' : 4})}}
+
+
+ {{:~link('Sensor Settings', null, { 'screen' : 5})}}
+
+
+ {{if mode==3}}
+ {{:~link('PANIC SIPHON ACTIVE - Turn siphoning off', null, { 'mode' : 1}, null, 'redButton')}}
+ {{else}}
+ {{:~link('ACTIVATE PANIC SIPHON IN AREA', null, { 'mode' : 3}, null, 'yellowButton')}}
+ {{/if}}
+ {{else screen == 2}}
+ {{for vents}}
+ {{:long_name}}
+
+
+ Operating:
+
+
+ {{:~link(power ? 'On' : 'Off', null, { 'id_tag' : id_tag, 'command' : 'power', 'val' : power ? 0 : 1}, null, power ? null : 'redButton')}}
+
+
+
+
+ Mode:
+
+
+ {{:direction == "siphon" ? 'Siphoning' : 'Pressurizing'}}
+
+
+
+
+ Pressure Checks:
+
+
+ {{:~link('External', null, { 'id_tag' : id_tag, 'command' : 'excheck', 'val' : checks}, null, excheck ? 'selected' : null)}}
+ {{:~link('Internal', null, { 'id_tag' : id_tag, 'command' : 'incheck', 'val' : checks}, null, incheck ? 'selected' : null)}}
+
+
+
+
+ External Pressure Bound:
+
+
+ {{:~link(~round(external*100)/100, null, { 'id_tag' : id_tag, 'command' : 'set_external_pressure'})}}
+ {{:~link('Reset', null, { 'id_tag' : id_tag, 'command' : 'reset_external_pressure'})}}
+
+
+
+ {{/for}}
+ {{if !vents.length}}
+ No vents connected.
+ {{/if}}
+ {{else screen == 3}}
+ {{for scrubbers}}
+ {{:long_name}}
+
+
+ Operating:
+
+
+ {{:~link(power ? 'On' : 'Off', null, { 'id_tag' : id_tag, 'command' : 'power', 'val' : power ? 0 : 1}, null, power ? null : 'redButton')}}
+
+
+
+
+ Mode:
+
+
+ {{:~link(scrubbing ? 'Scrubbing' : 'Siphoning', null, { 'id_tag' : id_tag, 'command' : 'scrubbing', 'val' : scrubbing ? 0 : 1}, null, scrubbing ? null : 'redButton')}}
+
+
+
+
+ Filters:
+
+
+ {{:~link("Carbon Dioxide", null, { 'id_tag' : id_tag, 'command' : "co2_scrub", 'val' : filter_co2 ? 0 : 1}, null, filter_co2 ? 'selected' : null)}}
+ {{:~link("Plasma", null, { 'id_tag' : id_tag, 'command' : "tox_scrub", 'val' : filter_toxins ? 0 : 1}, null, filter_toxins ? 'selected' : null)}}
+ {{:~link("Nitrous Oxide", null, { 'id_tag' : id_tag, 'command' : "n2o_scrub", 'val' : filter_n2o ? 0 : 1}, null, filter_n2o ? 'selected' : null)}}
+
+
+
+ {{/for}}
+ {{if !scrubbers.length}}
+ No scrubbers connected.
+ {{/if}}
+ {{else screen == 4}}
+ Environmental Modes
+ {{for modes}}
+
+ {{:~link(name, null, { 'mode' : mode }, null, selected ? (danger ? 'redButton' : 'selected') : (danger ? 'bad' : null))}}
+
+ {{/for}}
+ {{else screen == 5}}
+ Alarm Threshold
+ Partial pressure for gases.
+
+
+ | min2 | min1 | max1 | max2 |
+
+ {{for thresholds}}
+
+ | {{:name}} |
+ {{for settings}}
+
+ {{:~link(selected >= 0 ? ~round(selected*100)/100 : "Off", null, { 'command' : 'set_threshold', 'env' : env, 'var' : val })}}
+ |
+ {{/for}}
+
+ {{/for}}
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/atmos_filter.tmpl b/nano/templates/atmos_filter.tmpl
new file mode 100644
index 00000000000..24ee5c8c75f
--- /dev/null
+++ b/nano/templates/atmos_filter.tmpl
@@ -0,0 +1,51 @@
+
+
+ Power:
+
+
+ {{:~link(on? 'On' : 'Off', null, {'power' : 1})}}
+
+
+
+
+ Output pressure:
+
+
+
+ {{:~link('MAX', null, {'set_press' : 'max'}, null)}}
+ {{:~link('SET', null, {'set_press' : 'set'}, null)}}
+
{{:(pressure_set/100)}} kPa
+
+
+
+Filter Type
+
+
+ {{:~link('Plasma', null, {'filterset' : 0}, (filter_type == 0)? 'selected' : null)}}
+
+
+
+
+ {{:~link('Oxygen', null, {'filterset' : 1}, (filter_type == 1)? 'selected' : null)}}
+
+
+
+
+ {{:~link('Nitrogen', null, {'filterset' : 2}, (filter_type == 2)? 'selected' : null)}}
+
+
+
+
+ {{:~link('Carbon Dioxide', null, {'filterset' : 3}, (filter_type == 3)? 'selected' : null)}}
+
+
+
+
+ {{:~link('Nitrous Oxide', null, {'filterset' : 4}, (filter_type == 4)? 'selected' : null)}}
+
+
+
+
+ {{:~link('Nothing', null, {'filterset' : -1}, (filter_type == -1)? 'selected' : null)}}
+
+
\ No newline at end of file
diff --git a/nano/templates/atmos_gas_pump.tmpl b/nano/templates/atmos_gas_pump.tmpl
new file mode 100644
index 00000000000..833bc7046cb
--- /dev/null
+++ b/nano/templates/atmos_gas_pump.tmpl
@@ -0,0 +1,36 @@
+
+
+ Power:
+
+
+ {{:~link(on? 'On' : 'Off', null, {'power' : 1})}}
+
+
+
+{{if max_rate}}
+
+
+ Transfer rate:
+
+
+
+ {{:~link('MAX', null, {'set_transfer_rate' : 'max'}, null)}}
+ {{:~link('SET', null, {'set_transfer_rate' : 'set'}, null)}}
+
{{:(transfer_rate/100)}} L/s
+
+
+
+{{else}}
+
+
+ Output pressure:
+
+
+
+ {{:~link('MAX', null, {'set_press' : 'max'}, null)}}
+ {{:~link('SET', null, {'set_press' : 'set'}, null)}}
+
{{:(pressure_set/100)}} kPa
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/atmos_mixer.tmpl b/nano/templates/atmos_mixer.tmpl
new file mode 100644
index 00000000000..efc98565b90
--- /dev/null
+++ b/nano/templates/atmos_mixer.tmpl
@@ -0,0 +1,51 @@
+
+
+ Power:
+
+
+ {{:~link(on? 'On' : 'Off', null, {'power' : 1})}}
+
+
+
+
+
+ Output pressure:
+
+
+
+ {{:~link('MAX', null, {'set_press' : 'max'}, null)}}
+ {{:~link('SET', null, {'set_press' : 'set'}, null)}}
+
{{:(pressure_set/100)}} kPa
+
+
+
+
+
+
+ Node 1 Concentration:
+
+
+
+ {{:~link('-', null, {'node1_c' : '-0.1'}, null)}}
+ {{:~link('-', null, {'node1_c' : '-0.01'}, null)}}
+
{{:node1_concentration}} %
+ {{:~link('+', null, {'node1_c' : '0.01'}, null)}}
+ {{:~link('+', null, {'node1_c' : '0.1'}, null)}}
+
+
+
+
+
+
+ Node 2 Concentration:
+
+
+
+ {{:~link('-', null, {'node2_c' : '-0.1'}, null)}}
+ {{:~link('-', null, {'node2_c' : '-0.01'}, null)}}
+
{{:node2_concentration}} %
+ {{:~link('+', null, {'node2_c' : '0.01'}, null)}}
+ {{:~link('+', null, {'node2_c' : '0.1'}, null)}}
+
+
+
\ No newline at end of file
diff --git a/nano/templates/canister.tmpl b/nano/templates/canister.tmpl
new file mode 100644
index 00000000000..1f67d608e5b
--- /dev/null
+++ b/nano/templates/canister.tmpl
@@ -0,0 +1,83 @@
+Tank Status
+
+
+ Tank Label:
+
+
+
{{:name}}
{{:~link('Relabel', 'pencil', {'relabel' : 1}, canLabel ? null : 'disabled')}}
+
+
+
+
+
+ Tank Pressure:
+
+
+ {{:tankPressure}} kPa
+
+
+
+
+
+ Port Status:
+
+
+ {{:portConnected ? 'Connected' : 'Disconnected'}}
+
+
+
+Holding Tank Status
+{{if hasHoldingTank}}
+
+
+ Tank Label:
+
+
+
{{:holdingTank.name}}
{{:~link('Eject', 'eject', {'remove_tank' : 1})}}
+
+
+
+
+
+ Tank Pressure:
+
+
+ {{:holdingTank.tankPressure}} kPa
+
+
+{{else}}
+ No holding tank inserted.
+
+{{/if}}
+
+
+Release Valve Status
+
+
+ Release Pressure:
+
+
+ {{:~displayBar(releasePressure, minReleasePressure, maxReleasePressure)}}
+
+ {{:~link('-', null, {'pressure_adj' : -1000}, (releasePressure > minReleasePressure) ? null : 'disabled')}}
+ {{:~link('-', null, {'pressure_adj' : -100}, (releasePressure > minReleasePressure) ? null : 'disabled')}}
+ {{:~link('-', null, {'pressure_adj' : -10}, (releasePressure > minReleasePressure) ? null : 'disabled')}}
+ {{:~link('-', null, {'pressure_adj' : -1}, (releasePressure > minReleasePressure) ? null : 'disabled')}}
+
{{:releasePressure}} kPa
+ {{:~link('+', null, {'pressure_adj' : 1}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('+', null, {'pressure_adj' : 10}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('+', null, {'pressure_adj' : 100}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('+', null, {'pressure_adj' : 1000}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+
+
+
+
+
+
+ Release Valve:
+
+
+ {{:~link('Open', 'unlocked', {'toggle' : 1}, valveOpen ? 'selected' : null)}}{{:~link('Close', 'locked', {'toggle' : 1}, valveOpen ? null : 'selected')}}
+
+
+
diff --git a/nano/templates/tanks.tmpl b/nano/templates/tanks.tmpl
new file mode 100644
index 00000000000..6aa259fd145
--- /dev/null
+++ b/nano/templates/tanks.tmpl
@@ -0,0 +1,47 @@
+{{if maskConnected}}
+ This tank is connected to a mask.
+{{else}}
+ This tank is NOT connected to a mask.
+{{/if}}
+
+
+
+ Tank Pressure:
+
+
+ {{:~displayBar(tankPressure, 0, 1013, (tankPressure > 200) ? 'good' : ((tankPressure > 100) ? 'average' : 'bad'))}}
+
+ {{:tankPressure}} kPa
+
+
+
+
+
+
+
+
+ Mask Release Pressure:
+
+
+ {{:~displayBar(releasePressure, 0, maxReleasePressure, (releasePressure >= 23) ? null : ((releasePressure >= 17) ? 'average' : 'bad'))}}
+
+ {{:~link('-', null, {'dist_p' : -5}, (releasePressure > 0) ? null : 'disabled')}}
+ {{:~link('-', null, {'dist_p' : -1}, (releasePressure > 0) ? null : 'disabled')}}
+
{{:releasePressure}} kPa
+ {{:~link('+', null, {'dist_p' : 1}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('+', null, {'dist_p' : 5}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('Max', null, {'dist_p' : 'max'}, (releasePressure < maxReleasePressure) ? null : 'disabled')}}
+ {{:~link('Reset', null, {'dist_p' : 'reset'}, (releasePressure != defaultReleasePressure) ? null : 'disabled')}}
+
+
+
+
+
+
+ Mask Release Valve:
+
+
+ {{:~link('Open', 'unlocked', {'stat' : 1}, (!maskConnected) ? 'disabled' : (valveOpen ? 'selected' : null))}}{{:~link('Close', 'locked', {'stat' : 1}, valveOpen ? null : 'selected')}}
+
+
+